diff --git a/assets/animations/lottie/ambulance.json b/assets/animations/lottie/ambulance.json new file mode 100644 index 0000000..b38e58d --- /dev/null +++ b/assets/animations/lottie/ambulance.json @@ -0,0 +1 @@ +{"nm":"F5XND4M_3","ddd":0,"h":500,"w":500,"meta":{"g":"@lottiefiles/toolkit-js 0.33.2"},"layers":[{"ty":4,"nm":"Layer 12","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":0,"ti":[0,0,0],"to":[0,-0.833,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":10,"ti":[0,-0.833,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":20,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":30,"ti":[0,-0.833,0],"to":[0,0,0]},{"s":[450.232,298.786,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 6","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":1,"ti":[0,0,0],"to":[0,0.833,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":11,"ti":[0,0.833,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":21,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":31,"ti":[0,0.833,0],"to":[0,0,0]},{"s":[63.907,395.682,0],"t":41}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":0,"ti":[0,0,0],"to":[0,-0.667,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":10,"ti":[0,-0.667,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":20,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":30,"ti":[0,-0.667,0],"to":[0,0,0]},{"s":[121.127,424.922,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.746,-5.442],[5.445,-0.745],[0.746,5.442],[-5.445,0.745]],"o":[[0.746,5.442],[-5.445,0.745],[-0.746,-5.442],[5.445,-0.745]],"v":[[9.859,-1.349],[1.351,9.853],[-9.859,1.349],[-1.351,-9.853]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":3,"nm":"Null 3","sr":1,"st":0,"op":129,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.911,173.859,0],"ix":2},"r":{"a":0,"k":138,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":0,"ix":11}},"ef":[],"ind":4},{"ty":4,"nm":"Layer 11","sr":1,"st":43,"op":129,"ip":43,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":43},{"s":[-100,100,100],"t":48}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[54.892,46.827,0],"t":43,"ti":[1.777,-1.646,0],"to":[-1.777,1.646,0]},{"s":[44.23,56.705,0],"t":48}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":4},{"ty":4,"nm":"Layer 10","sr":1,"st":31,"op":41,"ip":31,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":31},{"s":[-134,134,100],"t":41}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":31,"ti":[5.313,-5.439,0],"to":[-5.313,5.439,0]},{"s":[23.889,75.927,0],"t":41}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":36},{"s":[0],"t":41}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6,"parent":4},{"ty":4,"nm":"Layer 9","sr":1,"st":18,"op":28,"ip":18,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":18},{"s":[-134,134,100],"t":28}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":18,"ti":[5.313,-5.439,0],"to":[-5.313,5.439,0]},{"s":[23.889,75.927,0],"t":28}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":23},{"s":[0],"t":28}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7,"parent":4},{"ty":4,"nm":"Layer 8","sr":1,"st":7,"op":17,"ip":7,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":7},{"s":[-134,134,100],"t":17}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":7,"ti":[5.313,-5.439,0],"to":[-5.313,5.439,0]},{"s":[23.889,75.927,0],"t":17}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":12},{"s":[0],"t":17}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8,"parent":4},{"ty":4,"nm":"Layer 7","sr":1,"st":0,"op":5,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-100,100,100],"t":0},{"s":[-134,134,100],"t":5}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[44.23,56.705,0],"t":0,"ti":[3.39,-3.204,0],"to":[-3.39,3.204,0]},{"s":[23.889,75.927,0],"t":5}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":0},{"s":[0],"t":5}],"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9,"parent":4},{"ty":4,"nm":"Layer 5","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[396.051,136.57,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":4},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":8},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":12},{"o":{"x":0.191,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":16},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":23},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":27},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":31},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":35},{"s":[100,100,100],"t":39}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[396.051,136.57,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[-13.769,0],[0,0],[-7.045,-11.709],[0,0]],"o":[[0,0],[7.01,-11.85],[0,0],[13.665,0],[0,0],[0,0]],"v":[[-64.065,49.563],[-17.385,-30.444],[16.14,-49.563],[16.14,-49.563],[49.516,-30.693],[64.065,-6.511]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":6,"ix":1}},{"nm":"gap","n":"g","v":{"a":0,"k":10,"ix":2}},{"nm":"gap2","n":"g","v":{"a":0,"k":10,"ix":4}},{"nm":"gap3","n":"g","v":{"a":0,"k":10,"ix":6}}],"c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[386.167,114.696],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.779,7.779],[-7.779,7.779],[-7.779,-7.779],[7.779,-7.779]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.391,184.828],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.361,-23.305],[-10.361,5.407],[-7.127,23.336],[-0.018,23.336],[-0.018,23.348],[7.103,23.34],[10.348,5.39],[10.361,-23.348]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tr","a":{"a":0,"k":[401.402,140.911],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"Layer 4","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[351.654,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[351.654,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.652,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"Layer 3","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[91.751,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.751,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.749,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":4,"nm":"Layer 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[221.146,268.245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":0,"ti":[0,0,0],"to":[0,-0.5,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":5,"ti":[0,-0.5,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":10,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":15,"ti":[0,-0.5,0],"to":[0,0,0]},{"o":{"x":0.324,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":20,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":25,"ti":[0,-0.5,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":30,"ti":[0,0,0],"to":[0,0,0]},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":35,"ti":[0,-0.5,0],"to":[0,0,0]},{"s":[221.146,268.245,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.847],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.305,0],[0,0],[0,-5.305],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.305,0],[0,0],[0,0],[0,0],[0,-5.305]],"v":[[0,-10.37],[0,-10.37],[-9.605,-0.765],[-9.605,10.37],[9.605,10.37],[9.605,-0.765]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[131.871,184.202],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[30.878,-9.505],[9.504,-9.505],[9.504,-30.878],[-9.504,-30.878],[-9.504,-9.505],[-30.878,-9.505],[-30.878,9.504],[-9.504,9.504],[-9.504,30.878],[9.504,30.878],[9.504,9.504],[30.878,9.504]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[280.853,235.296],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 7","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-31.952,16.61],[31.952,16.61],[31.952,-16.61],[-14.701,-16.61]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[111.137,230.612],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 8","ix":6,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 9","ix":7,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 10","ix":8,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 11","ix":9,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 12","ix":10,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 13","ix":11,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":1,"hd":false,"mn":"ADBE Vector Group","nm":"Group 14","ix":12,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[5.721,9.918],[-3.465,8.879]],"o":[[0,0],[0,0],[-11.453,0],[-4.89,-8.463],[0,0]],"v":[[42.236,-21.524],[42.236,21.524],[-10.514,21.524],[-37.943,5.687],[-40.081,-21.524]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[41.298,-0.235],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.792156862745098,0.8117647058823529,0.8666666666666667,0.5,0.8627450980392157,0.8745098039215686,0.9058823529411765,1,0.9333333333333333,0.9411764705882353,0.9450980392156862],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-43.173,-0.235],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[359.173,201.235],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 15","ix":13,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[119.713,9.09],[-119.713,9.09],[-119.713,-9.09],[119.713,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.689,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 16","ix":14,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,9.09],[-59.545,9.09],[-59.545,-9.09],[59.545,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.432,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 17","ix":15,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 18","ix":16,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.847],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":13},{"ty":0,"nm":"Pre-comp 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27,346],[27,380],[458,380],[458,349]]},"ix":1}}],"w":500,"h":500,"refId":"comp_0","ind":14}],"v":"5.12.1","fr":30,"op":61,"ip":0,"assets":[{"nm":"Pre-comp 1","id":"comp_0","layers":[{"ty":4,"nm":"Layer 8","sr":1,"st":22,"op":75,"ip":22,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":22,"ti":[-73.167,0,0],"to":[73.167,0,0]},{"s":[241.96,362.657,0],"t":42}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 7","sr":1,"st":20,"op":40,"ip":20,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":20,"ti":[-72.833,0,0],"to":[72.833,0,0]},{"s":[678.96,362.657,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 6","sr":1,"st":2,"op":22,"ip":2,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":2,"ti":[-73.167,0,0],"to":[73.167,0,0]},{"s":[241.96,362.657,0],"t":22}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":20,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":0,"ti":[-72.833,0,0],"to":[72.833,0,0]},{"s":[678.96,362.657,0],"t":20}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4}]}]} \ No newline at end of file diff --git a/assets/animations/lottie/ambulance_alert.json b/assets/animations/lottie/ambulance_alert.json new file mode 100644 index 0000000..8fb93b1 --- /dev/null +++ b/assets/animations/lottie/ambulance_alert.json @@ -0,0 +1 @@ +{"nm":"after_ohno","ddd":0,"h":214,"w":240,"meta":{"g":"@lottiefiles/toolkit-js 0.26.1"},"layers":[{"ty":4,"nm":"! contornos","sr":1,"st":-34,"op":716,"ip":26,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[172.26,-42.033,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0,0,100],"t":26},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[0,0,100],"t":27},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":-0.042},"s":[0,0,100],"t":28},{"o":{"x":0.167,"y":0.083},"i":{"x":0.833,"y":0.833},"s":[0,0,100],"t":29},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[12.5,12.5,100],"t":30},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[25,25,100],"t":31},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[37.5,37.5,100],"t":32},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[50,50,100],"t":33},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[62.5,62.5,100],"t":34},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[75,75,100],"t":35},{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.725},"s":[87.5,87.5,100],"t":36},{"o":{"x":0.167,"y":0.12},"i":{"x":0.833,"y":0.935},"s":[100,100,100],"t":37},{"o":{"x":0.167,"y":-0.292},"i":{"x":0.833,"y":0.654},"s":[128.739,128.739,100],"t":38},{"o":{"x":0.167,"y":0.11},"i":{"x":0.833,"y":0.866},"s":[122.364,122.364,100],"t":39},{"o":{"x":0.167,"y":0.22},"i":{"x":0.833,"y":0.924},"s":[102.249,102.249,100],"t":40},{"o":{"x":0.167,"y":-0.9},"i":{"x":0.833,"y":0.333},"s":[89.958,89.958,100],"t":41},{"o":{"x":0.167,"y":0.095},"i":{"x":0.833,"y":0.858},"s":[90.999,90.999,100],"t":42},{"o":{"x":0.167,"y":0.202},"i":{"x":0.833,"y":0.914},"s":[98.291,98.291,100],"t":43},{"o":{"x":0.167,"y":3.061},"i":{"x":0.833,"y":2.422},"s":[103.416,103.416,100],"t":44},{"o":{"x":0.167,"y":0.079},"i":{"x":0.833,"y":0.849},"s":[103.559,103.559,100],"t":45},{"o":{"x":0.167,"y":0.187},"i":{"x":0.833,"y":0.906},"s":[100.969,100.969,100],"t":46},{"o":{"x":0.167,"y":0.75},"i":{"x":0.833,"y":1.203},"s":[98.877,98.877,100],"t":47},{"o":{"x":0.167,"y":0.059},"i":{"x":0.833,"y":0.839},"s":[98.615,98.615,100],"t":48},{"o":{"x":0.167,"y":0.173},"i":{"x":0.833,"y":0.899},"s":[99.515,99.515,100],"t":49},{"o":{"x":0.167,"y":0.476},"i":{"x":0.833,"y":1.059},"s":[100.352,100.352,100],"t":50},{"o":{"x":0.167,"y":0.035},"i":{"x":0.833,"y":0.826},"s":[100.53,100.53,100],"t":51},{"o":{"x":0.167,"y":0.16},"i":{"x":0.833,"y":0.892},"s":[100.227,100.227,100],"t":52},{"o":{"x":0.167,"y":0.368},"i":{"x":0.833,"y":1.002},"s":[99.897,99.897,100],"t":53},{"o":{"x":0.167,"y":0.002},"i":{"x":0.833,"y":0.809},"s":[99.8,99.8,100],"t":54},{"o":{"x":0.167,"y":0.148},"i":{"x":0.833,"y":0.886},"s":[99.899,99.899,100],"t":55},{"o":{"x":0.167,"y":0.308},"i":{"x":0.833,"y":0.97},"s":[100.027,100.027,100],"t":56},{"o":{"x":0.167,"y":-0.046},"i":{"x":0.833,"y":0.784},"s":[100.074,100.074,100],"t":57},{"o":{"x":0.167,"y":0.135},"i":{"x":0.833,"y":0.879},"s":[100.044,100.044,100],"t":58},{"o":{"x":0.167,"y":0.269},"i":{"x":0.833,"y":0.95},"s":[99.995,99.995,100],"t":59},{"o":{"x":0.167,"y":-0.126},"i":{"x":0.833,"y":0.742},"s":[99.973,99.973,100],"t":60},{"o":{"x":0.167,"y":0.123},"i":{"x":0.833,"y":0.917},"s":[99.982,99.982,100],"t":61},{"o":{"x":0.167,"y":0.002},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":62},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":63},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":64},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":65},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":66},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":67},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":68},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":69},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":70},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":71},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":72},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":73},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":74},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":75},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":76},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":77},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":79},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":81},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":82},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":83},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":85},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":86},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":87},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":88},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":89},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":90},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":91},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":93},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":94},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":95},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":96},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":97},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":98},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":99},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":100},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":101},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":102},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":103},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":104},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":106},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":107},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":108},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":109},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":111},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":112},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":113},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":114},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":115},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":116},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":117},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":118},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":119},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":120},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":121},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":122},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":123},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":124},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":125},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":126},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":127},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":128},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":129},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":130},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":131},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":132},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":133},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":134},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":135},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":136},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":137},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":138},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":139},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":140},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":141},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":142},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":143},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":144},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":145},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":146},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":147},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":148},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":149},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":150},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":151},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":152},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":153},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":154},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":155},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":156},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":157},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":158},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":159},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":160},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":161},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":162},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":163},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":164},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":165},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":166},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":167},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":168},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":169},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":170},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":171},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":172},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":173},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":174},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":175},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":176},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":177},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":178},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":179},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":180},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":181},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":182},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":183},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":184},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":185},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":186},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":187},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":188},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":189},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":190},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":191},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":192},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":193},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":194},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":195},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":196},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":197},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":198},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":199},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":200},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":201},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":202},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":203},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":204},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":205},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":206},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":207},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":208},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":209},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":210},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":211},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":212},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":213},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":214},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":215},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":216},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":217},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":218},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":219},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":220},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":221},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":222},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":223},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":224},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":225},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":226},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":227},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":228},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":229},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":230},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":231},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":232},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":233},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":234},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":235},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":236},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":237},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":238},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":239},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":240},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":241},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":242},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":243},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":244},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":245},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":246},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":247},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":248},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":249},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":250},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":251},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":252},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":253},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":254},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":255},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":256},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":257},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":258},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":259},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":260},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":261},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":262},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":263},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":264},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":265},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":266},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":267},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":268},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":269},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":270},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":271},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":272},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":273},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":274},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":275},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":276},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":277},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":278},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":279},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":280},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":281},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":282},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":283},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":284},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":285},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":286},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":287},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":288},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":289},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":290},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":291},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":292},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":293},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":294},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":295},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":296},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":297},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":298},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":299},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":300},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":301},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":302},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":303},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":304},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":305},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":306},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":307},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":308},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":309},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":310},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":311},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":312},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":313},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":314},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":315},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":316},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":317},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":318},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":319},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":320},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":321},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":322},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":323},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":324},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":325},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":326},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":327},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":328},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":329},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":330},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":331},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":332},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":333},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":334},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":335},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":336},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":337},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":338},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":339},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":340},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":341},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":342},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":343},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":344},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":345},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":346},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":347},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":348},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":349},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":350},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":351},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":352},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":353},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":354},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":355},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":356},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":357},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":358},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":359},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":360},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":361},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":362},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":363},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":364},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":365},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":366},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":367},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":368},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":369},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":370},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":371},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":372},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":373},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":374},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":375},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":376},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":377},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":378},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":379},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":380},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":381},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":382},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":383},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":384},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":385},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":386},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":387},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":388},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":389},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":390},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":391},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":392},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":393},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":394},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":395},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":396},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":397},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":398},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":399},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":400},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":401},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":402},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":403},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":404},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":405},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":406},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":407},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":408},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":409},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":410},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":411},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":412},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":413},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":414},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":415},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":416},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":417},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":418},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":419},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":420},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":421},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":422},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":423},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":424},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":425},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":426},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":427},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":428},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":429},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":430},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":431},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":432},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":433},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":434},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":435},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":436},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":437},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":438},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":439},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":440},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":441},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":442},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":443},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":444},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":445},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":446},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":447},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":448},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":449},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":450},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":451},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":452},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":453},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":454},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":455},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":456},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":457},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":458},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":459},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":460},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":461},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":462},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":463},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":464},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":465},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":466},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":467},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":468},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":469},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":470},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":471},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":472},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":473},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":474},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":475},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":476},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":477},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":478},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":479},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":480},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":481},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":482},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":483},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":484},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":485},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":486},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":487},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":488},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":489},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":490},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":491},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":492},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":493},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":494},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":495},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":496},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":497},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":498},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":499},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":500},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":501},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":502},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":503},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":504},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":505},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":506},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":507},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":508},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":509},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":510},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":511},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":512},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":513},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":514},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":515},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":516},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":517},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":518},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":519},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":520},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":521},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":522},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":523},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":524},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":525},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":526},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":527},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":528},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":529},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":530},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":531},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":532},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":533},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":534},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":535},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":536},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":537},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":538},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":539},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":540},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":541},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":542},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":543},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":544},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":545},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":546},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":547},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":548},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":549},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":550},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":551},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":552},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":553},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":554},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":555},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":556},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":557},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":558},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":559},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":560},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":561},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":562},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":563},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":564},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":565},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":566},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":567},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":568},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":569},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":570},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":571},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":572},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":573},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":574},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":575},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":576},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":577},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":578},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":579},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":580},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":581},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":582},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":583},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":584},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":585},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":586},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":587},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":588},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":589},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":590},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":591},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":592},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":593},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":594},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":595},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":596},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":597},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":598},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":599},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":600},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":601},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":602},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":603},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":604},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":605},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":606},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":607},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":608},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":609},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":610},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":611},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":612},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":613},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":614},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":615},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":616},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":617},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":618},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":619},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":620},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":621},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":622},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":623},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":624},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":625},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":626},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":627},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":628},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":629},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":630},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":631},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":632},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":633},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":634},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":635},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":636},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":637},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":638},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":639},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":640},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":641},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":642},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":643},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":644},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":645},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":646},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":647},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":648},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":649},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":650},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":651},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":652},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":653},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":654},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":655},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":656},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":657},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":658},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":659},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":660},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":661},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":662},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":663},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":664},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":665},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":666},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":667},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":668},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":669},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":670},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":671},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":672},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":673},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":674},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":675},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":676},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":677},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":678},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":679},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":680},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":681},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":682},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":683},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":684},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":685},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":686},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":687},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":688},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":689},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":690},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":691},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":692},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":693},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":694},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":695},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":696},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":697},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":698},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":699},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":700},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":701},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":702},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":703},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":704},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":705},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":706},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":707},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":708},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":709},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":710},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":711},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":712},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":713},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[100,100,100],"t":714},{"s":[100,100,100],"t":715}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120,116.618,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"!","ix":1,"cix":2,"np":5,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"!","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-1.15,0],[-0.805,0.767],[-0.155,1.457],[0,0],[0,0],[1.648,1.42],[2.53,0],[1.648,-1.418],[0,-2.375],[0,0],[0,0],[-0.805,-0.765]],"o":[[1.15,0],[0.805,-0.765],[0,0],[0,0],[0,-2.375],[-1.65,-1.418],[-2.53,0],[-1.65,1.42],[0,0],[0,0],[0.153,1.457],[0.805,0.767]],"v":[[172.26,-23.46],[175.193,-24.61],[176.63,-27.945],[180.885,-72.565],[181,-73.83],[178.527,-79.523],[172.26,-81.65],[165.993,-79.523],[163.52,-73.83],[163.635,-72.68],[167.89,-27.945],[169.327,-24.61]]},"ix":2}},{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"!","ix":2,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-2.455,0],[-1.61,1.65],[0,2.455],[1.61,1.65],[2.453,0],[1.61,-1.648],[0,-2.453],[-1.61,-1.648]],"o":[[2.453,0],[1.61,-1.648],[0,-2.453],[-1.61,-1.648],[-2.455,0],[-1.61,1.65],[0,2.455],[1.61,1.65]],"v":[[172.26,0.69],[178.355,-1.783],[180.77,-7.935],[178.355,-14.087],[172.26,-16.56],[166.165,-14.087],[163.75,-7.935],[166.165,-1.783]]},"ix":2}},{"ty":"mm","bm":0,"hd":false,"mn":"ADBE Vector Filter - Merge","nm":"Mesclar caminhos 1","mm":1},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Preenchimento 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Camada de forma 1","sr":1,"st":0,"op":750,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[0,0,100],"t":28},{"s":[100,100,100],"t":35}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[120,107,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"ef":[],"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Polystar 1","ix":1,"cix":2,"np":4,"it":[{"ty":"sr","bm":0,"hd":false,"mn":"ADBE Vector Shape - Star","nm":"Caminho Polystar 1","ix":1,"d":1,"ir":{"a":0,"k":53.5,"ix":6},"is":{"a":0,"k":51,"ix":8},"pt":{"a":0,"k":3,"ix":3},"p":{"a":0,"k":[0,0],"ix":4},"or":{"a":1,"k":[{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":0},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":1},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":2},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":3},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":4},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":5},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":6},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":7},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":8},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":9},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":10},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":11},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":12},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":13},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":14},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":15},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":16},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":17},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":18},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":19},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":20},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":21},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":22},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":23},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":24},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":25},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":26},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":27},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":28},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":29},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[68],"t":30},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":0.157},"s":[68],"t":31},{"o":{"x":0.167,"y":0.083},"i":{"x":0.833,"y":0.762},"s":[68],"t":32},{"o":{"x":0.167,"y":0.128},"i":{"x":0.833,"y":0.872},"s":[78.111],"t":33},{"o":{"x":0.167,"y":0.238},"i":{"x":0.833,"y":0.869},"s":[96.889],"t":34},{"o":{"x":0.167,"y":0.23},"i":{"x":0.833,"y":0.935},"s":[107],"t":35},{"o":{"x":0.167,"y":-0.292},"i":{"x":0.833,"y":0.654},"s":[112.729],"t":36},{"o":{"x":0.167,"y":0.11},"i":{"x":0.833,"y":0.866},"s":[111.459],"t":37},{"o":{"x":0.167,"y":0.22},"i":{"x":0.833,"y":0.924},"s":[107.448],"t":38},{"o":{"x":0.167,"y":-0.9},"i":{"x":0.833,"y":0.333},"s":[104.998],"t":39},{"o":{"x":0.167,"y":0.095},"i":{"x":0.833,"y":0.858},"s":[105.206],"t":40},{"o":{"x":0.167,"y":0.202},"i":{"x":0.833,"y":0.914},"s":[106.659],"t":41},{"o":{"x":0.167,"y":3.061},"i":{"x":0.833,"y":2.422},"s":[107.681],"t":42},{"o":{"x":0.167,"y":0.079},"i":{"x":0.833,"y":0.849},"s":[107.71],"t":43},{"o":{"x":0.167,"y":0.187},"i":{"x":0.833,"y":0.906},"s":[107.193],"t":44},{"o":{"x":0.167,"y":0.75},"i":{"x":0.833,"y":1.203},"s":[106.776],"t":45},{"o":{"x":0.167,"y":0.059},"i":{"x":0.833,"y":0.839},"s":[106.724],"t":46},{"o":{"x":0.167,"y":0.173},"i":{"x":0.833,"y":0.899},"s":[106.903],"t":47},{"o":{"x":0.167,"y":0.476},"i":{"x":0.833,"y":1.059},"s":[107.07],"t":48},{"o":{"x":0.167,"y":0.035},"i":{"x":0.833,"y":0.826},"s":[107.106],"t":49},{"o":{"x":0.167,"y":0.16},"i":{"x":0.833,"y":0.892},"s":[107.045],"t":50},{"o":{"x":0.167,"y":0.368},"i":{"x":0.833,"y":1.002},"s":[106.979],"t":51},{"o":{"x":0.167,"y":0.002},"i":{"x":0.833,"y":0.809},"s":[106.96],"t":52},{"o":{"x":0.167,"y":0.148},"i":{"x":0.833,"y":0.886},"s":[106.98],"t":53},{"o":{"x":0.167,"y":0.308},"i":{"x":0.833,"y":0.97},"s":[107.005],"t":54},{"o":{"x":0.167,"y":-0.046},"i":{"x":0.833,"y":0.784},"s":[107.015],"t":55},{"o":{"x":0.167,"y":0.135},"i":{"x":0.833,"y":0.879},"s":[107.009],"t":56},{"o":{"x":0.167,"y":0.269},"i":{"x":0.833,"y":0.95},"s":[106.999],"t":57},{"o":{"x":0.167,"y":-0.126},"i":{"x":0.833,"y":0.742},"s":[106.995],"t":58},{"o":{"x":0.167,"y":0.123},"i":{"x":0.833,"y":0.917},"s":[106.996],"t":59},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":60},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":61},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":62},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":63},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":64},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":65},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":66},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":67},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":68},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":69},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":70},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":71},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":72},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":73},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":74},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":75},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":76},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":77},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":78},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":79},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":80},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":81},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":82},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":83},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":84},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":85},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":86},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":87},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":88},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":89},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":90},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":91},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":92},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":93},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":94},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":95},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":96},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":97},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":98},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":99},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":100},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":101},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":102},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":103},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":104},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":105},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":106},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":107},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":108},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":109},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":110},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":111},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":112},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":113},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":114},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":115},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":116},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":117},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":118},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":119},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":120},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":121},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":122},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":123},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":124},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":125},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":126},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":127},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":128},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":129},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":130},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":131},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":132},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":133},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":134},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":135},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":136},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":137},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":138},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":139},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":140},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":141},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":142},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":143},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":144},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":145},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":146},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":147},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":148},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":149},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":150},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":151},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":152},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":153},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":154},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":155},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":156},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":157},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":158},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":159},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":160},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":161},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":162},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":163},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":164},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":165},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":166},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":167},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":168},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":169},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":170},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":171},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":172},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":173},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":174},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":175},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":176},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":177},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":178},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":179},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":180},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":181},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":182},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":183},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":184},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":185},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":186},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":187},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":188},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":189},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":190},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":191},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":192},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":193},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":194},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":195},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":196},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":197},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":198},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":199},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":200},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":201},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":202},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":203},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":204},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":205},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":206},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":207},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":208},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":209},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":210},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":211},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":212},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":213},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":214},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":215},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":216},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":217},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":218},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":219},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":220},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":221},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":222},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":223},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":224},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":225},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":226},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":227},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":228},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":229},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":230},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":231},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":232},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":233},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":234},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":235},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":236},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":237},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":238},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":239},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":240},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":241},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":242},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":243},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":244},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":245},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":246},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":247},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":248},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":249},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":250},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":251},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":252},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":253},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":254},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":255},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":256},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":257},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":258},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":259},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":260},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":261},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":262},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":263},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":264},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":265},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":266},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":267},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":268},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":269},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":270},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":271},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":272},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":273},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":274},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":275},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":276},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":277},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":278},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":279},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":280},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":281},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":282},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":283},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":284},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":285},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":286},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":287},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":288},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":289},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":290},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":291},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":292},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":293},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":294},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":295},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":296},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":297},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":298},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":299},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":300},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":301},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":302},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":303},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":304},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":305},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":306},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":307},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":308},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":309},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":310},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":311},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":312},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":313},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":314},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":315},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":316},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":317},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":318},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":319},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":320},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":321},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":322},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":323},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":324},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":325},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":326},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":327},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":328},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":329},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":330},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":331},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":332},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":333},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":334},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":335},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":336},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":337},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":338},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":339},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":340},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":341},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":342},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":343},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":344},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":345},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":346},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":347},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":348},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":349},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":350},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":351},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":352},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":353},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":354},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":355},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":356},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":357},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":358},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":359},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":360},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":361},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":362},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":363},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":364},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":365},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":366},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":367},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":368},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":369},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":370},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":371},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":372},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":373},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":374},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":375},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":376},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":377},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":378},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":379},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":380},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":381},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":382},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":383},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":384},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":385},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":386},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":387},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":388},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":389},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":390},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":391},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":392},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":393},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":394},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":395},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":396},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":397},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":398},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":399},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":400},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":401},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":402},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":403},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":404},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":405},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":406},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":407},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":408},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":409},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":410},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":411},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":412},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":413},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":414},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":415},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":416},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":417},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":418},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":419},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":420},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":421},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":422},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":423},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":424},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":425},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":426},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":427},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":428},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":429},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":430},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":431},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":432},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":433},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":434},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":435},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":436},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":437},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":438},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":439},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":440},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":441},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":442},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":443},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":444},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":445},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":446},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":447},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":448},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":449},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":450},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":451},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":452},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":453},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":454},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":455},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":456},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":457},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":458},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":459},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":460},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":461},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":462},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":463},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":464},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":465},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":466},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":467},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":468},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":469},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":470},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":471},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":472},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":473},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":474},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":475},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":476},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":477},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":478},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":479},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":480},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":481},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":482},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":483},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":484},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":485},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":486},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":487},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":488},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":489},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":490},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":491},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":492},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":493},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":494},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":495},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":496},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":497},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":498},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":499},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":500},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":501},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":502},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":503},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":504},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":505},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":506},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":507},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":508},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":509},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":510},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":511},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":512},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":513},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":514},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":515},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":516},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":517},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":518},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":519},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":520},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":521},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":522},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":523},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":524},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":525},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":526},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":527},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":528},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":529},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":530},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":531},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":532},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":533},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":534},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":535},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":536},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":537},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":538},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":539},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":540},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":541},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":542},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":543},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":544},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":545},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":546},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":547},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":548},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":549},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":550},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":551},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":552},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":553},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":554},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":555},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":556},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":557},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":558},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":559},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":560},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":561},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":562},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":563},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":564},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":565},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":566},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":567},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":568},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":569},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":570},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":571},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":572},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":573},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":574},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":575},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":576},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":577},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":578},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":579},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":580},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":581},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":582},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":583},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":584},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":585},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":586},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":587},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":588},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":589},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":590},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":591},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":592},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":593},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":594},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":595},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":596},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":597},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":598},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":599},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":600},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":601},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":602},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":603},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":604},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":605},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":606},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":607},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":608},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":609},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":610},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":611},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":612},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":613},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":614},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":615},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":616},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":617},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":618},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":619},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":620},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":621},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":622},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":623},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":624},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":625},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":626},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":627},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":628},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":629},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":630},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":631},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":632},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":633},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":634},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":635},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":636},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":637},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":638},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":639},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":640},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":641},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":642},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":643},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":644},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":645},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":646},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":647},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":648},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":649},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":650},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":651},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":652},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":653},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":654},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":655},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":656},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":657},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":658},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":659},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":660},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":661},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":662},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":663},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":664},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":665},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":666},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":667},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":668},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":669},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":670},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":671},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":672},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":673},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":674},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":675},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":676},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":677},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":678},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":679},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":680},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":681},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":682},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":683},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":684},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":685},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":686},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":687},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":688},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":689},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":690},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":691},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":692},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":693},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":694},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":695},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":696},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":697},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":698},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":699},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":700},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":701},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":702},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":703},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":704},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":705},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":706},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":707},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":708},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":709},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":710},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":711},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":712},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":713},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":714},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":715},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":716},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":717},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":718},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":719},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":720},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":721},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":722},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":723},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":724},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":725},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":726},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":727},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":728},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":729},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":730},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":731},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":732},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":733},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":734},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":735},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":736},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":737},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":738},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":739},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":740},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":741},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":742},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":743},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":744},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":745},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":746},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":747},{"o":{"x":0.167,"y":0},"i":{"x":0.833,"y":1},"s":[107],"t":748},{"s":[107],"t":749}],"ix":7},"os":{"a":0,"k":0,"ix":9},"r":{"a":0,"k":0,"ix":5},"sy":1},{"ty":"rd","bm":0,"hd":false,"mn":"ADBE Vector Filter - RC","nm":"Arredondar cantos 1","ix":2,"r":{"a":0,"k":40,"ix":1}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Traçado 1","lc":1,"lj":1,"ml":4,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":5,"ix":5},"c":{"a":0,"k":[1,1,1],"ix":3}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Preenchimento 1","c":{"a":0,"k":[1,1,1],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,23],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2}],"v":"5.1.8","fr":25,"op":66,"ip":28,"assets":[]} \ No newline at end of file diff --git a/assets/animations/lottie/rrt_ambulance.json b/assets/animations/lottie/rrt_ambulance.json new file mode 100644 index 0000000..a15eee6 --- /dev/null +++ b/assets/animations/lottie/rrt_ambulance.json @@ -0,0 +1 @@ +{"nm":"Main Scene","ddd":0,"h":500,"w":500,"meta":{"g":"@lottiefiles/creator 1.47.1"},"layers":[{"ty":4,"nm":"Layer 12","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,298.786,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[450.232,293.786,0],"t":30},{"s":[450.232,298.786,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 6","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":1},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":11},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,395.682,0],"t":21},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[63.907,400.682,0],"t":31},{"s":[63.907,395.682,0],"t":41}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.518,-3.779],[3.781,-0.517],[0.518,3.779],[-3.781,0.517]],"o":[[0.518,3.779],[-3.781,0.517],[-0.518,-3.779],[3.781,-0.517]],"v":[[6.846,-0.937],[0.938,6.842],[-6.846,0.937],[-0.938,-6.842]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":180,"ip":0,"hd":true,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,424.922,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[121.127,420.922,0],"t":30},{"s":[121.127,424.922,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-0.746,-5.442],[5.445,-0.745],[0.746,5.442],[-5.445,0.745]],"o":[[0.746,5.442],[-5.445,0.745],[-0.746,-5.442],[5.445,-0.745]],"v":[[9.859,-1.349],[1.351,9.853],[-9.859,1.349],[-1.351,-9.853]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":3,"nm":"Null 3","sr":1,"st":0,"op":129,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[50,50,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[131.911,173.859,0],"ix":2},"r":{"a":0,"k":138,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":0,"ix":11}},"ind":4},{"ty":4,"nm":"Layer 11","sr":1,"st":43,"op":129,"ip":43,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":43},{"s":[-100,100,100],"t":48}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[54.892,46.827,0],"t":43},{"s":[44.23,56.705,0],"t":48}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":5,"parent":4},{"ty":4,"nm":"Layer 10","sr":1,"st":31,"op":41,"ip":31,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":31},{"s":[-134,134,100],"t":41}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":31},{"s":[23.889,75.927,0],"t":41}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":36},{"s":[0],"t":41}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":6,"parent":4},{"ty":4,"nm":"Layer 9","sr":1,"st":18,"op":28,"ip":18,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":18},{"s":[-134,134,100],"t":28}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":18},{"s":[23.889,75.927,0],"t":28}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":23},{"s":[0],"t":28}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":7,"parent":4},{"ty":4,"nm":"Layer 8","sr":1,"st":7,"op":17,"ip":7,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-23,23,100],"t":7},{"s":[-134,134,100],"t":17}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[55.769,43.295,0],"t":7},{"s":[23.889,75.927,0],"t":17}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":12},{"s":[0],"t":17}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":8,"parent":4},{"ty":4,"nm":"Layer 7","sr":1,"st":0,"op":5,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[379.47,131.675,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[-100,100,100],"t":0},{"s":[-134,134,100],"t":5}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[44.23,56.705,0],"t":0},{"s":[23.889,75.927,0],"t":5}],"ix":2},"r":{"a":0,"k":-92,"ix":10},"sa":{"a":0,"k":0},"o":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100],"t":0},{"s":[0],"t":5}],"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[10.036,0],[-10.036,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[405.776,141.137],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[0,-10.036],[0,10.036]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[368.129,105.249],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[7.096,-7.096],[-7.096,7.096]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[391.777,118.706],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":9,"parent":4},{"ty":4,"nm":"Layer 5","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[396.051,136.57,0],"ix":1},"s":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":4},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":8},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":12},{"o":{"x":0.191,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":16},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":23},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":27},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[100,100,100],"t":31},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[110,110,100],"t":35},{"s":[100,100,100],"t":39}],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[396.051,136.57,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[-13.769,0],[0,0],[-7.045,-11.709],[0,0]],"o":[[0,0],[7.01,-11.85],[0,0],[13.665,0],[0,0],[0,0]],"v":[[-64.065,49.563],[-17.385,-30.444],[16.14,-49.563],[16.14,-49.563],[49.516,-30.693],[64.065,-6.511]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"d":[{"nm":"dash","n":"d","v":{"a":0,"k":6,"ix":1}},{"nm":"gap","n":"g","v":{"a":0,"k":10,"ix":2}},{"nm":"gap2","n":"g","v":{"a":0,"k":10,"ix":4}},{"nm":"gap3","n":"g","v":{"a":0,"k":10,"ix":6}}],"c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[386.167,114.696],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[7.779,7.779],[-7.779,7.779],[-7.779,-7.779],[7.779,-7.779]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.391,184.828],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[-10.361,-23.305],[-10.361,5.407],[-7.127,23.336],[-0.018,23.336],[-0.018,23.348],[7.103,23.34],[10.348,5.39],[10.361,-23.348]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"tr","a":{"a":0,"k":[401.402,140.911],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,140.911],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[-6.092,-10.552],[0,0],[12.184,0],[0,0],[-6.092,10.552],[0,0]],"o":[[0,0],[6.092,10.552],[0,0],[-12.185,0],[0,0],[6.092,-10.552]],"v":[[13.709,-53.595],[66.454,37.767],[52.746,61.509],[-52.746,61.509],[-66.454,37.767],[-13.706,-53.595]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[401.402,146.499],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":10},{"ty":4,"nm":"Layer 4","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[351.654,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[351.654,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.652,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[351.654,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":11},{"ty":4,"nm":"Layer 3","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[91.751,335.209,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[91.751,335.209,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-5.899],[5.899,0],[0,5.899],[-5.899,0]],"o":[[0,5.899],[-5.899,0],[0,-5.899],[5.899,0]],"v":[[10.682,0],[0,10.682],[-10.682,0],[0,-10.682]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.749,334.504],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-15.159],[15.159,0],[0,15.159],[-15.159,0]],"o":[[0,15.159],[-15.159,0],[0,-15.159],[15.159,0]],"v":[[27.448,0],[0,27.448],[-27.448,0],[0,-27.448]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[91.751,335.209],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":12},{"ty":0,"nm":"Nested Scene 2","sr":1,"st":0,"op":61,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[32.09649981558323,13.458049893379211]},"s":{"a":0,"k":[-166.7344,166.7344]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[271.5349,244.9784]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"w":500,"h":500,"refId":"precomp_Shape Layer - SVG_25397d66-42bd-4739-a446-0631d3585a8b","ind":13},{"ty":4,"nm":"Layer 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[221.146,268.245,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":0},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":5},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":10},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":15},{"o":{"x":0.324,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":20},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":25},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,268.245,0],"t":30},{"o":{"x":0.333,"y":0},"i":{"x":0.667,"y":1},"s":[221.146,265.245,0],"t":35},{"s":[221.146,268.245,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 2","ix":2,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0.02204895019528408],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.8690489501953],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 3","ix":3,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[5.305,0],[0,0],[0,-5.305],[0,0],[0,0],[0,0]],"o":[[0,0],[-5.305,0],[0,0],[0,0],[0,0],[0,-5.305]],"v":[[0,-10.37],[0,-10.37],[-9.605,-0.765],[-9.605,10.37],[9.605,10.37],[9.605,-0.765]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0.022049903869628906],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[131.871,184.22404990386963],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 4","ix":4,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":true,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[30.878,-9.505],[9.504,-9.505],[9.504,-30.878],[-9.504,-30.878],[-9.504,-9.505],[-30.878,-9.505],[-30.878,9.504],[-9.504,9.504],[-9.504,30.878],[9.504,30.878],[9.504,9.504],[30.878,9.504]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0.022049903869628906],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[280.853,235.31804990386962],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 7","ix":5,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[-31.952,16.61],[31.952,16.61],[31.952,-16.61],[-14.701,-16.61]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.6627,0.6863,0.7686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[111.137,230.612],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 8","ix":6,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 9","ix":7,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 10","ix":8,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 11","ix":9,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,-4.691],[0,0],[4.691,0],[0,0],[0,1.98],[1.554,3.425],[0,0]],"o":[[0,0],[0,4.691],[0,0],[0.396,-1.861],[0,-3.999],[0,0],[4.691,0]],"v":[[17.798,0],[17.798,0],[9.305,8.493],[-15.996,8.493],[-15.392,2.732],[-17.798,-8.493],[9.305,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[394.495,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 12","ix":10,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,1.98],[1.554,3.425]],"o":[[-1.554,3.425],[0,1.98],[0,0],[0.396,-1.861],[0,-3.999],[0,0]],"v":[[104.91,-8.493],[102.505,2.732],[103.108,8.493],[-103.109,8.493],[-102.505,2.732],[-104.91,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[221.701,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 13","ix":11,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,-3.999],[-0.396,-1.861],[0,0],[0,4.691],[0,0],[-4.691,0]],"o":[[-1.544,3.425],[0,1.98],[0,0],[-4.691,0],[0,0],[0,-4.691],[0,0]],"v":[[18.352,-8.493],[15.947,2.732],[16.55,8.493],[-9.859,8.493],[-18.352,0],[-18.352,0],[-9.859,-8.493]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.8706,0.8824,0.9255],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[48.352,332.475],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":1,"hd":false,"mn":"ADBE Vector Group","nm":"Group 14","ix":12,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[5.721,9.918],[-3.465,8.879]],"o":[[0,0],[0,0],[-11.453,0],[-4.89,-8.463],[0,0]],"v":[[42.236,-21.524],[42.236,21.524],[-10.514,21.524],[-37.943,5.687],[-40.081,-21.524]]},"ix":2}},{"ty":"gf","bm":0,"hd":false,"mn":"ADBE Vector Graphic - G-Fill","nm":"Gradient Fill 1","e":{"a":0,"k":[41.298,-0.235],"ix":6},"g":{"p":3,"k":{"a":0,"k":[0,0.792156862745098,0.8117647058823529,0.8666666666666667,0.5,0.8627450980392157,0.8745098039215686,0.9058823529411765,1,0.9333333333333333,0.9411764705882353,0.9450980392156862],"ix":9}},"t":1,"a":{"a":0,"k":0},"h":{"a":0,"k":0},"s":{"a":0,"k":[-43.173,-0.235],"ix":5},"r":1,"o":{"a":0,"k":100,"ix":10}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[359.173,201.235],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 15","ix":13,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[119.713,9.09],[-119.713,9.09],[-119.713,-9.09],[119.713,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.689,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 16","ix":14,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,9.09],[-59.545,9.09],[-59.545,-9.09],[59.545,-9.09]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9294,0.1098,0.1686],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.432,297.261],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 17","ix":15,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[11.166,0],[4.286,-9.562],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[-4.276,-9.562],[-11.156,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[59.545,-64.707],[59.545,64.707],[14.358,64.707],[-10.685,48.483],[-35.729,64.707],[-59.545,64.707],[-59.545,11.067],[-23.247,-12.056],[1.777,-64.707]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[102.433,259.275],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]},{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 18","ix":16,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[44.92,72.136],[-119.713,72.136],[-119.713,-72.136],[119.713,-72.136],[119.713,72.136],[95.007,72.136]]},"ix":2}},{"ty":"fl","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Fill","nm":"Fill 1","c":{"a":0,"k":[0.9608,0.9608,0.9608],"ix":4},"r":1,"o":{"a":0,"k":100,"ix":5}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[281.691,251.847],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":14},{"ty":0,"nm":"Pre-comp 1","sr":1,"st":0,"op":180,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":true,"ao":0,"ks":{"a":{"a":0,"k":[250,250,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":0,"k":[250,250,0],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"masksProperties":[{"nm":"Mask 1","inv":false,"mode":"a","x":{"a":0,"k":0,"ix":4},"o":{"a":0,"k":100,"ix":3},"pt":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0]],"v":[[27,346],[27,380],[458,380],[458,349]]},"ix":1}}],"w":500,"h":500,"refId":"comp_0_f77fbf55-eb10-4e38-b70c-2a5f270c971e","ind":15}],"v":"5.7.0","fr":30,"op":61,"ip":0,"assets":[{"nm":"Pre-comp 1","id":"comp_0_f77fbf55-eb10-4e38-b70c-2a5f270c971e","layers":[{"ty":4,"nm":"Layer 8","sr":1,"st":22,"op":75,"ip":22,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":22},{"s":[241.96,362.657,0],"t":42}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":1},{"ty":4,"nm":"Layer 7","sr":1,"st":20,"op":40,"ip":20,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":20},{"s":[678.96,362.657,0],"t":40}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":2},{"ty":4,"nm":"Layer 6","sr":1,"st":2,"op":22,"ip":2,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[-197.04,362.657,0],"t":2},{"s":[241.96,362.657,0],"t":22}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":3},{"ty":4,"nm":"Layer 2","sr":1,"st":0,"op":20,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6},"sk":{"a":0,"k":0},"p":{"a":1,"k":[{"o":{"x":0.167,"y":0.167},"i":{"x":0.833,"y":0.833},"s":[241.96,362.657,0],"t":0},{"s":[678.96,362.657,0],"t":20}],"ix":2},"r":{"a":0,"k":0,"ix":10},"sa":{"a":0,"k":0},"o":{"a":0,"k":100,"ix":11}},"shapes":[{"ty":"gr","bm":0,"hd":false,"mn":"ADBE Vector Group","nm":"Group 1","ix":1,"cix":2,"np":2,"it":[{"ty":"sh","bm":0,"hd":false,"mn":"ADBE Vector Shape - Group","nm":"Path 1","ix":1,"d":1,"ks":{"a":0,"k":{"c":false,"i":[[0,0],[0,0]],"o":[[0,0],[0,0]],"v":[[211.957,0],[-211.957,0]]},"ix":2}},{"ty":"st","bm":0,"hd":false,"mn":"ADBE Vector Graphic - Stroke","nm":"Stroke 1","lc":1,"lj":1,"ml":10,"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"c":{"a":0,"k":[0.1804,0.1882,0.2235],"ix":3}},{"ty":"tr","a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"sk":{"a":0,"k":0,"ix":4},"p":{"a":0,"k":[0,0],"ix":2},"r":{"a":0,"k":0,"ix":6},"sa":{"a":0,"k":0,"ix":5},"o":{"a":0,"k":100,"ix":7}}]}],"ind":4}]},{"nm":"Nested Scene 2","id":"precomp_Shape Layer - SVG_25397d66-42bd-4739-a446-0631d3585a8b","layers":[{"ty":4,"nm":"Shape Layer - SVG","sr":1,"st":0,"op":61,"ip":0,"hd":false,"ddd":0,"bm":0,"hasMask":false,"ao":0,"ks":{"a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}},"shapes":[{"ty":"gr","bm":0,"hd":false,"nm":"Group 1","it":[{"ty":"sh","bm":0,"hd":false,"nm":"Path 1","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.3680000000000003,-0.696],[-0.6720000000000006,-1.1759999999999997],[0,-1.4400000000000004],[0.9600000000000009,-1.3440000000000012],[1.8960000000000008,-0.5039999999999996],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.943999999999999,0],[1.3679999999999986,0.6720000000000002],[0.6960000000000015,1.1520000000000001],[0,1.6559999999999988],[-0.9599999999999973,1.3200000000000003],[0,0],[0,0],[0,0]],"v":[[13.444,26],[7.9,16.208],[5.524,16.208],[5.524,26],[0.484,26],[0.484,0.872],[9.916,0.872],[14.884,1.916],[17.944,4.688],[18.988,8.576],[17.548,13.076],[13.264,15.812],[19.276,26],[13.444,26]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 2","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.6719999999999988,0.6479999999999997],[0,1.1760000000000002],[0.6720000000000006,0.6240000000000006],[1.3679999999999986,0],[0,0],[0,0]],"o":[[0,0],[1.3679999999999986,0],[0.6720000000000006,-0.6719999999999988],[0,-1.1519999999999992],[-0.6719999999999988,-0.6479999999999997],[0,0],[0,0],[0,0]],"v":[[5.524,12.428],[9.736,12.428],[12.796,11.456],[13.804,8.684],[12.796,6.02],[9.736,5.048],[5.524,5.048],[5.524,12.428]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 3","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[-1.368000000000002,-0.696],[-0.6720000000000041,-1.1759999999999997],[0,-1.4400000000000004],[0.9600000000000009,-1.3440000000000012],[1.8959999999999937,-0.5039999999999996],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[1.9440000000000026,0],[1.368000000000002,0.6720000000000002],[0.695999999999998,1.1520000000000001],[0,1.6559999999999988],[-0.9600000000000009,1.3200000000000003],[0,0],[0,0],[0,0]],"v":[[36.5065,26],[30.9625,16.208],[28.5865,16.208],[28.5865,26],[23.5465,26],[23.5465,0.872],[32.9785,0.872],[37.9465,1.916],[41.0065,4.688],[42.0505,8.576],[40.6105,13.076],[36.3265,15.812],[42.3385,26],[36.5065,26]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 4","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[-0.671999999999997,0.6479999999999997],[0,1.1760000000000002],[0.6720000000000041,0.6240000000000006],[1.368000000000002,0],[0,0],[0,0]],"o":[[0,0],[1.368000000000002,0],[0.6720000000000041,-0.6719999999999988],[0,-1.1519999999999992],[-0.671999999999997,-0.6479999999999997],[0,0],[0,0],[0,0]],"v":[[28.5865,12.428],[32.7985,12.428],[35.8585,11.456],[36.8665,8.684],[35.8585,6.02],[32.7985,5.048],[28.5865,5.048],[28.5865,12.428]]}}},{"ty":"sh","bm":0,"hd":false,"nm":"Path 5","d":1,"ks":{"a":0,"k":{"c":true,"i":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"o":[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]],"v":[[63.709,0.872],[63.709,4.94],[57.013,4.94],[57.013,26],[51.973,26],[51.973,4.94],[45.277,4.94],[45.277,0.872],[63.709,0.872]]}}},{"ty":"fl","bm":0,"hd":false,"nm":"Fill","c":{"a":0,"k":[0.1804,0.1882,0.2235]},"r":1,"o":{"a":0,"k":100}},{"ty":"tr","a":{"a":0,"k":[0,0]},"s":{"a":0,"k":[100,100]},"sk":{"a":0,"k":0},"p":{"a":0,"k":[0,0]},"r":{"a":0,"k":0},"sa":{"a":0,"k":0},"o":{"a":0,"k":100}}]}],"ind":1}]}]} \ No newline at end of file diff --git a/assets/images/svg/call_ambulance_icon.svg b/assets/images/svg/call_ambulance_icon.svg new file mode 100644 index 0000000..de3bbc2 --- /dev/null +++ b/assets/images/svg/call_ambulance_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/nearest_er_icon.svg b/assets/images/svg/nearest_er_icon.svg new file mode 100644 index 0000000..73637da --- /dev/null +++ b/assets/images/svg/nearest_er_icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/images/svg/rrt_icon.svg b/assets/images/svg/rrt_icon.svg new file mode 100644 index 0000000..0530487 --- /dev/null +++ b/assets/images/svg/rrt_icon.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/assets/images/svg/waiting_time_clock.svg b/assets/images/svg/waiting_time_clock.svg new file mode 100644 index 0000000..6207841 --- /dev/null +++ b/assets/images/svg/waiting_time_clock.svg @@ -0,0 +1,3 @@ + + + diff --git a/lib/core/api/api_client.dart b/lib/core/api/api_client.dart index 2cbe960..05ed866 100644 --- a/lib/core/api/api_client.dart +++ b/lib/core/api/api_client.dart @@ -174,7 +174,7 @@ class ApiClientImp implements ApiClient { } // body['TokenID'] = "@dm!n"; - // body['PatientID'] = 4772172; + // body['PatientID'] = 3966014; // body['PatientTypeID'] = 1; // // body['PatientOutSA'] = 0; diff --git a/lib/core/api_consts.dart b/lib/core/api_consts.dart index 9591cfe..ed2bba1 100644 --- a/lib/core/api_consts.dart +++ b/lib/core/api_consts.dart @@ -724,6 +724,8 @@ const DEACTIVATE_ACCOUNT = 'Services/Patients.svc/REST/PatientAppleActivation_In const FAMILY_FILES= 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus'; +var GET_PRESCRIPTION_INSTRUCTIONS_PDF = 'Services/ChatBot_Service.svc/REST/Chatbot_SendMedicationInstructionByWhatsApp'; + class ApiConsts { static const maxSmallScreen = 660; @@ -733,6 +735,8 @@ class ApiConsts { static String baseUrl = 'https://hmgwebservices.com/'; // HIS API URL PROD + static String RCBaseUrl = 'https://rc.hmg.com/'; // RC API URL PROD + static String SELECT_DEVICE_IMEI = 'Services/Patients.svc/REST/Patient_SELECTDeviceIMEIbyIMEI'; static num VERSION_ID = 18.9; @@ -762,6 +766,7 @@ class ApiConsts { TAMARA_URL = "https://mdlaboratories.com/tamaralive/Home/Checkout"; GET_TAMARA_INSTALLMENTS_URL = "https://mdlaboratories.com/tamaralive/Home/GetInstallments"; GET_TAMARA_PAYMENT_STATUS = 'https://mdlaboratories.com/tamaralive/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/'; break; case AppEnvironmentTypeEnum.dev: baseUrl = "https://uat.hmgwebservices.com/"; @@ -771,6 +776,7 @@ class ApiConsts { TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; break; case AppEnvironmentTypeEnum.uat: baseUrl = "https://uat.hmgwebservices.com/"; @@ -780,6 +786,7 @@ class ApiConsts { TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; break; case AppEnvironmentTypeEnum.preProd: @@ -790,6 +797,7 @@ class ApiConsts { TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/'; break; case AppEnvironmentTypeEnum.qa: baseUrl = "https://uat.hmgwebservices.com/"; @@ -799,6 +807,7 @@ class ApiConsts { TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; break; case AppEnvironmentTypeEnum.staging: baseUrl = "https://uat.hmgwebservices.com/"; @@ -808,6 +817,7 @@ class ApiConsts { TAMARA_URL = "https://epharmacy.hmg.com/tamara/Home/Checkout"; GET_TAMARA_INSTALLMENTS_URL = "https://epharmacy.hmg.com/tamara/Home/getinstallments"; GET_TAMARA_PAYMENT_STATUS = 'https://epharmacy.hmg.com/tamara/api/OnlineTamara/order_status?orderid='; + RCBaseUrl = 'https://rc.hmg.com/test/'; break; } } @@ -827,18 +837,17 @@ class ApiConsts { static final String insertPatientDeviceIMEIData = 'Services/Patients.svc/REST/Patient_INSERTDeviceIMEI'; static final String insertPatientMobileData = 'Services/MobileNotifications.svc/REST/Insert_PatientMobileDeviceInfo'; - static final String getPatientMobileData = '/Services/Authentication.svc/REST/GetMobileLoginInfo'; - static final String getPrivileges = 'Services/Patients.svc/REST/Service_Privilege'; - static final String registerUser = 'Services/Authentication.svc/REST/PatientRegistration'; - - static final String addFamilyFile = 'Services/Patients.svc/REST/ShareFamilyFileService'; - static final String sendFamilyFileActivation = 'Services/Authentication.svc/REST/SendActivationCodeForFamilyFile'; - static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile'; - static final String getAllPendingRecordsByResponseId = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId'; - static final String getAllSharedRecordsByStatus = 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus'; - static final String removeFileFromFamilyMembers = 'Services/Authentication.svc/REST/ActiveDeactive_PatientFile'; - static final String acceptAndRejectFamilyFile = 'Services/Authentication.svc/REST/Update_FileStatus'; - + static final String getPatientMobileData = '/Services/Authentication.svc/REST/GetMobileLoginInfo'; + static final String getPrivileges = 'Services/Patients.svc/REST/Service_Privilege'; + static final String registerUser = 'Services/Authentication.svc/REST/PatientRegistration'; + + static final String addFamilyFile = 'Services/Patients.svc/REST/ShareFamilyFileService'; + static final String sendFamilyFileActivation = 'Services/Authentication.svc/REST/SendActivationCodeForFamilyFile'; + static final String checkActivationCodeForFamily = 'Services/Authentication.svc/REST/CheckActivationCodeForFamilyFile'; + static final String getAllPendingRecordsByResponseId = 'Services/Authentication.svc/REST/GetAllPendingRecordsByResponseId'; + static final String getAllSharedRecordsByStatus = 'Services/Authentication.svc/REST/GetAllSharedRecordsByStatus'; + static final String removeFileFromFamilyMembers = 'Services/Authentication.svc/REST/ActiveDeactive_PatientFile'; + static final String acceptAndRejectFamilyFile = 'Services/Authentication.svc/REST/Update_FileStatus'; // static values for Api static final double appVersionID = 18.7; diff --git a/lib/core/app_assets.dart b/lib/core/app_assets.dart index 1e9eaa4..e194bb3 100644 --- a/lib/core/app_assets.dart +++ b/lib/core/app_assets.dart @@ -155,6 +155,10 @@ class AppAssets { static const String switch_user = '$svgBasePath/switch_user.svg'; static const String activeCheck = '$svgBasePath/active-check.svg'; static const String deleteIcon = '$svgBasePath/delete_icon.svg'; + static const String call_ambulance_icon = '$svgBasePath/call_ambulance_icon.svg'; + static const String nearest_er_icon = '$svgBasePath/nearest_er_icon.svg'; + static const String rrt_icon = '$svgBasePath/rrt_icon.svg'; + static const String waiting_time_clock = '$svgBasePath/waiting_time_clock.svg'; //bottom navigation// static const String homeBottom = '$svgBasePath/home_bottom.svg'; @@ -199,4 +203,8 @@ class AppAnimations { static const String noData = '$lottieBasePath/Nodata.json'; static const String ripple = '$lottieBasePath/Ripple.json'; static const String pending_loading_animation = '$lottieBasePath/pending_loading_animation.json'; + + static const String ambulance = '$lottieBasePath/ambulance.json'; + static const String ambulance_alert = '$lottieBasePath/ambulance_alert.json'; + static const String rrt_ambulance = '$lottieBasePath/rrt_ambulance.json'; } diff --git a/lib/core/common_models/data_points.dart b/lib/core/common_models/data_points.dart index c35d190..3f5065c 100644 --- a/lib/core/common_models/data_points.dart +++ b/lib/core/common_models/data_points.dart @@ -8,6 +8,7 @@ class DataPoint { String label; String referenceValue; String actualValue; + String? unitOfMeasurement ; DateTime time; String displayTime; @@ -18,6 +19,7 @@ class DataPoint { required this.actualValue, required this.time, required this.displayTime, + this.unitOfMeasurement }); @override diff --git a/lib/core/dependencies.dart b/lib/core/dependencies.dart index 7337dfa..a82a9ad 100644 --- a/lib/core/dependencies.dart +++ b/lib/core/dependencies.dart @@ -9,6 +9,8 @@ import 'package:hmg_patient_app_new/features/book_appointments/book_appointments import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/common/common_repo.dart'; import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_repo.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_repo.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_repo.dart'; @@ -38,6 +40,7 @@ import 'package:hmg_patient_app_new/services/localauth_service.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; +import 'package:http/http.dart'; import 'package:local_auth/local_auth.dart'; import 'package:logger/web.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -99,6 +102,7 @@ class AppDependencies { getIt.registerLazySingleton(() => HabibWalletRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => MedicalFileRepoImp(loggerService: getIt(), apiClient: getIt())); getIt.registerLazySingleton(() => ImmediateLiveCareRepoImp(loggerService: getIt(), apiClient: getIt())); + getIt.registerLazySingleton(() => EmergencyServicesRepoImp(loggerService: getIt(), apiClient: getIt())); // ViewModels // Global/shared VMs → LazySingleton @@ -165,12 +169,6 @@ class AppDependencies { myAppointmentsViewModel: getIt(), ), ); - getIt.registerLazySingleton( - () => AppointmentViaRegionViewmodel( - navigationService: getIt(), - appState: getIt(), - ), - ); getIt.registerLazySingleton( () => AuthenticationViewModel( @@ -187,7 +185,21 @@ class AppDependencies { ); getIt.registerLazySingleton( - () => AppointmentViaRegionViewmodel(navigationService: getIt(), appState: getIt()), + () => + AppointmentViaRegionViewmodel( + navigationService: getIt(), + appState: getIt(), + ), + ); + + getIt.registerLazySingleton( + () => EmergencyServicesViewModel( + locationUtils: getIt(), + navServices: getIt(), + emergencyServicesRepo: getIt(), + appState: getIt(), + errorHandlerService: getIt(), + ), ); // Screen-specific VMs → Factory diff --git a/lib/core/location_util.dart b/lib/core/location_util.dart index db8bef4..487b228 100644 --- a/lib/core/location_util.dart +++ b/lib/core/location_util.dart @@ -1,16 +1,20 @@ import 'dart:io'; import 'dart:ui'; +import 'package:easy_localization/easy_localization.dart'; import 'package:geolocator/geolocator.dart'; import 'package:gms_check/gms_check.dart'; import 'package:google_maps_flutter/google_maps_flutter.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:huawei_location/huawei_location.dart' as HmsLocation show FusedLocationProviderClient, Location, LocationSettingsRequest, LocationRequest; import 'package:location/location.dart' show Location, PermissionStatus, LocationData; -import 'package:permission_handler/permission_handler.dart' show Permission, PermissionListActions, PermissionStatusGetters; +import 'package:permission_handler/permission_handler.dart' show Permission, PermissionListActions, PermissionStatusGetters, openAppSettings; class LocationUtils { NavigationService navigationService; @@ -32,21 +36,60 @@ class LocationUtils { isGMSDevice = GmsCheck().checkGmsAvailability(); } - void getLocation({Function(LatLng)? onSuccess, VoidCallback? onFailure}) async { + // final defaultCallbackForLocationDenied = (){ + // showCommonBottomSheetWithoutHeight( + // title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + // navigationService.navigatorKey.currentContext!, + // child: Utils.getWarningWidget( + // loadingText: + // "Please grant location permission from app settings to see better results" + // .needTranslation, + // isShowActionButtons: true, + // onCancelTap: () { + // navigationService.pop(); + // }, + // onConfirmTap: () async { + // navigationService.pop(); + // openAppSettings(); + // }), + // callBackFunc: () {}, + // isFullScreen: false, + // isCloseButtonVisible: true, + // ); + // } + + void getLocation( + {Function(LatLng)? onSuccess, + VoidCallback? onFailure, + bool isShowConfirmDialog = false, + VoidCallback? onLocationDeniedForever}) async { + this.isShowConfirmDialog = isShowConfirmDialog; if (Platform.isIOS) { - getCurrentLocation(onFailure: onFailure, onSuccess: onSuccess); + getCurrentLocation( + onFailure: onFailure, + onSuccess: onSuccess, + onLocationDeniedForever: onLocationDeniedForever); return; } if (await isGMSDevice ?? true) { - getCurrentLocation(onFailure: onFailure, onSuccess: onSuccess); + getCurrentLocation( + onFailure: onFailure, + onSuccess: onSuccess, + onLocationDeniedForever: onLocationDeniedForever); return; } - getHMSLocation(onFailure: onFailure, onSuccess: onSuccess); + getHMSLocation( + onFailure: onFailure, + onSuccess: onSuccess, + onLocationDeniedForever: onLocationDeniedForever); } - void getCurrentLocation({Function(LatLng)? onSuccess, VoidCallback? onFailure}) async { + void getCurrentLocation( + {Function(LatLng)? onSuccess, + VoidCallback? onFailure, + VoidCallback? onLocationDeniedForever}) async { var location = Location(); bool isLocationEnabled = await location.serviceEnabled(); @@ -68,6 +111,31 @@ class LocationUtils { onFailure?.call(); return; } + } else if (permissionGranted == LocationPermission.deniedForever) { + appState.resetLocation(); + if(onLocationDeniedForever == null && isShowConfirmDialog){ + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + navigationService.navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: + "Please grant location permission from app settings to see better results" + .needTranslation, + isShowActionButtons: true, + onCancelTap: () { + navigationService.pop(); + }, + onConfirmTap: () async { + navigationService.pop(); + openAppSettings(); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + onLocationDeniedForever?.call(); + return; } Position? currentLocation = await Geolocator.getLastKnownPosition(); @@ -185,7 +253,10 @@ class LocationUtils { appState.userLong = locationData.longitude; } - void getHMSLocation({VoidCallback? onFailure, Function(LatLng p1)? onSuccess}) async { + void getHMSLocation( + {VoidCallback? onFailure, + Function(LatLng p1)? onSuccess, + VoidCallback? onLocationDeniedForever}) async { try { var location = Location(); HmsLocation.FusedLocationProviderClient locationService = HmsLocation.FusedLocationProviderClient()..initFusedLocationService(); @@ -206,7 +277,32 @@ class LocationUtils { LocationPermission permissionGranted = await Geolocator.checkPermission(); if (permissionGranted == LocationPermission.denied) { permissionGranted = await Geolocator.requestPermission(); - if (permissionGranted != LocationPermission.whileInUse && permissionGranted != LocationPermission.always) { + if (permissionGranted == LocationPermission.deniedForever) { + appState.resetLocation(); + if(onLocationDeniedForever == null && isShowConfirmDialog){ + showCommonBottomSheetWithoutHeight( + title: LocaleKeys.notice.tr(context: navigationService.navigatorKey.currentContext!), + navigationService.navigatorKey.currentContext!, + child: Utils.getWarningWidget( + loadingText: + "Please grant location permission from app settings to see better results" + .needTranslation, + isShowActionButtons: true, + onCancelTap: () { + navigationService.pop(); + }, + onConfirmTap: () async { + navigationService.pop(); + openAppSettings(); + }), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + onLocationDeniedForever?.call(); + return; + } else if (permissionGranted != LocationPermission.whileInUse && permissionGranted != LocationPermission.always) { appState.resetLocation(); onFailure?.call(); return; diff --git a/lib/core/utils/debouncer.dart b/lib/core/utils/debouncer.dart new file mode 100644 index 0000000..529e0a3 --- /dev/null +++ b/lib/core/utils/debouncer.dart @@ -0,0 +1,19 @@ +import 'dart:async'; +import 'dart:ui'; + +class Debouncer { + final int milliseconds; + VoidCallback? action; + Timer? _timer; + + Debouncer({required this.milliseconds}); + + void run(VoidCallback action) { + _timer?.cancel(); + _timer = Timer(Duration(milliseconds: milliseconds), action); + } + + void dispose() { + _timer?.cancel(); + } +} \ No newline at end of file diff --git a/lib/core/utils/push_notification_handler.dart b/lib/core/utils/push_notification_handler.dart index f59d657..2e0d7c3 100644 --- a/lib/core/utils/push_notification_handler.dart +++ b/lib/core/utils/push_notification_handler.dart @@ -15,7 +15,6 @@ import 'package:flutter_ios_voip_kit_karmm/flutter_ios_voip_kit.dart'; import 'package:flutter_local_notifications/flutter_local_notifications.dart'; import 'package:hmg_patient_app_new/core/utils/local_notifications.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:permission_handler/permission_handler.dart'; import '../cache_consts.dart'; @@ -355,7 +354,6 @@ class PushNotificationHandler { } onToken(String token) async { - print("Push Notification Token: " + token); await Utils.saveStringFromPrefs(CacheConst.pushToken, token); } @@ -370,7 +368,9 @@ class PushNotificationHandler { Future requestPermissions() async { try { if (Platform.isIOS) { - await flutterLocalNotificationsPlugin.resolvePlatformSpecificImplementation()?.requestPermissions(alert: true, badge: true, sound: true); + await flutterLocalNotificationsPlugin + .resolvePlatformSpecificImplementation() + ?.requestPermissions(alert: true, badge: true, sound: true); } else if (Platform.isAndroid) { Map statuses = await [ Permission.notification, diff --git a/lib/core/utils/size_utils.dart b/lib/core/utils/size_utils.dart index e569021..dbe6f2f 100644 --- a/lib/core/utils/size_utils.dart +++ b/lib/core/utils/size_utils.dart @@ -1,25 +1,41 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; // These are the Viewport values of your Figma Design. // These are used in the code as a reference to create your UI Responsively. -final num FIGMA_DESIGN_WIDTH = SizeUtils.width; -final num FIGMA_DESIGN_HEIGHT = SizeUtils.height; -const num FIGMA_DESIGN_STATUS_BAR = 0; +const num figmaDesignWidth = 375; // iPhone X / 12 base width +const num figmaDesignHeight = 812; // iPhone X / 12 base height extension ResponsiveExtension on num { - double get _width => SizeUtils.width; + double get _screenWidth => SizeUtils.width; - double get h => ((this * _width) / FIGMA_DESIGN_WIDTH); + double get _screenHeight => SizeUtils.height; - double get fSize => ((this * _width) / FIGMA_DESIGN_WIDTH); - static double get screenHeight => SizeUtils.height; + /// Scale horizontally (width-based) + double get w => (this * _screenWidth) / figmaDesignWidth; + + /// Scale vertically (height-based) + double get h => (this * _screenHeight) / figmaDesignHeight; + + //radius + double get r => (this * _screenWidth) / figmaDesignWidth; + + /// Scale text size + double get f { + double scale = _screenWidth / figmaDesignWidth; + if (scale > 1.6) scale = 1.6; // optional clamp for tablets + return this * scale; + } - /// Full screen width + /// Optional: direct accessors for full width/height static double get screenWidth => SizeUtils.width; + + static double get screenHeight => SizeUtils.height; } extension FormatExtension on double { double toDoubleValue({int fractionDigits = 2}) { - return double.parse(this.toStringAsFixed(fractionDigits)); + return double.parse(toStringAsFixed(fractionDigits)); } double isNonZero({num defaultValue = 0.0}) { @@ -36,7 +52,7 @@ typedef ResponsiveBuild = Widget Function( ); class Sizer extends StatelessWidget { - const Sizer({Key? key, required this.builder}) : super(key: key); + const Sizer({super.key, required this.builder}); /// Builds the widget whenever the orientation changes. final ResponsiveBuild builder; @@ -81,17 +97,46 @@ class SizeUtils { ) { boxConstraints = constraints; orientation = currentOrientation; + + double screenWidth; + double screenHeight; + if (orientation == Orientation.portrait) { - width = boxConstraints.maxWidth.isNonZero( - defaultValue: FIGMA_DESIGN_WIDTH, + screenWidth = boxConstraints.maxWidth.isNonZero( + defaultValue: figmaDesignWidth, ); - height = boxConstraints.maxHeight.isNonZero(); + screenHeight = boxConstraints.maxHeight.isNonZero(); } else { - width = boxConstraints.maxHeight.isNonZero( - defaultValue: FIGMA_DESIGN_WIDTH, + screenWidth = boxConstraints.maxHeight.isNonZero( + defaultValue: figmaDesignWidth, ); - height = boxConstraints.maxWidth.isNonZero(); + screenHeight = boxConstraints.maxWidth.isNonZero(); } - deviceType = DeviceType.mobile; + + width = screenWidth; + height = screenHeight; + + // Fix device type detection + double longerSide = screenWidth > screenHeight ? screenWidth : screenHeight; + double shorterSide = screenWidth < screenHeight ? screenWidth : screenHeight; + + if (longerSide >= 1200) { + deviceType = DeviceType.tablet; + } else if (shorterSide >= 700) { + // Use shorter side to distinguish tablets (iPads typically have 768+ width) + deviceType = DeviceType.tablet; + } else { + deviceType = DeviceType.mobile; + } + + log("longerSide: $longerSide"); + log("isTablet: $isTablet"); } } + +// Or create a helper method +bool get isTablet => SizeUtils.deviceType == DeviceType.tablet; + +bool get isMobile => SizeUtils.deviceType == DeviceType.mobile; + +bool get isDesktop => SizeUtils.deviceType == DeviceType.desktop; diff --git a/lib/core/utils/utils.dart b/lib/core/utils/utils.dart index c4a2db8..a88d9c2 100644 --- a/lib/core/utils/utils.dart +++ b/lib/core/utils/utils.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:developer'; import 'dart:io'; +import 'dart:math' as dartMath; import 'dart:typed_data'; import 'package:connectivity_plus/connectivity_plus.dart'; @@ -27,8 +28,6 @@ import 'package:lottie/lottie.dart'; import 'package:path_provider/path_provider.dart'; import 'package:shared_preferences/shared_preferences.dart'; -import 'dart:math' as dartMath; - class Utils { static AppState appState = getIt.get(); static NavigationService navigationService = getIt.get(); @@ -67,8 +66,10 @@ class Utils { // ), // )); return !isAddHours - ? DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US").format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.toLocal()) - : DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US").format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.add( + ? DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US") + .format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.toLocal()) + : DateFormat('hh:mm a', appState.isArabic() ? "ar_SA" : "en_US") + .format(DateTime.tryParse(startTime.contains("T") ? startTime : convertStringToDateTime(startTime))!.add( Duration( hours: isAddHours ? 3 : 0, ), @@ -301,7 +302,14 @@ class Utils { return false; } - static Widget getNoDataWidget(BuildContext context, {double width = 124, double height = 124, String? noDataText, Widget callToActionButton = const SizedBox.shrink(), bool isSmallWidget = false}) { + static Widget getNoDataWidget( + BuildContext context, { + double width = 124, + double height = 124, + String? noDataText, + Widget callToActionButton = const SizedBox.shrink(), + bool isSmallWidget = false, + }) { return Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, @@ -309,7 +317,9 @@ class Utils { SizedBox(height: isSmallWidget ? 0.h : 48.h), Lottie.asset(AppAnimations.noData, repeat: false, reverse: false, frameRate: FrameRate(60), width: width.h, height: height.h, fit: BoxFit.fill), SizedBox(height: 16.h), - (noDataText ?? LocaleKeys.noDataAvailable.tr()).toText16(weight: FontWeight.w500, color: AppColors.greyTextColor, isCenter: true).paddingSymmetrical(64.h, 0.h), + (noDataText ?? LocaleKeys.noDataAvailable.tr()) + .toText16(weight: FontWeight.w500, color: AppColors.greyTextColor, isCenter: true) + .paddingSymmetrical(64.w, 0.h), SizedBox(height: 16.h), callToActionButton ], @@ -461,8 +471,10 @@ class Utils { } // Replace HTML line breaks with newlines - var withLineBreaks = - htmlString.replaceAll(RegExp(r'', multiLine: true), '\n').replaceAll(RegExp(r'<\/p>', multiLine: true), '\n').replaceAll(RegExp(r'', multiLine: true), '\n'); + var withLineBreaks = htmlString + .replaceAll(RegExp(r'', multiLine: true), '\n') + .replaceAll(RegExp(r'<\/p>', multiLine: true), '\n') + .replaceAll(RegExp(r'', multiLine: true), '\n'); // Remove all other HTML tags var withoutTags = withLineBreaks.replaceAll(RegExp(r'<[^>]*>'), ''); @@ -540,7 +552,20 @@ class Utils { final year = parts[0]; // Map month number to short month name (Hijri months) - const hijriMonthNames = ['Muharram', 'Safar', 'Rabi I', 'Rabi II', 'Jumada I', 'Jumada II', 'Rajab', 'Sha\'ban', 'Ramadan', 'Shawwal', 'Dhu al-Qi\'dah', 'Dhu al-Hijjah']; + const hijriMonthNames = [ + 'Muharram', + 'Safar', + 'Rabi I', + 'Rabi II', + 'Jumada I', + 'Jumada II', + 'Rajab', + 'Sha\'ban', + 'Ramadan', + 'Shawwal', + 'Dhu al-Qi\'dah', + 'Dhu al-Hijjah' + ]; final monthIndex = int.tryParse(parts[1]) ?? 1; final month = hijriMonthNames[monthIndex - 1]; @@ -626,29 +651,36 @@ class Utils { required String icon, Color? iconColor, bool isDisabled = false, - double width = 24, - double height = 24, + double? width, + double? height, BoxFit fit = BoxFit.cover, double? border, double? borderRadius, }) { + final iconH = height ?? 24.h; + final iconW = width ?? 24.w; return Container( decoration: BoxDecoration( border: border != null ? Border.all(color: AppColors.whiteColor, width: border) : null, borderRadius: border != null ? BorderRadius.circular(borderRadius ?? 0) : null, ), - child: Image.asset(icon, width: width, height: height, fit: fit), + child: Image.asset(icon, width: iconW, height: iconH, fit: fit), ); // return Image.asset(icon, width: width, height: height, fit: fit, ); } /// Widget to build an SVG from network - static Widget buildImgWithNetwork({required String url, required Color iconColor, bool isDisabled = false, double width = 24, double height = 24, BoxFit fit = BoxFit.cover}) { + static Widget buildImgWithNetwork({required String url, required Color iconColor, bool isDisabled = false, double width = 24, double height = 24, BoxFit fit = BoxFit.cover, ImageErrorWidgetBuilder? errorBuilder}) { return Image.network( url, width: width, height: height, fit: fit, + errorBuilder: errorBuilder??(_,__,___){ + //todo change the error builder icon that it is returning + return Utils.buildSvgWithAssets(width: width, + height: height,icon: AppAssets.no_visit_icon); + }, ); } @@ -657,16 +689,17 @@ class Utils { mainAxisSize: MainAxisSize.max, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Image.asset(AppAssets.mada, width: 25, height: 25), - Image.asset(AppAssets.tamara_en, width: 25, height: 25), - Image.asset(AppAssets.visa, width: 25, height: 25), - Image.asset(AppAssets.Mastercard, width: 25, height: 25), - Image.asset(AppAssets.apple_pay, width: 25, height: 25), + Image.asset(AppAssets.mada, width: 25.h, height: 25.h), + Image.asset(AppAssets.tamara_en, width: 25.h, height: 25.h), + Image.asset(AppAssets.visa, width: 25.h, height: 25.h), + Image.asset(AppAssets.Mastercard, width: 25.h, height: 25.h), + Image.asset(AppAssets.apple_pay, width: 25.h, height: 25.h), ], ); } - static Widget getPaymentAmountWithSymbol(Widget paymentAmountWidget, Color iconColor, double iconSize, {bool isSaudiCurrency = true, bool isExpanded = true}) { + static Widget getPaymentAmountWithSymbol(Widget paymentAmountWidget, Color iconColor, double iconSize, + {bool isSaudiCurrency = true, bool isExpanded = true}) { return Row( mainAxisAlignment: isExpanded ? MainAxisAlignment.spaceBetween : MainAxisAlignment.start, children: [ @@ -696,7 +729,11 @@ class Utils { } static Widget getPaymentAmountWithSymbol2(num habibWalletAmount, - {double iconSize = 14, Color iconColor = AppColors.textColor, Color textColor = AppColors.blackColor, bool isSaudiCurrency = true, bool isExpanded = true}) { + {double iconSize = 14, + Color iconColor = AppColors.textColor, + Color textColor = AppColors.blackColor, + bool isSaudiCurrency = true, + bool isExpanded = true}) { return RichText( maxLines: 1, text: TextSpan( @@ -708,7 +745,7 @@ class Utils { ), TextSpan( text: " $habibWalletAmount", - style: TextStyle(color: textColor, fontSize: 32.fSize, letterSpacing: -4, fontWeight: FontWeight.w600, height: 1), + style: TextStyle(color: textColor, fontSize: 32.f, letterSpacing: -4, fontWeight: FontWeight.w600, height: 1), ), ], ), @@ -766,5 +803,4 @@ class Utils { } return isHavePrivilege; } - } diff --git a/lib/core/utils/validation_utils.dart b/lib/core/utils/validation_utils.dart index 4f02ad9..7e38300 100644 --- a/lib/core/utils/validation_utils.dart +++ b/lib/core/utils/validation_utils.dart @@ -4,7 +4,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:hmg_patient_app_new/core/common_models/nationality_country_model.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; -import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; @@ -102,7 +101,8 @@ class ValidationUtils { return regex.hasMatch(id); } - static bool validateUaeRegistration({String? name, GenderTypeEnum? gender, NationalityCountries? country, MaritalStatusTypeEnum? maritalStatus, required Function() onOkPress}) { + static bool validateUaeRegistration( + {String? name, GenderTypeEnum? gender, NationalityCountries? country, MaritalStatusTypeEnum? maritalStatus, required Function() onOkPress}) { if (name == null || name.isEmpty) { _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAValidName.tr(), onOkPressed: onOkPress); return false; @@ -141,7 +141,8 @@ class ValidationUtils { return true; } - static bool isValidatedIdAndPhoneWithCountryValidation({String? nationalId, String? phoneNumber, required Function() onOkPress, CountryEnum? selectedCountry}) { + static bool isValidatedIdAndPhoneWithCountryValidation( + {String? nationalId, String? phoneNumber, required Function() onOkPress, CountryEnum? selectedCountry}) { bool isCorrectID = true; if (nationalId == null || nationalId.isEmpty) { _dialogService.showExceptionBottomSheet(message: LocaleKeys.pleaseEnterAnationalID.tr(), onOkPressed: onOkPress); diff --git a/lib/extensions/context_extensions.dart b/lib/extensions/context_extensions.dart index 27d4cf4..27ff428 100644 --- a/lib/extensions/context_extensions.dart +++ b/lib/extensions/context_extensions.dart @@ -5,11 +5,10 @@ extension ContextUtils on BuildContext { double get screenWidth => MediaQuery.of(this).size.width; - EdgeInsets get padding => MediaQuery.of(this).padding; + EdgeInsets get padding => MediaQuery.of(this).padding; bool get safeInsets => padding.top > 0 || padding.bottom > 0 || padding.left > 0 || padding.right > 0; - ThemeData get theme => Theme.of(this); TextTheme get textTheme => theme.textTheme; @@ -24,9 +23,18 @@ extension ContextUtils on BuildContext { } extension ShowBottomSheet on BuildContext { - Future showBottomSheet({isScrollControlled = true, isDismissible = false, required Widget child, Color? backgroundColor, enableDra = false, useSafeArea = false}) { + Future showBottomSheet({ + isScrollControlled = true, + isDismissible = false, + required Widget child, + Color? backgroundColor, + enableDra = false, + useSafeArea = false, + BoxConstraints? constraints, + }) { return showModalBottomSheet( context: this, + constraints: constraints, isScrollControlled: isScrollControlled, isDismissible: isDismissible, enableDrag: enableDra, diff --git a/lib/extensions/string_extensions.dart b/lib/extensions/string_extensions.dart index 4432737..030770a 100644 --- a/lib/extensions/string_extensions.dart +++ b/lib/extensions/string_extensions.dart @@ -1,23 +1,23 @@ +import 'package:auto_size_text/auto_size_text.dart'; +import 'package:flutter/cupertino.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:auto_size_text/auto_size_text.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:intl/intl.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:intl/intl.dart'; extension CapExtension on String { - String get toCamelCase => "${this[0].toUpperCase()}${this.substring(1)}"; + String get toCamelCase => "${this[0].toUpperCase()}${substring(1)}"; - String get inCaps => '${this[0].toUpperCase()}${this.substring(1)}'; + String get inCaps => '${this[0].toUpperCase()}${substring(1)}'; - String get allInCaps => this.toUpperCase(); + String get allInCaps => toUpperCase(); String get needTranslation => this; - String get capitalizeFirstofEach => this.trim().length > 0 ? this.trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : ""; + String get capitalizeFirstofEach => trim().isNotEmpty ? trim().toLowerCase().split(" ").map((str) => str.inCaps).join(" ") : ""; } extension EmailValidator on String { @@ -28,7 +28,7 @@ extension EmailValidator on String { maxLines: maxlines, overflow: textOverflow, style: TextStyle( - fontSize: 8.fSize, + fontSize: 8.f, fontStyle: fontStyle ?? FontStyle.normal, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, @@ -36,12 +36,21 @@ extension EmailValidator on String { ), ); - Widget toText10({Color? color, FontWeight? weight, bool isBold = false, bool isUnderLine = false, int? maxlines, FontStyle? fontStyle, TextOverflow? textOverflow, double letterSpacing = 0}) => Text( + Widget toText10( + {Color? color, + FontWeight? weight, + bool isBold = false, + bool isUnderLine = false, + int? maxlines, + FontStyle? fontStyle, + TextOverflow? textOverflow, + double letterSpacing = 0}) => + Text( this, maxLines: maxlines, overflow: textOverflow, style: TextStyle( - fontSize: 10.fSize, + fontSize: 10.f, fontStyle: fontStyle ?? FontStyle.normal, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, @@ -50,13 +59,21 @@ extension EmailValidator on String { decorationColor: color ?? AppColors.blackColor), ); - Widget toText11({Color? color, FontWeight? weight, bool isUnderLine = false, bool isCenter = false, bool isBold = false, int maxLine = 0, double letterSpacing = 0}) => Text( + Widget toText11( + {Color? color, + FontWeight? weight, + bool isUnderLine = false, + bool isCenter = false, + bool isBold = false, + int maxLine = 0, + double letterSpacing = 0}) => + Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, softWrap: true, style: TextStyle( - fontSize: 11.fSize, + fontSize: 11.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: letterSpacing, @@ -64,12 +81,21 @@ extension EmailValidator on String { ), ); - Widget toText12({Color? color, bool isUnderLine = false, bool isBold = false, FontWeight? fontWeight, bool isCenter = false, double? height, int maxLine = 0}) => Text( + Widget toText12( + {Color? color, + bool isUnderLine = false, + TextAlign textAlignment = TextAlign.start, + bool isBold = false, + FontWeight? fontWeight, + bool isCenter = false, + double? height, + int maxLine = 0}) => + Text( this, - textAlign: isCenter ? TextAlign.center : null, + textAlign: isCenter ? TextAlign.center : textAlignment, maxLines: (maxLine > 0) ? maxLine : null, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: fontWeight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: 0, @@ -85,7 +111,7 @@ extension EmailValidator on String { maxLines: (maxLine > 0) ? maxLine : null, minFontSize: 8, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: 0, @@ -121,12 +147,20 @@ extension EmailValidator on String { ), ); - Widget toText13({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, int maxLine = 0, FontWeight? weight, double? letterSpacing = 0}) => Text( + Widget toText13( + {Color? color, + bool isUnderLine = false, + bool isBold = false, + bool isCenter = false, + int maxLine = 0, + FontWeight? weight, + double? letterSpacing = 0}) => + Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: (maxLine > 0) ? maxLine : null, style: TextStyle( - fontSize: 13.fSize, + fontSize: 13.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: letterSpacing, @@ -150,20 +184,28 @@ extension EmailValidator on String { overflow: textOverflow, style: TextStyle( color: color ?? AppColors.blackColor, - fontSize: 14.fSize, + fontSize: 14.f, letterSpacing: letterSpacing, height: height, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null), ); - Widget toText15({Color? color, bool isUnderLine = false, bool isBold = false, bool isCenter = false, FontWeight? weight, int? maxlines, double? letterSpacing = -1}) => Text( + Widget toText15( + {Color? color, + bool isUnderLine = false, + bool isBold = false, + bool isCenter = false, + FontWeight? weight, + int? maxlines, + double? letterSpacing = -1}) => + Text( this, textAlign: isCenter ? TextAlign.center : null, maxLines: maxlines, style: TextStyle( color: color ?? AppColors.blackColor, - fontSize: 15.fSize, + fontSize: 15.f, letterSpacing: letterSpacing, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), decoration: isUnderLine ? TextDecoration.underline : null), @@ -187,7 +229,7 @@ extension EmailValidator on String { textAlign: isCenter ? TextAlign.center : null, style: TextStyle( color: color ?? AppColors.blackColor, - fontSize: 16.fSize, + fontSize: 16.f, letterSpacing: letterSpacing, height: height, overflow: textOverflow, @@ -199,7 +241,7 @@ extension EmailValidator on String { Widget toText17({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(color: color ?? AppColors.blackColor, fontSize: 17.fSize, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle(color: color ?? AppColors.blackColor, fontSize: 17.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText18({Color? color, FontWeight? weight, bool isBold = false, bool isCenter = false, int? maxlines, TextOverflow? textOverflow}) => Text( @@ -207,35 +249,40 @@ extension EmailValidator on String { textAlign: isCenter ? TextAlign.center : null, this, overflow: textOverflow, - style: TextStyle(fontSize: 18.fSize, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), + style: TextStyle( + fontSize: 18.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); Widget toText19({Color? color, bool isBold = false}) => Text( this, - style: TextStyle(fontSize: 19.fSize, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4), + style: TextStyle(fontSize: 19.f, fontWeight: isBold ? FontWeight.bold : FontWeight.normal, color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); Widget toText20({Color? color, FontWeight? weight, bool isBold = false}) => Text( this, - style: TextStyle(fontSize: 20.fSize, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), + style: TextStyle( + fontSize: 20.f, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal), color: color ?? AppColors.blackColor, letterSpacing: -0.4), ); Widget toText21({Color? color, bool isBold = false, FontWeight? weight, int? maxlines}) => Text( this, maxLines: maxlines, - style: TextStyle(color: color ?? AppColors.blackColor, fontSize: 21.fSize, letterSpacing: -1, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), + style: TextStyle( + color: color ?? AppColors.blackColor, fontSize: 21.f, letterSpacing: -1, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), ); Widget toText22({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: 1, color: color ?? AppColors.blackColor, fontSize: 22.fSize, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 1, color: color ?? AppColors.blackColor, fontSize: 22.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText24({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: 23 / 24, color: color ?? AppColors.blackColor, fontSize: 24.fSize, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 23 / 24, color: color ?? AppColors.blackColor, fontSize: 24.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText26({Color? color, bool isBold = false, double? height, bool isCenter = false, FontWeight? weight, double? letterSpacing}) => Text( @@ -244,7 +291,7 @@ extension EmailValidator on String { style: TextStyle( height: height ?? 23 / 26, color: color ?? AppColors.blackColor, - fontSize: 26.fSize, + fontSize: 26.f, letterSpacing: letterSpacing ?? -1, fontWeight: weight ?? (isBold ? FontWeight.bold : FontWeight.normal)), ); @@ -252,18 +299,25 @@ extension EmailValidator on String { Widget toText28({Color? color, bool isBold = false, double? height, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: height ?? 23 / 28, color: color ?? AppColors.blackColor, fontSize: 28.fSize, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: height ?? 23 / 28, + color: color ?? AppColors.blackColor, + fontSize: 28.f, + letterSpacing: -1, + fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText32({Color? color, bool isBold = false, bool isCenter = false}) => Text( this, textAlign: isCenter ? TextAlign.center : null, - style: TextStyle(height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 32.fSize, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 32.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toText44({Color? color, bool isBold = false}) => Text( this, - style: TextStyle(height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 44.fSize, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), + style: TextStyle( + height: 32 / 32, color: color ?? AppColors.blackColor, fontSize: 44.f, letterSpacing: -1, fontWeight: isBold ? FontWeight.bold : FontWeight.normal), ); Widget toSectionHeading({String upperHeading = "", String lowerHeading = ""}) { @@ -299,12 +353,14 @@ extension EmailValidator on String { } bool isValidEmail() { - return RegExp(r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$').hasMatch(this); + return RegExp( + r'^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$') + .hasMatch(this); } String toFormattedDate() { - String date = this.split("T")[0]; - String time = this.split("T")[1]; + String date = split("T")[0]; + String time = split("T")[1]; var dates = date.split("-"); return "${dates[2]} ${getMonth(int.parse(dates[1]))} ${dates[0]} ${DateFormat('hh:mm a').format(DateFormat('hh:mm:ss').parse(time))}"; } diff --git a/lib/features/authentication/authentication_view_model.dart b/lib/features/authentication/authentication_view_model.dart index 02b0723..8be2b8e 100644 --- a/lib/features/authentication/authentication_view_model.dart +++ b/lib/features/authentication/authentication_view_model.dart @@ -457,6 +457,7 @@ class AuthenticationViewModel extends ChangeNotifier { int? patientID, }) async { bool isForRegister = (_appState.getUserRegistrationPayload.healthId != null || _appState.getUserRegistrationPayload.patientOutSa == true || _appState.getUserRegistrationPayload.patientOutSa == 1); + MyAppointmentsViewModel myAppointmentsVM = getIt(); final request = RequestUtils.getCommonRequestWelcome( phoneNumber: phoneNumberController.text, @@ -587,6 +588,7 @@ class AuthenticationViewModel extends ChangeNotifier { } // _appState.setUserBloodGroup = (activation.patientBlodType ?? ""); _appState.setAppAuthToken = activation.authenticationTokenId; + myAppointmentsVM.getActiveAppointmentsCount(); final request = RequestUtils.getAuthanticatedCommonRequest().toJson(); bool isUserAgreedBefore = await checkIfUserAgreedBefore(request: request); @@ -607,7 +609,6 @@ class AuthenticationViewModel extends ChangeNotifier { LoaderBottomSheet.hideLoader(); navigateToHomeScreen(); } else { - MyAppointmentsViewModel myAppointmentsVM = getIt(); myAppointmentsVM.setIsAppointmentDataToBeLoaded(true); LoaderBottomSheet.hideLoader(); navigateToHomeScreen(); diff --git a/lib/features/authentication/widgets/otp_verification_screen.dart b/lib/features/authentication/widgets/otp_verification_screen.dart index 10e34cd..e33222c 100644 --- a/lib/features/authentication/widgets/otp_verification_screen.dart +++ b/lib/features/authentication/widgets/otp_verification_screen.dart @@ -1,10 +1,8 @@ import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/animation.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; import 'package:get_it/get_it.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; @@ -19,16 +17,16 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; -import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart'; import 'package:provider/provider.dart'; +import 'package:sms_otp_auto_verify/sms_otp_auto_verify.dart'; typedef OnDone = void Function(String text); class ProvidedPinBoxTextAnimation { static AnimatedSwitcherTransitionBuilder scalingTransition = (child, animation) { return ScaleTransition( - child: child, scale: animation, + child: child, ); }; @@ -65,7 +63,7 @@ class OTPWidget extends StatefulWidget { final EdgeInsets pinBoxOuterPadding; const OTPWidget({ - Key? key, + super.key, this.maxLength = 4, this.controller, this.pinBoxWidth = 70.0, @@ -87,7 +85,7 @@ class OTPWidget extends StatefulWidget { this.pinBoxBorderWidth = 2.0, this.pinBoxRadius = 0, this.hideDefaultKeyboard = false, - }) : super(key: key); + }); @override State createState() { @@ -430,7 +428,8 @@ class OTPVerificationScreen extends StatefulWidget { final Function(String phoneNumber) onResendOTPPressed; final bool isFormFamilyFile; - const OTPVerificationScreen({super.key, required this.phoneNumber, required this.checkActivationCode, required this.onResendOTPPressed, required this.isFormFamilyFile}); + const OTPVerificationScreen( + {super.key, required this.phoneNumber, required this.checkActivationCode, required this.onResendOTPPressed, required this.isFormFamilyFile}); @override State createState() => _OTPVerificationScreenState(); @@ -555,7 +554,8 @@ class _OTPVerificationScreenState extends State { LocaleKeys.weHaveSendOTP.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), _getMaskedPhoneNumber().toText15(color: AppColors.inputLabelTextColor, isBold: true), LocaleKeys.via.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), - (widget.isFormFamilyFile ? LoginTypeEnum.sms.displayName : authVM.loginTypeEnum.displayName).toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4), + (widget.isFormFamilyFile ? LoginTypeEnum.sms.displayName : authVM.loginTypeEnum.displayName) + .toText15(color: AppColors.inputLabelTextColor, isBold: true, letterSpacing: -0.4), appState.getUserRegistrationPayload.isRegister != null && appState.getUserRegistrationPayload.isRegister == true ? LocaleKeys.forRegistrationVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4) : LocaleKeys.forLoginVerification.tr().toText15(color: AppColors.inputLabelTextColor, letterSpacing: -0.4), @@ -568,7 +568,7 @@ class _OTPVerificationScreenState extends State { maxLength: _otpLength, controller: _otpController, pinBoxWidth: 70.h, - pinBoxHeight: 100, + pinBoxHeight: 100.h, pinBoxRadius: 16, pinBoxBorderWidth: 0, pinBoxOuterPadding: EdgeInsets.symmetric(horizontal: 4.h), @@ -578,7 +578,7 @@ class _OTPVerificationScreenState extends State { autoFocus: true, onTextChanged: _onOtpChanged, pinTextStyle: TextStyle( - fontSize: 40.fSize, + fontSize: 40.f, fontWeight: FontWeight.bold, color: AppColors.whiteColor, ), diff --git a/lib/features/book_appointments/book_appointments_repo.dart b/lib/features/book_appointments/book_appointments_repo.dart index 1783556..8aafc9b 100644 --- a/lib/features/book_appointments/book_appointments_repo.dart +++ b/lib/features/book_appointments/book_appointments_repo.dart @@ -734,7 +734,7 @@ class BookAppointmentsRepoImp implements BookAppointmentsRepo { body: mapDevice, onFailure: (error, statusCode, {messageStatus, failureType}) { failure = failureType; - onError!(error); + onError?.call(error); }, onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { diff --git a/lib/features/book_appointments/book_appointments_view_model.dart b/lib/features/book_appointments/book_appointments_view_model.dart index 20b64fd..f24766b 100644 --- a/lib/features/book_appointments/book_appointments_view_model.dart +++ b/lib/features/book_appointments/book_appointments_view_model.dart @@ -1009,7 +1009,7 @@ class BookAppointmentsViewModel extends ChangeNotifier { (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { - onError!(apiResponse.errorMessage!); + onError?.call(apiResponse.errorMessage!); // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); } else if (apiResponse.messageStatus == 1) { dentalChiefComplaintsList = apiResponse.data!; diff --git a/lib/features/emergency_services/emergency_services_repo.dart b/lib/features/emergency_services/emergency_services_repo.dart new file mode 100644 index 0000000..089e7ad --- /dev/null +++ b/lib/features/emergency_services/emergency_services_repo.dart @@ -0,0 +1,94 @@ +import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/api/api_client.dart'; +import 'package:hmg_patient_app_new/core/api_consts.dart'; +import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; +import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_models/rrt_procedures_response_model.dart'; +import 'package:hmg_patient_app_new/services/logger_service.dart'; + +abstract class EmergencyServicesRepo { + Future>>> getRRTProcedures(); + + Future>>> getNearestEr({int? id, int? projectID}); +} + +class EmergencyServicesRepoImp implements EmergencyServicesRepo { + final ApiClient apiClient; + final LoggerService loggerService; + + EmergencyServicesRepoImp({required this.loggerService, required this.apiClient}); + + Future>>> getNearestEr({int? id, int? projectID}) async { + Map mapDevice = {'IsForER': true}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_NEAREST_HOSPITAL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['List_ProjectAvgERWaitingTime']; + + final clinicsList = list.map((item) => ProjectAvgERWaitingTime.fromJson(item as Map)).toList().cast(); + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: clinicsList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future>>> getRRTProcedures() async { + Map mapDevice = {}; + + try { + GenericApiModel>? apiResponse; + Failure? failure; + await apiClient.post( + GET_RRT_PROCEDURE_LIST, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final list = response['Vida_ProcedureList']; + final proceduresList = list.map((item) => RRTProceduresResponseModel.fromJson(item as Map)).toList().cast(); + + apiResponse = GenericApiModel>( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: proceduresList, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } +} diff --git a/lib/features/emergency_services/emergency_services_view_model.dart b/lib/features/emergency_services/emergency_services_view_model.dart new file mode 100644 index 0000000..d121fe5 --- /dev/null +++ b/lib/features/emergency_services/emergency_services_view_model.dart @@ -0,0 +1,137 @@ +import 'dart:async'; + +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_state.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_repo.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/models/resp_models/rrt_procedures_response_model.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/nearest_er_page.dart'; +import 'package:hmg_patient_app_new/services/error_handler_service.dart'; +import 'package:hmg_patient_app_new/services/navigation_service.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:url_launcher/url_launcher.dart'; + +class EmergencyServicesViewModel extends ChangeNotifier { + EmergencyServicesRepo emergencyServicesRepo; + ErrorHandlerService errorHandlerService; + + final NavigationService navServices; + final LocationUtils? locationUtils; + final AppState appState; + bool isERListLoading = false; + List nearestERList = []; + List nearestERFilteredList = []; + + List RRTProceduresList = []; + + late RRTProceduresResponseModel selectedRRTProcedure; + + setSelectedRRTProcedure(RRTProceduresResponseModel procedure) { + selectedRRTProcedure = procedure; + notifyListeners(); + } + + EmergencyServicesViewModel({ + required this.emergencyServicesRepo, + required this.errorHandlerService, + required this.navServices, + required this.locationUtils, + required this.appState, + }); + + Future getRRTProcedures({Function(dynamic)? onSuccess, Function(String)? onError}) async { + RRTProceduresList.clear(); + notifyListeners(); + + final result = await emergencyServicesRepo.getRRTProcedures(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + RRTProceduresList = apiResponse.data!; + selectedRRTProcedure = RRTProceduresList.first; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + void navigateToNearestERPage() { + locationUtils!.getLocation( + isShowConfirmDialog: true, + onSuccess: (position) { + navServices.push( + CustomPageRoute( + page: NearestErPage(), + ), + ); + getNearestER(); + }); + } + + void filterErList(String query) { + print("the query is $query"); + if (query.isEmpty) { + nearestERFilteredList = nearestERList; + } else { + nearestERFilteredList = nearestERList.where((er) => er.projectName != null && er.projectName!.toLowerCase().contains(query.toLowerCase())).toList(); + } + notifyListeners(); + } + + // Open directions (navigation) from current location to destination. + Future openDirections({ + required double destLat, + required double destLng, + String? travelMode, // driving, walking, bicycling, transit + }) async { + // Try Google Maps app navigation intent (android/iOS) + final modeParam = travelMode == null ? 'driving' : travelMode; + final googleNavUri = Uri.parse('google.navigation:q=$destLat,$destLng&mode=${modeParam.substring(0, 1)}'); // mode: d/w/b/t by scheme + final universalUrl = Uri.parse('https://www.google.com/maps/dir/?api=1&destination=$destLat,$destLng&travelmode=$modeParam'); + + if (await canLaunchUrl(googleNavUri)) { + await launchUrl(googleNavUri, mode: LaunchMode.externalApplication); + } else { + await launchUrl(universalUrl, mode: LaunchMode.externalApplication); + } + } + + Future openDialer(String phoneNumber) async { + final Uri telUri = Uri(scheme: 'tel', path: phoneNumber); + + if (await canLaunchUrl(telUri)) { + await launchUrl(telUri, mode: LaunchMode.externalApplication); + } else { + throw 'Could not open dialer for $phoneNumber'; + } + } + + FutureOr getNearestER() async { + isERListLoading = true; + nearestERList = []; + nearestERFilteredList = []; + notifyListeners(); + var response = await emergencyServicesRepo.getNearestEr(); + isERListLoading = false; + notifyListeners(); + + response.fold( + (failure) async {}, + (apiResponse) { + isERListLoading = false; + if (apiResponse.messageStatus == 1) { + nearestERList = apiResponse.data!; + nearestERFilteredList = nearestERList; + } + }, + ); + } +} diff --git a/lib/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart b/lib/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart new file mode 100644 index 0000000..57d73ae --- /dev/null +++ b/lib/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart @@ -0,0 +1,114 @@ +class ProjectAvgERWaitingTime { + int? iD; + int? projectID; + int? avgTimeInMinutes; + String? avgTimeInHHMM; + dynamic distanceInKilometers; + String? latitude; + String? longitude; + String? phonenumber; + String? projectImageURL; + String? projectName; + + ProjectAvgERWaitingTime( + {this.iD, + this.projectID, + this.avgTimeInMinutes, + this.avgTimeInHHMM, + this.distanceInKilometers, + this.latitude, + this.longitude, + this.phonenumber, + this.projectImageURL, + this.projectName}); + + ProjectAvgERWaitingTime.fromJson(Map json) { + iD = json['ID']; + projectID = json['ProjectID']; + avgTimeInMinutes = json['AvgTimeInMinutes']; + avgTimeInHHMM = json['AvgTimeInHHMM']; + distanceInKilometers = json['DistanceInKilometers']; + latitude = json['Latitude']; + longitude = json['Longitude']; + phonenumber = json['PhoneNumber']; + projectImageURL = json['ProjectImageURL']; + projectName = json['ProjectName']; + } + + String getTime(){ + print("the name is $projectName"); + print("the avgTimeInMinutes is $avgTimeInMinutes"); + if(avgTimeInMinutes == null) return ""; + int hours = avgTimeInMinutes! ~/ 60; + int minutes = avgTimeInMinutes! % 60; + print("the time is ${"${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}"}"); + return "${hours.toString().padLeft(2, '0')}:${minutes.toString().padLeft(2, '0')}"; + } + + Map toJson() { + final Map data = new Map(); + data['ID'] = this.iD; + data['ProjectID'] = this.projectID; + data['AvgTimeInMinutes'] = this.avgTimeInMinutes; + data['AvgTimeInHHMM'] = this.avgTimeInHHMM; + data['DistanceInKilometers'] = this.distanceInKilometers; + data['Latitude'] = this.latitude; + data['Longitude'] = this.longitude; + data['PhoneNumber'] = this.phonenumber; + data['ProjectImageURL'] = this.projectImageURL; + data['ProjectName'] = this.projectName; + return data; + } +} +//class ProjectAvgERWaitingTime { +// int? iD; +// int? projectID; +// int? avgTimeInMinutes; +// String? avgTimeInHHMM; +// String? distanceInKilometers; +// String? latitude; +// String? longitude; +// String? phonenum?ber; +// String? projectImageURL; +// String? projectName; +// +// ProjectAvgERWaitingTime( +// {this.iD, +// this.projectID, +// this.avgTimeInMinutes, +// this.avgTimeInHHMM, +// this.distanceInKilometers, +// this.latitude, +// this.longitude, +// this.phonenum?ber, +// this.projectImageURL, +// this.projectName}); +// +// ProjectAvgERWaitingTime.fromJson(Map json) { +// iD = json['ID']; +// projectID = json['ProjectID']; +// avgTimeInMinutes = json['AvgTimeInMinutes']; +// avgTimeInHHMM = json['AvgTimeInHHMM']; +// distanceInKilometers = json['DistanceInKilometers']; +// latitude = json['Latitude']; +// longitude = json['Longitude']; +// phonenum?ber = json['Phonenum?ber']; +// projectImageURL = json['ProjectImageURL']; +// projectName = json['ProjectName']; +// } +// +// Map toJson() { +// final Map data = new Map(); +// data['ID'] = this.iD; +// data['ProjectID'] = this.projectID; +// data['AvgTimeInMinutes'] = this.avgTimeInMinutes; +// data['AvgTimeInHHMM'] = this.avgTimeInHHMM; +// data['DistanceInKilometers'] = this.distanceInKilometers; +// data['Latitude'] = this.latitude; +// data['Longitude'] = this.longitude; +// data['Phonenum?ber'] = this.phonenum?ber; +// data['ProjectImageURL'] = this.projectImageURL; +// data['ProjectName'] = this.projectName; +// return data; +// } +//} \ No newline at end of file diff --git a/lib/features/emergency_services/models/resp_models/rrt_procedures_response_model.dart b/lib/features/emergency_services/models/resp_models/rrt_procedures_response_model.dart new file mode 100644 index 0000000..ea0559e --- /dev/null +++ b/lib/features/emergency_services/models/resp_models/rrt_procedures_response_model.dart @@ -0,0 +1,27 @@ +class RRTProceduresResponseModel { + num? patientShare; + num? patientShareWithTax; + num? patientTaxAmount; + String? procedureID; + String? procedureName; + + RRTProceduresResponseModel({this.patientShare, this.patientShareWithTax, this.patientTaxAmount, this.procedureID, this.procedureName}); + + RRTProceduresResponseModel.fromJson(Map json) { + patientShare = json['PatientShare']; + patientShareWithTax = json['PatientShareWithTax']; + patientTaxAmount = json['PatientTaxAmount']; + procedureID = json['ProcedureID']; + procedureName = json['ProcedureName']; + } + + Map toJson() { + final Map data = new Map(); + data['PatientShare'] = this.patientShare; + data['PatientShareWithTax'] = this.patientShareWithTax; + data['PatientTaxAmount'] = this.patientTaxAmount; + data['ProcedureID'] = this.procedureID; + data['ProcedureName'] = this.procedureName; + return data; + } +} diff --git a/lib/features/insurance/insurance_view_model.dart b/lib/features/insurance/insurance_view_model.dart index 363ad28..8460bd4 100644 --- a/lib/features/insurance/insurance_view_model.dart +++ b/lib/features/insurance/insurance_view_model.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/features/insurance/insurance_repo.dart'; import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_card_history.dart'; @@ -14,9 +15,10 @@ class InsuranceViewModel extends ChangeNotifier { bool isInsuranceUpdateDetailsLoading = false; bool isInsuranceDataToBeLoaded = true; - bool isInsuranceApprovalsLoading = false; + bool isInsuranceExpired = false; + InsuranceRepo insuranceRepo; ErrorHandlerService errorHandlerService; @@ -85,6 +87,11 @@ class InsuranceViewModel extends ChangeNotifier { patientInsuranceList = apiResponse.data!; isInsuranceLoading = false; isInsuranceDataToBeLoaded = false; + + isInsuranceExpired = DateTime.now().isAfter( + DateUtil.convertStringToDate(patientInsuranceList.first.cardValidTo), + ); + notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); diff --git a/lib/features/lab/lab_repo.dart b/lib/features/lab/lab_repo.dart index 2618ab6..3bb793b 100644 --- a/lib/features/lab/lab_repo.dart +++ b/lib/features/lab/lab_repo.dart @@ -3,6 +3,8 @@ import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_special_result.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; @@ -13,13 +15,12 @@ abstract class LabRepo { Future>>> getPatientLabOrders(); Future>>> getPatientLabResults(PatientLabOrdersResponseModel laborder, bool isVidaPlus, String procedureName); - Future>>> - getPatientLabResultsByHospitals( - PatientLabOrdersResponseModel laborder, bool isVidaPlus); + Future>>> getPatientLabResultsByHospitals(PatientLabOrdersResponseModel laborder, bool isVidaPlus); + + Future>>> getSpecialLabResult(PatientLabOrdersResponseModel laborder, bool isVidaPlus); + + Future>> getLabResultReportPDF({required PatientLabOrdersResponseModel labOrder}); - Future>>> - getSpecialLabResult( - PatientLabOrdersResponseModel laborder, bool isVidaPlus); } class LabRepoImp implements LabRepo { @@ -223,4 +224,58 @@ class LabRepoImp implements LabRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future>> getLabResultReportPDF({required PatientLabOrdersResponseModel labOrder}) async { + Map mapDevice = { + "InvoiceNo": Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? "0" : labOrder.invoiceNo, + "InvoiceNo_VP": Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? labOrder.invoiceNo : "0", + // "LineItemNo": labOrder.invoiceLineItemNo, + // "InvoiceLineItemNo": labOrder.invoiceLineItemNo, + "ProjectID": labOrder.projectID!, + "DoctorID": labOrder.doctorID!, + "OrderNo": labOrder.orderNo!, + "InvoiceType": labOrder.invoiceType!, + "SetupID": labOrder.setupID!, + "IsDownload": true, + 'ClinicName': labOrder.clinicDescription, + 'DateofBirth': Utils.appState.getAuthenticatedUser()!.dateofBirth, + 'DoctorName': labOrder.doctorName, + 'OrderDate': '${DateUtil.convertStringToDate(labOrder.orderDate!).year}-${DateUtil.convertStringToDate(labOrder.orderDate!).month}-${DateUtil.convertStringToDate(labOrder.orderDate!).day}', + 'PatientIditificationNum': Utils.appState.getAuthenticatedUser()!.patientIdentificationNo, + 'PatientMobileNumber': Utils.appState.getAuthenticatedUser()!.mobileNumber, + 'PatientName': "${Utils.appState.getAuthenticatedUser()!.firstName!} ${Utils.appState.getAuthenticatedUser()!.lastName!}", + 'ProjectName': labOrder.projectName, + "To": Utils.appState.getAuthenticatedUser()!.emailAddress + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + Utils.isVidaPlusProject(int.parse(labOrder.projectID!)) ? SEND_LAB_RESULT_EMAIL : SEND_LAB_RESULT_EMAIL_NEW, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: response["PdfContent"], + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } } diff --git a/lib/features/lab/lab_view_model.dart b/lib/features/lab/lab_view_model.dart index 9f713ac..12f0f27 100644 --- a/lib/features/lab/lab_view_model.dart +++ b/lib/features/lab/lab_view_model.dart @@ -36,6 +36,7 @@ class LabViewModel extends ChangeNotifier { List tempLabOrdersList = []; String labSpecialResult = ""; List labOrderTests = []; + String patientLabResultReportPDFBase64 = ""; PatientLabOrdersResponseModel? currentlySelectedPatientOrder; @@ -130,6 +131,31 @@ class LabViewModel extends ChangeNotifier { ); } + Future getLabResultReportPDF({required PatientLabOrdersResponseModel labOrder, Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await labRepo.getLabResultReportPDF(labOrder: labOrder); + + result.fold( + (failure) async => await errorHandlerService.handleError( + failure: failure, + onOkPressed: () { + onError!(failure.message); + }, + ), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + patientLabResultReportPDFBase64 = apiResponse.data!; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + filterSuggestions() { final List labels = patientLabOrders .expand((order) => order.testDetails!) @@ -238,6 +264,7 @@ class LabViewModel extends ChangeNotifier { value: transformedValue, actualValue:element.resultValue!, label: formatDateAsMMYY(dateTime), + unitOfMeasurement: element.uOM, displayTime: resultDate(dateTime), time: DateUtil.convertStringToDate(element.verifiedOnDateTime), referenceValue: element.calculatedResultFlag ?? "", @@ -367,6 +394,8 @@ class LabViewModel extends ChangeNotifier { value: transformedValue, actualValue: element.resultValue!, label: formatDateAsMMYY(time), + unitOfMeasurement: element.uOM, + displayTime: resultDate(time), time: DateUtil.convertStringToDate(element.verifiedOnDateTime), referenceValue: element.calculatedResultFlag ?? "", @@ -394,6 +423,8 @@ class LabViewModel extends ChangeNotifier { filteredGraphValues.add(DataPoint( value: transformedValue, actualValue: element.resultValue!, + unitOfMeasurement: element.uOM, + label: formatDateAsMMYY(dateTime), displayTime: resultDate(dateTime), time: @@ -407,6 +438,8 @@ class LabViewModel extends ChangeNotifier { value: transformedValue, actualValue: element.resultValue!, label: formatDateAsMMYY(dateTime), + unitOfMeasurement: element.uOM, + displayTime: resultDate(dateTime), time: DateUtil.convertStringToDate(element.verifiedOnDateTime), diff --git a/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart b/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart index 4143498..8bef76a 100644 --- a/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart +++ b/lib/features/lab/models/resp_models/patient_lab_orders_response_model.dart @@ -155,10 +155,10 @@ class PatientLabOrdersResponseModel { status = json['Status']; statusDesc = json['StatusDesc']; strOrderDate = json['StrOrderDate']; - if (json['TestDetails'] != dynamic) { + if (json['TestDetails'] != null) { testDetails = []; json['TestDetails'].forEach((v) { - testDetails!.add(new TestDetails.fromJson(v)); + testDetails!.add(TestDetails.fromJson(v)); }); } } diff --git a/lib/features/medical_file/medical_file_view_model.dart b/lib/features/medical_file/medical_file_view_model.dart index e4dc854..f0263f9 100644 --- a/lib/features/medical_file/medical_file_view_model.dart +++ b/lib/features/medical_file/medical_file_view_model.dart @@ -382,7 +382,10 @@ class MedicalFileViewModel extends ChangeNotifier { final result = await medicalFileRepo.getAllPendingRecordsByResponseId(request: {'ResponseID': appState.getAuthenticatedUser()!.patientId ?? "0", "Status": 2}); result.fold( - (failure) async => await errorHandlerService.handleError(failure: failure), + // (failure) async => await errorHandlerService.handleError(failure: failure), + (failure) async { + log("Error in fetching pending family files: ${failure.message}"); + }, (apiResponse) { if (apiResponse.messageStatus == 2) { // _dialogService.showErrorBottomSheet(message: apiResponse.errorMessage!, onOkPressed: () {}); diff --git a/lib/features/my_appointments/appointment_via_region_viewmodel.dart b/lib/features/my_appointments/appointment_via_region_viewmodel.dart index 3e3c3cd..6c6354a 100644 --- a/lib/features/my_appointments/appointment_via_region_viewmodel.dart +++ b/lib/features/my_appointments/appointment_via_region_viewmodel.dart @@ -110,11 +110,8 @@ class AppointmentViaRegionViewmodel extends ChangeNotifier { ); } } - if (clinicId == 253) { { - - navigationService.push( CustomPageRoute( page: LaserAppointment(), diff --git a/lib/features/my_appointments/my_appointments_repo.dart b/lib/features/my_appointments/my_appointments_repo.dart index b94f004..87451c2 100644 --- a/lib/features/my_appointments/my_appointments_repo.dart +++ b/lib/features/my_appointments/my_appointments_repo.dart @@ -47,6 +47,8 @@ abstract class MyAppointmentsRepo { Future>> insertLiveCareVIDARequest({required clientRequestID, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel}); Future>> getTamaraInstallmentsDetails(); + + Future>> getActiveAppointmentsCount(); } class MyAppointmentsRepoImp implements MyAppointmentsRepo { @@ -476,9 +478,6 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { onSuccess: (response, statusCode, {messageStatus, errorMessage}) { try { final list = response['PatientDoctorAppointmentResultList']; - // if (list == null || list.isEmpty) { - // throw Exception("Appointments list is empty"); - // } final appointmentsList = list.map((item) => PatientAppointmentHistoryResponseModel.fromJson(item as Map)).toList().cast(); @@ -583,4 +582,40 @@ class MyAppointmentsRepoImp implements MyAppointmentsRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future> getActiveAppointmentsCount() async { + Map mapDevice = {}; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_ACTIVE_APPOINTMENTS_LIST_URL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final appointmentCount = response['AppointmentActiveNumber']; + + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: appointmentCount, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } } diff --git a/lib/features/my_appointments/my_appointments_view_model.dart b/lib/features/my_appointments/my_appointments_view_model.dart index 60fbff2..e8b2650 100644 --- a/lib/features/my_appointments/my_appointments_view_model.dart +++ b/lib/features/my_appointments/my_appointments_view_model.dart @@ -1,8 +1,8 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/appointemnet_filters.dart'; +import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/get_tamara_installments_details_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_share_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_repo.dart'; @@ -17,6 +17,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { ErrorHandlerService errorHandlerService; AppState appState; + int activeAppointmentsCount = 0; + bool isMyAppointmentsLoading = false; bool isAppointmentPatientShareLoading = false; bool isTimeLineAppointmentsLoading = false; @@ -27,8 +29,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { List availableFilters = []; List? selectedFilter = []; bool isDateFilterSelected = false; - DateTime? start =null; - DateTime? end =null; + DateTime? start = null; + DateTime? end = null; List patientAppointmentsHistoryList = []; List filteredAppointmentList = []; @@ -64,7 +66,6 @@ class MyAppointmentsViewModel extends ChangeNotifier { isMyAppointmentsLoading = true; isTimeLineAppointmentsLoading = true; patientMyDoctorsList.clear(); - isPatientMyDoctorsLoading = true; } isTamaraDetailsLoading = true; isAppointmentPatientShareLoading = true; @@ -121,10 +122,12 @@ class MyAppointmentsViewModel extends ChangeNotifier { patientArrivedAppointmentsHistoryList.clear(); notifyListeners(); - final result = await myAppointmentsRepo.getPatientAppointments(isActiveAppointment: isActiveAppointment, isArrivedAppointments: isArrivedAppointments); - final resultArrived = await myAppointmentsRepo.getPatientAppointments(isActiveAppointment: false, isArrivedAppointments: true); + final results = await Future.wait([ + myAppointmentsRepo.getPatientAppointments(isActiveAppointment: isActiveAppointment, isArrivedAppointments: isArrivedAppointments), + myAppointmentsRepo.getPatientAppointments(isActiveAppointment: false, isArrivedAppointments: true), + ]); - result.fold( + results[0].fold( (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { @@ -141,7 +144,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { }, ); - resultArrived.fold( + results[1].fold( (failure) async => await errorHandlerService.handleError(failure: failure), (apiResponse) { if (apiResponse.messageStatus == 2) { @@ -149,6 +152,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { } else if (apiResponse.messageStatus == 1) { patientArrivedAppointmentsHistoryList = apiResponse.data!; isMyAppointmentsLoading = false; + isAppointmentDataToBeLoaded = false; notifyListeners(); if (onSuccess != null) { onSuccess(apiResponse); @@ -167,40 +171,36 @@ class MyAppointmentsViewModel extends ChangeNotifier { getFiltersForSelectedAppointmentList(filteredAppointmentList); } - void getFiltersForSelectedAppointmentList( - List filteredAppointmentList) { + void getFiltersForSelectedAppointmentList(List filteredAppointmentList) { availableFilters.clear(); if (filteredAppointmentList.isEmpty == true) return; availableFilters.add(AppointmentListingFilters.DATESELECTION); - if (filteredAppointmentList - .any((element) => element.isLiveCareAppointment == true)) { + if (filteredAppointmentList.any((element) => element.isLiveCareAppointment == true)) { availableFilters.add(AppointmentListingFilters.LIVECARE); } - if (filteredAppointmentList - .any((element) => element.isLiveCareAppointment == false)) { + if (filteredAppointmentList.any((element) => element.isLiveCareAppointment == false)) { availableFilters.add(AppointmentListingFilters.WALKIN); } - if (filteredAppointmentList - .any((element) => AppointmentType.isArrived(element) == true)) { + if (filteredAppointmentList.any((element) => AppointmentType.isArrived(element) == true)) { availableFilters.add(AppointmentListingFilters.ARRIVED); } - if (filteredAppointmentList - .any((element) => AppointmentType.isBooked(element) == true)) { + if (filteredAppointmentList.any((element) => AppointmentType.isBooked(element) == true)) { availableFilters.add(AppointmentListingFilters.BOOKED); } - if (filteredAppointmentList - .any((element) => AppointmentType.isConfirmed(element) == true)) { + if (filteredAppointmentList.any((element) => AppointmentType.isConfirmed(element) == true)) { availableFilters.add(AppointmentListingFilters.CONFIRMED); } notifyListeners(); } - Future getPatientShareAppointment(int projectID, int clinicID, String appointmentNo, bool isLiveCareAppointment, {Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.getPatientShareAppointment(projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo, isLiveCareAppointment: isLiveCareAppointment); + Future getPatientShareAppointment(int projectID, int clinicID, String appointmentNo, bool isLiveCareAppointment, + {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getPatientShareAppointment( + projectID: projectID, clinicID: clinicID, appointmentNo: appointmentNo, isLiveCareAppointment: isLiveCareAppointment); result.fold( (failure) async { @@ -226,8 +226,13 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future addAdvanceNumberRequest( - {required String advanceNumber, required String paymentReference, required String appointmentNo, Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); + {required String advanceNumber, + required String paymentReference, + required String appointmentNo, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = + await myAppointmentsRepo.addAdvanceNumberRequest(advanceNumber: advanceNumber, paymentReference: paymentReference, appointmentNo: appointmentNo); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -245,8 +250,14 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future generateAppointmentQR( - {required int clinicID, required int projectID, required String appointmentNo, required int isFollowUp, Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.generateAppointmentQR(clinicID: clinicID, projectID: projectID, appointmentNo: appointmentNo, isFollowUp: isFollowUp); + {required int clinicID, + required int projectID, + required String appointmentNo, + required int isFollowUp, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = + await myAppointmentsRepo.generateAppointmentQR(clinicID: clinicID, projectID: projectID, appointmentNo: appointmentNo, isFollowUp: isFollowUp); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -263,7 +274,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future cancelAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Future cancelAppointment( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await myAppointmentsRepo.cancelAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( @@ -282,7 +294,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { ); } - Future confirmAppointment({required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { + Future confirmAppointment( + {required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { final result = await myAppointmentsRepo.confirmAppointment(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( @@ -343,7 +356,8 @@ class MyAppointmentsViewModel extends ChangeNotifier { required int checkInType, Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.sendCheckInNfcRequest(patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, checkInType: checkInType); + final result = await myAppointmentsRepo.sendCheckInNfcRequest( + patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel, scannedCode: scannedCode, checkInType: checkInType); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -363,6 +377,9 @@ class MyAppointmentsViewModel extends ChangeNotifier { Future getPatientMyDoctors({Function(dynamic)? onSuccess, Function(String)? onError}) async { if (!isAppointmentDataToBeLoaded) return; + isPatientMyDoctorsLoading = true; + notifyListeners(); + final result = await myAppointmentsRepo.getPatientDoctorsList(); result.fold( @@ -386,8 +403,12 @@ class MyAppointmentsViewModel extends ChangeNotifier { } Future insertLiveCareVIDARequest( - {required clientRequestID, required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, Function(dynamic)? onSuccess, Function(String)? onError}) async { - final result = await myAppointmentsRepo.insertLiveCareVIDARequest(clientRequestID: clientRequestID, patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); + {required clientRequestID, + required PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel, + Function(dynamic)? onSuccess, + Function(String)? onError}) async { + final result = await myAppointmentsRepo.insertLiveCareVIDARequest( + clientRequestID: clientRequestID, patientAppointmentHistoryResponseModel: patientAppointmentHistoryResponseModel); result.fold( (failure) async => await errorHandlerService.handleError(failure: failure), @@ -434,7 +455,7 @@ class MyAppointmentsViewModel extends ChangeNotifier { return; } - selectedFilter?.add(availableFilter) ; + selectedFilter?.add(availableFilter); notifyListeners(); } @@ -454,14 +475,14 @@ class MyAppointmentsViewModel extends ChangeNotifier { if (start == null && end == null) { isDateFilterSelected = false; filteredAppointmentList.clear(); - sourceList.forEach((element) { + for (var element in sourceList) { if (isUnderFilter(element)) { filteredAppointmentList.add(element); } - }); + } } else { filteredAppointmentList.clear(); - sourceList.forEach((element) { + for (var element in sourceList) { try { var dateTime = DateUtil.convertStringToDate(element.appointmentDate).provideDateOnly(); @@ -472,14 +493,14 @@ class MyAppointmentsViewModel extends ChangeNotifier { } } } else if (start != null && end != null) { - if ((dateTime.isAfter(start)) && ((dateTime.isBefore(end))||((dateTime.isAtSameMomentAs(end))))) { + if ((dateTime.isAfter(start)) && ((dateTime.isBefore(end)) || ((dateTime.isAtSameMomentAs(end))))) { if (isUnderFilter(element)) { filteredAppointmentList.add(element); } } } } catch (e) {} - }); + } } notifyListeners(); } @@ -489,27 +510,24 @@ class MyAppointmentsViewModel extends ChangeNotifier { } bool isUnderFilter(PatientAppointmentHistoryResponseModel element) { - bool isUnderTheFilter = false; if (selectedFilter == null || selectedFilter!.isEmpty) return true; - int count = 0; for (var filter in selectedFilter ?? []) { switch (filter) { case AppointmentListingFilters.WALKIN: if (element.isLiveCareAppointment == false) return true; case AppointmentListingFilters.BOOKED: - if (AppointmentType.isBooked(element))return true; + if (AppointmentType.isBooked(element)) return true; case AppointmentListingFilters.CONFIRMED: - if (AppointmentType.isConfirmed(element))return true; + if (AppointmentType.isConfirmed(element)) return true; case AppointmentListingFilters.ARRIVED: - if (AppointmentType.isArrived(element))return true; + if (AppointmentType.isArrived(element)) return true; case AppointmentListingFilters.LIVECARE: if (element.isLiveCareAppointment == true) return true; case AppointmentListingFilters.DATESELECTION: - } } return false; @@ -527,17 +545,26 @@ class MyAppointmentsViewModel extends ChangeNotifier { if (onSuccess != null) { onSuccess(apiResponse); } + }, + ); + } - // if (apiResponse.messageStatus == 2) { - // onError!(apiResponse.errorMessage!); - // // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); - // } else if (apiResponse.messageStatus == 1) { - // getTamaraInstallmentsDetailsResponseModel = apiResponse.data!; - // notifyListeners(); - // if (onSuccess != null) { - // onSuccess(apiResponse); - // } - // } + Future getActiveAppointmentsCount({Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await myAppointmentsRepo.getActiveAppointmentsCount(); + + result.fold( + (failure) async => await errorHandlerService.handleError(failure: failure), + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + activeAppointmentsCount = 0; + } else if (apiResponse.messageStatus == 1) { + activeAppointmentsCount = apiResponse.data ?? 0; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } }, ); } diff --git a/lib/features/prescriptions/prescriptions_repo.dart b/lib/features/prescriptions/prescriptions_repo.dart index 5f2db30..2e3f1aa 100644 --- a/lib/features/prescriptions/prescriptions_repo.dart +++ b/lib/features/prescriptions/prescriptions_repo.dart @@ -3,6 +3,7 @@ import 'package:hmg_patient_app_new/core/api_consts.dart'; import 'package:hmg_patient_app_new/core/exceptions/api_failure.dart'; import 'package:hmg_patient_app_new/core/common_models/generic_api_model.dart'; import 'package:dartz/dartz.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/patient_prescriptions_response_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/models/resp_models/prescription_detail_response_model.dart'; import 'package:hmg_patient_app_new/services/logger_service.dart'; @@ -11,6 +12,10 @@ abstract class PrescriptionsRepo { Future>>> getPatientPrescriptionOrders({required String patientId}); Future>>> getPatientPrescriptionDetails({required PatientPrescriptionsResponseModel prescriptionsResponseModel}); + + Future>> getPrescriptionInstructionsPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel}); + + Future>> getPrescriptionPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel, required List prescriptionDetailsList}); } class PrescriptionsRepoImp implements PrescriptionsRepo { @@ -107,4 +112,98 @@ class PrescriptionsRepoImp implements PrescriptionsRepo { return Left(UnknownFailure(e.toString())); } } + + @override + Future> getPrescriptionInstructionsPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel}) async { + Map mapDevice = { + "AppointmentNo": prescriptionsResponseModel.appointmentNo.toString(), + "SetupID": prescriptionsResponseModel.setupID, + "ClinicID": prescriptionsResponseModel.clinicID.toString(), + "ProjectID": prescriptionsResponseModel.projectID.toString(), + "LocationID": "0", + "SalesInvoiceNo": "0", + "IsTest": false, + "ChannelID": "3", + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + GET_PRESCRIPTION_INSTRUCTIONS_PDF, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final prescriptionPDFURL = response["InvoiceUrl"]; + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: prescriptionPDFURL, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } + + @override + Future> getPrescriptionPDF({required PatientPrescriptionsResponseModel prescriptionsResponseModel, required List prescriptionDetailsList}) async { + Map mapDevice = { + "AppointmentDate": prescriptionsResponseModel.appointmentDate, + "ClinicName": prescriptionsResponseModel.clinicDescription, + "DoctorName": prescriptionsResponseModel.doctorName, + "ProjectID": prescriptionsResponseModel.projectID, + "DoctorID": prescriptionsResponseModel.doctorID, + "ClinicID": prescriptionsResponseModel.clinicID, + "DateofBirth": Utils.appState.getAuthenticatedUser()!.dateofBirth, + "ListPrescriptions": prescriptionDetailsList, + "PatientIditificationNum": Utils.appState.getAuthenticatedUser()!.patientIdentificationNo, + "PatientMobileNumber": Utils.appState.getAuthenticatedUser()!.mobileNumber, + "PatientName": "${Utils.appState.getAuthenticatedUser()!.firstName!} ${Utils.appState.getAuthenticatedUser()!.lastName!}", + "To": Utils.appState.getAuthenticatedUser()!.emailAddress, + "SetupID": prescriptionsResponseModel.setupID, + "IsDownload": true, + }; + + try { + GenericApiModel? apiResponse; + Failure? failure; + await apiClient.post( + SEND_PRESCRIPTION_EMAIL, + body: mapDevice, + onFailure: (error, statusCode, {messageStatus, failureType}) { + failure = failureType; + }, + onSuccess: (response, statusCode, {messageStatus, errorMessage}) { + try { + final prescriptionPDFData = response["Base64Data"]; + apiResponse = GenericApiModel( + messageStatus: messageStatus, + statusCode: statusCode, + errorMessage: null, + data: prescriptionPDFData, + ); + } catch (e) { + failure = DataParsingFailure(e.toString()); + } + }, + ); + if (failure != null) return Left(failure!); + if (apiResponse == null) return Left(ServerFailure("Unknown error")); + return Right(apiResponse!); + } catch (e) { + return Left(UnknownFailure(e.toString())); + } + } } diff --git a/lib/features/prescriptions/prescriptions_view_model.dart b/lib/features/prescriptions/prescriptions_view_model.dart index ebc3be8..aac25c1 100644 --- a/lib/features/prescriptions/prescriptions_view_model.dart +++ b/lib/features/prescriptions/prescriptions_view_model.dart @@ -23,6 +23,10 @@ class PrescriptionsViewModel extends ChangeNotifier { bool isSortByClinic = true; + String prescriptionInstructionsPDFLink = ""; + + String prescriptionPDFBase64Data = ""; + PrescriptionsViewModel({required this.prescriptionsRepo, required this.errorHandlerService}); initPrescriptionsViewModel() { @@ -126,4 +130,47 @@ class PrescriptionsViewModel extends ChangeNotifier { }, ); } + + Future getPrescriptionInstructionsPDF(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await prescriptionsRepo.getPrescriptionInstructionsPDF(prescriptionsResponseModel: prescriptionsResponseModel); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + // dialogService.showErrorDialog(message: apiResponse.errorMessage!, onOkPressed: () {}); + } else if (apiResponse.messageStatus == 1) { + prescriptionInstructionsPDFLink = apiResponse.data; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } + + Future getPrescriptionPDFBase64(PatientPrescriptionsResponseModel prescriptionsResponseModel, {Function(dynamic)? onSuccess, Function(String)? onError}) async { + final result = await prescriptionsRepo.getPrescriptionPDF(prescriptionsResponseModel: prescriptionsResponseModel, prescriptionDetailsList: prescriptionDetailsList); + + result.fold( + (failure) async { + onError!(failure.message); + }, + (apiResponse) { + if (apiResponse.messageStatus == 2) { + onError!(apiResponse.errorMessage!); + } else if (apiResponse.messageStatus == 1) { + prescriptionPDFBase64Data = apiResponse.data; + notifyListeners(); + if (onSuccess != null) { + onSuccess(apiResponse); + } + } + }, + ); + } } diff --git a/lib/generated/locale_keys.g.dart b/lib/generated/locale_keys.g.dart index 798f94d..7433ff7 100644 --- a/lib/generated/locale_keys.g.dart +++ b/lib/generated/locale_keys.g.dart @@ -2,7 +2,7 @@ // ignore_for_file: constant_identifier_names -abstract class LocaleKeys { +abstract class LocaleKeys { static const english = 'english'; static const arabic = 'arabic'; static const login = 'login'; @@ -876,5 +876,4 @@ abstract class LocaleKeys { static const walkin = 'walkin'; static const laserClinic = 'laserClinic'; static const continueString = 'continueString'; - } diff --git a/lib/main.dart b/lib/main.dart index 20507d0..259ce3b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -11,6 +11,7 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/doctor_filter/doctor_filter_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; @@ -125,6 +126,9 @@ void main() async { ), ChangeNotifierProvider( create: (_) => getIt.get(), + ), + ChangeNotifierProvider( + create: (_) => getIt.get(), ) ], child: MyApp()), ), @@ -170,4 +174,4 @@ class MyApp extends StatelessWidget { ); } } -// flutter pub run easy_localization:generate -S assets/langs -f keys -o locale_keys.g.dart \ No newline at end of file +// flutter pub run easy_localization:generate -S assets/langs -f keys -o locale_keys.g.dart diff --git a/lib/presentation/appointments/appointment_details_page.dart b/lib/presentation/appointments/appointment_details_page.dart index c87039c..f5b5b7e 100644 --- a/lib/presentation/appointments/appointment_details_page.dart +++ b/lib/presentation/appointments/appointment_details_page.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; -import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -22,16 +21,15 @@ import 'package:hmg_patient_app_new/presentation/appointments/appointment_paymen import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_checkin_bottom_sheet.dart'; import 'package:hmg_patient_app_new/presentation/appointments/widgets/appointment_doctor_card.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescription_detail_page.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:maps_launcher/maps_launcher.dart'; import 'package:provider/provider.dart'; @@ -86,30 +84,25 @@ class _AppointmentDetailsPageState extends State { onAskDoctorTap: () {}, onCancelTap: () async { myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); - showCommonBottomSheet(context, - child: Utils.getLoadingWidget(), - callBackFunc: (str) {}, - title: "", - height: ResponsiveExtension.screenHeight * 0.3, - isCloseButtonVisible: false, - isDismissible: false, - isFullScreen: false); + LoaderBottomSheet.showLoader(loadingText: "Cancelling Appointment, Please Wait...".needTranslation); await myAppointmentsViewModel.cancelAppointment( patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, onSuccess: (apiResponse) { - Navigator.of(context).pop(); - showCommonBottomSheet(context, - child: Utils.getSuccessWidget(loadingText: "Appointment Cancelled Successfully".needTranslation), - callBackFunc: (str) {}, - title: "", - height: ResponsiveExtension.screenHeight * 0.3, - isCloseButtonVisible: false, - isDismissible: false, - isFullScreen: false, - isSuccessDialog: true); + LoaderBottomSheet.hideLoader(); + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + myAppointmentsViewModel.getPatientAppointments(true, false); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getSuccessWidget(loadingText: "Appointment Cancelled Successfully".needTranslation), + callBackFunc: () { + Navigator.of(context).pop(); + }, + title: "", + isCloseButtonVisible: true, + isDismissible: false, + isFullScreen: false, + ); }); - Navigator.of(context).pop(); - Navigator.of(context).pop(); }, onRescheduleTap: () async { openDoctorScheduleCalendar(); @@ -175,15 +168,19 @@ class _AppointmentDetailsPageState extends State { child: CustomButton( text: "Get Directions".needTranslation, onPressed: () { - MapsLauncher.launchCoordinates(double.parse(widget.patientAppointmentHistoryResponseModel.latitude!), - double.parse(widget.patientAppointmentHistoryResponseModel.longitude!), widget.patientAppointmentHistoryResponseModel.projectName); + MapsLauncher.launchCoordinates( + double.parse(widget.patientAppointmentHistoryResponseModel.latitude!), + double.parse(widget.patientAppointmentHistoryResponseModel.longitude!), + widget.patientAppointmentHistoryResponseModel.projectName); }, backgroundColor: AppColors.textColor.withOpacity(0.8), - borderColor: AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), + borderColor: + AppointmentType.getNextActionButtonColor(widget.patientAppointmentHistoryResponseModel.nextAction) + .withOpacity(0.01), textColor: AppColors.whiteColor, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, - borderRadius: 12.h, + borderRadius: 12.r, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), height: 40.h, icon: AppAssets.directions_icon, @@ -240,7 +237,8 @@ class _AppointmentDetailsPageState extends State { "Lab & Radiology".needTranslation.toText18(isBold: true), SizedBox(height: 16.h), GridView( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 13.h, mainAxisSpacing: 13.h, childAspectRatio: 7 / 6), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 2, crossAxisSpacing: 13.h, mainAxisSpacing: 13.h, childAspectRatio: 7 / 6), physics: NeverScrollableScrollPhysics(), shrinkWrap: true, children: [ @@ -301,13 +299,17 @@ class _AppointmentDetailsPageState extends State { children: [ Column( children: [ - SizedBox(width: 150.h, child: prescriptionVM.prescriptionDetailsList[index].itemDescription!.toText12(isBold: true, maxLine: 1)), + SizedBox( + width: 150.h, + child: prescriptionVM.prescriptionDetailsList[index].itemDescription! + .toText12(isBold: true, maxLine: 1)), SizedBox( width: 150.h, child: "Prescribed By: ${widget.patientAppointmentHistoryResponseModel.doctorTitle} ${widget.patientAppointmentHistoryResponseModel.doctorNameObj}" .needTranslation - .toText10(weight: FontWeight.w500, color: AppColors.greyTextColor, letterSpacing: -0.4), + .toText10( + weight: FontWeight.w500, color: AppColors.greyTextColor, letterSpacing: -0.4), ), ], ), @@ -420,7 +422,8 @@ class _AppointmentDetailsPageState extends State { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ "Amount before tax".needTranslation.toText18(isBold: true), - Utils.getPaymentAmountWithSymbol(widget.patientAppointmentHistoryResponseModel.patientShare!.toString().toText16(isBold: true), AppColors.blackColor, 13, + Utils.getPaymentAmountWithSymbol( + widget.patientAppointmentHistoryResponseModel.patientShare!.toString().toText16(isBold: true), AppColors.blackColor, 13, isSaudiCurrency: true), ], ), @@ -428,8 +431,12 @@ class _AppointmentDetailsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Expanded(child: LocaleKeys.upcomingPaymentNow.tr(context: context).toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor)), - "VAT 15%(${widget.patientAppointmentHistoryResponseModel.patientTaxAmount})".needTranslation.toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -2), + Expanded( + child: + LocaleKeys.upcomingPaymentNow.tr(context: context).toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor)), + "VAT 15%(${widget.patientAppointmentHistoryResponseModel.patientTaxAmount})" + .needTranslation + .toText14(isBold: true, color: AppColors.greyTextColor, letterSpacing: -2), ], ), SizedBox(height: 18.h), @@ -443,7 +450,10 @@ class _AppointmentDetailsPageState extends State { Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ - Utils.getPaymentAmountWithSymbol(widget.patientAppointmentHistoryResponseModel.patientShareWithTax!.toString().toText24(isBold: true), AppColors.blackColor, 17, + Utils.getPaymentAmountWithSymbol( + widget.patientAppointmentHistoryResponseModel.patientShareWithTax!.toString().toText24(isBold: true), + AppColors.blackColor, + 17, isSaudiCurrency: true), ], ), @@ -510,7 +520,7 @@ class _AppointmentDetailsPageState extends State { projectName: widget.patientAppointmentHistoryResponseModel.projectName, ); bookAppointmentsViewModel.setSelectedDoctor(doctor); - LoaderBottomSheet.showLoader(); + LoaderBottomSheet.showLoader(loadingText: "Fetching Doctor Schedule, Please Wait...".needTranslation); await bookAppointmentsViewModel.getDoctorFreeSlots( isBookingForLiveCare: false, onSuccess: (dynamic respData) async { @@ -541,24 +551,25 @@ class _AppointmentDetailsPageState extends State { case 0: break; case 10: - showCommonBottomSheet(context, - child: Utils.getLoadingWidget(), callBackFunc: (str) {}, title: "", height: ResponsiveExtension.screenHeight * 0.3, isCloseButtonVisible: false, isDismissible: false, isFullScreen: false); + LoaderBottomSheet.showLoader(loadingText: "Confirming Appointment, Please Wait...".needTranslation); await myAppointmentsViewModel.confirmAppointment( patientAppointmentHistoryResponseModel: widget.patientAppointmentHistoryResponseModel, onSuccess: (apiResponse) { - Navigator.of(context).pop(); - showCommonBottomSheet(context, - child: Utils.getSuccessWidget(loadingText: "Appointment Confirmed Successfully".needTranslation), - callBackFunc: (str) {}, + LoaderBottomSheet.hideLoader(); + myAppointmentsViewModel.setIsAppointmentDataToBeLoaded(true); + myAppointmentsViewModel.getPatientAppointments(true, false); + showCommonBottomSheet(context, child: Utils.getSuccessWidget(loadingText: "Appointment Confirmed Successfully".needTranslation), + callBackFunc: (str) { + Navigator.of(context).pop(); + }, title: "", height: ResponsiveExtension.screenHeight * 0.3, - isCloseButtonVisible: false, + isCloseButtonVisible: true, isDismissible: false, isFullScreen: false, isSuccessDialog: true); }); - Navigator.of(context).pop(); - Navigator.of(context).pop(); + // LoaderBottomSheet.hideLoader(); case 15: break; case 20: diff --git a/lib/presentation/appointments/my_appointments_page.dart b/lib/presentation/appointments/my_appointments_page.dart index 1305ea0..8d9adec 100644 --- a/lib/presentation/appointments/my_appointments_page.dart +++ b/lib/presentation/appointments/my_appointments_page.dart @@ -188,7 +188,6 @@ class _MyAppointmentsPageState extends State { Widget getAppointmentFilters(MyAppointmentsViewModel myAppointmentsVM) { return SizedBox( - height: 56.h, child: Row( children: [ Expanded( diff --git a/lib/presentation/appointments/my_doctors_page.dart b/lib/presentation/appointments/my_doctors_page.dart index 06257c7..51e9703 100644 --- a/lib/presentation/appointments/my_doctors_page.dart +++ b/lib/presentation/appointments/my_doctors_page.dart @@ -8,10 +8,16 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/book_appointments_view_model.dart'; +import 'package:hmg_patient_app_new/features/book_appointments/models/resp_models/doctors_list_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:provider/provider.dart'; import '../../widgets/chip/app_custom_chip_widget.dart'; @@ -20,11 +26,13 @@ class MyDoctorsPage extends StatelessWidget { MyDoctorsPage({super.key}); late MyAppointmentsViewModel myAppointmentsViewModel; + late BookAppointmentsViewModel bookAppointmentsViewModel; @override Widget build(BuildContext context) { AppState appState = getIt.get(); myAppointmentsViewModel = Provider.of(context, listen: false); + bookAppointmentsViewModel = Provider.of(context, listen: false); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( @@ -141,13 +149,38 @@ class MyDoctorsPage extends StatelessWidget { "".toText16(), Transform.flip( flipX: appState.isArabic(), - child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), + child: + Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), ], ), ], ), ), - ), + ).onPress(() async { + bookAppointmentsViewModel.setSelectedDoctor(DoctorsListResponseModel( + clinicID: myAppointmentsVM.patientMyDoctorsList[index].clinicID, + projectID: myAppointmentsVM.patientMyDoctorsList[index].projectID, + doctorID: myAppointmentsVM.patientMyDoctorsList[index].doctorID, + )); + LoaderBottomSheet.showLoader(); + await bookAppointmentsViewModel.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), ), ), ); diff --git a/lib/presentation/appointments/widgets/appointment_card.dart b/lib/presentation/appointments/widgets/appointment_card.dart index aa67a76..1451bcb 100644 --- a/lib/presentation/appointments/widgets/appointment_card.dart +++ b/lib/presentation/appointments/widgets/appointment_card.dart @@ -117,26 +117,26 @@ class _AppointmentCardState extends State { ).toShimmer2(isShow: widget.isLoading), ), // TODO: Implement the logic to enable/disable the switch based on reminder status - AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) - ? SizedBox().toShimmer2(isShow: widget.isLoading) - : Switch( - activeColor: AppColors.successColor, - activeTrackColor: AppColors.successColor.withValues(alpha: .15), - thumbIcon: WidgetStateProperty.resolveWith( - (Set states) { - if (states.contains(WidgetState.selected)) { - return const Icon(Icons.check); // Icon when switch is ON - } - return const Icon(Icons.close); // Icon when switch is OFF - }, - ), - value: widget.isLoading ? false : widget.patientAppointmentHistoryResponseModel.hasReminder!, - onChanged: (newValue) { - setState(() { - widget.myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); - }); - }, - ).toShimmer2(isShow: widget.isLoading), + // AppointmentType.isArrived(widget.patientAppointmentHistoryResponseModel) + // ? SizedBox().toShimmer2(isShow: widget.isLoading) + // : Switch( + // activeColor: AppColors.successColor, + // activeTrackColor: AppColors.successColor.withValues(alpha: .15), + // thumbIcon: WidgetStateProperty.resolveWith( + // (Set states) { + // if (states.contains(WidgetState.selected)) { + // return const Icon(Icons.check); // Icon when switch is ON + // } + // return const Icon(Icons.close); // Icon when switch is OFF + // }, + // ), + // value: widget.isLoading ? false : widget.patientAppointmentHistoryResponseModel.hasReminder!, + // onChanged: (newValue) { + // setState(() { + // widget.myAppointmentsViewModel.setAppointmentReminder(newValue, widget.patientAppointmentHistoryResponseModel); + // }); + // }, + // ).toShimmer2(isShow: widget.isLoading), ], ), SizedBox(height: 16.h), @@ -155,7 +155,7 @@ class _AppointmentCardState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ (widget.isLoading ? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png" : widget.patientAppointmentHistoryResponseModel.doctorNameObj!) - .toText16(isBold: true) + .toText16(isBold: true, maxlines: 1) .toShimmer2(isShow: widget.isLoading), SizedBox(height: 8.h), Wrap( diff --git a/lib/presentation/authentication/login.dart b/lib/presentation/authentication/login.dart index f3d7664..7e5f4a1 100644 --- a/lib/presentation/authentication/login.dart +++ b/lib/presentation/authentication/login.dart @@ -1,5 +1,3 @@ -import 'dart:developer'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/gestures.dart'; import 'package:flutter/material.dart'; @@ -94,6 +92,7 @@ class LoginScreenState extends State { ), SizedBox(height: 16.h), // Adjusted to sizer unit (approx 16px) CustomButton( + height: 50.h, text: LocaleKeys.login.tr(), icon: AppAssets.login1, iconColor: Colors.white, @@ -117,7 +116,7 @@ class LoginScreenState extends State { text: TextSpan( style: context.dynamicTextStyle( color: Colors.black, - fontSize: 14.fSize, // Adjusted to sizer unit + fontSize: 14.f, // Adjusted to sizer unit height: 26 / 16, // This height is a ratio, may need re-evaluation fontWeight: FontWeight.w500, ), @@ -128,7 +127,7 @@ class LoginScreenState extends State { text: LocaleKeys.registernow.tr(), style: context.dynamicTextStyle( color: AppColors.primaryRedColor, - fontSize: 14.fSize, // Adjusted to sizer unit + fontSize: 14.f, // Adjusted to sizer unit height: 26 / 16, // Ratio fontWeight: FontWeight.w500), recognizer: TapGestureRecognizer() @@ -142,6 +141,7 @@ class LoginScreenState extends State { ), ).withVerticalPadding(2), // Adjusted to sizer unit ), + SizedBox(height: 20.h), // Adjusted to sizer unit (approx 14px) ], ), ), @@ -160,6 +160,7 @@ class LoginScreenState extends State { isScrollControlled: true, isDismissible: false, useSafeArea: true, + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width), backgroundColor: AppColors.transparent, child: StatefulBuilder(builder: (BuildContext context, StateSetter setModalState) { return Padding( diff --git a/lib/presentation/authentication/quick_login.dart b/lib/presentation/authentication/quick_login.dart index a370fb4..f10d84f 100644 --- a/lib/presentation/authentication/quick_login.dart +++ b/lib/presentation/authentication/quick_login.dart @@ -1,7 +1,7 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; -import 'package:flutter_svg/flutter_svg.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -17,11 +17,10 @@ class QuickLogin extends StatefulWidget { const QuickLogin({super.key, required this.onPressed, this.isDone = false}); @override - _QuickLogin createState() => _QuickLogin(); + QuickLoginState createState() => QuickLoginState(); } -class _QuickLogin extends State { - +class QuickLoginState extends State { @override Widget build(BuildContext context) { NavigationService navigationService = getIt.get(); @@ -40,99 +39,95 @@ class _QuickLogin extends State { children: [ widget.isDone ? Column( - children: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - InkWell( - onTap: () { - navigationService.pop(); - }, - child: Utils.buildSvgWithAssets(icon: AppAssets.cross_circle)), - ], - ), - Utils.showLottie(context: context, assetPath: AppAnimations.checkmark, width: 120, height: 120, repeat: true), - LocaleKeys.allSet.tr().toText16(textAlign: - TextAlign.center, weight: FontWeight.w500) - // Text( - // ' TranslationBase.of(context).allSet', - // textAlign: TextAlign.center, - // style: context.dynamicTextStyle( - // fontSize: 16, - // fontWeight: FontWeight.w500, - // color: Colors.black, - // ), - // ), - ], - ) + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + InkWell( + onTap: () { + navigationService.pop(); + }, + child: Utils.buildSvgWithAssets(icon: AppAssets.cross_circle)), + ], + ), + Utils.showLottie(context: context, assetPath: AppAnimations.checkmark, width: 120, height: 120, repeat: true), + LocaleKeys.allSet.tr().toText16(textAlign: TextAlign.center, weight: FontWeight.w500) + // Text( + // ' TranslationBase.of(context).allSet', + // textAlign: TextAlign.center, + // style: context.dynamicTextStyle( + // fontSize: 16, + // fontWeight: FontWeight.w500, + // color: Colors.black, + // ), + // ), + ], + ) : Column( - mainAxisSize: MainAxisSize.min, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Image.asset( - AppAssets.lockIcon, - height: 101, - ), - const SizedBox(height: 10), - LocaleKeys.enableQuickLogin.tr().toText26(isBold: true), - // Text( - // ' TranslationBase.of(context).enableQuickLogin', - // style: context.dynamicTextStyle( - // fontSize: 26, - // fontWeight: FontWeight.bold, - // color: Colors.black, - // ), - // ), - const SizedBox(height: 5), - LocaleKeys.enableQuickLogin.tr().toText16(color: AppColors.quickLoginColor), - // Description - // Text( - // 'TranslationBase.of(context).enableMsg', - // style: context.dynamicTextStyle( - // fontSize: 16, - // color: Color(0xFF666666), - // height: 1.5, - // ), - //), - const SizedBox(height: 24), - // Buttons - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Expanded( - child: CustomButton( - text:LocaleKeys.enableQuickLogin.tr(), - onPressed: () { - widget.onPressed(); - }, - backgroundColor: Color(0xffED1C2B), - borderColor: Color(0xffED1C2B), - textColor: Colors.white, - icon:AppAssets.apple_finder, - )), - ], - ), - SizedBox( - height: 16, - ), - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - Expanded( - child: CustomButton( - text: LocaleKeys.notNow.tr(), - onPressed: () { - Navigator.pop(context, "true"); - }, - backgroundColor: Color(0xffFEE9EA), - borderColor: Color(0xffFEE9EA), - textColor: Colors.red, - // icon: "assets/images/svg/apple-finder.svg", - )), - ], - ), - ], - ) + mainAxisSize: MainAxisSize.min, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Image.asset(AppAssets.lockIcon, height: 100), + SizedBox(height: 10.h), + LocaleKeys.enableQuickLogin.tr().toText26(isBold: true), + // Text( + // ' TranslationBase.of(context).enableQuickLogin', + // style: context.dynamicTextStyle( + // fontSize: 26, + // fontWeight: FontWeight.bold, + // color: Colors.black, + // ), + // ), + SizedBox(height: 5.h), + LocaleKeys.enableQuickLogin.tr().toText16(color: AppColors.quickLoginColor), + // Description + // Text( + // 'TranslationBase.of(context).enableMsg', + // style: context.dynamicTextStyle( + // fontSize: 16, + // color: Color(0xFF666666), + // height: 1.5, + // ), + //), + const SizedBox(height: 24), + // Buttons + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.enableQuickLogin.tr(), + onPressed: () { + widget.onPressed(); + }, + backgroundColor: Color(0xffED1C2B), + borderColor: Color(0xffED1C2B), + textColor: Colors.white, + icon: AppAssets.apple_finder, + )), + ], + ), + SizedBox( + height: 16, + ), + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + Expanded( + child: CustomButton( + text: LocaleKeys.notNow.tr(), + onPressed: () { + Navigator.pop(context, "true"); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Colors.red, + // icon: "assets/images/svg/apple-finder.svg", + )), + ], + ), + ], + ) ], ), ); diff --git a/lib/presentation/authentication/register.dart b/lib/presentation/authentication/register.dart index df1c8c7..9551ba1 100644 --- a/lib/presentation/authentication/register.dart +++ b/lib/presentation/authentication/register.dart @@ -11,7 +11,6 @@ import 'package:hmg_patient_app_new/core/utils/validation_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/authentication/authentication_view_model.dart'; -import 'package:hmg_patient_app_new/features/authentication/widgets/otp_verification_screen.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/app_bar_widget.dart'; @@ -79,7 +78,8 @@ class _RegisterNew extends State { mainAxisSize: MainAxisSize.min, crossAxisAlignment: CrossAxisAlignment.start, children: [ - Utils.showLottie(context: context, assetPath: 'assets/animations/lottie/register.json', width: 200.h, height: 200.h, fit: BoxFit.cover, repeat: true), + Utils.showLottie( + context: context, assetPath: 'assets/animations/lottie/register.json', width: 200.h, height: 200.h, fit: BoxFit.cover, repeat: true), SizedBox(height: 16.h), LocaleKeys.prepareToElevate.tr().toText32(isBold: true), SizedBox(height: 24.h), @@ -149,7 +149,7 @@ class _RegisterNew extends State { borderRadius: BorderRadius.circular(6), border: Border.all(color: isTermsAccepted ? AppColors.primaryRedBorderColor : AppColors.greyColor, width: 2.h), ), - child: isTermsAccepted ? Icon(Icons.check, size: 16.fSize, color: Colors.white) : null, + child: isTermsAccepted ? Icon(Icons.check, size: 16.f, color: Colors.white) : null, ); }, ), @@ -158,7 +158,7 @@ class _RegisterNew extends State { children: [ Text( LocaleKeys.iAcceptThe.tr(), - style: context.dynamicTextStyle(fontSize: 14.fSize, fontWeight: FontWeight.w500, color: Color(0xFF2E3039)), + style: context.dynamicTextStyle(fontSize: 14.f, fontWeight: FontWeight.w500, color: Color(0xFF2E3039)), ), GestureDetector( onTap: () { @@ -168,7 +168,7 @@ class _RegisterNew extends State { child: Text( LocaleKeys.termsConditoins.tr(), style: context.dynamicTextStyle( - fontSize: 14.fSize, + fontSize: 14.f, fontWeight: FontWeight.w500, color: AppColors.primaryRedColor, decoration: TextDecoration.underline, @@ -216,7 +216,7 @@ class _RegisterNew extends State { text: TextSpan( style: context.dynamicTextStyle( color: Colors.black, - fontSize: 16.fSize, + fontSize: 16.f, height: 26 / 16, fontWeight: FontWeight.w500, ), @@ -227,7 +227,7 @@ class _RegisterNew extends State { text: LocaleKeys.loginNow.tr(), style: context.dynamicTextStyle( color: AppColors.primaryRedColor, - fontSize: 16.fSize, + fontSize: 16.f, height: 26 / 16, fontWeight: FontWeight.w500, ), diff --git a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart index 1a772f7..2785449 100644 --- a/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart +++ b/lib/presentation/book_appointment/doctor_filter/doctors_filter.dart @@ -62,7 +62,7 @@ class DoctorsFilters extends StatelessWidget{ style:TextStyle( fontFamily: 'Poppins', fontWeight: FontWeight.w600, - fontSize: 27.fSize, + fontSize: 27.f, color: AppColors.textColor, letterSpacing: -1 ) @@ -72,7 +72,7 @@ class DoctorsFilters extends StatelessWidget{ style:TextStyle( fontFamily: 'Poppins', fontWeight: FontWeight.w500, - fontSize: 14.fSize, + fontSize: 14.f, color: AppColors.errorColor ) ).onPress((){ @@ -202,7 +202,7 @@ class DoctorsFilters extends StatelessWidget{ style:TextStyle( fontFamily: 'Poppins', fontWeight: FontWeight.w600, - fontSize: 16.fSize, + fontSize: 16.f, color: AppColors.textColor, letterSpacing:-1 ) diff --git a/lib/presentation/book_appointment/laser/laser_appointment.dart b/lib/presentation/book_appointment/laser/laser_appointment.dart index bad0591..440ae45 100644 --- a/lib/presentation/book_appointment/laser/laser_appointment.dart +++ b/lib/presentation/book_appointment/laser/laser_appointment.dart @@ -39,7 +39,7 @@ class LaserAppointment extends StatelessWidget { Text( LocaleKeys.totalMinutes.tr(), style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: FontWeight.w600, color: AppColors.textColor, letterSpacing: -0.48, @@ -48,7 +48,7 @@ class LaserAppointment extends StatelessWidget { Text( "$duration / 90".tr(), style: TextStyle( - fontSize: 16.fSize, + fontSize: 16.f, fontWeight: FontWeight.bold, color: AppColors.textColor, letterSpacing: -0.64, diff --git a/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart b/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart index 564c013..c957868 100644 --- a/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart +++ b/lib/presentation/book_appointment/laser/widgets/body_part_listing.dart @@ -43,85 +43,88 @@ class BodyPartsListing extends StatelessWidget { itemBuilder: (BuildContext context, int index) { return SizedBox( height: 80, width: 80,).toShimmer2(isShow: isLoading); })), - GridView.builder( - gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( - crossAxisCount: 3, - childAspectRatio: 85 / 107, - crossAxisSpacing: 4.h, - mainAxisSpacing: 21.h), - physics: NeverScrollableScrollPhysics(), - shrinkWrap: true, - itemCount: parts.length, - // padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero, - padding: EdgeInsets.zero, - itemBuilder: (BuildContext context, int index) { - bool _isSelected = - selectedPart.any((file) => file.id == parts[index].id); - return InkWell( - onTap: () { - onPartSelected(parts[index]); - }, - child: AnimatedOpacity( - opacity: 1.0, - duration: Duration(milliseconds: 200), - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - AspectRatio( - aspectRatio: 97 / 97, - child: FittedBox( - fit: BoxFit.fitWidth, - child: Stack( - alignment: Alignment.topRight, - children: [ - Container( - margin: EdgeInsets.only(top: 5.h, right: 5.h), - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(15.0), - border: Border.all( - color: _isSelected - ? AppColors.primaryRedColor - : AppColors.borderGrayColor, - width: 2.h), - ), - child: LaserBodyParts().getCategoryImage(isMale, - laserCategoryID, parts[index].mappingCode!), - ), - if (_isSelected) + Visibility( + visible: !isLoading, + child: GridView.builder( + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( + crossAxisCount: 3, + childAspectRatio: 85 / 107, + crossAxisSpacing: 4.h, + mainAxisSpacing: 21.h), + physics: NeverScrollableScrollPhysics(), + shrinkWrap: true, + itemCount: parts.length, + // padding: fullBody != null ? EdgeInsets.only(top: 16) : EdgeInsets.zero, + padding: EdgeInsets.zero, + itemBuilder: (BuildContext context, int index) { + bool _isSelected = + selectedPart.any((file) => file.id == parts[index].id); + return InkWell( + onTap: () { + onPartSelected(parts[index]); + }, + child: AnimatedOpacity( + opacity: 1.0, + duration: Duration(milliseconds: 200), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + AspectRatio( + aspectRatio: 97 / 97, + child: FittedBox( + fit: BoxFit.fitWidth, + child: Stack( + alignment: Alignment.topRight, + children: [ Container( - width: 18.h, - height: 18.h, - child: Icon(Icons.done, - color: Colors.white, size: 12.h), + margin: EdgeInsets.only(top: 5.h, right: 5.h), decoration: BoxDecoration( - color: AppColors.primaryRedColor, - borderRadius: BorderRadius.circular(30.h), + borderRadius: BorderRadius.circular(15.0), + border: Border.all( + color: _isSelected + ? AppColors.primaryRedColor + : AppColors.borderGrayColor, + width: 2.h), ), + child: LaserBodyParts().getCategoryImage(isMale, + laserCategoryID, parts[index].mappingCode!), ), - ], + if (_isSelected) + Container( + width: 18.h, + height: 18.h, + child: Icon(Icons.done, + color: Colors.white, size: 12.h), + decoration: BoxDecoration( + color: AppColors.primaryRedColor, + borderRadius: BorderRadius.circular(30.h), + ), + ), + ], + ), ), ), - ), - SizedBox(height: 6.h), - Expanded( - child: Text( - context - .read() - .getLaserProcedureNameWRTLanguage(parts[index]), - style: TextStyle( - fontSize: 12.fSize, - fontWeight: FontWeight.w600, - color: Color(0xff2B353E), - letterSpacing: -0.48, + SizedBox(height: 6.h), + Expanded( + child: Text( + context + .read() + .getLaserProcedureNameWRTLanguage(parts[index]), + style: TextStyle( + fontSize: 12.f, + fontWeight: FontWeight.w600, + color: Color(0xff2B353E), + letterSpacing: -0.48, + ), + maxLines: 1, ), - maxLines: 1, ), - ), - ], + ], + ), ), - ), - ); - }, + ); + }, + ), ), ], ); diff --git a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart index 2d671cf..e9e5c5c 100644 --- a/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart +++ b/lib/presentation/book_appointment/livecare/immediate_livecare_pending_request_page.dart @@ -278,7 +278,7 @@ class _ImmediateLiveCarePendingRequestPageState extends State { }); } - Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { + Widget getRegionalSelectionWidget(AppointmentViaRegionViewmodel data) { if (data.bottomSheetState == AppointmentViaRegionState.REGION_SELECTION) { return RegionBottomSheetBody(); } @@ -303,7 +303,10 @@ class _SelectClinicPageState extends State { id = regionalViewModel.selectedHospital?.patientDoctorAppointmentList?.first.projectID?.toString() ?? ""; } if (bookAppointmentsViewModel.selectedClinic.clinicID == 17) { - if (!appState.isAuthenticated) { + if (appState.isAuthenticated) { + initDentalAppointment(); + return SizedBox.shrink(); + }else { bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); } } @@ -459,8 +462,21 @@ class _SelectClinicPageState extends State { isCloseButtonVisible: true, ); } else { - // Navigate to Chief Complaint Screen + bookAppointmentsViewModel.setIsChiefComplaintsListLoading(true); + Navigator.of(context).push( + CustomPageRoute( + page: DentalChiefComplaintsPage(), + ), + ); } }); } + + void initDentalAppointment() async { + await Future.delayed(Duration(milliseconds: 300)); + initDentalAppointmentBookingFlow(int.parse(bookAppointmentsViewModel + .currentlySelectedHospitalFromRegionFlow ?? + "0")); + return; + } } diff --git a/lib/presentation/book_appointment/select_doctor_page.dart b/lib/presentation/book_appointment/select_doctor_page.dart index b0b2a45..46c3774 100644 --- a/lib/presentation/book_appointment/select_doctor_page.dart +++ b/lib/presentation/book_appointment/select_doctor_page.dart @@ -15,8 +15,8 @@ import 'package:hmg_patient_app_new/features/book_appointments/models/resp_model import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/doctor_card.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; @@ -132,14 +132,18 @@ class _SelectDoctorPageState extends State { child: AnimatedContainer( duration: Duration(milliseconds: 300), curve: Curves.easeInOut, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), child: DoctorCard( - doctorsListResponseModel: bookAppointmentsVM.isLiveCareSchedule ? bookAppointmentsVM.liveCareDoctorsList[index] : bookAppointmentsVM.doctorsList[index], + doctorsListResponseModel: bookAppointmentsVM.isLiveCareSchedule + ? bookAppointmentsVM.liveCareDoctorsList[index] + : bookAppointmentsVM.doctorsList[index], isLoading: false, bookAppointmentsViewModel: bookAppointmentsViewModel, ).onPress(() async { - bookAppointmentsVM - .setSelectedDoctor(bookAppointmentsVM.isLiveCareSchedule ? bookAppointmentsVM.liveCareDoctorsList[index] : bookAppointmentsVM.doctorsList[index]); + bookAppointmentsVM.setSelectedDoctor(bookAppointmentsVM.isLiveCareSchedule + ? bookAppointmentsVM.liveCareDoctorsList[index] + : bookAppointmentsVM.doctorsList[index]); // bookAppointmentsVM.setSelectedDoctor(DoctorsListResponseModel()); LoaderBottomSheet.showLoader(); await bookAppointmentsVM.getDoctorProfile(onSuccess: (dynamic respData) { diff --git a/lib/presentation/book_appointment/widgets/appointment_calendar.dart b/lib/presentation/book_appointment/widgets/appointment_calendar.dart index e7a47aa..ff966c2 100644 --- a/lib/presentation/book_appointment/widgets/appointment_calendar.dart +++ b/lib/presentation/book_appointment/widgets/appointment_calendar.dart @@ -99,11 +99,11 @@ class _AppointmentCalendarState extends State { headerStyle: CalendarHeaderStyle( backgroundColor: AppColors.scaffoldBgColor, textAlign: TextAlign.start, - textStyle: TextStyle(fontSize: 18.fSize, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.primaryRedColor, fontFamily: "Poppins"), + textStyle: TextStyle(fontSize: 18.f, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.primaryRedColor, fontFamily: "Poppins"), ), viewHeaderStyle: ViewHeaderStyle( backgroundColor: AppColors.scaffoldBgColor, - dayTextStyle: TextStyle(fontSize: 14.fSize, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.textColor), + dayTextStyle: TextStyle(fontSize: 14.f, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.textColor), ), view: CalendarView.month, todayHighlightColor: Colors.transparent, @@ -131,7 +131,7 @@ class _AppointmentCalendarState extends State { showTrailingAndLeadingDates: false, appointmentDisplayCount: 1, monthCellStyle: MonthCellStyle( - textStyle: TextStyle(fontSize: 19.fSize), + textStyle: TextStyle(fontSize: 19.f), ), ), onTap: (CalendarTapDetails details) { diff --git a/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart new file mode 100644 index 0000000..0e23d49 --- /dev/null +++ b/lib/presentation/emergency_services/RRT/rrt_request_type_select.dart @@ -0,0 +1,46 @@ +import 'package:flutter/cupertino.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/radio/custom_radio_button.dart'; +import 'package:provider/provider.dart'; + +class RrtRequestTypeSelect extends StatelessWidget { + const RrtRequestTypeSelect({super.key}); + + @override + Widget build(BuildContext context) { + // return Consumer(builder: (context, emergencyServicesVM, child) { + return Column( + children: [ + Container( + padding: EdgeInsets.all(16.h), + height: 200.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + ), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + CustomRadioOption( + value: "", + groupValue: "", + onChanged: (value) {}, + text: "Home Visit Emergency", + ) + ], + ), + ], + ), + ), + SizedBox(height: 32.h), + ], + ); + // }); + } +} diff --git a/lib/presentation/emergency_services/emergency_services_page.dart b/lib/presentation/emergency_services/emergency_services_page.dart new file mode 100644 index 0000000..adf141a --- /dev/null +++ b/lib/presentation/emergency_services/emergency_services_page.dart @@ -0,0 +1,191 @@ +import 'package:easy_localization/easy_localization.dart'; +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/dependencies.dart'; +import 'package:hmg_patient_app_new/core/location_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/RRT/rrt_request_type_select.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/nearest_er_page.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; +import 'package:lottie/lottie.dart'; +import 'package:provider/provider.dart'; + +class EmergencyServicesPage extends StatelessWidget { + EmergencyServicesPage({super.key}); + + late EmergencyServicesViewModel emergencyServicesViewModel; + LocationUtils? locationUtils; + + @override + Widget build(BuildContext context) { + emergencyServicesViewModel = Provider.of(context, listen: false); + locationUtils = getIt.get(); + locationUtils!.isShowConfirmDialog = true; + return CollapsingListView( + title: "Emergency Services".needTranslation, + requests: () {}, + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.call_ambulance_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Call Ambulance".needTranslation.toText16(isBold: true, color: AppColors.blackColor), + "Request and ambulance in emergency from home or hospital".needTranslation.toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.nearest_er_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Nearest ER Location".needTranslation.toText16(isBold: true, color: AppColors.blackColor), + "Get the details of nearest branch including directions".needTranslation.toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ).onPress(() { + context.read().navigateToNearestERPage(); + }), + ), + SizedBox(height: 16.h), + Container( + padding: EdgeInsets.all(16.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 20.h, + hasShadow: false, + ), + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.rrt_icon, width: 40.h, height: 40.h), + SizedBox(width: 12.h), + Expanded( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Rapid Response Team (RRT)".toText16(isBold: true, color: AppColors.blackColor), + "Comprehensive medical service for all sorts of urgent and stable cases".toText12(color: AppColors.greyTextColor, fontWeight: FontWeight.w500), + ], + ), + ), + SizedBox(width: 12.h), + Utils.buildSvgWithAssets(icon: AppAssets.forward_chevron_icon, width: 13.h, height: 13.h), + ], + ).onPress(() { + showCommonBottomSheetWithoutHeight( + context, + child: Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.primaryRedColor, + borderRadius: 24.h, + ), + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "".toText14(), + Utils.buildSvgWithAssets( + icon: AppAssets.cancel_circle_icon, + iconColor: AppColors.whiteColor, + width: 24.h, + height: 24.h, + fit: BoxFit.contain, + ).onPress(() { + Navigator.of(context).pop(); + }), + ], + ), + Lottie.asset(AppAnimations.ambulance_alert, repeat: false, reverse: false, frameRate: FrameRate(60), width: 120.h, height: 120.h, fit: BoxFit.contain), + SizedBox(height: 8.h), + "Confirmation".needTranslation.toText28(color: AppColors.whiteColor, isBold: true), + SizedBox(height: 8.h), + "Are you sure you want to call Rapid Response Team (RRT)?".needTranslation.toText14(color: AppColors.whiteColor, weight: FontWeight.w500), + SizedBox(height: 24.h), + CustomButton( + text: LocaleKeys.confirm.tr(context: context), + onPressed: () async { + Navigator.of(context).pop(); + showCommonBottomSheetWithoutHeight( + title: "Rapid Response Team (RRT)".needTranslation, + context, + child: RrtRequestTypeSelect(), + isFullScreen: false, + isCloseButtonVisible: true, + hasBottomPadding: false, + backgroundColor: AppColors.bottomSheetBgColor, + callBackFunc: () {}, + ); + }, + backgroundColor: AppColors.whiteColor, + borderColor: AppColors.whiteColor, + textColor: AppColors.primaryRedColor, + icon: AppAssets.checkmark_icon, + iconColor: AppColors.primaryRedColor, + ), + SizedBox(height: 8.h), + ], + ), + ), + ), + isFullScreen: false, + isCloseButtonVisible: false, + hasBottomPadding: false, + backgroundColor: AppColors.primaryRedColor, + callBackFunc: () {}, + ); + }), + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/emergency_services/nearest_er_page.dart b/lib/presentation/emergency_services/nearest_er_page.dart new file mode 100644 index 0000000..8138f57 --- /dev/null +++ b/lib/presentation/emergency_services/nearest_er_page.dart @@ -0,0 +1,104 @@ +import 'package:easy_localization/easy_localization.dart' show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/widgets/nearestERItem.dart' show NearestERItem; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/input_widget.dart'; +import 'package:provider/provider.dart' show Selector, WatchContext, ReadContext; + +import '../../core/enums.dart' show SelectionTypeEnum; +import '../../core/utils/debouncer.dart' show Debouncer; + +class NearestErPage extends StatefulWidget { + const NearestErPage({super.key}); + + @override + State createState() => _NearestErPageState(); +} + +class _NearestErPageState extends State { + final TextEditingController searchText = TextEditingController(); + final Debouncer debouncer = Debouncer(milliseconds: 500); + + @override + void dispose() { + debouncer.dispose(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "Nearest ER".needTranslation, + child: SingleChildScrollView( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisSize: MainAxisSize.max, + children: [ + TextInputWidget( + labelText: LocaleKeys.search.tr(), + hintText: 'Type any facility name'.needTranslation, + controller: searchText, + onChange: (value) { + debouncer.run(() { + context.read().filterErList(value ?? ''); + }); + }, + isEnable: true, + prefix: null, + autoFocus: false, + isBorderAllowed: false, + keyboardType: TextInputType.text, + isAllowLeadingIcon: true, + leadingIcon: AppAssets.search_icon, + padding: EdgeInsets.symmetric( + vertical: ResponsiveExtension(10).h, + horizontal: ResponsiveExtension(15).h, + ), + ), + Selector( + selector: (___, viewModel) => viewModel.isERListLoading, + builder: (_, isLoading, __) => Selector>( + selector: (___, viewModel) => viewModel.nearestERFilteredList, + shouldRebuild: (previous, next) => previous != next, + builder: (_, value, __) { + if (isLoading || value.isNotEmpty) { + return ListView.separated( + padding: EdgeInsets.only(top: 24.h), + itemCount: isLoading ? 6 : value.length, + separatorBuilder: (____, _____) => SizedBox( + height: 16.h, + ), + shrinkWrap: true, + physics: NeverScrollableScrollPhysics(), + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + verticalOffset: 100.0, + child: FadeInAnimation( + child: NearestERItem( + isLoading: isLoading, + nearestERItem: isLoading ? ProjectAvgERWaitingTime() : value[index], + )))); + }, + ); + } else { + return Center(child: Utils.getNoDataWidget(context, noDataText: "No nearest Er Arround you".needTranslation)); + } + }), + ), + ], + ).paddingAll(16.h), + )); + } +} diff --git a/lib/presentation/emergency_services/widgets/nearestERItem.dart b/lib/presentation/emergency_services/widgets/nearestERItem.dart new file mode 100644 index 0000000..3dc2aa1 --- /dev/null +++ b/lib/presentation/emergency_services/widgets/nearestERItem.dart @@ -0,0 +1,130 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/app_export.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/emergency_services_view_model.dart'; +import 'package:hmg_patient_app_new/features/emergency_services/model/resp_model/ProjectAvgERWaitingTime.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; +import 'package:provider/provider.dart'; + +class NearestERItem extends StatelessWidget { + final ProjectAvgERWaitingTime nearestERItem; + final bool isLoading; + + + const NearestERItem({ super.key, + required this.nearestERItem, + required this.isLoading + }) ; + + @override + Widget build(BuildContext context) { + return Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: Colors.white, + customBorder: BorderRadius.only( + topLeft: Radius.circular(24.h), + topRight: Radius.circular(24.h), + ), + ), + child: Padding( + padding: EdgeInsets.all(16.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Row( + children: [ + (isLoading || nearestERItem.projectImageURL?.isEmpty == true) + ? Container( + width: 24.h, + height: 24.h, + decoration: BoxDecoration( + color: Colors.grey.shade300, + shape: BoxShape.circle, + ), + ).toShimmer2(isShow: isLoading) + : Utils.buildImgWithNetwork( + url: nearestERItem.projectImageURL ?? '', + iconColor: Colors.transparent, + ).circle(24.h).toShimmer2(isShow: isLoading), + const SizedBox(width: 12), + Expanded( + child: (nearestERItem.projectName?.toText16( + color: AppColors.textColor, + weight: FontWeight.w600, + ) ?? + SizedBox.shrink()).toShimmer2(isShow: isLoading), + ), + // TODO: Add hospital icon logic here if needed + ], + ), + SizedBox(height: 8.h), + Row( + spacing: 8.h, + children: [ + AppCustomChipWidget( + labelText: "${nearestERItem.distanceInKilometers} km".needTranslation, + icon: AppAssets.location, + iconHasColor: false, + labelPadding: EdgeInsetsDirectional.only(start: 4.h, end: 0.h), + padding: EdgeInsets.all(8.h), + ).toShimmer2(isShow: isLoading), + AppCustomChipWidget( + labelText: "Expected waiting time: ${nearestERItem.getTime()} mins".needTranslation, + icon: AppAssets.waiting_time_clock, + iconHasColor: false, + labelPadding: EdgeInsetsDirectional.only(start: 4.h, end: 0.h), + padding: EdgeInsets.all(8.h), + ).toShimmer2(isShow: isLoading), + ], + ), + SizedBox(height: 16.h), + Row( + children: [ + Expanded( + child: CustomButton( + text: "View Location on Google Maps".needTranslation, + iconSize: 18.h, + icon: AppAssets.location, + onPressed: () { + context.read().openDirections(destLat: double.parse(nearestERItem.latitude??"0.0"), destLng: double.parse(nearestERItem.longitude??"0.0") ); + }, + backgroundColor: AppColors.secondaryLightRedColor, + borderColor: AppColors.secondaryLightRedColor, + textColor: AppColors.primaryRedColor, + iconColor: AppColors.primaryRedColor, + height: 40.h, + fontSize: 14, + fontWeight: FontWeight.w500, + ).toShimmer2(isShow: isLoading), + ), + SizedBox(width: 8.h), + SizedBox( + height: 40.h, + width: 40.h, + child: CustomButton( + text: '', + iconSize: 18.h, + icon: AppAssets.call_fill, + onPressed: () { + context.read().openDialer( nearestERItem.phonenumber??""); + + }, + backgroundColor: AppColors.greyColor, + iconColor: AppColors.textColor, + borderColor: AppColors.greyColor, + height: 40.h, + ).toShimmer2(isShow: isLoading), + ), + ], + ), + ], + ), + ), + ); + } +} diff --git a/lib/presentation/hmg_services/services_page.dart b/lib/presentation/hmg_services/services_page.dart new file mode 100644 index 0000000..f79aae0 --- /dev/null +++ b/lib/presentation/hmg_services/services_page.dart @@ -0,0 +1,25 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; + +class ServicesPage extends StatelessWidget { + const ServicesPage({super.key}); + + @override + Widget build(BuildContext context) { + return CollapsingListView( + title: "Explore Services".needTranslation, + isLeading: false, + child: Padding( + padding: EdgeInsets.all(24.h), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + "Medical & Care Services".needTranslation.toText18(isBold: true) + ], + ), + ), + ); + } +} diff --git a/lib/presentation/home/landing_page.dart b/lib/presentation/home/landing_page.dart index 7de153f..9cd72fa 100644 --- a/lib/presentation/home/landing_page.dart +++ b/lib/presentation/home/landing_page.dart @@ -19,7 +19,6 @@ import 'package:hmg_patient_app_new/features/book_appointments/book_appointments import 'package:hmg_patient_app_new/features/habib_wallet/habib_wallet_view_model.dart'; import 'package:hmg_patient_app_new/features/immediate_livecare/immediate_livecare_view_model.dart'; import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart'; -import 'package:hmg_patient_app_new/features/medical_file/medical_file_view_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/models/resp_models/patient_appointment_history_response_model.dart'; import 'package:hmg_patient_app_new/features/my_appointments/my_appointments_view_model.dart'; import 'package:hmg_patient_app_new/features/prescriptions/prescriptions_view_model.dart'; @@ -37,17 +36,12 @@ import 'package:hmg_patient_app_new/presentation/home/widgets/welcome_widget.dar import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/presentation/profile_settings/profile_settings.dart'; import 'package:hmg_patient_app_new/services/cache_service.dart'; -import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; -import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart' show CustomTabBar; -import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:hmg_patient_app_new/widgets/routes/spring_page_route_builder.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; -import 'package:lottie/lottie.dart'; import 'package:provider/provider.dart'; class LandingPage extends StatefulWidget { @@ -139,7 +133,7 @@ class _LandingPageState extends State { backgroundColor: Color(0xffFEE9EA), borderColor: Color(0xffFEE9EA), textColor: Color(0xffED1C2B), - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, borderRadius: 12, padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0), @@ -149,7 +143,7 @@ class _LandingPageState extends State { mainAxisSize: MainAxisSize.min, spacing: 12.h, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 20, width: 20).onPress(() { + Utils.buildSvgWithAssets(icon: AppAssets.bell, height: 18.h, width: 18.h).onPress(() { Navigator.of(context).push( CustomPageRoute( page: MedicalFilePage(), @@ -157,7 +151,7 @@ class _LandingPageState extends State { ), ); }), - Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 20, width: 20).onPress(() { + Utils.buildSvgWithAssets(icon: AppAssets.search_icon, height: 18.h, width: 18.h).onPress(() { Navigator.of(context).push( CustomPageRoute( page: MedicalFilePage(), @@ -165,7 +159,7 @@ class _LandingPageState extends State { ), ); }), - Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 20, width: 20).onPress(() { + Utils.buildSvgWithAssets(icon: AppAssets.contact_icon, height: 18.h, width: 18.h).onPress(() { Navigator.of(context).push( CustomPageRoute( page: MedicalFilePage(), @@ -216,7 +210,8 @@ class _LandingPageState extends State { : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty ? myAppointmentsVM.patientAppointmentsHistoryList.length == 1 ? Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), child: AppointmentCard( patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList.first, myAppointmentsViewModel: myAppointmentsViewModel, @@ -245,7 +240,8 @@ class _LandingPageState extends State { ), itemBuilder: (BuildContext context, int index) { return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + decoration: RoundedRectangleBorder() + .toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), child: AppointmentCard( patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index], myAppointmentsViewModel: myAppointmentsViewModel, @@ -258,7 +254,8 @@ class _LandingPageState extends State { ) : Container( width: double.infinity, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24, hasShadow: true), + decoration: + RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24, hasShadow: true), child: Padding( padding: EdgeInsets.all(12.h), child: Column( @@ -279,11 +276,9 @@ class _LandingPageState extends State { backgroundColor: Color(0xffFEE9EA), borderColor: Color(0xffFEE9EA), textColor: Color(0xffED1C2B), - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40, + padding: EdgeInsets.fromLTRB(10.h, 0, 10.h, 0), icon: AppAssets.add_icon, iconColor: AppColors.primaryRedColor, ), @@ -406,7 +401,7 @@ class _LandingPageState extends State { ), ); }, - separatorBuilder: (BuildContext cxt, int index) => 0.width, + separatorBuilder: (BuildContext cxt, int index) => 10.width, ), ), ], @@ -436,6 +431,7 @@ class _LandingPageState extends State { horizontalOffset: 100.0, child: FadeInAnimation( child: SmallServiceCard( + serviceName: LandingPageData.getNotLoggedInServiceCardsList[index].serviceName, icon: LandingPageData.getNotLoggedInServiceCardsList[index].icon, title: LandingPageData.getNotLoggedInServiceCardsList[index].title, subtitle: LandingPageData.getNotLoggedInServiceCardsList[index].subtitle, @@ -512,6 +508,7 @@ class _LandingPageState extends State { context, title: "", isCloseButtonVisible: false, + child: StatefulBuilder(builder: (context, setState) { return QuickLogin( isDone: isDone, diff --git a/lib/presentation/home/navigation_screen.dart b/lib/presentation/home/navigation_screen.dart index 6b33b2f..c2bfae7 100644 --- a/lib/presentation/home/navigation_screen.dart +++ b/lib/presentation/home/navigation_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/hmg_services/services_page.dart'; import 'package:hmg_patient_app_new/presentation/home/landing_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/medical_file_page.dart'; import 'package:hmg_patient_app_new/widgets/bottom_navigation/bottom_navigation.dart'; @@ -30,7 +31,7 @@ class _LandingNavigationState extends State { appState.isAuthenticated ? MedicalFilePage() : /* need add feedback page */ const LandingPage(), BookAppointmentPage(), const LandingPage(), - appState.isAuthenticated ? /* need add news page */ LandingPage() : const LandingPage(), + appState.isAuthenticated ? /* need add news page */ ServicesPage() : const LandingPage(), ], ), bottomNavigationBar: BottomNavigation( diff --git a/lib/presentation/home/widgets/small_service_card.dart b/lib/presentation/home/widgets/small_service_card.dart index 416ed9a..ee5fcca 100644 --- a/lib/presentation/home/widgets/small_service_card.dart +++ b/lib/presentation/home/widgets/small_service_card.dart @@ -3,6 +3,7 @@ import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart'; +import 'package:hmg_patient_app_new/presentation/emergency_services/emergency_services_page.dart'; import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart'; @@ -104,6 +105,13 @@ class SmallServiceCard extends StatelessWidget { ), ); break; + case "emergency": + Navigator.of(context).push( + CustomPageRoute( + page: EmergencyServicesPage(), + ), + ); + break; default: // Handle unknown service break; diff --git a/lib/presentation/insurance/widgets/insurance_approval_details_page.dart b/lib/presentation/insurance/insurance_approval_details_page.dart similarity index 82% rename from lib/presentation/insurance/widgets/insurance_approval_details_page.dart rename to lib/presentation/insurance/insurance_approval_details_page.dart index c9b1517..437c870 100644 --- a/lib/presentation/insurance/widgets/insurance_approval_details_page.dart +++ b/lib/presentation/insurance/insurance_approval_details_page.dart @@ -111,8 +111,6 @@ class InsuranceApprovalDetailsPage extends StatelessWidget { ), SizedBox(height: 16.h), Container( - width: double.infinity, - height: 200.h, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, borderRadius: 24.h, @@ -124,6 +122,33 @@ class InsuranceApprovalDetailsPage extends StatelessWidget { crossAxisAlignment: CrossAxisAlignment.start, children: [ "Approval Details".toText16(isBold: true), + SizedBox(height: 16.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + LocaleKeys.procedureName.tr(context: context).toText14(isBold: true), + Expanded( + child: insuranceApprovalResponseModel.apporvalDetails!.procedureName! + .toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, textAlignment: TextAlign.end, maxLine: 2), + ), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "Status:".needTranslation.toText14(isBold: true), + insuranceApprovalResponseModel.apporvalDetails!.status!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), + SizedBox(height: 8.h), + Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + "${LocaleKeys.usageStatus.tr(context: context)}: ".toText14(isBold: true), + insuranceApprovalResponseModel.apporvalDetails!.isInvoicedDesc!.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor), + ], + ), ], ), ), diff --git a/lib/presentation/insurance/insurance_approvals_page.dart b/lib/presentation/insurance/insurance_approvals_page.dart index 50e659c..b70c116 100644 --- a/lib/presentation/insurance/insurance_approvals_page.dart +++ b/lib/presentation/insurance/insurance_approvals_page.dart @@ -13,7 +13,7 @@ import 'package:hmg_patient_app_new/features/insurance/insurance_view_model.dart import 'package:hmg_patient_app_new/features/insurance/models/resp_models/patient_insurance_approval_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_approval_card.dart'; -import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_approval_details_page.dart'; +import 'package:hmg_patient_app_new/presentation/insurance/insurance_approval_details_page.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; diff --git a/lib/presentation/insurance/widgets/insurance_approval_card.dart b/lib/presentation/insurance/widgets/insurance_approval_card.dart index 71fce58..bea2e56 100644 --- a/lib/presentation/insurance/widgets/insurance_approval_card.dart +++ b/lib/presentation/insurance/widgets/insurance_approval_card.dart @@ -120,7 +120,7 @@ class InsuranceApprovalCard extends StatelessWidget { Transform.flip( flipX: appState.isArabic(), child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), ], - ), + ).toShimmer2(isShow: isLoading), ], ), ), diff --git a/lib/presentation/insurance/widgets/insurance_update_details_card.dart b/lib/presentation/insurance/widgets/insurance_update_details_card.dart index 08e252b..acdf1c7 100644 --- a/lib/presentation/insurance/widgets/insurance_update_details_card.dart +++ b/lib/presentation/insurance/widgets/insurance_update_details_card.dart @@ -99,18 +99,17 @@ class PatientInsuranceCardUpdateCard extends StatelessWidget { CustomButton( icon: AppAssets.insurance_active_icon, iconColor: AppColors.whiteColor, - iconSize: 20.h, + iconSize: 20.w, text: "${LocaleKeys.updateInsurance.tr(context: context)} ${LocaleKeys.updateInsuranceSubtitle.tr(context: context)}", onPressed: () {}, backgroundColor: insuranceViewModel.patientInsuranceUpdateResponseModel != null ? AppColors.successColor : AppColors.lightGrayBGColor, borderColor: AppColors.successColor.withOpacity(0.01), textColor: AppColors.whiteColor, - fontSize: 16, + fontSize: 16.f, fontWeight: FontWeight.w500, - borderRadius: 12, + borderRadius: 12.r, padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 56.h, - ).paddingSymmetrical(24.h, 0.h), + ).paddingSymmetrical(24.w, 0.h), ], ); } diff --git a/lib/presentation/insurance/widgets/patient_insurance_card.dart b/lib/presentation/insurance/widgets/patient_insurance_card.dart index b89d3e8..5190e5b 100644 --- a/lib/presentation/insurance/widgets/patient_insurance_card.dart +++ b/lib/presentation/insurance/widgets/patient_insurance_card.dart @@ -43,6 +43,7 @@ class PatientInsuranceCard extends StatelessWidget { children: [ Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, + crossAxisAlignment: CrossAxisAlignment.start, children: [ Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -51,20 +52,14 @@ class PatientInsuranceCard extends StatelessWidget { "Policy: ${insuranceCardDetailsModel.insurancePolicyNo}".toText12(isBold: true, color: AppColors.lightGrayColor), ], ), - CustomButton( + AppCustomChipWidget( icon: isInsuranceExpired ? AppAssets.cancel_circle_icon : AppAssets.insurance_active_icon, + labelText: isInsuranceExpired ? "Insurance Expired".needTranslation : "Insurance Active".needTranslation, iconColor: isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, - iconSize: 13.h, - text: isInsuranceExpired ? "Insurance Expired".needTranslation : "Insurance Active".needTranslation, - onPressed: () {}, - backgroundColor: isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.15) : AppColors.successColor.withOpacity(0.15), - borderColor: isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.01) : AppColors.successColor.withOpacity(0.01), textColor: isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, - fontSize: 10, - fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 30.h, + iconSize: 12, + backgroundColor: isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.successColor.withOpacity(0.1), + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), ), ], ), @@ -79,8 +74,10 @@ class PatientInsuranceCard extends StatelessWidget { children: [ AppCustomChipWidget( icon: AppAssets.doctor_calendar_icon, - labelText: "${LocaleKeys.expiryDate.tr(context: context)} ${DateUtil.formatDateToDate(DateUtil.convertStringToDate(insuranceCardDetailsModel.cardValidTo), false)}"), - AppCustomChipWidget(labelText: "Patient Card ID: ${insuranceCardDetailsModel.patientCardID}"), + labelText: "${LocaleKeys.expiryDate.tr(context: context)} ${DateUtil.formatDateToDate(DateUtil.convertStringToDate(insuranceCardDetailsModel.cardValidTo), false)}", + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), + ), + AppCustomChipWidget(labelText: "Patient Card ID: ${insuranceCardDetailsModel.patientCardID}".needTranslation), ], ), SizedBox(height: 10.h), diff --git a/lib/presentation/lab/lab_orders_page.dart b/lib/presentation/lab/lab_orders_page.dart index 882c737..0b9d093 100644 --- a/lib/presentation/lab/lab_orders_page.dart +++ b/lib/presentation/lab/lab_orders_page.dart @@ -1 +1 @@ -import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_order_by_test.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_hospital/LabResultByHospital.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import '../../widgets/appbar/collapsing_list_view.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: SingleChildScrollView( padding: EdgeInsets.all(24.h), physics: NeverScrollableScrollPhysics(), child: Consumer( builder: (context, model, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 16.h), CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), SizedBox(height: 16.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.patientLabOrders.isNotEmpty ? model.patientLabOrders.length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.patientLabOrders.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabResultItemView( onTap: () { model.currentlySelectedPatientOrder = model.patientLabOrders[ index]; labProvider.getPatientLabResultByHospital(model.patientLabOrders[ index]); labProvider .getPatientSpecialResult( model.patientLabOrders[ index]); Navigator.push( context, CustomPageRoute( page: LabResultByHospitals(), )); }, labOrder: model.patientLabOrders[index], index: index, isExpanded: isExpanded), ), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) : ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.uniqueTests.toList().isNotEmpty ? model.uniqueTests.toList().length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.uniqueTests.toList().isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabOrderByTest( appState: _appState, onTap: () { if (model.uniqueTests.toList()[index].model != null) { rangeViewModel.flush(); model.getPatientLabResult(model.uniqueTests.toList()[index].model!, model.uniqueTests.toList()[index].description!, (_appState.isArabic() ? model.uniqueTests.toList()[index].testDescriptionAr! : model.uniqueTests.toList()[index].testDescriptionEn!)); } }, tests: model.uniqueTests.toList()[index], index: index, isExpanded: isExpanded)), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) ], ); }, ), ), )); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file +import 'dart:async'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_order_by_test.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart'; import 'package:hmg_patient_app_new/presentation/lab/search_lab_report.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/chip/custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/date_range_selector/viewmodel/date_range_view_model.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; import 'package:hmg_patient_app_new/widgets/custom_tab_bar.dart'; import '../../widgets/appbar/collapsing_list_view.dart'; class LabOrdersPage extends StatefulWidget { const LabOrdersPage({super.key}); @override State createState() => _LabOrdersPageState(); } class _LabOrdersPageState extends State { late LabViewModel labProvider; late DateRangeSelectorRangeViewModel rangeViewModel; late AppState _appState; List?> labSuggestions = []; int? expandedIndex; String? selectedFilterText = ''; int activeIndex = 0; @override void initState() { scheduleMicrotask(() { labProvider.initLabProvider(); }); super.initState(); } @override Widget build(BuildContext context) { labProvider = Provider.of(context, listen: false); rangeViewModel = Provider.of(context); _appState = getIt(); return Scaffold( backgroundColor: AppColors.bgScaffoldColor, body: CollapsingListView( title: LocaleKeys.labResults.tr(), search: () async { final lavVM = Provider.of(context, listen: false); if (lavVM.isLabOrdersLoading) { return; } else { String? value = await Navigator.of(context).push( CustomPageRoute( page: SearchLabResultsContent(labSuggestionsList: lavVM.labSuggestions), fullScreenDialog: true, direction: AxisDirection.down, ), ); if (value != null) { selectedFilterText = value; lavVM.filterLabReports(value); } } }, child: SingleChildScrollView( padding: EdgeInsets.all(24.h), physics: NeverScrollableScrollPhysics(), child: Consumer( builder: (context, model, child) { return Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 16.h), CustomTabBar( activeTextColor: Color(0xffED1C2B), activeBackgroundColor: Color(0xffED1C2B).withValues(alpha: .1), tabs: [ CustomTabBarModel(null, "By Visit".needTranslation), CustomTabBarModel(null, "By Test".needTranslation), // CustomTabBarModel(null, "Completed".needTranslation), ], onTabChange: (index) { activeIndex = index; setState(() {}); }, ), SizedBox(height: 16.h), selectedFilterText!.isNotEmpty ? CustomChipWidget( chipText: selectedFilterText!, chipType: ChipTypeEnum.alert, isSelected: true, ) : SizedBox(), activeIndex == 0 ? ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.patientLabOrders.isNotEmpty ? model.patientLabOrders.length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.patientLabOrders.isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabResultItemView( onTap: () { model.currentlySelectedPatientOrder = model.patientLabOrders[ index]; labProvider.getPatientLabResultByHospital(model.patientLabOrders[ index]); labProvider .getPatientSpecialResult( model.patientLabOrders[ index]); Navigator.push( context, CustomPageRoute( page: LabResultByClinic(labOrder: model.patientLabOrders[index]), )); }, labOrder: model.patientLabOrders[index], index: index, isExpanded: isExpanded), ), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) : ListView.builder( shrinkWrap: true, physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, itemCount: model.isLabOrdersLoading ? 5 : model.uniqueTests.toList().isNotEmpty ? model.uniqueTests.toList().length : 1, itemBuilder: (context, index) { final isExpanded = expandedIndex == index; return model.isLabOrdersLoading ? LabResultItemView( onTap: () {}, labOrder: null, index: index, isLoading: true, ) : model.uniqueTests.toList().isNotEmpty ? AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 500), child: SlideAnimation( verticalOffset: 100.0, child: FadeInAnimation( child: LabOrderByTest( appState: _appState, onTap: () { if (model.uniqueTests.toList()[index].model != null) { rangeViewModel.flush(); model.getPatientLabResult(model.uniqueTests.toList()[index].model!, model.uniqueTests.toList()[index].description!, (_appState.isArabic() ? model.uniqueTests.toList()[index].testDescriptionAr! : model.uniqueTests.toList()[index].testDescriptionEn!)); } }, tests: model.uniqueTests.toList()[index], index: index, isExpanded: isExpanded)), ), ) : Utils.getNoDataWidget(context, noDataText: "You don't have any lab results yet.".needTranslation); }, ) ], ); }, ), ), )); } Color getLabOrderStatusColor(num status) { switch (status) { case 44: return AppColors.warningColorYellow; case 45: return AppColors.warningColorYellow; case 16: return AppColors.successColor; case 17: return AppColors.successColor; default: return AppColors.greyColor; } } String getLabOrderStatusText(num status) { switch (status) { case 44: return LocaleKeys.resultsPending.tr(context: context); case 45: return LocaleKeys.resultsPending.tr(context: context); case 16: return LocaleKeys.resultsAvailable.tr(context: context); case 17: return LocaleKeys.resultsAvailable.tr(context: context); default: return ""; } } getLabSuggestions(LabViewModel model) { if (model.patientLabOrders.isEmpty) { return []; } return model.patientLabOrders.map((m) => m.testDetails).toList(); } } \ No newline at end of file diff --git a/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart new file mode 100644 index 0000000..a603ecb --- /dev/null +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultByClinic.dart @@ -0,0 +1,144 @@ +import 'package:easy_localization/easy_localization.dart' + show tr, StringTranslateExtension; +import 'package:flutter/material.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; +import 'package:hmg_patient_app_new/core/app_assets.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/core/utils/utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; +import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; +import 'package:hmg_patient_app_new/features/lab/models/resp_models/patient_lab_orders_response_model.dart'; +import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/LabResultList.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; +import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; +import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; +import 'package:open_filex/open_filex.dart'; +import 'package:provider/provider.dart'; + +class LabResultByClinic extends StatelessWidget { + LabResultByClinic({required this.labOrder, Key? key}); + + late LabViewModel labViewModel; + PatientLabOrdersResponseModel labOrder; + @override + Widget build(BuildContext context) { + labViewModel = Provider.of(context, listen: false); + return Scaffold( + backgroundColor: AppColors.bgScaffoldColor, + body: Column( + children: [ + Expanded( + child: CollapsingListView( + title: LocaleKeys.labResults.tr(), + child: SingleChildScrollView( + child: Column( + spacing: 8.h, + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Selector( + selector: (_, model) => model.isLabResultByHospitalLoading, + builder: (_, isLoading, __) { + if (isLoading) { + return Column( + children: [ + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + LabResultItemView( + onTap: () {}, + labOrder: null, + index: 0, + isLoading: true, + ), + ], + ); + } else { + return LabResultList(); + } + }, + ), + LabOrderSpecialResult() + ], + ).paddingAll(24.h), + )), + ), + Container( + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 24.h, + hasShadow: true, + ), + child: CustomButton( + text: "Download report".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(loadingText: "Generating report, Please wait...".needTranslation); + await labViewModel + .getLabResultReportPDF( + labOrder: labOrder, + onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }) + .then((val) async { + LoaderBottomSheet.hideLoader(); + if (labViewModel.patientLabResultReportPDFBase64.isNotEmpty) { + String path = await Utils.createFileFromString(labViewModel.patientLabResultReportPDFBase64, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); + }, + backgroundColor: AppColors.successColor, + borderColor: AppColors.successColor, + textColor: AppColors.whiteColor, + fontSize: 16, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 45.h, + icon: AppAssets.download, + iconColor: AppColors.whiteColor, + iconSize: 20.h, + ).paddingSymmetrical(24.h, 24.h), + ), + ], + ), + ); + } +} diff --git a/lib/presentation/lab/lab_result_via_hospital/LabResultList.dart b/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart similarity index 97% rename from lib/presentation/lab/lab_result_via_hospital/LabResultList.dart rename to lib/presentation/lab/lab_result_via_clinic/LabResultList.dart index e94bb5c..8893ffd 100644 --- a/lib/presentation/lab/lab_result_via_hospital/LabResultList.dart +++ b/lib/presentation/lab/lab_result_via_clinic/LabResultList.dart @@ -3,7 +3,7 @@ import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; import 'package:hmg_patient_app_new/features/lab/models/resp_models/lab_result.dart'; -import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_hospital/lab_order_result_item.dart'; +import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart'; import 'package:provider/provider.dart' show Selector, Provider, ReadContext; class LabResultList extends StatelessWidget { diff --git a/lib/presentation/lab/lab_result_via_hospital/lab_order_result_item.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart similarity index 97% rename from lib/presentation/lab/lab_result_via_hospital/lab_order_result_item.dart rename to lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart index edfc65b..36cdc2b 100644 --- a/lib/presentation/lab/lab_result_via_hospital/lab_order_result_item.dart +++ b/lib/presentation/lab/lab_result_via_clinic/lab_order_result_item.dart @@ -53,9 +53,9 @@ class LabOrderResultItem extends StatelessWidget { children: [ Flexible( child: Text( - tests?.resultValue ?? "", + "${tests?.resultValue} ${tests?.uOM}", style: TextStyle( - fontSize: 24.fSize, + fontSize: 24.f, fontWeight: FontWeight.w600, fontFamily: 'Poppins', color: context.read().getColor( @@ -75,7 +75,7 @@ class LabOrderResultItem extends StatelessWidget { child: Text( "(Reference range ${tests?.referanceRange})".needTranslation, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: FontWeight.w500, fontFamily: 'Poppins', color: AppColors.greyTextColor, diff --git a/lib/presentation/lab/lab_result_via_hospital/lab_order_specialResult.dart b/lib/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart similarity index 100% rename from lib/presentation/lab/lab_result_via_hospital/lab_order_specialResult.dart rename to lib/presentation/lab/lab_result_via_clinic/lab_order_specialResult.dart diff --git a/lib/presentation/lab/lab_result_via_hospital/LabResultByHospital.dart b/lib/presentation/lab/lab_result_via_hospital/LabResultByHospital.dart deleted file mode 100644 index fb88908..0000000 --- a/lib/presentation/lab/lab_result_via_hospital/LabResultByHospital.dart +++ /dev/null @@ -1,69 +0,0 @@ -import 'package:easy_localization/easy_localization.dart' - show tr, StringTranslateExtension; -import 'package:flutter/material.dart'; -import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; -import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; -import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; -import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/features/lab/lab_view_model.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; -import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; -import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_hospital/LabResultList.dart'; -import 'package:hmg_patient_app_new/presentation/lab/lab_result_via_hospital/lab_order_specialResult.dart'; -import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; -import 'package:provider/provider.dart'; - -class LabResultByHospitals extends StatelessWidget { - @override - Widget build(BuildContext context) { - return CollapsingListView( - title: LocaleKeys.labResults.tr(), - child: SingleChildScrollView( - child: Column( - spacing: 8.h, - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - Selector( - selector: (_, model) => model.isLabResultByHospitalLoading, - builder: (_, isLoading, __) { - if (isLoading) { - return Column( - children: [ - LabResultItemView( - onTap: () {}, - labOrder: null, - index: 0, - isLoading: true, - ), - LabResultItemView( - onTap: () {}, - labOrder: null, - index: 0, - isLoading: true, - ), - LabResultItemView( - onTap: () {}, - labOrder: null, - index: 0, - isLoading: true, - ), - LabResultItemView( - onTap: () {}, - labOrder: null, - index: 0, - isLoading: true, - ), - ], - ); - } else { - return LabResultList(); - } - }, - ), - LabOrderSpecialResult() - ], - ).paddingAll(24.h), - )); - } -} diff --git a/lib/presentation/lab/lab_results/lab_result_details.dart b/lib/presentation/lab/lab_results/lab_result_details.dart index ad108cc..2330d0d 100644 --- a/lib/presentation/lab/lab_results/lab_result_details.dart +++ b/lib/presentation/lab/lab_results/lab_result_details.dart @@ -91,9 +91,10 @@ class LabResultDetails extends StatelessWidget { children: [ Flexible( child: Text( - recentLabResult.resultValue ?? "", + "${recentLabResult.resultValue} ${recentLabResult.uOM}" ?? + "", style: TextStyle( - fontSize: 24.fSize, + fontSize: 24.f, fontWeight: FontWeight.w600, fontFamily: 'Poppins', color: context.read().getColor( @@ -114,7 +115,7 @@ class LabResultDetails extends StatelessWidget { child: Text( "(Reference range ${recentLabResult.referanceRange})".needTranslation, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: FontWeight.w500, fontFamily: 'Poppins', color: AppColors.greyTextColor, @@ -128,17 +129,42 @@ class LabResultDetails extends StatelessWidget { ], ), ), - SizedBox( - width: 21, - child: Utils.buildSvgWithAssets( - icon: AppAssets.lab_result_indicator, - width: 21, - height: 23, - iconColor: context.read().getColor( - recentLabResult.calculatedResultFlag ?? "", - ), + Visibility( + visible: + recentLabResult.checkIfGraphShouldBeDisplayed() == true, + child: Column( + spacing: 6.h, + children: [ + context + .read() + .getSeverityText( + recentLabResult.calculatedResultFlag ?? "", + ) + .tr() + .toText10( + weight: FontWeight.w500, + color: AppColors.greyTextColor), + Utils.buildSvgWithAssets( + icon: AppAssets.lab_result_indicator, + width: 21, + height: 23, + iconColor: context.read().getColor( + recentLabResult.calculatedResultFlag ?? "", + )), + ], ), ), + // SizedBox( + // width: 21, + // child: Utils.buildSvgWithAssets( + // icon: AppAssets.lab_result_indicator, + // width: 21, + // height: 23, + // iconColor: context.read().getColor( + // recentLabResult.calculatedResultFlag ?? "", + // ), + // ), + // ), ], ) @@ -226,7 +252,7 @@ class LabResultDetails extends StatelessWidget { style: TextStyle( fontWeight: FontWeight.w600, fontFamily: 'Poppins', - fontSize: 8.fSize, + fontSize: 8.f, color: AppColors.textColor, ), ); @@ -238,7 +264,7 @@ class LabResultDetails extends StatelessWidget { child: Text( label, style: TextStyle( - fontSize: 8.fSize, + fontSize: 8.f, fontFamily: 'Poppins', fontWeight: FontWeight.w600, color: AppColors.labelTextColor), @@ -257,7 +283,7 @@ class LabResultDetails extends StatelessWidget { maxY: (labmodel.maxY)+(getInterval(labmodel)??0)/2, maxX: labmodel.filteredGraphValues.length.toDouble()-.75, leftLabelFormatter: (value) { - return leftLabels(value.toStringAsFixed(2).tr()); + return leftLabels(value.toStringAsFixed(2)); // switch (value.toInt()) { // case 10: // return leftLabels("Critical Low".needTranslation); diff --git a/lib/presentation/lab/lab_results/lab_result_list_item.dart b/lib/presentation/lab/lab_results/lab_result_list_item.dart index 00b5ff2..f90df7b 100644 --- a/lib/presentation/lab/lab_results/lab_result_list_item.dart +++ b/lib/presentation/lab/lab_results/lab_result_list_item.dart @@ -24,7 +24,7 @@ class LabHistoryItem extends StatelessWidget{ Text( dayNameAndDate, style: TextStyle( - fontSize: 14.fSize, + fontSize: 14.f, fontWeight: FontWeight.w500, fontFamily: 'Poppins', color: AppColors.labelTextColor @@ -33,7 +33,7 @@ class LabHistoryItem extends StatelessWidget{ Text( result, style: TextStyle( - fontSize: 18.fSize, + fontSize: 18.f, fontWeight: FontWeight.w600, fontFamily: 'Poppins', color: AppColors.textColor diff --git a/lib/presentation/medical_file/medical_file_page.dart b/lib/presentation/medical_file/medical_file_page.dart index 19d4335..cea3cf1 100644 --- a/lib/presentation/medical_file/medical_file_page.dart +++ b/lib/presentation/medical_file/medical_file_page.dart @@ -8,6 +8,7 @@ import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/utils/date_util.dart'; +import 'package:hmg_patient_app_new/core/utils/size_config.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -26,6 +27,7 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/appointments/my_appointments_page.dart'; import 'package:hmg_patient_app_new/presentation/appointments/my_doctors_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/book_appointment_page.dart'; +import 'package:hmg_patient_app_new/presentation/book_appointment/doctor_profile_page.dart'; import 'package:hmg_patient_app_new/presentation/book_appointment/widgets/appointment_calendar.dart'; import 'package:hmg_patient_app_new/presentation/insurance/insurance_approvals_page.dart'; import 'package:hmg_patient_app_new/presentation/insurance/insurance_home_page.dart'; @@ -33,19 +35,19 @@ import 'package:hmg_patient_app_new/presentation/insurance/widgets/insurance_upd import 'package:hmg_patient_app_new/presentation/insurance/widgets/patient_insurance_card.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_orders_page.dart'; import 'package:hmg_patient_app_new/presentation/lab/lab_result_item_view.dart'; -import 'package:hmg_patient_app_new/presentation/my_family/my_family.dart'; -import 'package:hmg_patient_app_new/services/dialog_service.dart'; -import 'package:hmg_patient_app_new/presentation/radiology/radiology_orders_page.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; -import 'package:hmg_patient_app_new/presentation/medical_report/medical_reports_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/patient_sickleaves_list_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/vaccine_list_page.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/widgets/lab_rad_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/widgets/medical_file_card.dart'; import 'package:hmg_patient_app_new/presentation/medical_file/widgets/patient_sick_leave_card.dart'; +import 'package:hmg_patient_app_new/presentation/medical_report/medical_reports_page.dart'; +import 'package:hmg_patient_app_new/presentation/my_family/my_family.dart'; import 'package:hmg_patient_app_new/presentation/prescriptions/prescriptions_list_page.dart'; +import 'package:hmg_patient_app_new/presentation/radiology/radiology_orders_page.dart'; +import 'package:hmg_patient_app_new/services/dialog_service.dart'; import 'package:hmg_patient_app_new/services/navigation_service.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; @@ -60,7 +62,7 @@ import '../prescriptions/prescription_detail_page.dart'; import 'widgets/medical_file_appointment_card.dart'; class MedicalFilePage extends StatefulWidget { - MedicalFilePage({super.key}); + const MedicalFilePage({super.key}); @override State createState() => _MedicalFilePageState(); @@ -103,15 +105,35 @@ class _MedicalFilePageState extends State { title: "Medical File".needTranslation, trailing: Row( children: [ - Wrap(spacing: -15, children: [ - Utils.buildImgWithAssets(icon: AppAssets.babyGirlImg, width: 32.h, height: 32.h, border: 1.5.h, borderRadius: 50.h), - Utils.buildImgWithAssets(icon: AppAssets.femaleImg, width: 32.h, height: 32.h, border: 1.5.h, borderRadius: 50.h), - Utils.buildImgWithAssets(icon: AppAssets.male_img, width: 32.h, height: 32.h, border: 1.5.h, borderRadius: 50.h), - ]), + Wrap( + children: [ + Utils.buildImgWithAssets( + icon: AppAssets.babyGirlImg, + height: 32.h, + border: 1.5, + fit: BoxFit.contain, + borderRadius: 50.r, + ), + Utils.buildImgWithAssets( + icon: AppAssets.femaleImg, + height: 32.h, + border: 1.5, + borderRadius: 50.r, + fit: BoxFit.contain, + ), + Utils.buildImgWithAssets( + icon: AppAssets.male_img, + height: 32.h, + border: 1.5, + borderRadius: 50.r, + fit: BoxFit.contain, + ), + ], + ), SizedBox(width: 4.h), - Utils.buildSvgWithAssets(icon: AppAssets.arrow_down) + Utils.buildSvgWithAssets(icon: AppAssets.arrow_down, height: 22.h, width: 22.w) ], - ).onPress(() { + ).withHorizontalPadding(24.w).onPress(() { DialogService dialogService = getIt.get(); dialogService.showFamilyBottomSheetWithoutH( label: "Family Members".needTranslation, @@ -139,21 +161,21 @@ class _MedicalFilePageState extends State { isAllowLeadingIcon: true, padding: EdgeInsets.symmetric(vertical: 8.h, horizontal: 8.h), leadingIcon: AppAssets.student_card, - ).paddingSymmetrical(24.h, 0.0), + ).paddingSymmetrical(24.w, 0.0), SizedBox(height: 16.h), Container( width: double.infinity, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r), child: Padding( - padding: EdgeInsets.all(16.h), + padding: EdgeInsets.all(16.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ - Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.h, height: 56.h), - SizedBox(width: 8.h), + Image.asset(appState.getAuthenticatedUser()?.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.w, height: 56.h), + SizedBox(width: 8.w), Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -162,12 +184,13 @@ class _MedicalFilePageState extends State { SizedBox(height: 4.h), Wrap( direction: Axis.horizontal, - spacing: 4.h, - runSpacing: 4.h, + spacing: 4.w, + runSpacing: 6.w, children: [ AppCustomChipWidget( icon: AppAssets.file_icon, labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${appState.getAuthenticatedUser()!.patientId}", + labelPadding: EdgeInsetsDirectional.only(end: 6.w), onChipTap: () { navigationService.pushPage( page: FamilyMedicalScreen( @@ -180,6 +203,7 @@ class _MedicalFilePageState extends State { icon: AppAssets.checkmark_icon, labelText: LocaleKeys.verified.tr(context: context), iconColor: AppColors.successColor, + labelPadding: EdgeInsetsDirectional.only(end: 6.w), ), ], ), @@ -200,15 +224,28 @@ class _MedicalFilePageState extends State { ), AppCustomChipWidget( icon: AppAssets.blood_icon, - labelText: "${LocaleKeys.bloodType.tr(context: context)}: ${appState.getUserBloodGroup}", + labelText: "Blood: ${appState.getUserBloodGroup}", iconColor: AppColors.primaryRedColor, + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 8.w), ), + Consumer(builder: (context, insuranceVM, child) { + return AppCustomChipWidget( + icon: insuranceVM.isInsuranceExpired ? AppAssets.cancel_circle_icon : AppAssets.insurance_active_icon, + labelText: insuranceVM.isInsuranceExpired ? "Insurance Expired".needTranslation : "Insurance Active".needTranslation, + iconColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, + textColor: insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor : AppColors.successColor, + iconSize: 12.w, + backgroundColor: + insuranceVM.isInsuranceExpired ? AppColors.primaryRedColor.withOpacity(0.1) : AppColors.successColor.withOpacity(0.1), + labelPadding: EdgeInsetsDirectional.only(start: 4.w, end: 8.w), + ); + }), ], ), ], ), ), - ).paddingSymmetrical(24.h, 0.0), + ).paddingSymmetrical(24.w, 0.0), SizedBox(height: 16.h), Consumer(builder: (context, medicalFileVM, child) { return Column( @@ -225,7 +262,7 @@ class _MedicalFilePageState extends State { onTabChange: (index) { medicalFileVM.onTabChanged(index); }, - ).paddingSymmetrical(24.h, 0.0), + ).paddingSymmetrical(24.w, 0.0), SizedBox(height: 24.h), getSelectedTabData(medicalFileVM.selectedTabIndex), ], @@ -296,93 +333,89 @@ class _MedicalFilePageState extends State { ], ), ], - ).paddingSymmetrical(24.h, 0.h).onPress(() { + ).paddingSymmetrical(24.w, 0.h).onPress(() { Navigator.of(context).push( CustomPageRoute( page: MyAppointmentsPage(), ), ); }), + SizedBox(height: 16.h), Consumer(builder: (context, myAppointmentsVM, child) { return SizedBox( - height: myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty ? 200.h : 175.h, - child: ListView.separated( - scrollDirection: Axis.horizontal, - padding: EdgeInsets.only(top: 16.h, left: 24.h, right: 24.h, bottom: 0.h), - shrinkWrap: true, - itemCount: myAppointmentsVM.isMyAppointmentsLoading ? 5 : (myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty ? myAppointmentsVM.patientAppointmentsHistoryList.length : 1), - itemBuilder: (context, index) { - return AnimationConfiguration.staggeredList( - position: index, - duration: const Duration(milliseconds: 500), - child: SlideAnimation( - horizontalOffset: 100.0, - child: FadeInAnimation( - child: AnimatedContainer( - duration: Duration(milliseconds: 300), - curve: Curves.easeInOut, - child: myAppointmentsVM.isMyAppointmentsLoading - ? MedicalFileAppointmentCard( - patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(), - myAppointmentsViewModel: myAppointmentsVM, - onRescheduleTap: () {}, - onAskDoctorTap: () {}, - ) - : myAppointmentsVM.patientAppointmentsHistoryList.isNotEmpty - ? MedicalFileAppointmentCard( - patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index], - myAppointmentsViewModel: myAppointmentsViewModel, - onRescheduleTap: () { - openDoctorScheduleCalendar(myAppointmentsVM.patientAppointmentsHistoryList[index]); - }, - onAskDoctorTap: () {}, - ) - : Container( - width: MediaQuery.of(context).size.width - 48.h, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24, hasShadow: true), - child: Padding( - padding: EdgeInsets.all(12.h), - child: Column( - children: [ - Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h), - SizedBox(height: 12.h), - "You do not have any appointments. Please book an appointment".needTranslation.toText12(isCenter: true), - SizedBox(height: 12.h), - CustomButton( - text: LocaleKeys.bookAppo.tr(context: context), - onPressed: () { - Navigator.of(context).push( - CustomPageRoute( - page: BookAppointmentPage(), - ), - ); - }, - backgroundColor: Color(0xffFEE9EA), - borderColor: Color(0xffFEE9EA), - textColor: Color(0xffED1C2B), - fontSize: 14, - fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40, - icon: AppAssets.add_icon, - iconColor: AppColors.primaryRedColor, - ), - ], - ), - ), + child: myAppointmentsVM.isMyAppointmentsLoading + ? MedicalFileAppointmentCard( + patientAppointmentHistoryResponseModel: PatientAppointmentHistoryResponseModel(), + myAppointmentsViewModel: myAppointmentsVM, + onRescheduleTap: () {}, + onAskDoctorTap: () {}, + ) + : myAppointmentsVM.patientAppointmentsHistoryList.isEmpty + ? Container( + padding: EdgeInsets.all(12.w), + width: MediaQuery.of(context).size.width, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r, hasShadow: true), + child: Column( + children: [ + Utils.buildSvgWithAssets(icon: AppAssets.home_calendar_icon, width: 32.h, height: 32.h), + SizedBox(height: 12.h), + "You do not have any appointments. Please book an appointment".needTranslation.toText12(isCenter: true), + SizedBox(height: 12.h), + CustomButton( + text: LocaleKeys.bookAppo.tr(context: context), + onPressed: () { + Navigator.of(context).push( + CustomPageRoute( + page: BookAppointmentPage(), ), + ); + }, + backgroundColor: Color(0xffFEE9EA), + borderColor: Color(0xffFEE9EA), + textColor: Color(0xffED1C2B), + fontSize: 14.f, + fontWeight: FontWeight.w500, + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: 40.h, + icon: AppAssets.add_icon, + iconColor: AppColors.primaryRedColor, + ), + ], + ), + ) + : ListView.separated( + scrollDirection: Axis.horizontal, + shrinkWrap: true, + itemCount: myAppointmentsVM.patientAppointmentsHistoryList.length, + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( + position: index, + duration: const Duration(milliseconds: 500), + child: SlideAnimation( + horizontalOffset: 100.0, + child: FadeInAnimation( + child: AnimatedContainer( + duration: Duration(milliseconds: 300), + curve: Curves.easeInOut, + child: MedicalFileAppointmentCard( + patientAppointmentHistoryResponseModel: myAppointmentsVM.patientAppointmentsHistoryList[index], + myAppointmentsViewModel: myAppointmentsViewModel, + onRescheduleTap: () { + openDoctorScheduleCalendar(myAppointmentsVM.patientAppointmentsHistoryList[index]); + }, + onAskDoctorTap: () {}, + )), + ), + ), + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 12.h), ), - ), - ), - ); - }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 12.h), - ), - ); + ).paddingSymmetrical(24.w, 0); }), SizedBox(height: 24.h), - "Lab & Radiology".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + "Lab & Radiology".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), SizedBox(height: 16.h), Row( children: [ @@ -418,27 +451,27 @@ class _MedicalFilePageState extends State { }), ), ], - ).paddingSymmetrical(24.h, 0.h), + ).paddingSymmetrical(24.w, 0.h), SizedBox(height: 24.h), - "Active Medications & Prescriptions".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + "Active Medications & Prescriptions".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), SizedBox(height: 16.h), Consumer(builder: (context, prescriptionVM, child) { return prescriptionVM.isPrescriptionsOrdersLoading - ? const MoviesShimmerWidget().paddingSymmetrical(24.h, 0.h) + ? const MoviesShimmerWidget().paddingSymmetrical(24.w, 0.h) : prescriptionVM.patientPrescriptionOrders.isNotEmpty ? Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: Colors.white, - borderRadius: 20.h, + borderRadius: 12.r, ), child: Padding( - padding: EdgeInsets.all(16.h), + padding: EdgeInsets.all(16.w), child: Column( children: [ ListView.separated( itemCount: prescriptionVM.patientPrescriptionOrders.length, shrinkWrap: true, - padding: const EdgeInsets.only(left: 0, right: 8), + padding: EdgeInsets.only(left: 0, right: 8.w), physics: NeverScrollableScrollPhysics(), itemBuilder: (context, index) { return AnimationConfiguration.staggeredList( @@ -451,11 +484,11 @@ class _MedicalFilePageState extends State { children: [ Image.network( prescriptionVM.patientPrescriptionOrders[index].doctorImageURL!, - width: 40.h, + width: 40.w, height: 40.h, fit: BoxFit.cover, - ).circle(100), - SizedBox(width: 16.h), + ).circle(100.r), + SizedBox(width: 16.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, @@ -464,13 +497,16 @@ class _MedicalFilePageState extends State { SizedBox(height: 4.h), Wrap( direction: Axis.horizontal, - spacing: 3.h, - runSpacing: 4.h, + spacing: 3.w, + runSpacing: 4.w, children: [ AppCustomChipWidget(labelText: prescriptionVM.patientPrescriptionOrders[index].clinicDescription!), AppCustomChipWidget( icon: AppAssets.doctor_calendar_icon, - labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(prescriptionVM.patientPrescriptionOrders[index].appointmentDate), false), + labelText: DateUtil.formatDateToDate( + DateUtil.convertStringToDate(prescriptionVM.patientPrescriptionOrders[index].appointmentDate), + false, + ), ), ], ), @@ -481,7 +517,11 @@ class _MedicalFilePageState extends State { Transform.flip( flipX: appState.isArabic(), child: Utils.buildSvgWithAssets( - icon: AppAssets.forward_arrow_icon_small, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor)), + icon: AppAssets.forward_arrow_icon_small, + width: 15.w, + height: 15.h, + fit: BoxFit.contain, + iconColor: AppColors.textColor)), ], ).onPress(() { prescriptionVM.setPrescriptionsDetailsLoading(); @@ -497,9 +537,9 @@ class _MedicalFilePageState extends State { }, separatorBuilder: (BuildContext cxt, int index) => SizedBox(height: 16.h), ), - SizedBox(height: 16.h), + SizedBox(height: 24.h), const Divider(color: AppColors.dividerColor), - SizedBox(height: 16.h), + SizedBox(height: 24.h), Row( children: [ Expanded( @@ -515,16 +555,16 @@ class _MedicalFilePageState extends State { backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, - fontSize: 12.3, + fontSize: 12.f, fontWeight: FontWeight.w500, - borderRadius: 12.h, - height: 40.h, + borderRadius: 12.r, + height: 56.h, icon: AppAssets.requests, iconColor: AppColors.primaryRedColor, - iconSize: 16.h, + iconSize: 16.w, ), ), - SizedBox(width: 10.h), + SizedBox(width: 10.w), Expanded( child: CustomButton( text: "All Medications".needTranslation, @@ -532,10 +572,10 @@ class _MedicalFilePageState extends State { backgroundColor: AppColors.secondaryLightRedColor, borderColor: AppColors.secondaryLightRedColor, textColor: AppColors.primaryRedColor, - fontSize: 13, + fontSize: 12.f, fontWeight: FontWeight.w500, borderRadius: 12.h, - height: 40.h, + height: 56.h, icon: AppAssets.all_medications_icon, iconColor: AppColors.primaryRedColor, iconSize: 16.h, @@ -546,15 +586,21 @@ class _MedicalFilePageState extends State { ], ), ), - ).paddingSymmetrical(24.h, 0.h) + ).paddingSymmetrical(24.w, 0.h) : Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.h, - hasShadow: false, - ), - child: Utils.getNoDataWidget(context, noDataText: "You don't have any prescriptions yet.".needTranslation, isSmallWidget: true, width: 62, height: 62)) - .paddingSymmetrical(24.h, 0.h); + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have any prescriptions yet.".needTranslation, + isSmallWidget: true, + width: 62.w, + height: 62.h, + ), + ).paddingSymmetrical(24.w, 0.h); }), SizedBox(height: 24.h), //My Doctor Section @@ -565,11 +611,10 @@ class _MedicalFilePageState extends State { Row( children: [ LocaleKeys.viewAll.tr().toText12(color: AppColors.primaryRedColor, fontWeight: FontWeight.w500), - SizedBox(width: 2.h), + SizedBox(width: 2.w), Icon(Icons.arrow_forward_ios, color: AppColors.primaryRedColor, size: 10.h), ], ).onPress(() { - myAppointmentsViewModel.setIsPatientMyDoctorsLoading(true); myAppointmentsViewModel.getPatientMyDoctors(); Navigator.of(context).push( CustomPageRoute( @@ -578,58 +623,63 @@ class _MedicalFilePageState extends State { ); }), ], - ).paddingSymmetrical(24.h, 0.h), + ).paddingSymmetrical(24.w, 0.h), SizedBox(height: 16.h), Consumer(builder: (context, myAppointmentsVM, child) { - return SizedBox( - height: 120.h, - child: ListView.separated( - scrollDirection: Axis.horizontal, - itemCount: myAppointmentsVM.isPatientMyDoctorsLoading - ? 5 - : myAppointmentsVM.patientMyDoctorsList.isNotEmpty - ? myAppointmentsVM.patientMyDoctorsList.length - : 1, - shrinkWrap: true, - padding: EdgeInsets.only(left: 24.h, right: 24.h), - itemBuilder: (context, index) { - return myAppointmentsVM.isPatientMyDoctorsLoading - ? SizedBox( - width: 80.h, - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - children: [ - Image.network( - "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", - width: 64.h, - height: 64.h, - fit: BoxFit.cover, - ).circle(100).toShimmer2(isShow: true, radius: 50.h), - SizedBox(height: 8.h), - Expanded( - child: ("Dr. John Smith Smith Smith").toString().toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2).toShimmer2(isShow: true), - ), - ], - ), - ) - : myAppointmentsVM.patientMyDoctorsList.isNotEmpty - ? AnimationConfiguration.staggeredList( + return myAppointmentsVM.isPatientMyDoctorsLoading + ? Column( + crossAxisAlignment: CrossAxisAlignment.center, + children: [ + Image.network( + "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", + width: 64.w, + height: 64.h, + fit: BoxFit.cover, + ).circle(100).toShimmer2(isShow: true, radius: 50.r), + SizedBox(height: 8.h), + ("Dr. John Smith Smith Smith").toString().toText12(fontWeight: FontWeight.w500, isCenter: true, maxLine: 2).toShimmer2(isShow: true), + ], + ) + : myAppointmentsVM.patientMyDoctorsList.isEmpty + ? Container( + width: SizeConfig.screenWidth, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.whiteColor, + borderRadius: 12.r, + hasShadow: false, + ), + child: Utils.getNoDataWidget( + context, + noDataText: "You don't have any completed visits yet".needTranslation, + isSmallWidget: true, + width: 62.w, + height: 62.h, + ), + ).paddingSymmetrical(24.w, 0.h) + : SizedBox( + height: 200.h, + child: ListView.separated( + scrollDirection: Axis.horizontal, + itemCount: myAppointmentsVM.patientMyDoctorsList.length, + shrinkWrap: true, + itemBuilder: (context, index) { + return AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 1000), child: SlideAnimation( horizontalOffset: 100.0, child: FadeInAnimation( child: SizedBox( - width: 80.h, + // width: 80.w, child: Column( crossAxisAlignment: CrossAxisAlignment.center, children: [ Image.network( myAppointmentsVM.patientMyDoctorsList[index].doctorImageURL!, - width: 64.h, + width: 64.w, height: 64.h, fit: BoxFit.cover, - ).circle(100).toShimmer2(isShow: false, radius: 50.h), + ).circle(100).toShimmer2(isShow: false, radius: 50.r), SizedBox(height: 8.h), Expanded( child: (myAppointmentsVM.patientMyDoctorsList[index].doctorName) @@ -639,32 +689,48 @@ class _MedicalFilePageState extends State { ), ], ), - ), + ).onPress(() async { + bookAppointmentsViewModel.setSelectedDoctor(DoctorsListResponseModel( + clinicID: myAppointmentsVM.patientMyDoctorsList[index].clinicID, + projectID: myAppointmentsVM.patientMyDoctorsList[index].projectID, + doctorID: myAppointmentsVM.patientMyDoctorsList[index].doctorID, + )); + LoaderBottomSheet.showLoader(); + await bookAppointmentsViewModel.getDoctorProfile(onSuccess: (dynamic respData) { + LoaderBottomSheet.hideLoader(); + Navigator.of(context).push( + CustomPageRoute( + page: DoctorProfilePage(), + ), + ); + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }), ), ), - ) - : Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - color: AppColors.whiteColor, - borderRadius: 20.h, - hasShadow: false, - ), - child: Utils.getNoDataWidget(context, noDataText: "You don't have any completed visits yet.".needTranslation, isSmallWidget: true, width: 62, height: 62), - ).paddingSymmetrical(24.h, 0.h); - }, - separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.h), - ), - ); + ); + }, + separatorBuilder: (BuildContext cxt, int index) => SizedBox(width: 8.h), + ), + ); }), SizedBox(height: 24.h), - "Others".needTranslation.toText18(isBold: true).paddingSymmetrical(24.h, 0.h), + "Others".needTranslation.toText18(isBold: true).paddingSymmetrical(24.w, 0.h), SizedBox(height: 16.h), GridView( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, - crossAxisSpacing: 16, - mainAxisSpacing: 16, - mainAxisExtent: 130, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 130.h, ), physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, @@ -676,15 +742,15 @@ class _MedicalFilePageState extends State { backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.eye_result_icon, isLargeText: true, - iconSize: 36.h, + iconSize: 36.w, ), MedicalFileCard( - label: "Allergy Info".needTranslation, + label: "Allergy Info".needTranslation, textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.allergy_info_icon, isLargeText: true, - iconSize: 36.h, + iconSize: 36.w, ), MedicalFileCard( label: "Vaccine Info".needTranslation, @@ -692,7 +758,7 @@ class _MedicalFilePageState extends State { backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.vaccine_info_icon, isLargeText: true, - iconSize: 36.h, + iconSize: 36.w, ).onPress(() { Navigator.of(context).push( CustomPageRoute( @@ -701,7 +767,7 @@ class _MedicalFilePageState extends State { ); }), ], - ).paddingSymmetrical(24.h, 0.0), + ).paddingSymmetrical(24.w, 0.0), SizedBox(height: 24.h), ], ); @@ -716,7 +782,7 @@ class _MedicalFilePageState extends State { labOrder: null, index: index, isLoading: true, - ).paddingSymmetrical(24.h, 0.0) + ).paddingSymmetrical(24.w, 0.0) : insuranceVM.patientInsuranceList.isNotEmpty ? PatientInsuranceCard( insuranceCardDetailsModel: insuranceVM.patientInsuranceList.first, @@ -727,15 +793,15 @@ class _MedicalFilePageState extends State { : Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 20.h, + borderRadius: 12.r, hasShadow: false, ), child: Utils.getNoDataWidget( context, noDataText: "You don't have insurance registered with HMG.".needTranslation, isSmallWidget: true, - width: 62, - height: 62, + width: 62.w, + height: 62.h, callToActionButton: CustomButton( icon: AppAssets.update_insurance_card_icon, iconColor: AppColors.successColor, @@ -745,53 +811,51 @@ class _MedicalFilePageState extends State { insuranceViewModel.setIsInsuranceUpdateDetailsLoading(true); insuranceViewModel.getPatientInsuranceDetailsForUpdate( appState.getAuthenticatedUser()!.patientId.toString(), appState.getAuthenticatedUser()!.patientIdentificationNo.toString()); - showCommonBottomSheetWithoutHeight(context, child: PatientInsuranceCardUpdateCard(), callBackFunc: () {}, title: "", isCloseButtonVisible: false, isFullScreen: false); + showCommonBottomSheetWithoutHeight(context, + child: PatientInsuranceCardUpdateCard(), callBackFunc: () {}, title: "", isCloseButtonVisible: false, isFullScreen: false); }, backgroundColor: AppColors.bgGreenColor.withOpacity(0.20), borderColor: AppColors.bgGreenColor.withOpacity(0.0), textColor: AppColors.bgGreenColor, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, - ).paddingOnly(left: 12.h, right: 12.h, bottom: 12.h), + borderRadius: 12.r, + padding: EdgeInsets.fromLTRB(10.w, 0, 10.w, 0), + height: 56.h, + ).paddingOnly(left: 12.w, right: 12.w, bottom: 12.h), ), - ).paddingSymmetrical(24.h, 0.h); + ).paddingSymmetrical(24.w, 0.h); }), SizedBox(height: 10.h), GridView( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, - crossAxisSpacing: 16, - mainAxisSpacing: 16, - mainAxisExtent: 140, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 150.h, ), physics: NeverScrollableScrollPhysics(), - padding: EdgeInsets.only(top: 12), + padding: EdgeInsets.only(top: 12.h), shrinkWrap: true, children: [ MedicalFileCard( - label: "Update Insurance".needTranslation, - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.eye_result_icon, - isLargeText: true, - iconSize: 36.h) - .onPress(() { - Navigator.of(context).push( - CustomPageRoute( - page: InsuranceHomePage(), - ), - ); + label: "Update Insurance".needTranslation, + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { + Navigator.of(context).push(CustomPageRoute(page: InsuranceHomePage())); }), MedicalFileCard( - label: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}", - textColor: AppColors.blackColor, - backgroundColor: AppColors.whiteColor, - svgIcon: AppAssets.eye_result_icon, - isLargeText: true, - iconSize: 36.h).onPress(() { + label: "${LocaleKeys.insurance.tr(context: context)} ${LocaleKeys.approvals.tr(context: context)}", + textColor: AppColors.blackColor, + backgroundColor: AppColors.whiteColor, + svgIcon: AppAssets.eye_result_icon, + isLargeText: true, + iconSize: 36.w, + ).onPress(() { Navigator.of(context).push( CustomPageRoute( page: InsuranceApprovalsPage(), @@ -799,21 +863,21 @@ class _MedicalFilePageState extends State { ); }), MedicalFileCard( - label: "My Invoices List".needTranslation, + label: "My Invoices List".needTranslation, textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.eye_result_icon, isLargeText: true, - iconSize: 36.h), + iconSize: 36.w), MedicalFileCard( label: "Ancillary Orders List".needTranslation, textColor: AppColors.blackColor, backgroundColor: AppColors.whiteColor, svgIcon: AppAssets.eye_result_icon, isLargeText: true, - iconSize: 36.h), + iconSize: 36.w), ], - ).paddingSymmetrical(24.h, 0.0), + ).paddingSymmetrical(24.w, 0.0), SizedBox(height: 16.h), ], ); @@ -826,34 +890,34 @@ class _MedicalFilePageState extends State { ? PatientSickLeaveCard( patientSickLeavesResponseModel: PatientSickLeavesResponseModel(), isLoading: true, - ).paddingSymmetrical(24.h, 0.0) + ).paddingSymmetrical(24.w, 0.0) : medicalFileVM.patientSickLeaveList.isNotEmpty ? PatientSickLeaveCard( patientSickLeavesResponseModel: medicalFileVM.patientSickLeaveList.first, isLoading: false, - ).paddingSymmetrical(24.h, 0.0) + ).paddingSymmetrical(24.w, 0.0) : Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 20.h, + borderRadius: 12.r, hasShadow: false, ), child: Utils.getNoDataWidget( context, noDataText: "You don't have any sick leaves yet.".needTranslation, isSmallWidget: true, - width: 62, - height: 62, + width: 62.w, + height: 62.h, ), - ).paddingSymmetrical(24.h, 0.h); + ).paddingSymmetrical(24.w, 0.h); }), SizedBox(height: 16.h), GridView( gridDelegate: SliverGridDelegateWithFixedCrossAxisCount( crossAxisCount: 3, - crossAxisSpacing: 16, - mainAxisSpacing: 16, - mainAxisExtent: 140, + crossAxisSpacing: 16.h, + mainAxisSpacing: 16.w, + mainAxisExtent: 140.h, ), physics: NeverScrollableScrollPhysics(), padding: EdgeInsets.zero, @@ -898,7 +962,7 @@ class _MedicalFilePageState extends State { ); }), ], - ).paddingSymmetrical(24.h, 0.0), + ).paddingSymmetrical(24.w, 0.0), SizedBox(height: 24.h), ], ); @@ -908,9 +972,4 @@ class _MedicalFilePageState extends State { return Container(); } } - - getMember() { - // AuthanticationViewModel authanticationViewModel = getIt.get(); - // RequestUtils.getAddFamilyRequest(nationalIDorFile: nationalIDorFile, mobileNo: mobileNo, countryCode: countryCode, loginType: loginType); - } } diff --git a/lib/presentation/medical_file/widgets/lab_rad_card.dart b/lib/presentation/medical_file/widgets/lab_rad_card.dart index c7fd7dd..42f5bff 100644 --- a/lib/presentation/medical_file/widgets/lab_rad_card.dart +++ b/lib/presentation/medical_file/widgets/lab_rad_card.dart @@ -9,18 +9,25 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; class LabRadCard extends StatelessWidget { - LabRadCard({super.key, required this.icon, required this.labelText, required this.labOrderTests, required this.isLoading}); + const LabRadCard({ + super.key, + required this.icon, + required this.labelText, + required this.labOrderTests, + required this.isLoading, + }); - String icon; - String labelText; - List labOrderTests = []; - bool isLoading; + final String icon; + final String labelText; + final List labOrderTests; + + final bool isLoading; @override Widget build(BuildContext context) { AppState appState = getIt.get(); return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: false), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 12.r, hasShadow: false), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -28,12 +35,12 @@ class LabRadCard extends StatelessWidget { children: [ Utils.buildSvgWithAssets( icon: icon, - width: 40.h, + width: 40.w, height: 40.h, fit: BoxFit.contain, - ).toShimmer2(isShow: false, radius: 12.h), - SizedBox(width: 8.h), - labelText.toText13(isBold: true).toShimmer2(isShow: false, radius: 6.h, height: 32.h), + ).toShimmer2(isShow: false, radius: 12.r), + SizedBox(width: 8.w), + Flexible(child: labelText.toText14(isBold: true).toShimmer2(isShow: false, radius: 6.r, height: 32.h)), ], ), SizedBox(height: 16.h), @@ -43,13 +50,19 @@ class LabRadCard extends StatelessWidget { padding: EdgeInsets.zero, physics: NeverScrollableScrollPhysics(), shrinkWrap: true, - itemBuilder: (cxt, index) { - return labOrderTests[index].toText12(isBold: true, maxLine: 1).toShimmer2(isShow: false, radius: 6.h, height: 24.h, width: 120.h).toShimmer2(isShow: isLoading); + itemBuilder: (cxt, index) { + return labOrderTests[index] + .toText12(isBold: true, maxLine: 1) + .toShimmer2(isShow: false, radius: 6.r, height: 24.h, width: 120.w) + .toShimmer2(isShow: isLoading); }, separatorBuilder: (cxt, index) => SizedBox(height: 8.h), itemCount: 3, ) - : "You don't have any records yet".needTranslation.toText12(fontWeight: FontWeight.w500, color: AppColors.greyTextColor, isCenter: true), + : "You don't have any records yet".needTranslation.toText13( + color: AppColors.greyTextColor, + isCenter: true, + ), SizedBox(height: 16.h), Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, @@ -57,13 +70,14 @@ class LabRadCard extends StatelessWidget { SizedBox.shrink(), Transform.flip( flipX: appState.isArabic(), - child: Utils.buildSvgWithAssets(icon: AppAssets.forward_arrow_icon_small, width: 15.h, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor) - .toShimmer2(isShow: false, radius: 12.h), + child: Utils.buildSvgWithAssets( + icon: AppAssets.forward_arrow_icon_small, width: 15.w, height: 15.h, fit: BoxFit.contain, iconColor: AppColors.textColor) + .toShimmer2(isShow: false, radius: 12.r), ), ], ) ], - ).paddingAll(16.h), + ).paddingAll(16.w), ); } } diff --git a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart index 434bad2..0f382dc 100644 --- a/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart +++ b/lib/presentation/medical_file/widgets/medical_file_appointment_card.dart @@ -17,16 +17,20 @@ import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; class MedicalFileAppointmentCard extends StatelessWidget { - MedicalFileAppointmentCard({super.key, required this.patientAppointmentHistoryResponseModel, required this.myAppointmentsViewModel, required this.onRescheduleTap, required this.onAskDoctorTap}); + final PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; + final MyAppointmentsViewModel myAppointmentsViewModel; + final Function onRescheduleTap; + final Function onAskDoctorTap; - PatientAppointmentHistoryResponseModel patientAppointmentHistoryResponseModel; - MyAppointmentsViewModel myAppointmentsViewModel; - - late Function onRescheduleTap; - late Function onAskDoctorTap; + const MedicalFileAppointmentCard({ + super.key, + required this.patientAppointmentHistoryResponseModel, + required this.myAppointmentsViewModel, + required this.onRescheduleTap, + required this.onAskDoctorTap, + }); @override Widget build(BuildContext context) { @@ -36,19 +40,21 @@ class MedicalFileAppointmentCard extends StatelessWidget { children: [ AppCustomChipWidget( richText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientAppointmentHistoryResponseModel.appointmentDate), false) - .toText12(color: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, fontWeight: FontWeight.w500) - .paddingOnly(left: 8.h), + .toText12( + color: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, + fontWeight: FontWeight.w500) + .paddingOnly(left: 8.w), icon: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppAssets.appointment_calendar_icon : AppAssets.alarm_clock_icon, iconColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, - iconSize: 16.h, + iconSize: 16.w, backgroundColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.greyColor : AppColors.secondaryLightRedColor, textColor: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) ? AppColors.textColor : AppColors.primaryRedColor, - padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 8.h, right: 8.h), + padding: EdgeInsets.only(top: 12.h, bottom: 12.h, left: 8.w, right: 8.w), ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), SizedBox(height: 16.h), Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), - width: 200.h, + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), + width: 200.w, child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ @@ -56,16 +62,18 @@ class MedicalFileAppointmentCard extends StatelessWidget { children: [ Image.network( patientAppointmentHistoryResponseModel.doctorImageURL ?? "https://hmgwebservices.com/Images/MobileImages/DUBAI/unkown_female.png", - width: 25.h, + width: 25.w, height: 27.h, fit: BoxFit.fill, ).circle(100).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), - SizedBox(width: 8.h), + SizedBox(width: 8.w), Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ - (patientAppointmentHistoryResponseModel.doctorNameObj ?? "").toText14(isBold: true, maxlines: 1).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), + (patientAppointmentHistoryResponseModel.doctorNameObj ?? "") + .toText14(isBold: true, maxlines: 1) + .toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), (patientAppointmentHistoryResponseModel.clinicName ?? "") .toText12(maxLine: 1, fontWeight: FontWeight.w500, color: AppColors.greyTextColor) .toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), @@ -78,7 +86,7 @@ class MedicalFileAppointmentCard extends StatelessWidget { Row( children: [ myAppointmentsViewModel.isMyAppointmentsLoading - ? Container().toShimmer2(isShow: true, height: 40.h, width: 100.h, radius: 12.h) + ? Container().toShimmer2(isShow: true, height: 40.h, width: 100.w, radius: 12.r) : Expanded( flex: 6, child: AppointmentType.isArrived(patientAppointmentHistoryResponseModel) @@ -95,37 +103,38 @@ class MedicalFileAppointmentCard extends StatelessWidget { // widget.myAppointmentsViewModel.getPatientAppointments(true, false); }); }, - backgroundColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.15), + backgroundColor: + AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.15), borderColor: AppointmentType.getNextActionButtonColor(patientAppointmentHistoryResponseModel.nextAction).withOpacity(0.01), textColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), height: 40.h, icon: AppointmentType.getNextActionIcon(patientAppointmentHistoryResponseModel.nextAction), iconColor: AppointmentType.getNextActionTextColor(patientAppointmentHistoryResponseModel.nextAction), iconSize: 14.h, ).toShimmer2(isShow: myAppointmentsViewModel.isMyAppointmentsLoading), ), - SizedBox(width: 8.h), + SizedBox(width: 8.w), Expanded( flex: 2, child: Container( height: 40.h, - width: 40.h, + width: 40.w, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.textColor, - borderRadius: 10.h, + borderRadius: 10.r, ), child: Padding( - padding: EdgeInsets.all(10.h), + padding: EdgeInsets.all(10.w), child: Transform.flip( flipX: appState.isArabic(), child: Utils.buildSvgWithAssets( iconColor: AppColors.whiteColor, icon: AppAssets.forward_arrow_icon_small, - width: 40.h, + width: 40.w, height: 40.h, fit: BoxFit.contain, ), @@ -147,7 +156,7 @@ class MedicalFileAppointmentCard extends StatelessWidget { ], ), ], - ).paddingAll(16.h), + ).paddingAll(16.w), ), ], ); @@ -163,8 +172,8 @@ class MedicalFileAppointmentCard extends StatelessWidget { textColor: AppColors.primaryRedColor, fontSize: 14, fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), height: 40.h, icon: AppAssets.ask_doctor_icon, iconColor: AppColors.primaryRedColor, @@ -178,10 +187,10 @@ class MedicalFileAppointmentCard extends StatelessWidget { backgroundColor: AppColors.greyColor, borderColor: AppColors.greyColor, textColor: AppColors.blackColor, - fontSize: 14, + fontSize: 14.f, fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + borderRadius: 12.r, + padding: EdgeInsets.symmetric(horizontal: 10.w), height: 40.h, icon: AppAssets.rebook_appointment_icon, iconColor: AppColors.blackColor, diff --git a/lib/presentation/medical_file/widgets/medical_file_card.dart b/lib/presentation/medical_file/widgets/medical_file_card.dart index e8cff72..00d62c9 100644 --- a/lib/presentation/medical_file/widgets/medical_file_card.dart +++ b/lib/presentation/medical_file/widgets/medical_file_card.dart @@ -9,32 +9,34 @@ class MedicalFileCard extends StatelessWidget { final Color textColor; final Color backgroundColor; final String svgIcon; - final num iconSize; - bool isLargeText; + final double? iconSize; + final bool isLargeText; - MedicalFileCard({ + const MedicalFileCard({ + super.key, required this.label, required this.textColor, required this.backgroundColor, this.svgIcon = "", - this.iconSize = 30, - this.isLargeText = false + this.iconSize, + this.isLargeText = false, }); @override Widget build(BuildContext context) { + final iconS = iconSize ?? 30.w; return Container( decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: backgroundColor, - borderRadius: 20, + borderRadius: 12.r, ), child: Padding( - padding: EdgeInsets.all(12.h), + padding: EdgeInsets.all(12.w), child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: svgIcon, width: iconSize.h, height: iconSize.h, fit: BoxFit.contain), + Utils.buildSvgWithAssets(icon: svgIcon, width: iconS, height: iconS, fit: BoxFit.contain), SizedBox(height: 12.h), isLargeText ? label.toText13(color: textColor, isBold: true, maxLine: 2) : label.toText11(color: textColor, isBold: true, maxLine: 2), ], diff --git a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart index 87794ef..a818ae5 100644 --- a/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart +++ b/lib/presentation/medical_file/widgets/patient_sick_leave_card.dart @@ -77,6 +77,7 @@ class PatientSickLeaveCard extends StatelessWidget { AppCustomChipWidget( icon: AppAssets.doctor_calendar_icon, labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(patientSickLeavesResponseModel.appointmentDate), false), + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), ).toShimmer2(isShow: isLoading), AppCustomChipWidget(labelText: isLoading ? "Pending Activation" : patientSickLeavesResponseModel.clinicName!).toShimmer2(isShow: isLoading), ], diff --git a/lib/presentation/my_family/my_family.dart b/lib/presentation/my_family/my_family.dart index 9b8014a..194d5e0 100644 --- a/lib/presentation/my_family/my_family.dart +++ b/lib/presentation/my_family/my_family.dart @@ -77,9 +77,8 @@ class _FamilyMedicalScreenState extends State { }); }, icon: AppAssets.add_icon, - height: 56.h, - fontSize: 16, - borderRadius: 12.h, + fontSize: 16.f, + borderRadius: 12.r, fontWeight: FontWeight.w500)) : SizedBox(), child: Column( diff --git a/lib/presentation/onboarding/onboarding_screen.dart b/lib/presentation/onboarding/onboarding_screen.dart index 9d13488..2bf898b 100644 --- a/lib/presentation/onboarding/onboarding_screen.dart +++ b/lib/presentation/onboarding/onboarding_screen.dart @@ -4,7 +4,6 @@ import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/cache_consts.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/presentation/home/navigation_screen.dart'; @@ -82,16 +81,18 @@ class _OnboardingScreenState extends State { duration: const Duration(milliseconds: 250), height: 6.h, width: selectedIndex == 0 ? 18.h : 6.h, - decoration: BoxDecoration(color: selectedIndex == 0 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30)), + decoration: + BoxDecoration(color: selectedIndex == 0 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30)), ), AnimatedContainer( duration: const Duration(milliseconds: 250), height: 6.h, width: selectedIndex == 1 ? 18.h : 6.h, - decoration: BoxDecoration(color: selectedIndex == 1 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30)), + decoration: + BoxDecoration(color: selectedIndex == 1 ? AppColors.textColor : AppColors.inputLabelTextColor, borderRadius: BorderRadius.circular(30)), ), ], - ).paddingOnly(left: 24, right: 24), + ).paddingOnly(left: 24.h, right: 24.h), Row( children: [ AnimatedSwitcher( @@ -103,23 +104,21 @@ class _OnboardingScreenState extends State { onPressed: () => goToHomePage(), width: 86.h, height: 56.h, - borderRadius: 12.h, backgroundColor: Color(0xffFEE9EA), textColor: AppColors.primaryRedColor, - borderWidth: 0, borderColor: Colors.transparent, - ).paddingOnly(left: 24) + ).paddingOnly(left: 24.h) : const SizedBox.shrink(), ), const Spacer(), AnimatedContainer( duration: const Duration(milliseconds: 400), curve: Curves.easeInOut, - width: selectedIndex == 0 ? 86 : MediaQuery.of(context).size.width - 48, - margin: EdgeInsets.only(left: 24, right: 24), + width: selectedIndex == 0 ? 86.h : MediaQuery.of(context).size.width - 48.h, + margin: EdgeInsets.only(left: 24.h, right: 24.h), decoration: BoxDecoration( color: AppColors.primaryRedColor, - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular(12.r), ), child: AnimatedSwitcher( duration: const Duration(milliseconds: 250), @@ -130,7 +129,6 @@ class _OnboardingScreenState extends State { iconSize: 32.h, width: 86.h, height: 56.h, - borderRadius: 12.h, text: "".needTranslation, backgroundColor: Colors.transparent, onPressed: () { @@ -139,9 +137,8 @@ class _OnboardingScreenState extends State { : CustomButton( text: "Get Started".needTranslation, fontWeight: FontWeight.w500, - fontSize: 16.h, + fontSize: 16.f, height: 56.h, - borderRadius: 16.h, textOverflow: TextOverflow.ellipsis, backgroundColor: Colors.transparent, onPressed: () => goToHomePage(), @@ -166,18 +163,23 @@ class _OnboardingScreenState extends State { alignment: Alignment.bottomCenter, child: Transform.flip( flipX: getIt.get().isArabic() ? true : false, - child: Lottie.asset(icon, repeat: true, reverse: false, frameRate: FrameRate(60), width: MediaQuery.sizeOf(context).width - 50, height: MediaQuery.sizeOf(context).width - 50))) + child: Lottie.asset(icon, + repeat: true, + reverse: false, + frameRate: FrameRate(60), + width: MediaQuery.sizeOf(context).width - 50, + height: MediaQuery.sizeOf(context).width - 50))) .expanded, // 12.height, Text( heading, - style: TextStyle(fontSize: 36.h, fontWeight: FontWeight.w600, color: AppColors.textColor, letterSpacing: -0.4, height: 1), + style: TextStyle(fontSize: 36.f, fontWeight: FontWeight.w600, color: AppColors.textColor, letterSpacing: -0.4, height: 1), ), Text( body, - style: TextStyle(fontSize: 16.h, fontWeight: FontWeight.w500, color: AppColors.greyTextColor, letterSpacing: 0, height: 26 / 16), + style: TextStyle(fontSize: 16.f, fontWeight: FontWeight.w500, color: AppColors.greyTextColor, letterSpacing: 0, height: 26 / 16), ), ], - ).paddingOnly(left: 24, right: 24); + ).paddingOnly(left: 24.h, right: 24.h); } } diff --git a/lib/presentation/prescriptions/prescription_detail_page.dart b/lib/presentation/prescriptions/prescription_detail_page.dart index 9f6d55b..473f79a 100644 --- a/lib/presentation/prescriptions/prescription_detail_page.dart +++ b/lib/presentation/prescriptions/prescription_detail_page.dart @@ -20,8 +20,11 @@ import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; +import 'package:hmg_patient_app_new/widgets/loader/bottomsheet_loader.dart'; import 'package:hmg_patient_app_new/widgets/shimmer/movies_shimmer_widget.dart'; +import 'package:open_filex/open_filex.dart'; import 'package:provider/provider.dart'; +import 'package:url_launcher/url_launcher.dart'; class PrescriptionDetailPage extends StatefulWidget { PrescriptionDetailPage({super.key, required this.prescriptionsResponseModel}); @@ -59,6 +62,33 @@ class _PrescriptionDetailPageState extends State { Expanded( child: CollapsingListView( title: LocaleKeys.prescriptions.tr(context: context), + instructions: () async { + LoaderBottomSheet.showLoader(loadingText: "Fetching prescription PDF, Please wait...".needTranslation); + await prescriptionsViewModel.getPrescriptionInstructionsPDF(widget.prescriptionsResponseModel, onSuccess: (val) { + LoaderBottomSheet.hideLoader(); + if (prescriptionsViewModel.prescriptionInstructionsPDFLink.isNotEmpty) { + Uri uri = Uri.parse(prescriptionsViewModel.prescriptionInstructionsPDFLink); + launchUrl(uri, mode: LaunchMode.platformDefault, webOnlyWindowName: ""); + } else { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Unable to fetch PDF".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + }, onError: (err) { + LoaderBottomSheet.hideLoader(); + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: err), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + }); + }, child: SingleChildScrollView( child: Consumer(builder: (context, prescriptionVM, child) { return Column( @@ -98,6 +128,7 @@ class _PrescriptionDetailPageState extends State { AppCustomChipWidget( icon: AppAssets.doctor_calendar_icon, labelText: DateUtil.formatDateToDate(DateUtil.convertStringToDate(widget.prescriptionsResponseModel.appointmentDate), false), + labelPadding: EdgeInsetsDirectional.only(start: -4.h, end: 8.h), ), AppCustomChipWidget( labelText: widget.prescriptionsResponseModel.clinicDescription!, @@ -112,6 +143,41 @@ class _PrescriptionDetailPageState extends State { ), ], ), + SizedBox(height: 16.h), + CustomButton( + text: "Download Prescription".needTranslation, + onPressed: () async { + LoaderBottomSheet.showLoader(); + await prescriptionVM.getPrescriptionPDFBase64(widget.prescriptionsResponseModel).then((val) async { + LoaderBottomSheet.hideLoader(); + if (prescriptionVM.prescriptionPDFBase64Data.isNotEmpty) { + String path = await Utils.createFileFromString(prescriptionVM.prescriptionPDFBase64Data, "pdf"); + try { + OpenFilex.open(path); + } catch (ex) { + showCommonBottomSheetWithoutHeight( + context, + child: Utils.getErrorWidget(loadingText: "Cannot open file".needTranslation), + callBackFunc: () {}, + isFullScreen: false, + isCloseButtonVisible: true, + ); + } + } + }); + }, + backgroundColor: AppColors.successColor.withValues(alpha: 0.15), + borderColor: AppColors.successColor.withValues(alpha: 0.01), + textColor: AppColors.successColor, + fontSize: 14, + fontWeight: FontWeight.w500, + borderRadius: 12, + padding: EdgeInsets.fromLTRB(10, 0, 10, 0), + height: 40.h, + icon: AppAssets.download, + iconColor: AppColors.successColor, + iconSize: 14.h, + ), ], ), ), diff --git a/lib/presentation/prescriptions/prescription_item_view.dart b/lib/presentation/prescriptions/prescription_item_view.dart index 8357033..acf03f5 100644 --- a/lib/presentation/prescriptions/prescription_item_view.dart +++ b/lib/presentation/prescriptions/prescription_item_view.dart @@ -209,21 +209,7 @@ class PrescriptionItemView extends StatelessWidget { height: 40.h, ).toShimmer2(isShow: isLoading), ), - SizedBox(width: 16.h), - Expanded( - child: CustomButton( - text: LocaleKeys.readInstructions.tr(context: context), - onPressed: () {}, - backgroundColor: AppColors.primaryRedColor, - borderColor: AppColors.primaryRedColor, - textColor: AppColors.whiteColor, - fontSize: 13, - fontWeight: FontWeight.w500, - borderRadius: 12, - padding: EdgeInsets.fromLTRB(10, 0, 10, 0), - height: 40.h, - ).toShimmer2(isShow: isLoading), - ), + // SizedBox(width: 16.h), ], ).paddingSymmetrical(16.h, 16.h), ], diff --git a/lib/presentation/profile_settings/profile_settings.dart b/lib/presentation/profile_settings/profile_settings.dart index a12077a..59e59b1 100644 --- a/lib/presentation/profile_settings/profile_settings.dart +++ b/lib/presentation/profile_settings/profile_settings.dart @@ -1,16 +1,12 @@ -import 'dart:convert'; -import 'dart:developer'; - import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_swiper_view/flutter_swiper_view.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/app_state.dart'; -import 'package:hmg_patient_app_new/core/utils/date_util.dart'; -import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/dependencies.dart'; import 'package:hmg_patient_app_new/core/enums.dart'; +import 'package:hmg_patient_app_new/core/utils/date_util.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; @@ -24,14 +20,13 @@ import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/presentation/habib_wallet/habib_wallet_page.dart'; import 'package:hmg_patient_app_new/presentation/habib_wallet/recharge_wallet_page.dart'; import 'package:hmg_patient_app_new/services/dialog_service.dart'; -import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/app_language_change.dart'; +import 'package:hmg_patient_app_new/widgets/appbar/collapsing_list_view.dart'; import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; import 'package:hmg_patient_app_new/widgets/chip/app_custom_chip_widget.dart'; import 'package:hmg_patient_app_new/widgets/common_bottom_sheet.dart'; import 'package:hmg_patient_app_new/widgets/routes/custom_page_route.dart'; -import 'package:hmg_patient_app_new/widgets/transitions/fade_page.dart'; import 'package:provider/provider.dart'; import '../../core/dependencies.dart' show getIt; @@ -66,7 +61,7 @@ class _ProfileSettingsState extends State { logout: () {}, isClose: true, child: SingleChildScrollView( - padding: EdgeInsets.only(top: 24, bottom: 24), + padding: EdgeInsets.only(top: 24.h, bottom: 24.h), physics: NeverScrollableScrollPhysics(), child: Consumer2( builder: (context, profileVm, medicalVm, child) { @@ -77,14 +72,14 @@ class _ProfileSettingsState extends State { itemCount: medicalVm.patientFamilyFiles.length, layout: SwiperLayout.STACK, loop: true, - itemWidth: MediaQuery.of(context).size.width - 42, + itemWidth: SizeUtils.width - 42.w, indicatorLayout: PageIndicatorLayout.COLOR, axisDirection: AxisDirection.right, controller: _controller, - itemHeight: 200.h, - pagination: const SwiperPagination( + itemHeight: 220.h, + pagination: SwiperPagination( alignment: Alignment.bottomCenter, - margin: EdgeInsets.only(top: 210 + 8 + 24), + margin: EdgeInsets.only(top: (210.h + 8.h + 24.h)), builder: DotSwiperPaginationBuilder(color: Color(0xffD9D9D9), activeColor: AppColors.blackBgColor), ), itemBuilder: (BuildContext context, int index) { @@ -102,20 +97,20 @@ class _ProfileSettingsState extends State { onFamilySwitchPress: (FamilyFileResponseModelLists profile) { medicalVm.switchFamilyFiles(responseID: profile.responseId, patientID: profile.patientId, phoneNumber: profile.mobileNumber); }, - ).paddingOnly(right: 16); + ).paddingOnly(right: 16.w); }, ), GridView( - gridDelegate: const SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 9, mainAxisSpacing: 9), + gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 2, crossAxisSpacing: 9.w, mainAxisSpacing: 9.h), physics: const NeverScrollableScrollPhysics(), - padding: const EdgeInsets.all(24), + padding: EdgeInsets.only(left: 24.w, right: 24.w, bottom: 24.w, top: 10.w), shrinkWrap: true, children: [ Container( - padding: EdgeInsets.all(16), + padding: EdgeInsets.all(16.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 20.h, + borderRadius: 20.r, hasShadow: true, ), child: Column( @@ -123,10 +118,10 @@ class _ProfileSettingsState extends State { spacing: 4.h, children: [ Row( - spacing: 8.h, + spacing: 8.w, crossAxisAlignment: CrossAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.h, height: 40.h), + Utils.buildSvgWithAssets(icon: AppAssets.wallet, width: 40.w, height: 40.h), "Habib Wallet".needTranslation.toText14(weight: FontWeight.w600, maxlines: 2).expanded, Utils.buildSvgWithAssets(icon: AppAssets.arrow_forward), ], @@ -134,7 +129,7 @@ class _ProfileSettingsState extends State { Spacer(), Consumer(builder: (context, habibWalletVM, child) { return Utils.getPaymentAmountWithSymbol2(habibWalletVM.habibWalletAmount, isExpanded: false) - .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.h, width: 80.h, height: 24.h); + .toShimmer2(isShow: habibWalletVM.isWalletAmountLoading, radius: 12.r, width: 80.w, height: 24.h); }), CustomButton( height: 40.h, @@ -143,12 +138,12 @@ class _ProfileSettingsState extends State { iconColor: AppColors.infoColor, textColor: AppColors.infoColor, text: "Recharge".needTranslation, - borderWidth: 0.h, + borderWidth: 0.w, fontWeight: FontWeight.w500, borderColor: Colors.transparent, backgroundColor: Color(0xff45A2F8).withValues(alpha: 0.08), - padding: EdgeInsets.all(8.h), - fontSize: 14, + padding: EdgeInsets.all(8.w), + fontSize: 14.f, onPressed: () { Navigator.of(context).push(CustomPageRoute(page: RechargeWalletPage())); }, @@ -160,15 +155,19 @@ class _ProfileSettingsState extends State { ) ], ), - "Quick Actions".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24, right: 24), + "Quick Actions" + .needTranslation + .toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1) + .paddingOnly(left: 24.w, right: 24.w), Container( - margin: EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 24), - padding: EdgeInsets.only(top: 4, bottom: 4), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), child: Column( children: [ actionItem(AppAssets.language_change, "Language".needTranslation, () { - showCommonBottomSheetWithoutHeight(context, title: "Application Language".needTranslation, child: AppLanguageChange(), callBackFunc: () {}, isFullScreen: false); + showCommonBottomSheetWithoutHeight(context, + title: "Application Language".needTranslation, child: AppLanguageChange(), callBackFunc: () {}, isFullScreen: false); }, trailingLabel: Utils.appState.isArabic() ? "العربية".needTranslation : "English".needTranslation), 1.divider, actionItem(AppAssets.accessibility, "Accessibility".needTranslation, () {}), @@ -179,11 +178,14 @@ class _ProfileSettingsState extends State { ], ), ), - "Personal Information".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24, right: 24), + "Personal Information" + .needTranslation + .toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1) + .paddingOnly(left: 24.w, right: 24.w), Container( - margin: EdgeInsets.only(left: 24, right: 24, top: 16, bottom: 24), - padding: EdgeInsets.only(top: 4, bottom: 4), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h, bottom: 24.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), child: Column( children: [ actionItem(AppAssets.email_transparent, "Update Email Address".needTranslation, () {}), @@ -196,11 +198,14 @@ class _ProfileSettingsState extends State { ], ), ), - "Help & Support".needTranslation.toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1).paddingOnly(left: 24, right: 24), + "Help & Support" + .needTranslation + .toText18(weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1) + .paddingOnly(left: 24.w, right: 24.w), Container( - margin: EdgeInsets.only(left: 24, right: 24, top: 16), - padding: EdgeInsets.only(top: 4, bottom: 4), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.h, hasShadow: true), + margin: EdgeInsets.only(left: 24.w, right: 24.w, top: 16.h), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 24.r, hasShadow: true), child: Column( children: [ actionItem(AppAssets.call_fill, "Contact Us".needTranslation, () {}, trailingLabel: "9200666666"), @@ -215,7 +220,7 @@ class _ProfileSettingsState extends State { ], ), ), - CustomButton(icon: AppAssets.minus, text: "Deactivate account".needTranslation, onPressed: () {}).paddingAll(24), + CustomButton(icon: AppAssets.minus, text: "Deactivate account".needTranslation, onPressed: () {}).paddingAll(24.w), ], ); }, @@ -226,18 +231,19 @@ class _ProfileSettingsState extends State { Widget actionItem(String icon, String label, VoidCallback onPress, {String trailingLabel = "", bool? switchValue, bool isExternalLink = false}) { return SizedBox( - height: 56, + height: 56.h, child: Row( - spacing: 8.h, + spacing: 8.w, children: [ Utils.buildSvgWithAssets(icon: icon, iconColor: AppColors.greyTextColor), label.toText14(weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1).expanded, - if (trailingLabel.isNotEmpty) trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1), + if (trailingLabel.isNotEmpty) + trailingLabel.toText14(color: AppColors.greyTextColor, weight: FontWeight.w500, textOverflow: TextOverflow.ellipsis, maxlines: 1), switchValue != null ? Switch( value: switchValue, onChanged: (value) {}, - activeColor: AppColors.successColor, + activeThumbColor: AppColors.successColor, activeTrackColor: AppColors.successColor.withValues(alpha: .15), ) : Transform.scale( @@ -245,18 +251,22 @@ class _ProfileSettingsState extends State { child: Utils.buildSvgWithAssets(icon: isExternalLink ? AppAssets.externalLink : AppAssets.arrow_forward), ) ], - ).paddingOnly(left: 16, right: 16).onPress(onPress), + ).paddingOnly(left: 16.w, right: 16.w).onPress(onPress), ); } } class FamilyCardWidget extends StatelessWidget { - late AppState appState; final Function() onAddFamilyMemberPress; final Function(FamilyFileResponseModelLists member) onFamilySwitchPress; final FamilyFileResponseModelLists profile; - FamilyCardWidget({super.key, required this.onAddFamilyMemberPress, required this.profile, required this.onFamilySwitchPress(FamilyFileResponseModelLists member)}); + const FamilyCardWidget({ + super.key, + required this.onAddFamilyMemberPress, + required this.profile, + required this.onFamilySwitchPress(FamilyFileResponseModelLists member), + }); @override Widget build(BuildContext context) { @@ -265,7 +275,7 @@ class FamilyCardWidget extends StatelessWidget { final isParentUser = appState.getAuthenticatedUser()?.isParentUser ?? false; final canSwitch = isParentUser || (!isParentUser && profile.responseId == appState.getSuperUserID); return Container( - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.h, hasShadow: true), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(color: AppColors.whiteColor, borderRadius: 20.r, hasShadow: true), child: Column( children: [ Column( @@ -274,37 +284,38 @@ class FamilyCardWidget extends StatelessWidget { children: [ Row( crossAxisAlignment: CrossAxisAlignment.start, - spacing: 8.h, + // children: [ - Image.asset(profile.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.h, height: 56.h), + Image.asset(profile.gender == 1 ? AppAssets.male_img : AppAssets.femaleImg, width: 56.w, height: 56.h), Column( crossAxisAlignment: CrossAxisAlignment.start, - spacing: 0.h, mainAxisSize: MainAxisSize.min, children: [ "${profile.patientName}".toText18(isBold: true, weight: FontWeight.w600, textOverflow: TextOverflow.ellipsis, maxlines: 1), AppCustomChipWidget( icon: AppAssets.file_icon, labelText: "${LocaleKeys.fileNo.tr(context: context)}: ${profile.responseId}", - iconSize: 12, + iconSize: 12.w, ), ], ).expanded, - Icon(Icons.qr_code, size: 56) + Icon(Icons.qr_code, size: 56.h) ], ), SizedBox(height: 4.h), SizedBox( child: Wrap( alignment: WrapAlignment.start, - spacing: 4.h, + spacing: 4.w, runSpacing: 4.h, children: [ - AppCustomChipWidget(labelText: "${profile.age} Years Old".needTranslation), + AppCustomChipWidget( + labelText: "${profile.age} Years Old".needTranslation, + ), isActive && appState.getAuthenticatedUser()!.bloodGroup != null ? AppCustomChipWidget( icon: AppAssets.blood_icon, - labelPadding: EdgeInsetsDirectional.only(start: -6.h, end: 8.h), + labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 8.w), labelText: "Blood: ${appState.getAuthenticatedUser()!.bloodGroup ?? ""}", iconColor: AppColors.primaryRedColor) : SizedBox(), @@ -351,9 +362,9 @@ class FamilyCardWidget extends StatelessWidget { icon: icon, labelText: labelText, iconColor: iconColor, - iconSize: 12, + iconSize: 12.w, backgroundColor: backgroundColor, - labelPadding: EdgeInsetsDirectional.only(start: -6.h, end: 8.h), + labelPadding: EdgeInsetsDirectional.only(start: -6.w, end: 8.w), // padding: EdgeInsets.zero, ).toShimmer2(isShow: isLoading); }, @@ -362,7 +373,7 @@ class FamilyCardWidget extends StatelessWidget { ), ), ], - ).paddingOnly(top: 16.h, right: 16.h, left: 16.h, bottom: 12.h).expanded, + ).paddingOnly(top: 16.h, right: 16.w, left: 16.w, bottom: 12.h), 1.divider, _buildActionButton(appState), ], @@ -393,9 +404,9 @@ class FamilyCardWidget extends StatelessWidget { borderColor: canSwitch ? AppColors.secondaryLightRedColor : AppColors.primaryRedColor, textColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor, iconColor: canSwitch ? AppColors.primaryRedColor : AppColors.whiteColor, - height: 40.h, - fontSize: 14, - ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16); + height: 56.h, + fontSize: 14.f, + ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h); } Widget _buildNonParentUserButton(int? superUserId) { @@ -410,8 +421,8 @@ class FamilyCardWidget extends StatelessWidget { iconColor: canSwitchBack ? AppColors.whiteColor : AppColors.greyTextColor, onPressed: canSwitchBack ? () => onFamilySwitchPress(profile) : () {}, height: 40.h, - fontSize: 14, - ).paddingOnly(top: 12, right: 16, left: 16, bottom: 16); + fontSize: 14.f, + ).paddingOnly(top: 12.h, right: 16.w, left: 16.w, bottom: 16.h); } // //TODO: Add family file switch logic here diff --git a/lib/presentation/radiology/radiology_result_page.dart b/lib/presentation/radiology/radiology_result_page.dart index e15c8d6..df34164 100644 --- a/lib/presentation/radiology/radiology_result_page.dart +++ b/lib/presentation/radiology/radiology_result_page.dart @@ -68,7 +68,7 @@ class _RadiologyResultPageState extends State { crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox(height: 16.h), - widget.patientRadiologyResponseModel.description!.toText16(isBold: true), + // widget.patientRadiologyResponseModel.description!.toText16(isBold: true), SizedBox(height: 8.h), widget.patientRadiologyResponseModel.reportData!.trim().toText12(isBold: true, color: AppColors.textColorLight), SizedBox(height: 16.h), diff --git a/lib/services/dialog_service.dart b/lib/services/dialog_service.dart index 68de687..7b83584 100644 --- a/lib/services/dialog_service.dart +++ b/lib/services/dialog_service.dart @@ -22,9 +22,13 @@ abstract class DialogService { Future showCommonBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed}); Future showFamilyBottomSheetWithoutH( - {String? label, required String message, required Function(FamilyFileResponseModelLists response) onSwitchPress, required List profiles}); + {String? label, + required String message, + required Function(FamilyFileResponseModelLists response) onSwitchPress, + required List profiles}); - Future showFamilyBottomSheetWithoutHWithChild({String? label, required String message, Widget? child, required Function() onOkPressed, Function()? onCancelPressed}); + Future showFamilyBottomSheetWithoutHWithChild( + {String? label, required String message, Widget? child, required Function() onOkPressed, Function()? onCancelPressed}); Future showPhoneNumberPickerSheet({String? label, String? message, required Function() onSMSPress, required Function() onWhatsappPress}); @@ -49,6 +53,7 @@ class DialogServiceImp implements DialogService { await showModalBottomSheet( context: context, isScrollControlled: false, + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width), shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(16)), ), @@ -59,15 +64,14 @@ class DialogServiceImp implements DialogService { onOkPressed: () { if (onOkPressed != null) { onOkPressed(); - } else { - context.pop(); } - context.pop(); + context.pop(); }, onCancelPressed: () { if (onCancelPressed != null) { - context.pop(); + onCancelPressed(); } + context.pop(); }, ), ); @@ -81,6 +85,7 @@ class DialogServiceImp implements DialogService { await showModalBottomSheet( context: context, + constraints: BoxConstraints(maxWidth: MediaQuery.of(context).size.width), isScrollControlled: false, shape: const RoundedRectangleBorder( borderRadius: BorderRadius.vertical(top: Radius.circular(16)), @@ -102,13 +107,20 @@ class DialogServiceImp implements DialogService { Future showCommonBottomSheetWithoutH({String? label, required String message, required Function() onOkPressed, Function()? onCancelPressed}) async { final context = navigationService.navigatorKey.currentContext; if (context == null) return; - showCommonBottomSheetWithoutHeight(context, - title: label ?? "", child: exceptionBottomSheetWidget(context: context, message: message, onOkPressed: onOkPressed, onCancelPressed: onCancelPressed), callBackFunc: () {}); + showCommonBottomSheetWithoutHeight( + context, + title: label ?? "", + child: exceptionBottomSheetWidget(context: context, message: message, onOkPressed: onOkPressed, onCancelPressed: onCancelPressed), + callBackFunc: () {}, + ); } @override Future showFamilyBottomSheetWithoutH( - {String? label, required String message, required Function(FamilyFileResponseModelLists response) onSwitchPress, required List profiles}) async { + {String? label, + required String message, + required Function(FamilyFileResponseModelLists response) onSwitchPress, + required List profiles}) async { final context = navigationService.navigatorKey.currentContext; if (context == null) return; showCommonBottomSheetWithoutHeight(context, @@ -133,7 +145,8 @@ class DialogServiceImp implements DialogService { } @override - Future showFamilyBottomSheetWithoutHWithChild({String? label, required String message, Widget? child, required Function() onOkPressed, Function()? onCancelPressed}) async { + Future showFamilyBottomSheetWithoutHWithChild( + {String? label, required String message, Widget? child, required Function() onOkPressed, Function()? onCancelPressed}) async { final context = navigationService.navigatorKey.currentContext; if (context == null) return; showCommonBottomSheetWithoutHeight( @@ -149,7 +162,9 @@ class DialogServiceImp implements DialogService { final context = navigationService.navigatorKey.currentContext; if (context == null) return; showCommonBottomSheetWithoutHeight(context, - title: label ?? "", child: showPhoneNumberPickerWidget(context: context, message: message, onSMSPress: onSMSPress, onWhatsappPress: onWhatsappPress), callBackFunc: () {}); + title: label ?? "", + child: showPhoneNumberPickerWidget(context: context, message: message, onSMSPress: onSMSPress, onWhatsappPress: onWhatsappPress), + callBackFunc: () {}); } @override @@ -187,7 +202,7 @@ Widget exceptionBottomSheetWidget({required BuildContext context, required Strin iconColor: AppColors.primaryRedColor, ), ), - SizedBox(width: 5.h), + SizedBox(width: 10.h), Expanded( child: CustomButton( text: LocaleKeys.confirm.tr(), diff --git a/lib/widgets/appbar/app_bar_widget.dart b/lib/widgets/appbar/app_bar_widget.dart index b446f90..2c180ce 100644 --- a/lib/widgets/appbar/app_bar_widget.dart +++ b/lib/widgets/appbar/app_bar_widget.dart @@ -3,7 +3,6 @@ import 'package:flutter/material.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; -import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/widgets/language_switcher.dart'; import '../../generated/locale_keys.g.dart'; @@ -11,14 +10,14 @@ import '../../generated/locale_keys.g.dart'; class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { final VoidCallback onBackPressed; final ValueChanged onLanguageChanged; - bool hideLogoAndLang; + final bool hideLogoAndLang; - CustomAppBar({ - Key? key, + const CustomAppBar({ + super.key, required this.onBackPressed, required this.onLanguageChanged, this.hideLogoAndLang = false, - }) : super(key: key); + }); @override Size get preferredSize => const Size.fromHeight(kToolbarHeight); @@ -42,9 +41,17 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { child: context.locale.languageCode == "ar" ? RotatedBox( quarterTurns: 90, - child: Utils.buildSvgWithAssets(icon: AppAssets.arrow_back, width: 32.h, height: 32.h), + child: Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + width: 32.h, + height: 32.h, + ), ) - : Utils.buildSvgWithAssets(icon: AppAssets.arrow_back, width: 32.h, height: 32.h), + : Utils.buildSvgWithAssets( + icon: AppAssets.arrow_back, + width: 32.h, + height: 32.h, + ), ), ), ), @@ -53,6 +60,7 @@ class CustomAppBar extends StatelessWidget implements PreferredSizeWidget { if (!hideLogoAndLang) Utils.buildSvgWithAssets( icon: AppAssets.habiblogo, + height: 24.h, ), if (!hideLogoAndLang) diff --git a/lib/widgets/appbar/collapsing_list_view.dart b/lib/widgets/appbar/collapsing_list_view.dart index 2687944..1574a0a 100644 --- a/lib/widgets/appbar/collapsing_list_view.dart +++ b/lib/widgets/appbar/collapsing_list_view.dart @@ -1,6 +1,5 @@ import 'dart:ui'; -import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:hmg_patient_app_new/core/app_assets.dart'; @@ -9,9 +8,8 @@ import 'package:hmg_patient_app_new/core/app_state.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; -import 'package:hmg_patient_app_new/generated/locale_keys.g.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; -import 'package:hmg_patient_app_new/widgets/buttons/custom_button.dart'; + import '../../core/dependencies.dart'; class CollapsingListView extends StatelessWidget { @@ -21,12 +19,28 @@ class CollapsingListView extends StatelessWidget { VoidCallback? report; VoidCallback? logout; VoidCallback? history; + VoidCallback? instructions; + VoidCallback? requests; Widget? bottomChild; Widget? trailing; bool isClose; bool isLeading; - CollapsingListView({required this.title, this.child, this.search, this.isClose = false, this.bottomChild, this.report, this.logout, this.history, this.isLeading = true, this.trailing}); + CollapsingListView({ + super.key, + required this.title, + this.child, + this.search, + this.isClose = false, + this.bottomChild, + this.report, + this.logout, + this.history, + this.instructions, + this.requests, + this.isLeading = true, + this.trailing, + }); @override Widget build(BuildContext context) { @@ -40,7 +54,7 @@ class CollapsingListView extends StatelessWidget { SliverAppBar( automaticallyImplyLeading: false, pinned: true, - expandedHeight: 100, + expandedHeight: 100.h, stretch: true, systemOverlayStyle: SystemUiOverlayStyle(statusBarBrightness: Brightness.light), surfaceTintColor: Colors.transparent, @@ -58,7 +72,7 @@ class CollapsingListView extends StatelessWidget { : SizedBox.shrink(), flexibleSpace: LayoutBuilder( builder: (context, constraints) { - final double maxHeight = 100; + final double maxHeight = 100.h; final double minHeight = kToolbarHeight; double t = (constraints.maxHeight - minHeight) / (maxHeight - minHeight); t = t - 1; @@ -78,7 +92,8 @@ class CollapsingListView extends StatelessWidget { t, )!, child: Padding( - padding: EdgeInsets.only(left: appState.isArabic() ? 0 : leftPadding, right: appState.isArabic() ? leftPadding : 0, bottom: bottomPadding), + padding: EdgeInsets.only( + left: appState.isArabic() ? 0 : leftPadding, right: appState.isArabic() ? leftPadding : 0, bottom: bottomPadding), child: Row( spacing: 4.h, children: [ @@ -86,7 +101,7 @@ class CollapsingListView extends StatelessWidget { title, maxLines: 1, style: TextStyle( - fontSize: (27 - (5 * (2 - t))).fSize, + fontSize: (27 - (5 * (2 - t))).f, fontWeight: FontWeight.lerp( FontWeight.w300, FontWeight.w600, @@ -97,7 +112,12 @@ class CollapsingListView extends StatelessWidget { ).expanded, if (logout != null) actionButton(context, t, title: "Logout".needTranslation, icon: AppAssets.logout).onPress(logout!), if (report != null) actionButton(context, t, title: "Report".needTranslation, icon: AppAssets.report_icon).onPress(report!), - if (history != null) actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon).onPress(history!), + if (history != null) + actionButton(context, t, title: "History".needTranslation, icon: AppAssets.insurance_history_icon).onPress(history!), + if (instructions != null) + actionButton(context, t, title: "Instructions".needTranslation, icon: AppAssets.requests).onPress(instructions!), + if (requests != null) + actionButton(context, t, title: "Requests".needTranslation, icon: AppAssets.insurance_history_icon).onPress(requests!), if (search != null) Utils.buildSvgWithAssets(icon: AppAssets.search_icon).onPress(search!).paddingOnly(right: 24), if (trailing != null) trailing!, ], @@ -126,12 +146,12 @@ class CollapsingListView extends StatelessWidget { return AnimatedSize( duration: Duration(milliseconds: 150), child: Container( - height: 40, - padding: EdgeInsets.all(8), - margin: EdgeInsets.only(right: 24), + height: 40.h, + padding: EdgeInsets.all(8.w), + margin: EdgeInsets.only(right: 24.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.secondaryLightRedColor, - borderRadius: 12, + borderRadius: 12.r, ), child: Row( crossAxisAlignment: CrossAxisAlignment.center, @@ -146,7 +166,7 @@ class CollapsingListView extends StatelessWidget { style: context.dynamicTextStyle( color: AppColors.primaryRedColor, letterSpacing: -0.4, - fontSize: (14 - (2 * (1 - t))).fSize, + fontSize: (14 - (2 * (1 - t))).f, fontWeight: FontWeight.lerp( FontWeight.w300, FontWeight.w500, diff --git a/lib/widgets/bottomsheet/exception_bottom_sheet.dart b/lib/widgets/bottomsheet/exception_bottom_sheet.dart index c11dec1..fe23264 100644 --- a/lib/widgets/bottomsheet/exception_bottom_sheet.dart +++ b/lib/widgets/bottomsheet/exception_bottom_sheet.dart @@ -18,7 +18,15 @@ class ExceptionBottomSheet extends StatelessWidget { final Function() onOkPressed; final Function()? onCancelPressed; - const ExceptionBottomSheet({super.key, this.title, required this.message, this.showOKButton = true, this.showCancel = false, required this.onOkPressed, this.onCancelPressed}); + const ExceptionBottomSheet({ + super.key, + this.title, + required this.message, + this.showOKButton = true, + this.showCancel = false, + required this.onOkPressed, + this.onCancelPressed, + }); @override Widget build(BuildContext context) { @@ -50,7 +58,10 @@ class ExceptionBottomSheet extends StatelessWidget { onTap: () { Navigator.of(context).pop(); }, - child: Utils.buildSvgWithAssets(icon: AppAssets.cross_circle), + child: Utils.buildSvgWithAssets( + icon: AppAssets.cross_circle, + height: 24.h, + ), ) ], ), @@ -63,6 +74,7 @@ class ExceptionBottomSheet extends StatelessWidget { children: [ Expanded( child: CustomButton( + height: 56.h, text: LocaleKeys.cancel.tr(), onPressed: onCancelPressed != null ? onCancelPressed! @@ -79,6 +91,7 @@ class ExceptionBottomSheet extends StatelessWidget { SizedBox(width: 5.h), Expanded( child: CustomButton( + height: 56.h, text: showCancel ? LocaleKeys.confirm.tr() : LocaleKeys.ok.tr(), onPressed: onOkPressed, backgroundColor: AppColors.bgGreenColor, @@ -93,6 +106,7 @@ class ExceptionBottomSheet extends StatelessWidget { Padding( padding: EdgeInsets.only(bottom: 10.h), child: CustomButton( + height: 56.h, text: LocaleKeys.ok.tr(), onPressed: onOkPressed, backgroundColor: AppColors.primaryRedColor, diff --git a/lib/widgets/bottomsheet/generic_bottom_sheet.dart b/lib/widgets/bottomsheet/generic_bottom_sheet.dart index cf7697d..b6be36c 100644 --- a/lib/widgets/bottomsheet/generic_bottom_sheet.dart +++ b/lib/widgets/bottomsheet/generic_bottom_sheet.dart @@ -13,20 +13,20 @@ import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/input_widget.dart'; class GenericBottomSheet extends StatefulWidget { - String? countryCode; - String? initialPhoneNumber; + final String? countryCode; + final String? initialPhoneNumber; final List buttons; - TextEditingController? textController; + final TextEditingController? textController; final bool isForEmail; - Function(CountryEnum)? onCountryChange; + final Function(CountryEnum)? onCountryChange; final bool isEnableCountryDropdown; final bool isFromSavedLogin; - Function(String?)? onChange; + final Function(String?)? onChange; final bool autoFocus; // FocusNode myFocusNode; - GenericBottomSheet({ + const GenericBottomSheet({ super.key, this.countryCode = "", this.initialPhoneNumber = "", @@ -42,10 +42,10 @@ class GenericBottomSheet extends StatefulWidget { }); @override - _GenericBottomSheetState createState() => _GenericBottomSheetState(); + GenericBottomSheetState createState() => GenericBottomSheetState(); } -class _GenericBottomSheetState extends State { +class GenericBottomSheetState extends State { late FocusNode _textFieldFocusNode; @override @@ -85,8 +85,11 @@ class _GenericBottomSheetState extends State { textDirection: Directionality.of(context), child: Container( padding: EdgeInsets.all(24.h), - decoration: RoundedRectangleBorder() - .toSmoothCornerDecoration(color: AppColors.bgScaffoldColor, borderRadius: 16, customBorder: BorderRadius.only(topLeft: Radius.circular(16), topRight: Radius.circular(16))), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration( + color: AppColors.bgScaffoldColor, + borderRadius: 16.r, + customBorder: BorderRadius.only(topLeft: Radius.circular(16.r), topRight: Radius.circular(16.r)), + ), child: Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.start, @@ -112,7 +115,10 @@ class _GenericBottomSheetState extends State { }, child: Padding( padding: EdgeInsets.only(top: 10.h), - child: Utils.buildSvgWithAssets(icon: AppAssets.cross_circle), + child: Utils.buildSvgWithAssets( + icon: AppAssets.cross_circle, + height: 24.h, + ), ), ), ], @@ -152,7 +158,7 @@ class _GenericBottomSheetState extends State { prefix: widget.isForEmail ? null : widget.countryCode, isBorderAllowed: false, isAllowLeadingIcon: true, - fontSize: 13.h, + fontSize: 13, isCountryDropDown: widget.isEnableCountryDropdown, leadingIcon: widget.isForEmail ? AppAssets.email : AppAssets.smart_phone, ) diff --git a/lib/widgets/buttons/custom_button.dart b/lib/widgets/buttons/custom_button.dart index 73885b0..28d6554 100644 --- a/lib/widgets/buttons/custom_button.dart +++ b/lib/widgets/buttons/custom_button.dart @@ -6,60 +6,63 @@ import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; class CustomButton extends StatelessWidget { final String text; - String? icon; + final String? icon; final VoidCallback onPressed; final Color backgroundColor; final Color borderColor; final Color textColor; - final double borderRadius; + final double? borderRadius; final double borderWidth; final EdgeInsetsGeometry padding; - final double fontSize; + final double? fontSize; final String? fontFamily; final FontWeight fontWeight; final bool isDisabled; final Color? iconColor; - final double height; + final double? height; final double? width; - final double iconSize; + final double? iconSize; final TextOverflow? textOverflow; final BorderSide? borderSide; - CustomButton( - {Key? key, - required this.text, - required this.onPressed, - this.backgroundColor = const Color(0xFFED1C2B), - this.borderColor = const Color(0xFFED1C2B), - this.textColor = Colors.white, - this.borderRadius = 12, - this.borderWidth = 2, - this.padding = const EdgeInsets.fromLTRB(8, 10, 8, 10), - this.fontSize = 16, - this.fontFamily, - this.fontWeight = FontWeight.w500, - this.isDisabled = false, - this.icon, - this.iconColor = Colors.white, - this.height = 56, - this.width, - this.iconSize = 24, - this.textOverflow, - this.borderSide}) - : super(key: key); + const CustomButton({ + super.key, + required this.text, + required this.onPressed, + this.backgroundColor = const Color(0xFFED1C2B), + this.borderColor = const Color(0xFFED1C2B), + this.textColor = Colors.white, + this.borderRadius, + this.borderWidth = 2, + this.padding = const EdgeInsets.fromLTRB(8, 10, 8, 10), + this.fontSize, + this.fontFamily, + this.fontWeight = FontWeight.w500, + this.isDisabled = false, + this.icon, + this.iconColor = Colors.white, + this.height, + this.width, + this.iconSize, + this.textOverflow, + this.borderSide, + }); @override Widget build(BuildContext context) { + final radius = borderRadius ?? (12.r); + final iconS = iconSize ?? (24.h); + final fontS = fontSize ?? (16.f); return GestureDetector( onTap: isDisabled ? null : onPressed, child: Container( - height: height, + height: height ?? (50.h), width: width, padding: padding, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: isDisabled ? backgroundColor.withOpacity(.5) : backgroundColor, - borderRadius: borderRadius, - customBorder: BorderRadius.circular(borderRadius), + borderRadius: radius, + customBorder: BorderRadius.circular(radius), side: borderSide ?? BorderSide(width: borderWidth.h, color: isDisabled ? borderColor.withValues(alpha: 0.5) : borderColor)), child: Row( crossAxisAlignment: CrossAxisAlignment.center, @@ -67,19 +70,22 @@ class CustomButton extends StatelessWidget { children: [ if (icon != null) Padding( - padding: EdgeInsets.only(right: 8.h, left: 8.h), - child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconSize, height: iconSize), + padding: text.isNotEmpty ? EdgeInsets.only(right: 8.h, left: 8.h) : EdgeInsets.zero, + child: Utils.buildSvgWithAssets(icon: icon!, iconColor: iconColor, isDisabled: isDisabled, width: iconS, height: iconS), ), - Padding( - padding: EdgeInsets.only(top: 0), - child: Text( - text, - overflow: textOverflow, - style: context.dynamicTextStyle( - fontSize: fontSize.fSize, - color: isDisabled ? textColor.withOpacity(0.5) : textColor, - letterSpacing: 0, - fontWeight: fontWeight, + Visibility( + visible: text.isNotEmpty, + child: Padding( + padding: EdgeInsets.only(top: 0), + child: Text( + text, + overflow: textOverflow, + style: context.dynamicTextStyle( + fontSize: fontS, + color: isDisabled ? textColor.withOpacity(0.5) : textColor, + letterSpacing: 0, + fontWeight: fontWeight, + ), ), ), ), diff --git a/lib/widgets/buttons/default_button.dart b/lib/widgets/buttons/default_button.dart index f0f6a43..eb02c38 100644 --- a/lib/widgets/buttons/default_button.dart +++ b/lib/widgets/buttons/default_button.dart @@ -81,7 +81,7 @@ class DefaultButton extends StatelessWidget { text, textAlign: TextAlign.center, style: TextStyle( - fontSize: fontSize ?? 18.fSize, + fontSize: fontSize ?? 18.f, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48, @@ -94,7 +94,7 @@ class DefaultButton extends StatelessWidget { text, textAlign: TextAlign.center, style: TextStyle( - fontSize: fontSize ?? 18.fSize, + fontSize: fontSize ?? 18.f, fontWeight: FontWeight.w600, color: textColor, letterSpacing: -0.48, diff --git a/lib/widgets/chip/app_custom_chip_widget.dart b/lib/widgets/chip/app_custom_chip_widget.dart index 2cfd5ce..d720151 100644 --- a/lib/widgets/chip/app_custom_chip_widget.dart +++ b/lib/widgets/chip/app_custom_chip_widget.dart @@ -1,26 +1,24 @@ import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; -import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:smooth_corner/smooth_corner.dart'; class AppCustomChipWidget extends StatelessWidget { - AppCustomChipWidget({ + const AppCustomChipWidget({ super.key, this.labelText, this.textColor = AppColors.textColor, this.backgroundColor = AppColors.greyColor, - this.iconSize = 12, + this.iconSize, this.icon = "", this.iconColor = AppColors.textColor, this.richText, this.iconHasColor = true, this.shape, this.deleteIcon, - this.deleteIconSize = const Size(12, 12), + this.deleteIconSize, this.deleteIconColor = AppColors.textColor, this.deleteIconHasColor = false, this.padding = EdgeInsets.zero, @@ -32,7 +30,7 @@ class AppCustomChipWidget extends StatelessWidget { final Widget? richText; final Color? textColor; final Color? backgroundColor; - final num iconSize; + final double? iconSize; final String icon; final String? deleteIcon; final Size? deleteIconSize; @@ -47,56 +45,66 @@ class AppCustomChipWidget extends StatelessWidget { @override Widget build(BuildContext context) { + final iconS = iconSize ?? 12.w; return GestureDetector( onTap: onChipTap, - child: ChipTheme( - data: ChipThemeData( - padding: EdgeInsets.all(0.0), - shape: SmoothRectangleBorder( - side: BorderSide( - width: 10.0, - color: Colors.transparent, // Crucially, set color to transparent - style: BorderStyle.none, + child: SizedBox( + child: ChipTheme( + data: ChipThemeData( + padding: EdgeInsets.zero, + shape: SmoothRectangleBorder( + side: BorderSide( + width: 10.w, + color: Colors.transparent, // Crucially, set color to transparent + style: BorderStyle.none, + ), + borderRadius: BorderRadius.circular(8.r), // Apply a border radius of 16.0 ), - borderRadius: BorderRadius.circular(8.0), // Apply a border radius of 16.0 ), + child: icon.isNotEmpty + ? Chip( + avatar: icon.isNotEmpty + ? Utils.buildSvgWithAssets(icon: icon, width: iconS, height: iconS, iconColor: iconHasColor ? iconColor : null, fit: BoxFit.contain) + : SizedBox.shrink(), + label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), + padding: padding, + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + labelPadding: labelPadding ?? EdgeInsetsDirectional.only(start: 2.w, end: deleteIcon?.isNotEmpty == true ? 2.w : 8.w), + backgroundColor: backgroundColor, + shape: shape ?? + SmoothRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + smoothness: 10, + side: BorderSide(color: AppColors.transparent, width: 1.5), + ), + deleteIcon: deleteIcon?.isNotEmpty == true + ? Utils.buildSvgWithAssets( + icon: deleteIcon!, + width: iconS, + height: iconS, + iconColor: deleteIconHasColor ? deleteIconColor : null, + ) + : null, + onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, + ) + : Chip( + materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, + label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), + padding: EdgeInsets.zero, + backgroundColor: backgroundColor, + shape: shape ?? + SmoothRectangleBorder( + borderRadius: BorderRadius.circular(8.r), + smoothness: 10, + side: BorderSide(color: AppColors.transparent, width: 1.5), + ), + labelPadding: labelPadding ?? EdgeInsetsDirectional.only(start: 2.w, end: deleteIcon?.isNotEmpty == true ? 2.w : 8.w), + deleteIcon: deleteIcon?.isNotEmpty == true + ? Utils.buildSvgWithAssets(icon: deleteIcon!, width: iconS, height: iconS, iconColor: deleteIconHasColor ? deleteIconColor : null) + : null, + onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, + ), ), - child: icon.isNotEmpty - ? Chip( - avatar: icon.isNotEmpty ? Utils.buildSvgWithAssets(icon: icon, width: iconSize.h, height: iconSize.h, iconColor: iconHasColor ? iconColor : null, fit: BoxFit.contain) : SizedBox.shrink(), - label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), - padding: padding, - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - labelPadding: labelPadding ?? EdgeInsetsDirectional.only(start: 0.h, end: deleteIcon?.isNotEmpty == true ? 2.h : 8.h), - backgroundColor: backgroundColor, - shape: shape ?? - SmoothRectangleBorder( - borderRadius: BorderRadius.circular(8 ?? 0), - smoothness: 10, - side: BorderSide(color: AppColors.transparent, width: 1.5), - ), - deleteIcon: deleteIcon?.isNotEmpty == true - ? Utils.buildSvgWithAssets(icon: deleteIcon!, width: deleteIconSize!.width!.h, height: deleteIconSize!.height.h, iconColor: deleteIconHasColor ? deleteIconColor : null) - : null, - onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, - ) - : Chip( - materialTapTargetSize: MaterialTapTargetSize.shrinkWrap, - label: richText ?? labelText!.toText10(weight: FontWeight.w500, letterSpacing: 0, color: textColor), - padding: EdgeInsets.all(0.0), - backgroundColor: backgroundColor, - shape: shape ?? - SmoothRectangleBorder( - borderRadius: BorderRadius.circular(8 ?? 0), - smoothness: 10, - side: BorderSide(color: AppColors.transparent, width: 1.5), - ), - labelPadding: EdgeInsetsDirectional.only(start: 8.h, end: deleteIcon?.isNotEmpty == true ? -2.h : 8.h), - deleteIcon: deleteIcon?.isNotEmpty == true - ? Utils.buildSvgWithAssets(icon: deleteIcon!, width: deleteIconSize!.width.h, height: deleteIconSize!.height.h, iconColor: deleteIconHasColor ? deleteIconColor : null) - : null, - onDeleted: deleteIcon?.isNotEmpty == true ? () {} : null, - ), ), ); } diff --git a/lib/widgets/common_bottom_sheet.dart b/lib/widgets/common_bottom_sheet.dart index c6db474..4d0dcf1 100644 --- a/lib/widgets/common_bottom_sheet.dart +++ b/lib/widgets/common_bottom_sheet.dart @@ -114,23 +114,29 @@ void showCommonBottomSheetWithoutHeight( bool isDismissible = true, Widget? titleWidget, bool useSafeArea = false, - }) { + bool hasBottomPadding = true, + Color backgroundColor = AppColors.bottomSheetBgColor, +}) { showModalBottomSheet( sheetAnimationStyle: AnimationStyle( duration: Duration(milliseconds: 500), reverseDuration: Duration(milliseconds: 300), ), + constraints: BoxConstraints( + maxWidth: MediaQuery.of(context).size.width, // Full width + ), context: context, isScrollControlled: true, showDragHandle: false, isDismissible: isDismissible, - backgroundColor: AppColors.bottomSheetBgColor, + backgroundColor: backgroundColor, useSafeArea: useSafeArea, builder: (BuildContext context) { return SafeArea( top: false, left: false, right: false, + bottom: hasBottomPadding, child: Padding( padding: EdgeInsets.only( bottom: MediaQuery.of(context).viewInsets.bottom, diff --git a/lib/widgets/custom_tab_bar.dart b/lib/widgets/custom_tab_bar.dart index 870e85b..a148cc7 100644 --- a/lib/widgets/custom_tab_bar.dart +++ b/lib/widgets/custom_tab_bar.dart @@ -1,5 +1,4 @@ import 'package:flutter/material.dart'; -import 'package:hmg_patient_app_new/core/app_assets.dart'; import 'package:hmg_patient_app_new/core/app_export.dart'; import 'package:hmg_patient_app_new/core/utils/utils.dart'; import 'package:hmg_patient_app_new/extensions/int_extensions.dart'; @@ -23,23 +22,21 @@ class CustomTabBar extends StatefulWidget { final Color inActiveBackgroundColor; final Function(int)? onTabChange; - CustomTabBar( - {Key? key, - required this.tabs, - this.activeTextColor = const Color(0xff2E3039), - this.inActiveTextColor = const Color(0xff898A8D), - this.activeBackgroundColor = const Color(0x142E3039), - this.inActiveBackgroundColor = Colors.white, - this.onTabChange}) - : super(key: key); + const CustomTabBar({ + super.key, + required this.tabs, + this.activeTextColor = const Color(0xff2E3039), + this.inActiveTextColor = const Color(0xff898A8D), + this.activeBackgroundColor = const Color(0x142E3039), + this.inActiveBackgroundColor = Colors.white, + this.onTabChange, + }); @override - _CustomTabBarState createState() { - return _CustomTabBarState(); - } + CustomTabBarState createState() => CustomTabBarState(); } -class _CustomTabBarState extends State { +class CustomTabBarState extends State { int selectedIndex = 0; @override @@ -65,44 +62,53 @@ class _CustomTabBarState extends State { scrollDirection: Axis.horizontal, padding: EdgeInsets.zero, physics: const BouncingScrollPhysics(), - itemBuilder: (cxt, index) => myTab(widget.tabs[index], index), + itemBuilder: (cxt, index) => myTab(widget.tabs[index], index).expanded, separatorBuilder: (cxt, index) => 4.width, itemCount: widget.tabs.length, ); } else { parentWidget = Row( - spacing: 4, + mainAxisAlignment: MainAxisAlignment.center, + spacing: 4.w, children: [for (int i = 0; i < widget.tabs.length; i++) myTab(widget.tabs[i], i).expanded], ); } return Container( height: 62.h, - padding: EdgeInsets.all(4), + padding: EdgeInsets.all(4.w), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: AppColors.whiteColor, - borderRadius: 11, + borderRadius: 12.r, ), - child: parentWidget); + child: Center(child: parentWidget)); } Widget myTab(CustomTabBarModel tabBar, int currentIndex) { bool isSelected = selectedIndex == currentIndex; return Container( height: 54.h, - padding: EdgeInsets.only(top: 4, bottom: 4, left: 16, right: 16), + padding: EdgeInsets.only(top: 4.h, bottom: 4.h, left: 16.w, right: 16.w), alignment: Alignment.center, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: isSelected ? widget.activeBackgroundColor : widget.inActiveBackgroundColor, - borderRadius: 12, + borderRadius: 12.r, ), child: Row( mainAxisSize: MainAxisSize.min, - spacing: 4, + spacing: 4.w, children: [ - if (tabBar.image != null) Utils.buildSvgWithAssets(icon: tabBar.image!, height: 18, width: 18, iconColor: isSelected ? widget.activeTextColor : widget.inActiveTextColor), - tabBar.title - .toText13(weight: isSelected ? FontWeight.w600 : FontWeight.w500, color: isSelected ? widget.activeTextColor : widget.inActiveTextColor, letterSpacing: isSelected ? -0.3 : -0.1), + if (tabBar.image != null) + Utils.buildSvgWithAssets( + icon: tabBar.image!, + height: 18.h, + width: 18.w, + iconColor: isSelected ? widget.activeTextColor : widget.inActiveTextColor, + ), + tabBar.title.toText13( + weight: isSelected ? FontWeight.w600 : FontWeight.w500, + color: isSelected ? widget.activeTextColor : widget.inActiveTextColor, + letterSpacing: isSelected ? -0.3 : -0.1), ], )).onPress(() { setState(() { diff --git a/lib/widgets/date_range_selector/date_range_calender.dart b/lib/widgets/date_range_selector/date_range_calender.dart index a1e1055..8620ab5 100644 --- a/lib/widgets/date_range_selector/date_range_calender.dart +++ b/lib/widgets/date_range_selector/date_range_calender.dart @@ -99,7 +99,7 @@ class _DateRangeSelectorState extends State { backgroundColor: Colors.white, textAlign: TextAlign.start, textStyle: TextStyle( - fontSize: 18.fSize, + fontSize: 18.f, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.primaryRedColor, @@ -110,7 +110,7 @@ class _DateRangeSelectorState extends State { viewHeaderStyle: DateRangePickerViewHeaderStyle( backgroundColor: Colors.white, textStyle: TextStyle( - fontSize: 14.fSize, + fontSize: 14.f, fontWeight: FontWeight.w600, letterSpacing: -0.46, color: AppColors.textColor, @@ -129,7 +129,7 @@ class _DateRangeSelectorState extends State { todayHighlightColor: Colors.transparent, monthCellStyle: DateRangePickerMonthCellStyle( textStyle: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, color: AppColors.textColor, ), todayTextStyle: TextStyle( diff --git a/lib/widgets/dropdown/country_dropdown_widget.dart b/lib/widgets/dropdown/country_dropdown_widget.dart index f002f24..b6191ed 100644 --- a/lib/widgets/dropdown/country_dropdown_widget.dart +++ b/lib/widgets/dropdown/country_dropdown_widget.dart @@ -16,27 +16,27 @@ class CustomCountryDropdown extends StatefulWidget { final Function(String)? onPhoneNumberChanged; final bool isFromBottomSheet; final bool isEnableTextField; - Widget? textField; + final Widget? textField; - CustomCountryDropdown({ - Key? key, + const CustomCountryDropdown({ + super.key, required this.countryList, this.onCountryChange, this.onPhoneNumberChanged, this.isFromBottomSheet = false, this.isEnableTextField = false, this.textField, - }) : super(key: key); + }); @override - _CustomCountryDropdownState createState() => _CustomCountryDropdownState(); + CustomCountryDropdownState createState() => CustomCountryDropdownState(); } -class _CustomCountryDropdownState extends State { +class CustomCountryDropdownState extends State { CountryEnum? selectedCountry; late OverlayEntry _overlayEntry; bool _isDropdownOpen = false; - FocusNode textFocusNode = new FocusNode(); + FocusNode textFocusNode = FocusNode(); @override void initState() { @@ -61,87 +61,78 @@ class _CustomCountryDropdownState extends State { @override Widget build(BuildContext context) { AppState appState = getIt.get(); - return Container( - height: 40.h, - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 10.h), - child: Row( - children: [ + return Row( + children: [ + GestureDetector( + onTap: () { + if (_isDropdownOpen) { + _closeDropdown(); + } else { + _openDropdown(); + } + }, + child: Row( + children: [ + Utils.buildSvgWithAssets(icon: selectedCountry != null ? selectedCountry!.iconPath : AppAssets.ksa, width: 40.h, height: 40.h), + SizedBox(width: 8.h), + Utils.buildSvgWithAssets(icon: _isDropdownOpen ? AppAssets.dropdow_icon : AppAssets.dropdow_icon), + ], + ), + ), + SizedBox(width: 4.h), + if (widget.isFromBottomSheet) GestureDetector( onTap: () { - if (_isDropdownOpen) { - _closeDropdown(); - } else { - _openDropdown(); + if (widget.isEnableTextField && textFocusNode.canRequestFocus) { + FocusScope.of(context).requestFocus(textFocusNode); } }, - child: Row( + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + mainAxisAlignment: MainAxisAlignment.center, children: [ - Utils.buildSvgWithAssets(icon: selectedCountry != null ? selectedCountry!.iconPath : AppAssets.ksa, width: 40.h, height: 40.h), - SizedBox(width: 8.h), - Utils.buildSvgWithAssets(icon: _isDropdownOpen ? AppAssets.dropdow_icon : AppAssets.dropdow_icon), - ], - ), - ), - SizedBox(width: 4.h), - if (widget.isFromBottomSheet) - GestureDetector( - onTap: () { - if (widget.isEnableTextField && textFocusNode.canRequestFocus) { - FocusScope.of(context).requestFocus(textFocusNode); - } - }, - child: Column( - crossAxisAlignment: CrossAxisAlignment.start, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Row( - children: [ - Text( - LocaleKeys.phoneNumber.tr(), - style: TextStyle(fontSize: 12.fSize, height: 1.2.h, fontWeight: FontWeight.w500, letterSpacing: -1), - ), - ], - ), - Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.start, - children: [ - Text( - selectedCountry!.countryCode, - style: TextStyle(fontSize: 12.fSize, fontWeight: FontWeight.w600, letterSpacing: -0.4, height: 1.5), - ), - SizedBox(width: 4.h), - if (widget.isEnableTextField) - SizedBox( - height: 20.h, - width: 200.h, - child: Align( - alignment: Alignment.centerLeft, - child: TextField( - focusNode: textFocusNode, - style: TextStyle(fontSize: 12.fSize, fontWeight: FontWeight.w600, letterSpacing: -0.4, height: 1.5), - decoration: InputDecoration(hintText: "", isDense: true, border: InputBorder.none, contentPadding: EdgeInsets.zero), - keyboardType: TextInputType.phone, - onChanged: widget.onPhoneNumberChanged, - ), + Text( + LocaleKeys.phoneNumber.tr(), + style: TextStyle(fontSize: 12.f, height: 1.5, fontWeight: FontWeight.w500, letterSpacing: -1), + ), + Row( + mainAxisAlignment: MainAxisAlignment.start, + children: [ + Text( + selectedCountry!.countryCode, + style: TextStyle(fontSize: 12.f, fontWeight: FontWeight.w600, letterSpacing: -0.4, height: 1.5), + ), + SizedBox(width: 4.h), + if (widget.isEnableTextField) + SizedBox( + height: 20.h, + width: 200.h, + child: Align( + alignment: Alignment.centerLeft, + child: TextField( + focusNode: textFocusNode, + style: TextStyle(fontSize: 12.f, fontWeight: FontWeight.w600, letterSpacing: -0.4, height: 1.5), + decoration: InputDecoration(hintText: "", isDense: true, border: InputBorder.none, contentPadding: EdgeInsets.zero), + keyboardType: TextInputType.phone, + onChanged: widget.onPhoneNumberChanged, ), ), - ], - ) - ], - ), - ), - if (!widget.isFromBottomSheet) - Text( - selectedCountry != null - ? appState.getLanguageCode() == "ar" - ? selectedCountry!.nameArabic - : selectedCountry!.displayName - : LocaleKeys.selectCountry.tr(), - style: TextStyle(fontSize: 14.fSize, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2), + ), + ], + ) + ], ), - ], - ), + ), + if (!widget.isFromBottomSheet) + Text( + selectedCountry != null + ? appState.getLanguageCode() == "ar" + ? selectedCountry!.nameArabic + : selectedCountry!.displayName + : LocaleKeys.selectCountry.tr(), + style: TextStyle(fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2), + ), + ], ); } @@ -202,7 +193,7 @@ class _CustomCountryDropdownState extends State { if (!widget.isFromBottomSheet) SizedBox(width: 12.h), if (!widget.isFromBottomSheet) Text(appState.getLanguageCode() == "ar" ? country.nameArabic : country.displayName, - style: TextStyle(fontSize: 14.fSize, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2)), + style: TextStyle(fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2)), ], ), )), diff --git a/lib/widgets/dropdown/dropdown_widget.dart b/lib/widgets/dropdown/dropdown_widget.dart index d4c1c5f..b4062e4 100644 --- a/lib/widgets/dropdown/dropdown_widget.dart +++ b/lib/widgets/dropdown/dropdown_widget.dart @@ -81,7 +81,7 @@ class DropdownWidget extends StatelessWidget { return Text( labelText, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: FontWeight.w500, color: labelColor ?? Color(0xff898A8D), letterSpacing: -0.2, @@ -111,7 +111,7 @@ class DropdownWidget extends StatelessWidget { child: Text( e, style: TextStyle( - fontSize: 14.fSize, + fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, letterSpacing: -0.2, @@ -142,7 +142,7 @@ class DropdownWidget extends StatelessWidget { textAlign: TextAlign.left, textDirection: TextDirection.ltr, style: TextStyle( - fontSize: 14.fSize, + fontSize: 14.f, height: 21 / 14, fontWeight: FontWeight.w500, color: (selectedValue != null && selectedValue!.isNotEmpty) ? const Color(0xff2E3039) : const Color(0xffB0B0B0), diff --git a/lib/widgets/graph/custom_graph.dart b/lib/widgets/graph/custom_graph.dart index 02ad987..7fc1f2a 100644 --- a/lib/widgets/graph/custom_graph.dart +++ b/lib/widgets/graph/custom_graph.dart @@ -142,11 +142,10 @@ class CustomGraph extends StatelessWidget { final dataPoint = dataPoints[spot.x.toInt()]; return LineTooltipItem( - // '${dataPoint.label} ${spot.y.toStringAsFixed(2)}', - '${dataPoint.value} - ${dataPoint.actualValue} - ${dataPoint.displayTime}', + '${dataPoint.actualValue} ${dataPoint.unitOfMeasurement??""} - ${dataPoint.displayTime}', TextStyle( color: Colors.black, - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: FontWeight.w500), ); } diff --git a/lib/widgets/input_widget.dart b/lib/widgets/input_widget.dart index dae704b..2dcd32f 100644 --- a/lib/widgets/input_widget.dart +++ b/lib/widgets/input_widget.dart @@ -9,7 +9,6 @@ import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; import 'package:hmg_patient_app_new/extensions/widget_extensions.dart'; import 'package:hmg_patient_app_new/theme/colors.dart'; import 'package:hmg_patient_app_new/widgets/dropdown/country_dropdown_widget.dart'; -import 'package:keyboard_actions/keyboard_actions.dart'; import '../core/dependencies.dart'; @@ -36,9 +35,9 @@ class TextInputWidget extends StatelessWidget { final bool isCountryDropDown; final bool hasError; final String? errorMessage; - Function(CountryEnum)? onCountryChange; + final Function(CountryEnum)? onCountryChange; final SelectionTypeEnum? selectionType; - final num? fontSize; + final double? fontSize; final bool? isWalletAmountInput; final Widget? suffix; final Color? labelColor; @@ -70,7 +69,7 @@ class TextInputWidget extends StatelessWidget { this.errorMessage, this.onCountryChange, this.selectionType, - this.fontSize = 14, + this.fontSize, this.isWalletAmountInput = false, this.suffix, this.labelColor, @@ -118,7 +117,7 @@ class TextInputWidget extends StatelessWidget { alignment: Alignment.center, decoration: RoundedRectangleBorder().toSmoothCornerDecoration( color: Colors.white, - borderRadius: isAllowRadius ? 12 : null, + borderRadius: isAllowRadius ? (12.r) : null, side: isBorderAllowed ? BorderSide(color: hasError ? errorColor : const Color(0xffefefef), width: 1) : null, ), child: Row( @@ -151,7 +150,7 @@ class TextInputWidget extends StatelessWidget { ], ), ), - (suffix!= null )?suffix!:SizedBox.shrink() + (suffix != null) ? suffix! : SizedBox.shrink() ], ), ), @@ -167,7 +166,7 @@ class TextInputWidget extends StatelessWidget { errorMessage!, style: TextStyle( color: errorColor, - fontSize: 12.fSize, + fontSize: 12.f, ), ), ), @@ -182,7 +181,7 @@ class TextInputWidget extends StatelessWidget { margin: EdgeInsets.only(right: 10.h), padding: EdgeInsets.all(8.h), decoration: RoundedRectangleBorder().toSmoothCornerDecoration( - borderRadius: 10.h, + borderRadius: 12.r, color: AppColors.greyColor, ), child: Utils.buildSvgWithAssets(icon: leadingIcon!)); @@ -195,7 +194,7 @@ class TextInputWidget extends StatelessWidget { width: 40.h, margin: EdgeInsets.zero, padding: EdgeInsets.all(8.h), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 10.h, color: AppColors.whiteColor), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.whiteColor), child: GestureDetector( onTap: () async { bool isGregorian = true; @@ -206,7 +205,9 @@ class TextInputWidget extends StatelessWidget { initialDate: DateTime.now(), fontFamily: appState.getLanguageCode() == "ar" ? "GESSTwo" : "Poppins", okWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.confirm, width: 24.h, height: 24.h)), - cancelWidget: Padding(padding: EdgeInsets.only(right: 8.h), child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)), + cancelWidget: Padding( + padding: EdgeInsets.only(right: 8.h), + child: Utils.buildSvgWithAssets(icon: AppAssets.cancel, iconColor: Colors.white, width: 24.h, height: 24.h)), onCalendarTypeChanged: (bool value) { isGregorian = value; }); @@ -226,7 +227,7 @@ class TextInputWidget extends StatelessWidget { return Text( labelText, style: TextStyle( - fontSize: 12.fSize, + fontSize: 12.f, fontWeight: FontWeight.w500, color: labelColor ?? AppColors.inputLabelTextColor, letterSpacing: -0, @@ -235,6 +236,7 @@ class TextInputWidget extends StatelessWidget { } Widget _buildTextField(BuildContext context) { + double fontS = fontSize ?? 14.f; return TextField( enabled: isEnable, scrollPadding: EdgeInsets.zero, @@ -253,11 +255,11 @@ class TextInputWidget extends StatelessWidget { FocusManager.instance.primaryFocus?.unfocus(); }, onSubmitted: onSubmitted, - style: TextStyle(fontSize: fontSize!.fSize, height: isWalletAmountInput! ? 1 / 4 : 0, fontWeight: FontWeight.w500, color: AppColors.textColor, letterSpacing: -1), + style: TextStyle(fontSize: fontS, height: isWalletAmountInput! ? 1 / 4 : 0, fontWeight: FontWeight.w500, color: AppColors.textColor, letterSpacing: -1), decoration: InputDecoration( isDense: true, hintText: hintText, - hintStyle: TextStyle(fontSize: 14.fSize, height: 21 / 16, fontWeight: FontWeight.w500, color: Color(0xff898A8D), letterSpacing: -0.75), + hintStyle: TextStyle(fontSize: 14.f, height: 21 / 16, fontWeight: FontWeight.w500, color: Color(0xff898A8D), letterSpacing: -0.75), prefixIconConstraints: BoxConstraints(minWidth: 30.h), prefixIcon: prefix == null ? null : "+${prefix!}".toText14(letterSpacing: -1, color: AppColors.textColor, weight: FontWeight.w500), contentPadding: EdgeInsets.zero, @@ -269,13 +271,12 @@ class TextInputWidget extends StatelessWidget { } _buildTrailingIconForSearch(BuildContext context) { - final AppState appState = getIt.get(); return Container( height: 40.h, width: 40.h, margin: EdgeInsets.zero, padding: EdgeInsets.all(8.h), - decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 10.h, color: AppColors.whiteColor), + decoration: RoundedRectangleBorder().toSmoothCornerDecoration(borderRadius: 12.r, color: AppColors.whiteColor), child: Utils.buildSvgWithAssets(icon: AppAssets.search_icon), ); } diff --git a/lib/widgets/language_switcher.dart b/lib/widgets/language_switcher.dart index 4a81217..ee54015 100644 --- a/lib/widgets/language_switcher.dart +++ b/lib/widgets/language_switcher.dart @@ -35,7 +35,6 @@ class _LanguageSelectorState extends State { return InkWell( onTap: () { final newLanguage = widget.currentLanguage == 'ar' ? 'en' : 'ar'; - print(newLanguage); widget.onLanguageChanged(newLanguage); }, child: Utils.buildSvgWithAssets(icon: AppAssets.globe_black)); @@ -43,7 +42,7 @@ class _LanguageSelectorState extends State { return Stack(clipBehavior: Clip.none, children: [ Container( decoration: BoxDecoration( - borderRadius: BorderRadius.circular(12), + borderRadius: BorderRadius.circular((12.r)), color: AppColors.secondaryLightRedColor, ), child: InkWell( @@ -53,7 +52,7 @@ class _LanguageSelectorState extends State { }, child: Container( padding: EdgeInsets.all(8.h), - decoration: BoxDecoration(borderRadius: BorderRadius.circular(12)), + decoration: BoxDecoration(borderRadius: BorderRadius.circular((12.r))), child: Row( mainAxisSize: MainAxisSize.min, children: [ @@ -63,7 +62,7 @@ class _LanguageSelectorState extends State { currentLangData['name']?.toUpperCase() ?? 'EN', style: context.dynamicTextStyle( fontWeight: FontWeight.w500, - fontSize: 14.fSize, + fontSize: 14.f, color: AppColors.primaryRedColor, letterSpacing: 0.1, isLanguageSwitcher: true, diff --git a/lib/widgets/loader/bottomsheet_loader.dart b/lib/widgets/loader/bottomsheet_loader.dart index 41d2b15..813ad5b 100644 --- a/lib/widgets/loader/bottomsheet_loader.dart +++ b/lib/widgets/loader/bottomsheet_loader.dart @@ -15,14 +15,16 @@ class LoaderBottomSheet { _isVisible = true; + final context = _navService.navigatorKey.currentContext!; showModalBottomSheet( - context: _navService.navigatorKey.currentContext!, + context: context, isDismissible: (ApiConsts.appEnvironmentType == AppEnvironmentTypeEnum.uat || kDebugMode) ? true : false, enableDrag: false, + constraints: BoxConstraints(minWidth: MediaQuery.of(context).size.width), backgroundColor: Colors.transparent, builder: (_) { return Container( - height: MediaQuery.of(_navService.navigatorKey.currentContext!).size.height * 0.3, + height: MediaQuery.of(context).size.height * 0.3, decoration: const BoxDecoration( color: Colors.white, borderRadius: BorderRadius.vertical(top: Radius.circular(16)), diff --git a/lib/widgets/radio/custom_radio_button.dart b/lib/widgets/radio/custom_radio_button.dart new file mode 100644 index 0000000..080fcb3 --- /dev/null +++ b/lib/widgets/radio/custom_radio_button.dart @@ -0,0 +1,49 @@ +import 'package:flutter/material.dart'; +import 'package:hmg_patient_app_new/core/utils/size_utils.dart'; +import 'package:hmg_patient_app_new/extensions/string_extensions.dart'; +import 'package:hmg_patient_app_new/theme/colors.dart'; + +class CustomRadioOption extends StatelessWidget { + final T value; + final T? groupValue; + final ValueChanged onChanged; + final String text; + + // final Widget child; // The content of your radio option (e.g., Text, Image) + + const CustomRadioOption({ + super.key, + required this.value, + required this.groupValue, + required this.onChanged, + // required this.child, + required this.text, + }); + + @override + Widget build(BuildContext context) { + // bool isSelected = value == groupValue; + bool isSelected = false; + return InkWell( + onTap: () => onChanged(value), + child: Container( + padding: EdgeInsets.all(8.h), + child: Row( + children: [ + Container( + width: 20.h, + height: 20.h, + decoration: BoxDecoration( + shape: BoxShape.circle, + color: isSelected ? AppColors.primaryRedColor : AppColors.whiteColor, + border: Border.all(color: isSelected ? AppColors.primaryRedColor : AppColors.bottomNAVBorder, width: 2.h), + ), + ), + SizedBox(width: 8.h), + text.toText16(weight: FontWeight.w500), // The provided content + ], + ), + ), + ); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 8265141..005642f 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -67,7 +67,6 @@ dependencies: jiffy: ^6.4.3 hijri_gregorian_calendar: ^0.1.1 sms_otp_auto_verify: ^2.2.0 - web: any flutter_staggered_animations: ^1.1.1 smooth_corner: ^1.1.1