From 0392fa1f206798bc662474344558553e292936f2 Mon Sep 17 00:00:00 2001 From: Juan Francisco Cisneros Windows Date: Mon, 23 Sep 2024 10:16:14 -0500 Subject: [PATCH] New Features: 1. Load Test AI finished Bugs Corrected: 1. Load Test History, chart showing in disorder To Be Corrected: 0. On product delete, delete trace results 1. On product delete, delete flamegraph result --- .../load-test-history.module.ts | 4 +- .../load-test-history.page.html | 66 +++++++++ .../load-test-history.page.ts | 127 +++++++++++++++++- .../load_test/load-test/load-test.page.html | 21 +-- .../load_test/load-test/load-test.page.ts | 14 +- www/4304.1ee0ef2bdf588c3d.js | 1 - www/4304.5e919bf908d2ac02.js | 1 + www/4559.303a6d01dbac6106.js | 1 + www/4559.893444f9e022cfc0.js | 1 - www/index.html | 4 +- ...0a50111.js => runtime.615e791cd0faaacf.js} | 2 +- ...5f57c6.css => styles.efc6c323ccc8bd32.css} | 2 +- 12 files changed, 217 insertions(+), 27 deletions(-) delete mode 100644 www/4304.1ee0ef2bdf588c3d.js create mode 100644 www/4304.5e919bf908d2ac02.js create mode 100644 www/4559.303a6d01dbac6106.js delete mode 100644 www/4559.893444f9e022cfc0.js rename www/{runtime.eb3737bff0a50111.js => runtime.615e791cd0faaacf.js} (97%) rename www/{styles.cfb293c7045f57c6.css => styles.efc6c323ccc8bd32.css} (89%) diff --git a/src/app/pages/load_test/load-test-history/load-test-history.module.ts b/src/app/pages/load_test/load-test-history/load-test-history.module.ts index af0d919..fafe1ae 100644 --- a/src/app/pages/load_test/load-test-history/load-test-history.module.ts +++ b/src/app/pages/load_test/load-test-history/load-test-history.module.ts @@ -9,6 +9,7 @@ import { LoadTestHistoryPageRoutingModule } from './load-test-history-routing.mo import { LoadTestHistoryPage } from './load-test-history.page'; import {ComponentsModule} from "../../../components/components.module"; import {NgxEchartsDirective} from "ngx-echarts"; +import {MarkdownComponent} from "ngx-markdown"; @NgModule({ imports: [ @@ -17,7 +18,8 @@ import {NgxEchartsDirective} from "ngx-echarts"; IonicModule, LoadTestHistoryPageRoutingModule, ComponentsModule, - NgxEchartsDirective + NgxEchartsDirective, + MarkdownComponent ], declarations: [LoadTestHistoryPage] }) diff --git a/src/app/pages/load_test/load-test-history/load-test-history.page.html b/src/app/pages/load_test/load-test-history/load-test-history.page.html index 95a8584..3a98883 100644 --- a/src/app/pages/load_test/load-test-history/load-test-history.page.html +++ b/src/app/pages/load_test/load-test-history/load-test-history.page.html @@ -17,6 +17,12 @@

{{ totalNumberOfRequests | number:'1.0-0' }}

+ +
+ + + +
HTTP Status Codes @@ -25,9 +31,16 @@

{{ totalNumberOfRequests | number:'1.0-0' }}

+
+ +
+ + + +
HTTP Response Time @@ -36,9 +49,62 @@

{{ totalNumberOfRequests | number:'1.0-0' }}

+
+ + + @if(hasBeenOpened){ + + + + + + } + + + +
+
+ +
+
+

DevProbe AI

+
+
+
+ +
+
+ + +
+
+ +
+ {{ msg.message }} +
+ + +
+ {{ msg.message }} +
+
+
+ + +
+ +
+
+ Send +
+
+
+
+ + diff --git a/src/app/pages/load_test/load-test-history/load-test-history.page.ts b/src/app/pages/load_test/load-test-history/load-test-history.page.ts index f5d3233..a759352 100644 --- a/src/app/pages/load_test/load-test-history/load-test-history.page.ts +++ b/src/app/pages/load_test/load-test-history/load-test-history.page.ts @@ -1,8 +1,11 @@ -import { Component, OnInit } from '@angular/core'; +import {Component, ElementRef, inject, OnInit, ViewChild} from '@angular/core'; import {ActivatedRoute, Router} from "@angular/router"; import {LoadTestService} from "../../../services/load-test.service"; import {ArtilleryData} from "../../../classes/artillery-data"; import {EChartsOption} from "echarts"; +import {getGenerativeModel, VertexAI} from "@angular/fire/vertexai-preview"; +import {AiMessage} from "../../../interfaces/ai-message"; +import {LoadingController} from "@ionic/angular"; @Component({ selector: 'app-load-test-history', @@ -50,10 +53,48 @@ export class LoadTestHistoryPage implements OnInit { } + + @ViewChild('messagesContainer') private messagesContainer: ElementRef | undefined; + aiModal: boolean = false + message: string = ''; + vertexAI: VertexAI = inject(VertexAI); + model = getGenerativeModel(this.vertexAI, { model: "gemini-1.5-flash" }); + chat = this.model.startChat({ + history: [ + { + role: "user", + parts: [{text:"Hola, desde ahora en adelante quiero que seas un modelo experto en Software Quality Assurance y analista de datos, tu nombre es DevProbeAI, nunca lo puedes olvidar"}], + }, + { + role: "model", + parts: [{text:"Soy un modelo experto en Software Quality Assurance, de igual forma tengo un masterado en anlaítica de datos ¿En qué puedo ayudarte?"}], + }, + { + role: "user", + parts: [{text:"Gracias, te voy a entregar un json con datos en unos minutos, necesito que lo analices y me des un resumen de los datos, este json contiene datos de un load test" + + ",tu analisis tiene que ser detallado, si encuentras inconsistencias en los datos, por favor mencionalas, en " + + "caso de que creas que puede haber un problema o que se encuentre el recurso no disponible por favor mencionalo, si encuentras algo interesante, por favor mencionalo, en resumen, necesito un analisis detallado de los datos"}], + }, + { + role: "model", + parts: [{text:"Claro, envíame el json y yo me encargo de analizarlo"}] + }, + ], + }); + messages:AiMessage[] = [] + hasBeenOpened = false; + + + + + + + constructor( private activatedRoute: ActivatedRoute, private router: Router, - private loadTestService: LoadTestService + private loadTestService: LoadTestService, + private loadingCtrl:LoadingController ) { } ngOnInit() { @@ -99,7 +140,7 @@ export class LoadTestHistoryPage implements OnInit { // @ts-ignore: Extrae la fecha del resultado let date = this.loadTestResults[key].date; // Filtra las claves que empiezan con "http.requests." - let httpCodesKeys = Object.keys(data).filter(keyCode => keyCode.startsWith('http.requests')); + let httpCodesKeys = Object.keys(data).filter(keyCode => keyCode.startsWith('http.responses')); for (let keyCode of httpCodesKeys) { if (!requests[date]) { @@ -111,7 +152,7 @@ export class LoadTestHistoryPage implements OnInit { } for (let date of Object.keys(requests)) { - totalRequests += requests[date]['http.requests']; + totalRequests += requests[date]['http.responses']; } this.totalNumberOfRequests = totalRequests; @@ -149,10 +190,11 @@ export class LoadTestHistoryPage implements OnInit { return codes; } normalizarFecha(fecha: string): string { - const [year, month, day] = fecha.split('-').map(num => parseInt(num, 10)); // Convertimos a números para evitar ceros iniciales incorrectos + console.log('fecha',fecha); + const [year, month, day, hour, minute, second] = fecha.split('-').map(num => parseInt(num, 10)); // Convertimos a números para evitar ceros iniciales incorrectos const mesNormalizado = month < 10 ? `0${month}` : month.toString(); // Agregar 0 si es necesario const diaNormalizado = day < 10 ? `0${day}` : day.toString(); // Agregar 0 si es necesario - return `${year}-${mesNormalizado}-${diaNormalizado}`; + return `${year}-${mesNormalizado}-${diaNormalizado} ${hour}:${minute}:${second}`; } ordenarDiccionarioPorFechas(diccionario: { [key: string]: any }): { [key: string]: any } { // Obtener las claves del diccionario (fechas) @@ -160,6 +202,8 @@ export class LoadTestHistoryPage implements OnInit { // Ordenar las fechas normalizadas const fechasOrdenadas = fechas.sort((a, b) => { + console.log('a', this.normalizarFecha(a)); + console.log('b', this.normalizarFecha(b)); const fechaA = new Date(this.normalizarFecha(a)); const fechaB = new Date(this.normalizarFecha(b)); return fechaA.getTime() - fechaB.getTime(); @@ -176,9 +220,12 @@ export class LoadTestHistoryPage implements OnInit { } async plotCodes() { let codes = this.byCodes(); - console.log(codes); + console.log('codess',codes); let keys = Object.keys(codes); + + console.log('llaves',keys); + let typesOfCodes = new Set() as Set; for (let key of keys) { @@ -200,6 +247,7 @@ export class LoadTestHistoryPage implements OnInit { } } + let colors = [ '#36b311', '#306fc6', @@ -373,9 +421,74 @@ export class LoadTestHistoryPage implements OnInit { responseTimeChart!.style.width = '100%'; responseTimeChart!.style.height = '25em'; + + return responseTimes; + + } + + + + async toggleAiModal(context?: string) { + await this.showLoading() + + this.aiModal = !this.aiModal; + this.hasBeenOpened = true; + + if (context === 'httpCodesOptions') { + this.message = 'En este caso el json tiene codigos de respuesta HTTP, por ejemplo, 404, 500, etc y cuantos requests devolvieron esos codigos:' + JSON.stringify(this.byCodes()) + } + if (context === 'httpResponseTimeOptions') { + this.message = 'En este caso el json tiene tiempos de respuesta de los requests, por ejemplo, 500ms, 1000ms, etc: ' + JSON.stringify(this.responseTime()) + } + + if (this.message === '') { + console.log('Message is empty'); + await this.hideLoading(); + return; + } + + let length = this.messages.length; + if (length > 0) { + this.messages.push({message: this.message, from: 'User', id: length.toString()}); + } + const result = await this.chat.sendMessage(this.message); + length = this.messages.length; + this.messages.push({message: result.response.text(), from: 'AI', id: length.toString()}); + this.message = ''; + await this.hideLoading(); + return; + + } + sendMessage() { + let length = this.messages.length; + this.messages.push({message: this.message, from: 'User', id: length.toString()}); + this.chat.sendMessage(this.message).then(async (result) => { + await this.showLoading() + length = this.messages.length; + this.messages.push({message: result.response.text(), from: 'AI', id: length.toString()}); + await this.hideLoading(); + }); + this.message = ''; + return; + } + /** + * Show a loading spinner. + */ + async showLoading() { + const loading = await this.loadingCtrl.create({ + }); + await loading.present(); + } + + /** + * Hide the loading spinner. + */ + async hideLoading() { + await this.loadingCtrl.dismiss(); + } } diff --git a/src/app/pages/load_test/load-test/load-test.page.html b/src/app/pages/load_test/load-test/load-test.page.html index 2f9e4c2..7d0a74d 100644 --- a/src/app/pages/load_test/load-test/load-test.page.html +++ b/src/app/pages/load_test/load-test/load-test.page.html @@ -34,10 +34,10 @@

{{ totalNumberOfRequests | number:'1.0-0' }}

- -
- - + +
+ +
@@ -52,10 +52,10 @@

{{ totalNumberOfRequests | number:'1.0-0' }}

- -
- - + +
+ +
@@ -84,12 +84,13 @@

{{ totalNumberOfRequests | number:'1.0-0' }}

- + @if(hasBeenOpened){ - + + } diff --git a/src/app/pages/load_test/load-test/load-test.page.ts b/src/app/pages/load_test/load-test/load-test.page.ts index 56ee2fb..b435913 100644 --- a/src/app/pages/load_test/load-test/load-test.page.ts +++ b/src/app/pages/load_test/load-test/load-test.page.ts @@ -91,6 +91,7 @@ responseTimeOptions: EChartsOption = { ], }); messages:AiMessage[] = [] + hasBeenOpened = false; @@ -175,7 +176,7 @@ responseTimeOptions: EChartsOption = { // @ts-ignore: Extrae la fecha del resultado let date = this.loadTestResults[key].date; // Filtra las claves que empiezan con "http.requests." - let httpCodesKeys = Object.keys(data).filter(keyCode => keyCode.startsWith('http.requests')); + let httpCodesKeys = Object.keys(data).filter(keyCode => keyCode.startsWith('http.responses')); for (let keyCode of httpCodesKeys) { if (!requests[date]) { @@ -187,7 +188,7 @@ responseTimeOptions: EChartsOption = { } for (let date of Object.keys(requests)) { - totalRequests += requests[date]['http.requests']; + totalRequests += requests[date]['http.responses']; } this.totalNumberOfRequests = totalRequests; @@ -522,7 +523,10 @@ for (let metric in total) { async toggleAiModal(context?: string) { + await this.showLoading() + this.aiModal = !this.aiModal; + this.hasBeenOpened = true; if (context === 'httpCodesOptions') { this.message = 'En este caso el json tiene codigos de respuesta HTTP, por ejemplo, 404, 500, etc y cuantos requests devolvieron esos codigos:' + JSON.stringify(this.byCodes()) @@ -533,6 +537,7 @@ for (let metric in total) { if (this.message === '') { console.log('Message is empty'); + await this.hideLoading(); return; } @@ -544,6 +549,7 @@ for (let metric in total) { length = this.messages.length; this.messages.push({message: result.response.text(), from: 'AI', id: length.toString()}); this.message = ''; + await this.hideLoading(); return; @@ -552,9 +558,11 @@ for (let metric in total) { sendMessage() { let length = this.messages.length; this.messages.push({message: this.message, from: 'User', id: length.toString()}); - this.chat.sendMessage(this.message).then((result) => { + this.chat.sendMessage(this.message).then(async (result) => { + await this.showLoading() length = this.messages.length; this.messages.push({message: result.response.text(), from: 'AI', id: length.toString()}); + await this.hideLoading(); }); this.message = ''; return; diff --git a/www/4304.1ee0ef2bdf588c3d.js b/www/4304.1ee0ef2bdf588c3d.js deleted file mode 100644 index c1fe58c..0000000 --- a/www/4304.1ee0ef2bdf588c3d.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[4304],{5553:(L,v,a)=>{a.d(v,{h:()=>O});var d=a(177),j=a(7863),c=a(4438);let O=(()=>{var f;class t{}return(f=t).\u0275fac=function(T){return new(T||f)},f.\u0275mod=c.$C({type:f}),f.\u0275inj=c.G2t({imports:[d.MD,j.bv]}),t})()},3241:(L,v,a)=>{a.d(v,{p:()=>O});var d=a(4438),j=a(177),c=a(7863);let O=(()=>{var f;class t{constructor(T){this.location=T,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(f=t).\u0275fac=function(T){return new(T||f)(d.rXU(j.aZ))},f.\u0275cmp=d.VBU({type:f,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(T,b){1&T&&(d.j41(0,"ion-header",0)(1,"ion-toolbar"),d.nrm(2,"ion-menu-button",1),d.j41(3,"ion-icon",2),d.bIt("click",function(){return b.goBack()}),d.k0s(),d.j41(4,"ion-title"),d.EFF(5),d.k0s()()()),2&T&&(d.Y8G("translucent",!0),d.R7$(5),d.JRh(b.title))},dependencies:[c.eU,c.iq,c.MC,c.BC,c.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),t})()},4304:(L,v,a)=>{a.r(v),a.d(v,{LoadTestHistoryPageModule:()=>A});var d=a(177),j=a(4341),c=a(7863),O=a(7650),f=a(467),t=a(4438),R=a(4970),T=a(8453),b=a(3241),F=a(2820);const x=[{path:"",component:(()=>{var i;class C{constructor(o,e,s){this.activatedRoute=o,this.router=e,this.loadTestService=s,this.productObjective="",this.productStep="",this.orgName="",this.date="",this.loadTestResults={},this.totalNumberOfRequests=0,this.statusCodesOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.responseTimeOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]}}ngOnInit(){var o=this;this.getParams(),this.getLoadTestHistoryByDate().then(function(){var e=(0,f.A)(function*(s){o.totalRequests(),yield o.plotCodes(),yield o.responseTime()});return function(s){return e.apply(this,arguments)}}())}getParams(){this.activatedRoute.params.subscribe(e=>{this.productObjective=e.productObjective,this.productStep=e.productStep,this.date=e.day});const o=JSON.parse(localStorage.getItem("user"));this.orgName=o.orgName,console.log(this.orgName),console.log(this.productObjective),console.log(this.productStep),console.log(this.date)}getLoadTestHistoryByDate(){var o=this;return(0,f.A)(function*(){o.loadTestResults=yield o.loadTestService.getLoadTestHistoryByDate(o.orgName,o.productObjective,o.productStep,o.date)})()}totalRequests(){let o=Object.keys(this.loadTestResults),e={},s=0;for(let r of o){let n=this.loadTestResults[r].aggregate.counters,u=this.loadTestResults[r].date,y=Object.keys(n).filter(p=>p.startsWith("http.requests"));for(let p of y)e[u]||(e[u]={}),e[u][p]=(e[u][p]||0)+n[p]}for(let r of Object.keys(e))s+=e[r]["http.requests"];this.totalNumberOfRequests=s}byCodes(){let o=Object.keys(this.loadTestResults),e={};for(let s of o){let r=this.loadTestResults[s].aggregate.counters,n=this.loadTestResults[s].date,u=Object.keys(r).filter(y=>y.startsWith("http.codes."));for(let y of u)e[n]||(e[n]={}),e[n][y]=r[y]}return console.log(e),e=this.ordenarDiccionarioPorFechas(e),e}normalizarFecha(o){const[e,s,r]=o.split("-").map(y=>parseInt(y,10));return`${e}-${s<10?`0${s}`:s.toString()}-${r<10?`0${r}`:r.toString()}`}ordenarDiccionarioPorFechas(o){const s=Object.keys(o).sort((n,u)=>{const y=new Date(this.normalizarFecha(n)),p=new Date(this.normalizarFecha(u));return y.getTime()-p.getTime()}),r={};return s.forEach(n=>{r[n]=o[n]}),r}plotCodes(){var o=this;return(0,f.A)(function*(){let e=o.byCodes();console.log(e);let s=Object.keys(e),r=new Set;for(let p of s){let h=Object.keys(e[p]);for(let M of h)r.add(M)}let n={};for(let p in e){let l=e[p];for(let h of r)n[h]||(n[h]=[]),n[h].push(l[h]||0)}let u=["#36b311","#306fc6","#ed3b3b","#f4ba20"];for(let p in n){let h,l=p.split(".").pop();null!=l&&l.startsWith("2")&&(h=u[0]),null!=l&&l.startsWith("3")&&(h=u[1]),null!=l&&l.startsWith("4")&&(h=u[2]),null!=l&&l.startsWith("5")&&(h=u[3]),h||(h="#000000"),o.statusCodesOptions.series.push({name:p,type:"line",data:n[p],lineStyle:{color:h},itemStyle:{color:h}})}o.statusCodesOptions.xAxis={type:"category",boundaryGap:!1,data:s},o.statusCodesOptions={...o.statusCodesOptions};let y=document.getElementById("httpCodesChartHistory");console.log(y),y.style.width="100%",y.style.height="25em"})()}responseTime(){let o=Object.keys(this.loadTestResults),e={};for(let g of o){let m=this.loadTestResults[g].aggregate.histograms,k=this.loadTestResults[g].date,D=Object.keys(m).filter(H=>H.startsWith("http.response_time"));for(let H of D)e[k]=m[H]}let s=Object.keys(e);s=function r(g){return g.sort((m,k)=>{let D=m.split("-").slice(0,3).join("/"),H=k.split("-").slice(0,3).join("/"),S=m.split("-").slice(3,6).join(":"),$=H+" "+k.split("-").slice(3,6).join(":");return new Date(D+" "+S).getTime()-new Date($).getTime()})}(s),console.log("date",s),console.log("responseTimes",e);let n=[],u=[],y=[],p=[],l=[],h=[];for(let g in s){console.log("date",s[g]);for(let m in e[s[g]])"min"===m&&n.push(e[s[g]][m]),"max"===m&&u.push(e[s[g]][m]),"p95"===m&&y.push(e[s[g]][m]),"p99"===m&&p.push(e[s[g]][m]),"mean"===m&&l.push(e[s[g]][m]),"median"===m&&h.push(e[s[g]][m])}console.log("min",n);let M={min:n,max:u,p95:y,p99:p,mean:l,median:h};this.responseTimeOptions.series=[];for(let g in M)this.responseTimeOptions.series.push({name:g,type:"bar",data:M[g]});this.responseTimeOptions.xAxis={type:"category",boundaryGap:!1,data:s},this.responseTimeOptions={...this.responseTimeOptions};let E=document.getElementById("httpResponseTimeChartHistory");console.log(E),E.style.width="100%",E.style.height="25em"}}return(i=C).\u0275fac=function(o){return new(o||i)(t.rXU(O.nX),t.rXU(O.Ix),t.rXU(R.s))},i.\u0275cmp=t.VBU({type:i,selectors:[["app-load-test-history"]],decls:28,vars:9,consts:[[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12",1,"w-full"],[1,"w-full","p-6","flex","flex-col","justify-center","items-center"],[1,"text-3xl"],[1,"text-2xl","text-white"],[1,"h-[25em]","w-full"],["id","httpCodesChartHistory","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["id","httpResponseTimeChartHistory","echarts","",1,"demo-chart","h-full","w-full",3,"options"]],template:function(o,e){1&o&&(t.nrm(0,"app-header-return",0),t.j41(1,"ion-content",1)(2,"ion-grid"),t.nrm(3,"app-title",0),t.j41(4,"ion-row",2)(5,"ion-col",3)(6,"ion-card",4)(7,"ion-card-header")(8,"ion-card-title",5),t.EFF(9,"Total Number of Requests"),t.k0s()(),t.j41(10,"ion-card-content")(11,"h1",6),t.EFF(12),t.nI1(13,"number"),t.k0s()()()()(),t.j41(14,"ion-row",2)(15,"ion-card",4)(16,"ion-card-header")(17,"ion-card-title",5),t.EFF(18,"HTTP Status Codes"),t.k0s()(),t.j41(19,"ion-card-content",7),t.nrm(20,"div",8),t.k0s()()(),t.j41(21,"ion-row",2)(22,"ion-card",4)(23,"ion-card-header")(24,"ion-card-title",5),t.EFF(25,"HTTP Response Time"),t.k0s()(),t.j41(26,"ion-card-content",7),t.nrm(27,"div",9),t.k0s()()()()()),2&o&&(t.Y8G("title","History For: "+e.date),t.R7$(),t.Y8G("fullscreen",!0),t.R7$(2),t.Y8G("title","Load Test History"),t.R7$(9),t.JRh(t.i5U(13,6,e.totalNumberOfRequests,"1.0-0")),t.R7$(8),t.Y8G("options",e.statusCodesOptions),t.R7$(7),t.Y8G("options",e.responseTimeOptions))},dependencies:[c.b_,c.I9,c.ME,c.tN,c.hU,c.W9,c.lO,c.ln,T.W,b.p,F.$P,d.QX]}),C})()}];let I=(()=>{var i;class C{}return(i=C).\u0275fac=function(o){return new(o||i)},i.\u0275mod=t.$C({type:i}),i.\u0275inj=t.G2t({imports:[O.iI.forChild(x),O.iI]}),C})();var B=a(5553);let A=(()=>{var i;class C{}return(i=C).\u0275fac=function(o){return new(o||i)},i.\u0275mod=t.$C({type:i}),i.\u0275inj=t.G2t({imports:[d.MD,j.YN,c.bv,I,B.h]}),C})()}}]); \ No newline at end of file diff --git a/www/4304.5e919bf908d2ac02.js b/www/4304.5e919bf908d2ac02.js new file mode 100644 index 0000000..e5d87ac --- /dev/null +++ b/www/4304.5e919bf908d2ac02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[4304],{5553:(w,_,r)=>{r.d(_,{h:()=>j});var c=r(177),x=r(7863),l=r(4438);let j=(()=>{var u;class e{}return(u=e).\u0275fac=function(b){return new(b||u)},u.\u0275mod=l.$C({type:u}),u.\u0275inj=l.G2t({imports:[c.MD,x.bv]}),e})()},3241:(w,_,r)=>{r.d(_,{p:()=>j});var c=r(4438),x=r(177),l=r(7863);let j=(()=>{var u;class e{constructor(b){this.location=b,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(u=e).\u0275fac=function(b){return new(b||u)(c.rXU(x.aZ))},u.\u0275cmp=c.VBU({type:u,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(b,O){1&b&&(c.j41(0,"ion-header",0)(1,"ion-toolbar"),c.nrm(2,"ion-menu-button",1),c.j41(3,"ion-icon",2),c.bIt("click",function(){return O.goBack()}),c.k0s(),c.j41(4,"ion-title"),c.EFF(5),c.k0s()()()),2&b&&(c.Y8G("translucent",!0),c.R7$(5),c.JRh(O.title))},dependencies:[l.eU,l.iq,l.MC,l.BC,l.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),e})()},4304:(w,_,r)=>{r.r(_),r.d(_,{LoadTestHistoryPageModule:()=>z});var c=r(177),x=r(4341),l=r(7863),j=r(7650),u=r(467),e=r(4438),C=r(9032),b=r(4970),O=r(8453),L=r(3241),A=r(2820),E=r(9549);const F=["messagesContainer"];function I(i,T){if(1&i){const f=e.RV6();e.j41(0,"ion-fab",30),e.bIt("click",function(){e.eBV(f);const t=e.XpG();return e.Njj(t.toggleAiModal())}),e.j41(1,"ion-avatar",31),e.nrm(2,"ion-icon",32),e.k0s()()}}function D(i,T){if(1&i&&(e.j41(0,"div",36)(1,"markdown",37),e.EFF(2),e.k0s()()),2&i){const f=e.XpG().$implicit;e.R7$(2),e.JRh(f.message)}}function N(i,T){if(1&i&&(e.j41(0,"div",38)(1,"markdown",39),e.EFF(2),e.k0s()()),2&i){const f=e.XpG().$implicit;e.R7$(),e.Mz_("id","mk-",f.id,""),e.R7$(),e.JRh(f.message)}}function B(i,T){if(1&i&&(e.j41(0,"div",33),e.DNE(1,D,3,1,"div",34)(2,N,3,3,"div",35),e.k0s()),2&i){const f=T.$implicit;e.R7$(),e.Y8G("ngIf","User"===f.from),e.R7$(),e.Y8G("ngIf","AI"===f.from)}}const $=[{path:"",component:(()=>{var i;class T{constructor(s,t,o,n){this.activatedRoute=s,this.router=t,this.loadTestService=o,this.loadingCtrl=n,this.productObjective="",this.productStep="",this.orgName="",this.date="",this.loadTestResults={},this.totalNumberOfRequests=0,this.statusCodesOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.responseTimeOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.aiModal=!1,this.message="",this.vertexAI=(0,e.WQX)(C.L9),this.model=(0,C.oc)(this.vertexAI,{model:"gemini-1.5-flash"}),this.chat=this.model.startChat({history:[{role:"user",parts:[{text:"Hola, desde ahora en adelante quiero que seas un modelo experto en Software Quality Assurance y analista de datos, tu nombre es DevProbeAI, nunca lo puedes olvidar"}]},{role:"model",parts:[{text:"Soy un modelo experto en Software Quality Assurance, de igual forma tengo un masterado en anla\xedtica de datos \xbfEn qu\xe9 puedo ayudarte?"}]},{role:"user",parts:[{text:"Gracias, te voy a entregar un json con datos en unos minutos, necesito que lo analices y me des un resumen de los datos, este json contiene datos de un load test,tu analisis tiene que ser detallado, si encuentras inconsistencias en los datos, por favor mencionalas, en caso de que creas que puede haber un problema o que se encuentre el recurso no disponible por favor mencionalo, si encuentras algo interesante, por favor mencionalo, en resumen, necesito un analisis detallado de los datos"}]},{role:"model",parts:[{text:"Claro, env\xedame el json y yo me encargo de analizarlo"}]}]}),this.messages=[],this.hasBeenOpened=!1}ngOnInit(){var s=this;this.getParams(),this.getLoadTestHistoryByDate().then(function(){var t=(0,u.A)(function*(o){s.totalRequests(),yield s.plotCodes(),yield s.responseTime()});return function(o){return t.apply(this,arguments)}}())}getParams(){this.activatedRoute.params.subscribe(t=>{this.productObjective=t.productObjective,this.productStep=t.productStep,this.date=t.day});const s=JSON.parse(localStorage.getItem("user"));this.orgName=s.orgName,console.log(this.orgName),console.log(this.productObjective),console.log(this.productStep),console.log(this.date)}getLoadTestHistoryByDate(){var s=this;return(0,u.A)(function*(){s.loadTestResults=yield s.loadTestService.getLoadTestHistoryByDate(s.orgName,s.productObjective,s.productStep,s.date)})()}totalRequests(){let s=Object.keys(this.loadTestResults),t={},o=0;for(let n of s){let a=this.loadTestResults[n].aggregate.counters,p=this.loadTestResults[n].date,y=Object.keys(a).filter(m=>m.startsWith("http.responses"));for(let m of y)t[p]||(t[p]={}),t[p][m]=(t[p][m]||0)+a[m]}for(let n of Object.keys(t))o+=t[n]["http.responses"];this.totalNumberOfRequests=o}byCodes(){let s=Object.keys(this.loadTestResults),t={};for(let o of s){let n=this.loadTestResults[o].aggregate.counters,a=this.loadTestResults[o].date,p=Object.keys(n).filter(y=>y.startsWith("http.codes."));for(let y of p)t[a]||(t[a]={}),t[a][y]=n[y]}return console.log(t),t=this.ordenarDiccionarioPorFechas(t),t}normalizarFecha(s){console.log("fecha",s);const[t,o,n,a,p,y]=s.split("-").map(g=>parseInt(g,10));return`${t}-${o<10?`0${o}`:o.toString()}-${n<10?`0${n}`:n.toString()} ${a}:${p}:${y}`}ordenarDiccionarioPorFechas(s){const o=Object.keys(s).sort((a,p)=>{console.log("a",this.normalizarFecha(a)),console.log("b",this.normalizarFecha(p));const y=new Date(this.normalizarFecha(a)),m=new Date(this.normalizarFecha(p));return y.getTime()-m.getTime()}),n={};return o.forEach(a=>{n[a]=s[a]}),n}plotCodes(){var s=this;return(0,u.A)(function*(){let t=s.byCodes();console.log("codess",t);let o=Object.keys(t);console.log("llaves",o);let n=new Set;for(let m of o){let g=Object.keys(t[m]);for(let k of g)n.add(k)}let a={};for(let m in t){let d=t[m];for(let g of n)a[g]||(a[g]=[]),a[g].push(d[g]||0)}let p=["#36b311","#306fc6","#ed3b3b","#f4ba20"];for(let m in a){let g,d=m.split(".").pop();null!=d&&d.startsWith("2")&&(g=p[0]),null!=d&&d.startsWith("3")&&(g=p[1]),null!=d&&d.startsWith("4")&&(g=p[2]),null!=d&&d.startsWith("5")&&(g=p[3]),g||(g="#000000"),s.statusCodesOptions.series.push({name:m,type:"line",data:a[m],lineStyle:{color:g},itemStyle:{color:g}})}s.statusCodesOptions.xAxis={type:"category",boundaryGap:!1,data:o},s.statusCodesOptions={...s.statusCodesOptions};let y=document.getElementById("httpCodesChartHistory");console.log(y),y.style.width="100%",y.style.height="25em"})()}responseTime(){let s=Object.keys(this.loadTestResults),t={};for(let v of s){let h=this.loadTestResults[v].aggregate.histograms,M=this.loadTestResults[v].date,H=Object.keys(h).filter(R=>R.startsWith("http.response_time"));for(let R of H)t[M]=h[R]}let o=Object.keys(t);o=function n(v){return v.sort((h,M)=>{let H=h.split("-").slice(0,3).join("/"),R=M.split("-").slice(0,3).join("/"),U=h.split("-").slice(3,6).join(":"),V=R+" "+M.split("-").slice(3,6).join(":");return new Date(H+" "+U).getTime()-new Date(V).getTime()})}(o),console.log("date",o),console.log("responseTimes",t);let a=[],p=[],y=[],m=[],d=[],g=[];for(let v in o){console.log("date",o[v]);for(let h in t[o[v]])"min"===h&&a.push(t[o[v]][h]),"max"===h&&p.push(t[o[v]][h]),"p95"===h&&y.push(t[o[v]][h]),"p99"===h&&m.push(t[o[v]][h]),"mean"===h&&d.push(t[o[v]][h]),"median"===h&&g.push(t[o[v]][h])}console.log("min",a);let k={min:a,max:p,p95:y,p99:m,mean:d,median:g};this.responseTimeOptions.series=[];for(let v in k)this.responseTimeOptions.series.push({name:v,type:"bar",data:k[v]});this.responseTimeOptions.xAxis={type:"category",boundaryGap:!1,data:o},this.responseTimeOptions={...this.responseTimeOptions};let P=document.getElementById("httpResponseTimeChartHistory");return console.log(P),P.style.width="100%",P.style.height="25em",t}toggleAiModal(s){var t=this;return(0,u.A)(function*(){if(yield t.showLoading(),t.aiModal=!t.aiModal,t.hasBeenOpened=!0,"httpCodesOptions"===s&&(t.message="En este caso el json tiene codigos de respuesta HTTP, por ejemplo, 404, 500, etc y cuantos requests devolvieron esos codigos:"+JSON.stringify(t.byCodes())),"httpResponseTimeOptions"===s&&(t.message="En este caso el json tiene tiempos de respuesta de los requests, por ejemplo, 500ms, 1000ms, etc: "+JSON.stringify(t.responseTime())),""===t.message)return console.log("Message is empty"),void(yield t.hideLoading());let o=t.messages.length;o>0&&t.messages.push({message:t.message,from:"User",id:o.toString()});const n=yield t.chat.sendMessage(t.message);o=t.messages.length,t.messages.push({message:n.response.text(),from:"AI",id:o.toString()}),t.message="",yield t.hideLoading()})()}sendMessage(){var s=this;let t=this.messages.length;this.messages.push({message:this.message,from:"User",id:t.toString()}),this.chat.sendMessage(this.message).then(function(){var o=(0,u.A)(function*(n){yield s.showLoading(),t=s.messages.length,s.messages.push({message:n.response.text(),from:"AI",id:t.toString()}),yield s.hideLoading()});return function(n){return o.apply(this,arguments)}}()),this.message=""}showLoading(){var s=this;return(0,u.A)(function*(){yield(yield s.loadingCtrl.create({})).present()})()}hideLoading(){var s=this;return(0,u.A)(function*(){yield s.loadingCtrl.dismiss()})()}}return(i=T).\u0275fac=function(s){return new(s||i)(e.rXU(j.nX),e.rXU(j.Ix),e.rXU(b.s),e.rXU(l.Xi))},i.\u0275cmp=e.VBU({type:i,selectors:[["app-load-test-history"]],viewQuery:function(s,t){if(1&s&&e.GBs(F,5),2&s){let o;e.mGM(o=e.lsd())&&(t.messagesContainer=o.first)}},decls:55,vars:14,consts:[["messagesContainer",""],[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12",1,"w-full"],[1,"w-full","p-6","flex","flex-col","justify-center","items-center"],[1,"text-3xl"],[1,"text-2xl","text-white"],["size","12",1,"relative","flex","flex-row","justify-center"],[1,"absolute","z-10","w-full","flex","flex-row","justify-end"],[1,"h-12","w-12","bg-purple-400","p-2",3,"click"],["name","color-wand-outline",1,"w-full","h-full"],[1,"h-[25em]","w-full"],["id","httpCodesChartHistory","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["id","httpResponseTimeChartHistory","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["vertical","bottom","horizontal","end","slot","fixed",1,"m-2","z-10"],["id","ai-modal",1,"fixed","bottom-0","right-0","h-full","w-full","bg-black","bg-opacity-60","z-10","r"],[1,"h-full","md:h-3/4","lg:h-3/4","w-full","bg-gray-900","p-4","absolute","right-0","bottom-0","z-50","flex","flex-col","rounded-tl-2xl","rounded-tr-2xl"],[1,"w-full","bg-gray-500","flex","flex-row","justify-center","items-center","p-2","mb-2","rounded-3xl"],[1,"flex","flex-row","p-2","items-center","bg-gray-800","w-full","rounded-3xl","h-full"],[1,"text-white"],[1,"m-2"],[1,"flex","flex-row","justify-center","items-center","bg-gray-800","hover:bg-gray-600","w-1/6","h-full","rounded-3xl",3,"click"],["name","close-outline"],[1,"flex-grow","overflow-y-auto","bg-gray-400","p-2","rounded-3xl"],["class","flex flex-col",4,"ngFor","ngForOf"],[1,"flex","flex-row","mt-2","p-2"],["placeholder","Ask...",1,"flex-grow","bg-gray-700","rounded-2xl",3,"ngModelChange","ngModel"],[1,"m-1"],[1,"w-1/3","bg-gray-500","rounded-3xl","flex","flex-row","justify-center","items-center","hover:bg-gray-300",3,"click"],["vertical","bottom","horizontal","end","slot","fixed",1,"m-2","z-10",3,"click"],[1,"bg-purple-300","p-1","lg:p-4","md:p-4"],["name","chatbubble-outline",1,"w-full","h-full"],[1,"flex","flex-col"],["class","rounded-3xl bg-gray-800 w-2/3 m-1 ml-auto p-2",4,"ngIf"],["class","rounded-3xl bg-gray-500 w-2/3 m-1 p-2 pr-2",4,"ngIf"],[1,"rounded-3xl","bg-gray-800","w-2/3","m-1","ml-auto","p-2"],[1,"text-white","p-4","m-2"],[1,"rounded-3xl","bg-gray-500","w-2/3","m-1","p-2","pr-2"],[1,"text-white","p-4","m-2",3,"id"]],template:function(s,t){if(1&s){const o=e.RV6();e.nrm(0,"app-header-return",1),e.j41(1,"ion-content",2)(2,"ion-grid"),e.nrm(3,"app-title",1),e.j41(4,"ion-row",3)(5,"ion-col",4)(6,"ion-card",5)(7,"ion-card-header")(8,"ion-card-title",6),e.EFF(9,"Total Number of Requests"),e.k0s()(),e.j41(10,"ion-card-content")(11,"h1",7),e.EFF(12),e.nI1(13,"number"),e.k0s()()()()(),e.j41(14,"ion-row",3)(15,"ion-col",8)(16,"div",9)(17,"ion-avatar",10),e.bIt("click",function(){return e.eBV(o),e.Njj(t.toggleAiModal("httpCodesOptions"))}),e.nrm(18,"ion-icon",11),e.k0s()(),e.j41(19,"ion-card",5)(20,"ion-card-header")(21,"ion-card-title",6),e.EFF(22,"HTTP Status Codes"),e.k0s()(),e.j41(23,"ion-card-content",12),e.nrm(24,"div",13),e.k0s()()()(),e.j41(25,"ion-row",3)(26,"ion-col",8)(27,"div",9)(28,"ion-avatar",10),e.bIt("click",function(){return e.eBV(o),e.Njj(t.toggleAiModal("httpResponseTimeOptions"))}),e.nrm(29,"ion-icon",11),e.k0s()(),e.j41(30,"ion-card",5)(31,"ion-card-header")(32,"ion-card-title",6),e.EFF(33,"HTTP Response Time"),e.k0s()(),e.j41(34,"ion-card-content",12),e.nrm(35,"div",14),e.k0s()()()()(),e.DNE(36,I,3,0,"ion-fab",15),e.k0s(),e.j41(37,"div",16)(38,"div",17)(39,"div",18)(40,"div",19)(41,"h1",20),e.EFF(42,"DevProbe AI"),e.k0s()(),e.nrm(43,"div",21),e.j41(44,"div",22),e.bIt("click",function(){return e.eBV(o),e.Njj(t.toggleAiModal())}),e.nrm(45,"ion-icon",23),e.k0s()(),e.j41(46,"div",24,0),e.DNE(48,B,3,2,"div",25),e.k0s(),e.j41(49,"div",26)(50,"ion-textarea",27),e.mxI("ngModelChange",function(a){return e.eBV(o),e.DH7(t.message,a)||(t.message=a),e.Njj(a)}),e.k0s(),e.nrm(51,"div",28),e.j41(52,"div",29),e.bIt("click",function(){return e.eBV(o),e.Njj(t.sendMessage())}),e.j41(53,"span",20),e.EFF(54,"Send"),e.k0s()()()()()}2&s&&(e.Y8G("title","History For: "+t.date),e.R7$(),e.Y8G("fullscreen",!0),e.R7$(2),e.Y8G("title","Load Test History"),e.R7$(9),e.JRh(e.i5U(13,11,t.totalNumberOfRequests,"1.0-0")),e.R7$(12),e.Y8G("options",t.statusCodesOptions),e.R7$(11),e.Y8G("options",t.responseTimeOptions),e.R7$(),e.vxM(36,t.hasBeenOpened?36:-1),e.R7$(),e.AVh("hidden",!t.aiModal),e.R7$(11),e.Y8G("ngForOf",t.messages),e.R7$(2),e.R50("ngModel",t.message))},dependencies:[c.Sq,c.bT,x.BC,x.vS,l.mC,l.b_,l.I9,l.ME,l.tN,l.hU,l.W9,l.Q8,l.lO,l.iq,l.ln,l.nc,l.Gw,O.W,L.p,A.$P,E.NN,c.QX]}),T})()}];let S=(()=>{var i;class T{}return(i=T).\u0275fac=function(s){return new(s||i)},i.\u0275mod=e.$C({type:i}),i.\u0275inj=e.G2t({imports:[j.iI.forChild($),j.iI]}),T})();var G=r(5553);let z=(()=>{var i;class T{}return(i=T).\u0275fac=function(s){return new(s||i)},i.\u0275mod=e.$C({type:i}),i.\u0275inj=e.G2t({imports:[c.MD,x.YN,l.bv,S,G.h,E.NN]}),T})()}}]); \ No newline at end of file diff --git a/www/4559.303a6d01dbac6106.js b/www/4559.303a6d01dbac6106.js new file mode 100644 index 0000000..bc22810 --- /dev/null +++ b/www/4559.303a6d01dbac6106.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[4559],{5553:(w,x,u)=>{u.d(x,{h:()=>b});var g=u(177),j=u(7863),d=u(4438);let b=(()=>{var p;class e{}return(p=e).\u0275fac=function(_){return new(_||p)},p.\u0275mod=d.$C({type:p}),p.\u0275inj=d.G2t({imports:[g.MD,j.bv]}),e})()},3241:(w,x,u)=>{u.d(x,{p:()=>b});var g=u(4438),j=u(177),d=u(7863);let b=(()=>{var p;class e{constructor(_){this.location=_,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(p=e).\u0275fac=function(_){return new(_||p)(g.rXU(j.aZ))},p.\u0275cmp=g.VBU({type:p,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(_,O){1&_&&(g.j41(0,"ion-header",0)(1,"ion-toolbar"),g.nrm(2,"ion-menu-button",1),g.j41(3,"ion-icon",2),g.bIt("click",function(){return O.goBack()}),g.k0s(),g.j41(4,"ion-title"),g.EFF(5),g.k0s()()()),2&_&&(g.Y8G("translucent",!0),g.R7$(5),g.JRh(O.title))},dependencies:[d.eU,d.iq,d.MC,d.BC,d.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),e})()},4559:(w,x,u)=>{u.r(x),u.d(x,{LoadTestPageModule:()=>B});var g=u(177),j=u(4341),d=u(7863),b=u(7650),p=u(467),e=u(4438),R=u(9032),_=u(4970),O=u(8453),M=u(3241),P=u(2820),L=u(9549);const E=["messagesContainer"];function A(l,T){if(1&l){const m=e.RV6();e.j41(0,"ion-item",37),e.bIt("click",function(){const t=e.eBV(m).$implicit,n=e.XpG();return e.Njj(n.viewHistory(t))}),e.j41(1,"ion-label"),e.EFF(2),e.k0s(),e.nrm(3,"ion-icon",38),e.k0s()}if(2&l){const m=T.$implicit;e.R7$(2),e.JRh(m)}}function F(l,T){if(1&l){const m=e.RV6();e.j41(0,"ion-fab",39),e.bIt("click",function(){e.eBV(m);const t=e.XpG();return e.Njj(t.toggleAiModal())}),e.j41(1,"ion-avatar",40),e.nrm(2,"ion-icon",41),e.k0s()()}}function I(l,T){if(1&l&&(e.j41(0,"div",45)(1,"markdown",46),e.EFF(2),e.k0s()()),2&l){const m=e.XpG().$implicit;e.R7$(2),e.JRh(m.message)}}function D(l,T){if(1&l&&(e.j41(0,"div",47)(1,"markdown",48),e.EFF(2),e.k0s()()),2&l){const m=e.XpG().$implicit;e.R7$(),e.Mz_("id","mk-",m.id,""),e.R7$(),e.JRh(m.message)}}function N(l,T){if(1&l&&(e.j41(0,"div",42),e.DNE(1,I,3,1,"div",43)(2,D,3,3,"div",44),e.k0s()),2&l){const m=T.$implicit;e.R7$(),e.Y8G("ngIf","User"===m.from),e.R7$(),e.Y8G("ngIf","AI"===m.from)}}const S=[{path:"",component:(()=>{var l;class T{constructor(s,t,n,a,o){this.router=s,this.activatedRoute=t,this.loadTestService=n,this.loadingCtrl=a,this.alertCtrl=o,this.productStep="",this.productObjective="",this.orgName="",this.target="",this.description="",this.loadTestResults={},this.totalNumberOfRequests=0,this.statusCodesOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.responseTimeOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.listOfDates=[],this.aiModal=!1,this.message="",this.vertexAI=(0,e.WQX)(R.L9),this.model=(0,R.oc)(this.vertexAI,{model:"gemini-1.5-flash"}),this.chat=this.model.startChat({history:[{role:"user",parts:[{text:"Hola, desde ahora en adelante quiero que seas un modelo experto en Software Quality Assurance y analista de datos, tu nombre es DevProbeAI, nunca lo puedes olvidar"}]},{role:"model",parts:[{text:"Soy un modelo experto en Software Quality Assurance, de igual forma tengo un masterado en anla\xedtica de datos \xbfEn qu\xe9 puedo ayudarte?"}]},{role:"user",parts:[{text:"Gracias, te voy a entregar un json con datos en unos minutos, necesito que lo analices y me des un resumen de los datos, este json contiene datos de un load test,tu analisis tiene que ser detallado, si encuentras inconsistencias en los datos, por favor mencionalas, en caso de que creas que puede haber un problema o que se encuentre el recurso no disponible por favor mencionalo, si encuentras algo interesante, por favor mencionalo, en resumen, necesito un analisis detallado de los datos"}]},{role:"model",parts:[{text:"Claro, env\xedame el json y yo me encargo de analizarlo"}]}]}),this.messages=[],this.hasBeenOpened=!1}ngOnInit(){}ionViewWillEnter(){var s=this;return(0,p.A)(function*(){yield s.showLoading(),s.getParams(),yield s.getHistoryResults().then(()=>{s.plotCodes(),s.totalRequests(),s.responseTime()}),yield s.hideLoading()})()}getParams(){this.activatedRoute.params.subscribe(t=>{this.productObjective=t.productObjective,this.productStep=t.step});const s=JSON.parse(localStorage.getItem("user"));this.orgName=s.orgName,console.log(this.orgName),console.log(this.productObjective),console.log(this.productStep)}sendRequest(){var s=this;return(0,p.A)(function*(){if(yield s.showLoading(),s.target.startsWith("http://")||s.target.startsWith("https://")||s.target.endsWith("/"))return yield s.hideLoading(),void(yield s.showAlert("No http or https is needed, check for slashes at the end of the domain","Please enter a valid host"));yield s.loadTestService.sendLoadTest(s.orgName,s.productObjective,s.productStep,s.target).then(function(){var t=(0,p.A)(function*(n){yield s.hideLoading(),console.log("data",n),n&&(yield s.showAlert("Test sent, please wait a few seconds to GET RESULTS","Success"))});return function(n){return t.apply(this,arguments)}}()),yield s.hideLoading()})()}getHistoryResults(){var s=this;return(0,p.A)(function*(){s.loadTestResults=yield s.loadTestService.getLoadTestHistory(s.orgName,s.productObjective,s.productStep)})()}totalRequests(){let s=Object.keys(this.loadTestResults),t={},n=0;for(let a of s){let o=this.loadTestResults[a].aggregate.counters,v=this.loadTestResults[a].date,c=Object.keys(o).filter(y=>y.startsWith("http.responses"));for(let y of c)t[v]||(t[v]={}),t[v][y]=(t[v][y]||0)+o[y]}for(let a of Object.keys(t))n+=t[a]["http.responses"];this.totalNumberOfRequests=n}byCodes(){let s=Object.keys(this.loadTestResults),t={};for(let n of s){let a=this.loadTestResults[n].aggregate.counters,o=this.loadTestResults[n].date.split("-").slice(0,3).join("-"),v=Object.keys(a).filter(c=>c.startsWith("http.codes."));t[o]||(t[o]={});for(let c of v)t[o][c]=(t[o][c]||0)+a[c]}return t=this.ordenarDiccionarioPorFechas(t),console.log("codessss",t),t}normalizarFecha(s){const[t,n,a]=s.split("-").map(c=>parseInt(c,10));return`${t}-${n<10?`0${n}`:n.toString()}-${a<10?`0${a}`:a.toString()}`}ordenarDiccionarioPorFechas(s){const n=Object.keys(s).sort((o,v)=>{const c=new Date(this.normalizarFecha(o)),y=new Date(this.normalizarFecha(v));return c.getTime()-y.getTime()}),a={};return n.forEach(o=>{a[o]=s[o]}),a}plotCodes(){var s=this;return(0,p.A)(function*(){let t=s.byCodes();console.log(t);let n=Object.keys(t);s.listOfDates=n;let a=new Set;for(let y of n){let i=Object.keys(t[y]);for(let r of i)a.add(r)}let o={};for(let y in t){let h=t[y];for(let i of a)o[i]||(o[i]=[]),o[i].push(h[i]||0)}let v=["#36b311","#306fc6","#ed3b3b","#f4ba20"];for(let y in o){let i,h=y.split(".").pop();null!=h&&h.startsWith("2")&&(i=v[0]),null!=h&&h.startsWith("3")&&(i=v[1]),null!=h&&h.startsWith("4")&&(i=v[2]),null!=h&&h.startsWith("5")&&(i=v[3]),i||(i="#000000"),s.statusCodesOptions.series.push({name:y,type:"line",data:o[y],lineStyle:{color:i},itemStyle:{color:i}})}s.statusCodesOptions.xAxis={type:"category",boundaryGap:!1,data:n},s.statusCodesOptions={...s.statusCodesOptions};let c=document.getElementById("httpCodesChart");console.log(c),c.style.width="100%",c.style.height="25em"})()}responseTime(){let s=Object.keys(this.loadTestResults),t={};for(let i of s){let r=this.loadTestResults[i].aggregate.histograms,C=this.loadTestResults[i].date,f=Object.keys(r).filter(k=>k.startsWith("http.response_time"));for(let k of f)t[C]=r[k]}let n=Object.entries(t).reduce((i,[r,C])=>{const f=r.split("-").slice(0,3).join("-");return i[f]=i[f]||[],i[f].push(C),i},{}),a=Object.keys(n).sort((i,r)=>new Date(i).getTime()-new Date(r).getTime()),o={count:0,max:0,min:0,mean:0,median:0,p50:0,p90:0,p95:0,p99:0,p999:0},v={};a.forEach(i=>{let r={count:0,max:0,min:0,mean:0,median:0,p50:0,p90:0,p95:0,p99:0,p999:0},C=0;n[i].forEach(f=>{r.count+=f.count,r.max+=f.max,r.min+=f.min,r.mean+=f.mean,r.median+=f.median,r.p50+=f.p50,r.p90+=f.p90,r.p95+=f.p95,r.p99+=f.p99,r.p999+=f.p999,C++});for(let f in r)"count"!==f&&C>0&&(r[f]=r[f]/C);v[i]=r,o.count+=r.count,o.max+=r.max,o.min+=r.min,o.mean+=r.mean,o.median+=r.median,o.p50+=r.p50,o.p90+=r.p90,o.p95+=r.p95,o.p99+=r.p99,o.p999+=r.p999});let c=a.length;c>0&&(o.mean/=c,o.median/=c,o.p50/=c,o.p90/=c,o.p95/=c,o.p99/=c,o.p999/=c,o.max/=c,o.min/=c);let y={};for(let i in o)"count"===i||"p90"===i||"p50"===i||"p999"===i||(y[i]=o[i],this.responseTimeOptions.series.push({name:i,type:"bar",data:[o[i]],label:{show:!0,formatter:r=>`${r.value.toFixed(2)} ms`}}));this.responseTimeOptions.xAxis={type:"category",boundaryGap:!1,data:["Category"]},this.responseTimeOptions={...this.responseTimeOptions};let h=document.getElementById("httpResponseTimeChart");return console.log(h),h.style.width="100%",h.style.height="25em",y}showLoading(){var s=this;return(0,p.A)(function*(){yield(yield s.loadingCtrl.create({})).present()})()}hideLoading(){var s=this;return(0,p.A)(function*(){yield s.loadingCtrl.dismiss()})()}showAlert(s,t){var n=this;return(0,p.A)(function*(){const a=yield n.alertCtrl.create({header:t,message:s,buttons:["OK"]});return yield a.present(),yield a.onDidDismiss(),!0})()}viewHistory(s){this.router.navigate(["/load-test-history",{productObjective:this.productObjective,productStep:this.productStep,day:s}])}toggleAiModal(s){var t=this;return(0,p.A)(function*(){if(yield t.showLoading(),t.aiModal=!t.aiModal,t.hasBeenOpened=!0,"httpCodesOptions"===s&&(t.message="En este caso el json tiene codigos de respuesta HTTP, por ejemplo, 404, 500, etc y cuantos requests devolvieron esos codigos:"+JSON.stringify(t.byCodes())),"httpResponseTimeOptions"===s&&(t.message="En este caso el json tiene tiempos de respuesta de los requests, por ejemplo, 500ms, 1000ms, etc: "+JSON.stringify(t.responseTime())),""===t.message)return console.log("Message is empty"),void(yield t.hideLoading());let n=t.messages.length;n>0&&t.messages.push({message:t.message,from:"User",id:n.toString()});const a=yield t.chat.sendMessage(t.message);n=t.messages.length,t.messages.push({message:a.response.text(),from:"AI",id:n.toString()}),t.message="",yield t.hideLoading()})()}sendMessage(){var s=this;let t=this.messages.length;this.messages.push({message:this.message,from:"User",id:t.toString()}),this.chat.sendMessage(this.message).then(function(){var n=(0,p.A)(function*(a){yield s.showLoading(),t=s.messages.length,s.messages.push({message:a.response.text(),from:"AI",id:t.toString()}),yield s.hideLoading()});return function(a){return n.apply(this,arguments)}}()),this.message=""}}return(l=T).\u0275fac=function(s){return new(s||l)(e.rXU(b.Ix),e.rXU(b.nX),e.rXU(_.s),e.rXU(d.Xi),e.rXU(d.hG))},l.\u0275cmp=e.VBU({type:l,selectors:[["app-load-test"]],viewQuery:function(s,t){if(1&s&&e.GBs(E,5),2&s){let n;e.mGM(n=e.lsd())&&(t.messagesContainer=n.first)}},decls:71,vars:18,consts:[["messagesContainer",""],[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12"],["label","Target","placeholder","Enter a target","type","text","labelPlacement","stacked",1,"",3,"ngModelChange","ngModel"],["size","12","size-md","12","size-lg","12",1,"flex","flex-row","justify-end"],["color","primary","size","small",1,"",3,"click"],["name","add"],[1,"w-full","p-6","flex","flex-col","justify-center","items-center"],[1,"text-3xl"],[1,"text-2xl","text-white"],["size","12",1,"relative","flex","flex-row","justify-center"],[1,"absolute","z-10","w-full","flex","flex-row","justify-end"],[1,"h-12","w-12","bg-purple-400","p-2",3,"click"],["name","color-wand-outline",1,"w-full","h-full"],[1,"h-[25em]","w-full"],["id","httpCodesChart","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["id","httpResponseTimeChart","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["size","12",1,"w-full"],[1,"w-full"],["class","w-full",3,"click",4,"ngFor","ngForOf"],["vertical","bottom","horizontal","end","slot","fixed",1,"m-2","z-10"],["id","ai-modal",1,"fixed","bottom-0","right-0","h-full","w-full","bg-black","bg-opacity-60","z-10","r"],[1,"h-full","md:h-3/4","lg:h-3/4","w-full","bg-gray-900","p-4","absolute","right-0","bottom-0","z-50","flex","flex-col","rounded-tl-2xl","rounded-tr-2xl"],[1,"w-full","bg-gray-500","flex","flex-row","justify-center","items-center","p-2","mb-2","rounded-3xl"],[1,"flex","flex-row","p-2","items-center","bg-gray-800","w-full","rounded-3xl","h-full"],[1,"text-white"],[1,"m-2"],[1,"flex","flex-row","justify-center","items-center","bg-gray-800","hover:bg-gray-600","w-1/6","h-full","rounded-3xl",3,"click"],["name","close-outline"],[1,"flex-grow","overflow-y-auto","bg-gray-400","p-2","rounded-3xl"],["class","flex flex-col",4,"ngFor","ngForOf"],[1,"flex","flex-row","mt-2","p-2"],["placeholder","Ask...",1,"flex-grow","bg-gray-700","rounded-2xl",3,"ngModelChange","ngModel"],[1,"m-1"],[1,"w-1/3","bg-gray-500","rounded-3xl","flex","flex-row","justify-center","items-center","hover:bg-gray-300",3,"click"],[1,"w-full",3,"click"],["name","arrow-forward","color","primary"],["vertical","bottom","horizontal","end","slot","fixed",1,"m-2","z-10",3,"click"],[1,"bg-purple-300","p-1","lg:p-4","md:p-4"],["name","chatbubble-outline",1,"w-full","h-full"],[1,"flex","flex-col"],["class","rounded-3xl bg-gray-800 w-2/3 m-1 ml-auto p-2",4,"ngIf"],["class","rounded-3xl bg-gray-500 w-2/3 m-1 p-2 pr-2",4,"ngIf"],[1,"rounded-3xl","bg-gray-800","w-2/3","m-1","ml-auto","p-2"],[1,"text-white","p-4","m-2"],[1,"rounded-3xl","bg-gray-500","w-2/3","m-1","p-2","pr-2"],[1,"text-white","p-4","m-2",3,"id"]],template:function(s,t){if(1&s){const n=e.RV6();e.nrm(0,"app-header-return",1),e.j41(1,"ion-content",2)(2,"ion-grid"),e.nrm(3,"app-title",1),e.j41(4,"ion-row",3)(5,"ion-col",4)(6,"ion-card")(7,"ion-card-content")(8,"ion-input",5),e.mxI("ngModelChange",function(o){return e.eBV(n),e.DH7(t.target,o)||(t.target=o),e.Njj(o)}),e.k0s()()()()(),e.j41(9,"ion-row",3)(10,"ion-col",6)(11,"ion-button",7),e.bIt("click",function(){return e.eBV(n),e.Njj(t.sendRequest())}),e.EFF(12,"Load Target "),e.nrm(13,"ion-icon",8),e.k0s()()(),e.nrm(14,"app-title",1),e.j41(15,"ion-row",3)(16,"ion-col",4)(17,"ion-card",9)(18,"ion-card-header")(19,"ion-card-title",10),e.EFF(20,"Total Number of Requests"),e.k0s()(),e.j41(21,"ion-card-content")(22,"h1",11),e.EFF(23),e.nI1(24,"number"),e.k0s()()()()(),e.j41(25,"ion-row",3)(26,"ion-col",12)(27,"div",13)(28,"ion-avatar",14),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal("httpCodesOptions"))}),e.nrm(29,"ion-icon",15),e.k0s()(),e.j41(30,"ion-card",9)(31,"ion-card-header")(32,"ion-card-title",10),e.EFF(33,"HTTP Status Codes"),e.k0s()(),e.j41(34,"ion-card-content",16),e.nrm(35,"div",17),e.k0s()()()(),e.j41(36,"ion-row",3)(37,"ion-col",12)(38,"div",13)(39,"ion-avatar",14),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal("httpResponseTimeOptions"))}),e.nrm(40,"ion-icon",15),e.k0s()(),e.j41(41,"ion-card",9)(42,"ion-card-header")(43,"ion-card-title",10),e.EFF(44,"HTTP Response Time"),e.k0s()(),e.j41(45,"ion-card-content",16),e.nrm(46,"div",18),e.k0s()()()(),e.nrm(47,"app-title",1),e.j41(48,"ion-row",3)(49,"ion-col",19)(50,"ion-list",20),e.DNE(51,A,4,1,"ion-item",21),e.k0s()()()(),e.DNE(52,F,3,0,"ion-fab",22),e.k0s(),e.j41(53,"div",23)(54,"div",24)(55,"div",25)(56,"div",26)(57,"h1",27),e.EFF(58,"DevProbe AI"),e.k0s()(),e.nrm(59,"div",28),e.j41(60,"div",29),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal())}),e.nrm(61,"ion-icon",30),e.k0s()(),e.j41(62,"div",31,0),e.DNE(64,N,3,2,"div",32),e.k0s(),e.j41(65,"div",33)(66,"ion-textarea",34),e.mxI("ngModelChange",function(o){return e.eBV(n),e.DH7(t.message,o)||(t.message=o),e.Njj(o)}),e.k0s(),e.nrm(67,"div",35),e.j41(68,"div",36),e.bIt("click",function(){return e.eBV(n),e.Njj(t.sendMessage())}),e.j41(69,"span",27),e.EFF(70,"Send"),e.k0s()()()()()}2&s&&(e.Y8G("title","Load Test For "+t.productStep),e.R7$(),e.Y8G("fullscreen",!0),e.R7$(2),e.Y8G("title","New Load Test"),e.R7$(5),e.R50("ngModel",t.target),e.R7$(6),e.Y8G("title","Analytics For "+t.productStep),e.R7$(9),e.JRh(e.i5U(24,15,t.totalNumberOfRequests,"1.0-0")),e.R7$(12),e.Y8G("options",t.statusCodesOptions),e.R7$(11),e.Y8G("options",t.responseTimeOptions),e.R7$(),e.Y8G("title","Results for date: "),e.R7$(4),e.Y8G("ngForOf",t.listOfDates),e.R7$(),e.vxM(52,t.hasBeenOpened?52:-1),e.R7$(),e.AVh("hidden",!t.aiModal),e.R7$(11),e.Y8G("ngForOf",t.messages),e.R7$(2),e.R50("ngModel",t.message))},dependencies:[g.Sq,g.bT,j.BC,j.vS,d.mC,d.Jm,d.b_,d.I9,d.ME,d.tN,d.hU,d.W9,d.Q8,d.lO,d.iq,d.$w,d.uz,d.he,d.nf,d.ln,d.nc,d.Gw,O.W,M.p,P.$P,L.NN,g.QX]}),T})()}];let $=(()=>{var l;class T{}return(l=T).\u0275fac=function(s){return new(s||l)},l.\u0275mod=e.$C({type:l}),l.\u0275inj=e.G2t({imports:[b.iI.forChild(S),b.iI]}),T})();var G=u(5553);let B=(()=>{var l;class T{}return(l=T).\u0275fac=function(s){return new(s||l)},l.\u0275mod=e.$C({type:l}),l.\u0275inj=e.G2t({imports:[g.MD,j.YN,d.bv,$,G.h,L.NN]}),T})()}}]); \ No newline at end of file diff --git a/www/4559.893444f9e022cfc0.js b/www/4559.893444f9e022cfc0.js deleted file mode 100644 index 98cd79d..0000000 --- a/www/4559.893444f9e022cfc0.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkapp=self.webpackChunkapp||[]).push([[4559],{5553:(w,k,u)=>{u.d(k,{h:()=>_});var p=u(177),b=u(7863),d=u(4438);let _=(()=>{var m;class e{}return(m=e).\u0275fac=function(j){return new(j||m)},m.\u0275mod=d.$C({type:m}),m.\u0275inj=d.G2t({imports:[p.MD,b.bv]}),e})()},3241:(w,k,u)=>{u.d(k,{p:()=>_});var p=u(4438),b=u(177),d=u(7863);let _=(()=>{var m;class e{constructor(j){this.location=j,this.title="Header Title"}ngOnInit(){}goBack(){this.location.back()}}return(m=e).\u0275fac=function(j){return new(j||m)(p.rXU(b.aZ))},m.\u0275cmp=p.VBU({type:m,selectors:[["app-header-return"]],inputs:{title:"title"},decls:6,vars:2,consts:[[3,"translucent"],["slot","start","menu","menu-id"],["name","arrow-back","slot","start",1,"p-4","bigger-icon",3,"click"]],template:function(j,O){1&j&&(p.j41(0,"ion-header",0)(1,"ion-toolbar"),p.nrm(2,"ion-menu-button",1),p.j41(3,"ion-icon",2),p.bIt("click",function(){return O.goBack()}),p.k0s(),p.j41(4,"ion-title"),p.EFF(5),p.k0s()()()),2&j&&(p.Y8G("translucent",!0),p.R7$(5),p.JRh(O.title))},dependencies:[d.eU,d.iq,d.MC,d.BC,d.ai],styles:[".bigger-icon[_ngcontent-%COMP%]{font-size:1.5em}"]}),e})()},4559:(w,k,u)=>{u.r(k),u.d(k,{LoadTestPageModule:()=>G});var p=u(177),b=u(4341),d=u(7863),_=u(7650),m=u(467),e=u(4438),R=u(9032),j=u(4970),O=u(8453),M=u(3241),L=u(2820),P=u(9549);const E=["messagesContainer"];function A(l,T){if(1&l){const f=e.RV6();e.j41(0,"ion-item",39),e.bIt("click",function(){const t=e.eBV(f).$implicit,n=e.XpG();return e.Njj(n.viewHistory(t))}),e.j41(1,"ion-label"),e.EFF(2),e.k0s(),e.nrm(3,"ion-icon",40),e.k0s()}if(2&l){const f=T.$implicit;e.R7$(2),e.JRh(f)}}function F(l,T){if(1&l&&(e.j41(0,"div",44)(1,"markdown",45),e.EFF(2),e.k0s()()),2&l){const f=e.XpG().$implicit;e.R7$(2),e.JRh(f.message)}}function I(l,T){if(1&l&&(e.j41(0,"div",46)(1,"markdown",47),e.EFF(2),e.k0s()()),2&l){const f=e.XpG().$implicit;e.R7$(),e.Mz_("id","mk-",f.id,""),e.R7$(),e.JRh(f.message)}}function D(l,T){if(1&l&&(e.j41(0,"div",41),e.DNE(1,F,3,1,"div",42)(2,I,3,3,"div",43),e.k0s()),2&l){const f=T.$implicit;e.R7$(),e.Y8G("ngIf","User"===f.from),e.R7$(),e.Y8G("ngIf","AI"===f.from)}}const N=[{path:"",component:(()=>{var l;class T{constructor(s,t,n,i,o){this.router=s,this.activatedRoute=t,this.loadTestService=n,this.loadingCtrl=i,this.alertCtrl=o,this.productStep="",this.productObjective="",this.orgName="",this.target="",this.description="",this.loadTestResults={},this.totalNumberOfRequests=0,this.statusCodesOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.responseTimeOptions={tooltip:{trigger:"axis"},xAxis:{type:"category",boundaryGap:!1,data:[]},yAxis:{type:"value"},series:[]},this.listOfDates=[],this.aiModal=!1,this.message="",this.vertexAI=(0,e.WQX)(R.L9),this.model=(0,R.oc)(this.vertexAI,{model:"gemini-1.5-flash"}),this.chat=this.model.startChat({history:[{role:"user",parts:[{text:"Hola, desde ahora en adelante quiero que seas un modelo experto en Software Quality Assurance y analista de datos, tu nombre es DevProbeAI, nunca lo puedes olvidar"}]},{role:"model",parts:[{text:"Soy un modelo experto en Software Quality Assurance, de igual forma tengo un masterado en anla\xedtica de datos \xbfEn qu\xe9 puedo ayudarte?"}]},{role:"user",parts:[{text:"Gracias, te voy a entregar un json con datos en unos minutos, necesito que lo analices y me des un resumen de los datos, este json contiene datos de un load test,tu analisis tiene que ser detallado, si encuentras inconsistencias en los datos, por favor mencionalas, en caso de que creas que puede haber un problema o que se encuentre el recurso no disponible por favor mencionalo, si encuentras algo interesante, por favor mencionalo, en resumen, necesito un analisis detallado de los datos"}]},{role:"model",parts:[{text:"Claro, env\xedame el json y yo me encargo de analizarlo"}]}]}),this.messages=[]}ngOnInit(){}ionViewWillEnter(){var s=this;return(0,m.A)(function*(){yield s.showLoading(),s.getParams(),yield s.getHistoryResults().then(()=>{s.plotCodes(),s.totalRequests(),s.responseTime()}),yield s.hideLoading()})()}getParams(){this.activatedRoute.params.subscribe(t=>{this.productObjective=t.productObjective,this.productStep=t.step});const s=JSON.parse(localStorage.getItem("user"));this.orgName=s.orgName,console.log(this.orgName),console.log(this.productObjective),console.log(this.productStep)}sendRequest(){var s=this;return(0,m.A)(function*(){if(yield s.showLoading(),s.target.startsWith("http://")||s.target.startsWith("https://")||s.target.endsWith("/"))return yield s.hideLoading(),void(yield s.showAlert("No http or https is needed, check for slashes at the end of the domain","Please enter a valid host"));yield s.loadTestService.sendLoadTest(s.orgName,s.productObjective,s.productStep,s.target).then(function(){var t=(0,m.A)(function*(n){yield s.hideLoading(),console.log("data",n),n&&(yield s.showAlert("Test sent, please wait a few seconds to GET RESULTS","Success"))});return function(n){return t.apply(this,arguments)}}()),yield s.hideLoading()})()}getHistoryResults(){var s=this;return(0,m.A)(function*(){s.loadTestResults=yield s.loadTestService.getLoadTestHistory(s.orgName,s.productObjective,s.productStep)})()}totalRequests(){let s=Object.keys(this.loadTestResults),t={},n=0;for(let i of s){let o=this.loadTestResults[i].aggregate.counters,v=this.loadTestResults[i].date,c=Object.keys(o).filter(y=>y.startsWith("http.requests"));for(let y of c)t[v]||(t[v]={}),t[v][y]=(t[v][y]||0)+o[y]}for(let i of Object.keys(t))n+=t[i]["http.requests"];this.totalNumberOfRequests=n}byCodes(){let s=Object.keys(this.loadTestResults),t={};for(let n of s){let i=this.loadTestResults[n].aggregate.counters,o=this.loadTestResults[n].date.split("-").slice(0,3).join("-"),v=Object.keys(i).filter(c=>c.startsWith("http.codes."));t[o]||(t[o]={});for(let c of v)t[o][c]=(t[o][c]||0)+i[c]}return t=this.ordenarDiccionarioPorFechas(t),console.log("codessss",t),t}normalizarFecha(s){const[t,n,i]=s.split("-").map(c=>parseInt(c,10));return`${t}-${n<10?`0${n}`:n.toString()}-${i<10?`0${i}`:i.toString()}`}ordenarDiccionarioPorFechas(s){const n=Object.keys(s).sort((o,v)=>{const c=new Date(this.normalizarFecha(o)),y=new Date(this.normalizarFecha(v));return c.getTime()-y.getTime()}),i={};return n.forEach(o=>{i[o]=s[o]}),i}plotCodes(){var s=this;return(0,m.A)(function*(){let t=s.byCodes();console.log(t);let n=Object.keys(t);s.listOfDates=n;let i=new Set;for(let y of n){let a=Object.keys(t[y]);for(let r of a)i.add(r)}let o={};for(let y in t){let g=t[y];for(let a of i)o[a]||(o[a]=[]),o[a].push(g[a]||0)}let v=["#36b311","#306fc6","#ed3b3b","#f4ba20"];for(let y in o){let a,g=y.split(".").pop();null!=g&&g.startsWith("2")&&(a=v[0]),null!=g&&g.startsWith("3")&&(a=v[1]),null!=g&&g.startsWith("4")&&(a=v[2]),null!=g&&g.startsWith("5")&&(a=v[3]),a||(a="#000000"),s.statusCodesOptions.series.push({name:y,type:"line",data:o[y],lineStyle:{color:a},itemStyle:{color:a}})}s.statusCodesOptions.xAxis={type:"category",boundaryGap:!1,data:n},s.statusCodesOptions={...s.statusCodesOptions};let c=document.getElementById("httpCodesChart");console.log(c),c.style.width="100%",c.style.height="25em"})()}responseTime(){let s=Object.keys(this.loadTestResults),t={};for(let a of s){let r=this.loadTestResults[a].aggregate.histograms,C=this.loadTestResults[a].date,h=Object.keys(r).filter(x=>x.startsWith("http.response_time"));for(let x of h)t[C]=r[x]}let n=Object.entries(t).reduce((a,[r,C])=>{const h=r.split("-").slice(0,3).join("-");return a[h]=a[h]||[],a[h].push(C),a},{}),i=Object.keys(n).sort((a,r)=>new Date(a).getTime()-new Date(r).getTime()),o={count:0,max:0,min:0,mean:0,median:0,p50:0,p90:0,p95:0,p99:0,p999:0},v={};i.forEach(a=>{let r={count:0,max:0,min:0,mean:0,median:0,p50:0,p90:0,p95:0,p99:0,p999:0},C=0;n[a].forEach(h=>{r.count+=h.count,r.max+=h.max,r.min+=h.min,r.mean+=h.mean,r.median+=h.median,r.p50+=h.p50,r.p90+=h.p90,r.p95+=h.p95,r.p99+=h.p99,r.p999+=h.p999,C++});for(let h in r)"count"!==h&&C>0&&(r[h]=r[h]/C);v[a]=r,o.count+=r.count,o.max+=r.max,o.min+=r.min,o.mean+=r.mean,o.median+=r.median,o.p50+=r.p50,o.p90+=r.p90,o.p95+=r.p95,o.p99+=r.p99,o.p999+=r.p999});let c=i.length;c>0&&(o.mean/=c,o.median/=c,o.p50/=c,o.p90/=c,o.p95/=c,o.p99/=c,o.p999/=c,o.max/=c,o.min/=c);let y={};for(let a in o)"count"===a||"p90"===a||"p50"===a||"p999"===a||(y[a]=o[a],this.responseTimeOptions.series.push({name:a,type:"bar",data:[o[a]],label:{show:!0,formatter:r=>`${r.value.toFixed(2)} ms`}}));this.responseTimeOptions.xAxis={type:"category",boundaryGap:!1,data:["Category"]},this.responseTimeOptions={...this.responseTimeOptions};let g=document.getElementById("httpResponseTimeChart");return console.log(g),g.style.width="100%",g.style.height="25em",y}showLoading(){var s=this;return(0,m.A)(function*(){yield(yield s.loadingCtrl.create({})).present()})()}hideLoading(){var s=this;return(0,m.A)(function*(){yield s.loadingCtrl.dismiss()})()}showAlert(s,t){var n=this;return(0,m.A)(function*(){const i=yield n.alertCtrl.create({header:t,message:s,buttons:["OK"]});return yield i.present(),yield i.onDidDismiss(),!0})()}viewHistory(s){this.router.navigate(["/load-test-history",{productObjective:this.productObjective,productStep:this.productStep,day:s}])}toggleAiModal(s){var t=this;return(0,m.A)(function*(){if(t.aiModal=!t.aiModal,"httpCodesOptions"===s&&(t.message="En este caso el json tiene codigos de respuesta HTTP, por ejemplo, 404, 500, etc y cuantos requests devolvieron esos codigos:"+JSON.stringify(t.byCodes())),"httpResponseTimeOptions"===s&&(t.message="En este caso el json tiene tiempos de respuesta de los requests, por ejemplo, 500ms, 1000ms, etc: "+JSON.stringify(t.responseTime())),""===t.message)return void console.log("Message is empty");let n=t.messages.length;n>0&&t.messages.push({message:t.message,from:"User",id:n.toString()});const i=yield t.chat.sendMessage(t.message);n=t.messages.length,t.messages.push({message:i.response.text(),from:"AI",id:n.toString()}),t.message=""})()}sendMessage(){let s=this.messages.length;this.messages.push({message:this.message,from:"User",id:s.toString()}),this.chat.sendMessage(this.message).then(t=>{s=this.messages.length,this.messages.push({message:t.response.text(),from:"AI",id:s.toString()})}),this.message=""}}return(l=T).\u0275fac=function(s){return new(s||l)(e.rXU(_.Ix),e.rXU(_.nX),e.rXU(j.s),e.rXU(d.Xi),e.rXU(d.hG))},l.\u0275cmp=e.VBU({type:l,selectors:[["app-load-test"]],viewQuery:function(s,t){if(1&s&&e.GBs(E,5),2&s){let n;e.mGM(n=e.lsd())&&(t.messagesContainer=n.first)}},decls:73,vars:17,consts:[["messagesContainer",""],[3,"title"],[3,"fullscreen"],[1,"lg:m-10","md:m-10"],["size","12"],["label","Target","placeholder","Enter a target","type","text","labelPlacement","stacked",1,"",3,"ngModelChange","ngModel"],["size","12","size-md","12","size-lg","12",1,"flex","flex-row","justify-end"],["color","primary","size","small",1,"",3,"click"],["name","add"],[1,"w-full","p-6","flex","flex-col","justify-center","items-center"],[1,"text-3xl"],[1,"text-2xl","text-white"],["size","12",1,"relative"],[1,"absolute","z-10","flex","justify-center","items-center","-right-5","-top-5",3,"click"],[1,"bg-purple-600","justify-center","items-center","flex"],["size","large","name","color-wand-outline"],[1,"h-[25em]","w-full"],["id","httpCodesChart","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["id","httpResponseTimeChart","echarts","",1,"demo-chart","h-full","w-full",3,"options"],["size","12",1,"w-full"],[1,"w-full"],["class","w-full",3,"click",4,"ngFor","ngForOf"],["vertical","bottom","horizontal","end","slot","fixed",1,"m-2","z-10",3,"click"],[1,"bg-purple-300","p-4"],["name","chatbubble-outline",1,"w-full","h-full"],["id","ai-modal",1,"fixed","bottom-0","right-0","h-full","w-full","bg-black","bg-opacity-60","z-10","r"],[1,"h-full","md:h-3/4","lg:h-3/4","w-full","bg-gray-900","p-4","absolute","right-0","bottom-0","z-50","flex","flex-col","rounded-tl-2xl","rounded-tr-2xl"],[1,"w-full","bg-gray-500","flex","flex-row","justify-center","items-center","p-2","mb-2","rounded-3xl"],[1,"flex","flex-row","p-2","items-center","bg-gray-800","w-full","rounded-3xl","h-full"],[1,"text-white"],[1,"m-2"],[1,"flex","flex-row","justify-center","items-center","bg-gray-800","hover:bg-gray-600","w-1/6","h-full","rounded-3xl",3,"click"],["name","close-outline"],[1,"flex-grow","overflow-y-auto","bg-gray-400","p-2","rounded-3xl"],["class","flex flex-col",4,"ngFor","ngForOf"],[1,"flex","flex-row","mt-2","p-2"],["placeholder","Ask...",1,"flex-grow","bg-gray-700","rounded-2xl",3,"ngModelChange","ngModel"],[1,"m-1"],[1,"w-1/3","bg-gray-500","rounded-3xl","flex","flex-row","justify-center","items-center","hover:bg-gray-300",3,"click"],[1,"w-full",3,"click"],["name","arrow-forward","color","primary"],[1,"flex","flex-col"],["class","rounded-3xl bg-gray-800 w-2/3 m-1 ml-auto p-2",4,"ngIf"],["class","rounded-3xl bg-gray-500 w-2/3 m-1 p-2 pr-2",4,"ngIf"],[1,"rounded-3xl","bg-gray-800","w-2/3","m-1","ml-auto","p-2"],[1,"text-white","p-4","m-2"],[1,"rounded-3xl","bg-gray-500","w-2/3","m-1","p-2","pr-2"],[1,"text-white","p-4","m-2",3,"id"]],template:function(s,t){if(1&s){const n=e.RV6();e.nrm(0,"app-header-return",1),e.j41(1,"ion-content",2)(2,"ion-grid"),e.nrm(3,"app-title",1),e.j41(4,"ion-row",3)(5,"ion-col",4)(6,"ion-card")(7,"ion-card-content")(8,"ion-input",5),e.mxI("ngModelChange",function(o){return e.eBV(n),e.DH7(t.target,o)||(t.target=o),e.Njj(o)}),e.k0s()()()()(),e.j41(9,"ion-row",3)(10,"ion-col",6)(11,"ion-button",7),e.bIt("click",function(){return e.eBV(n),e.Njj(t.sendRequest())}),e.EFF(12,"Load Target "),e.nrm(13,"ion-icon",8),e.k0s()()(),e.nrm(14,"app-title",1),e.j41(15,"ion-row",3)(16,"ion-col",4)(17,"ion-card",9)(18,"ion-card-header")(19,"ion-card-title",10),e.EFF(20,"Total Number of Requests"),e.k0s()(),e.j41(21,"ion-card-content")(22,"h1",11),e.EFF(23),e.nI1(24,"number"),e.k0s()()()()(),e.j41(25,"ion-row",3)(26,"ion-col",12)(27,"div",13),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal("httpCodesOptions"))}),e.j41(28,"ion-avatar",14),e.nrm(29,"ion-icon",15),e.k0s()(),e.j41(30,"ion-card",9)(31,"ion-card-header")(32,"ion-card-title",10),e.EFF(33,"HTTP Status Codes"),e.k0s()(),e.j41(34,"ion-card-content",16),e.nrm(35,"div",17),e.k0s()()()(),e.j41(36,"ion-row",3)(37,"ion-col",12)(38,"div",13),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal("httpResponseTimeOptions"))}),e.j41(39,"ion-avatar",14),e.nrm(40,"ion-icon",15),e.k0s()(),e.j41(41,"ion-card",9)(42,"ion-card-header")(43,"ion-card-title",10),e.EFF(44,"HTTP Response Time"),e.k0s()(),e.j41(45,"ion-card-content",16),e.nrm(46,"div",18),e.k0s()()()(),e.nrm(47,"app-title",1),e.j41(48,"ion-row",3)(49,"ion-col",19)(50,"ion-list",20),e.DNE(51,A,4,1,"ion-item",21),e.k0s()()()(),e.j41(52,"ion-fab",22),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal())}),e.j41(53,"ion-avatar",23),e.nrm(54,"ion-icon",24),e.k0s()()(),e.j41(55,"div",25)(56,"div",26)(57,"div",27)(58,"div",28)(59,"h1",29),e.EFF(60,"DevProbe AI"),e.k0s()(),e.nrm(61,"div",30),e.j41(62,"div",31),e.bIt("click",function(){return e.eBV(n),e.Njj(t.toggleAiModal())}),e.nrm(63,"ion-icon",32),e.k0s()(),e.j41(64,"div",33,0),e.DNE(66,D,3,2,"div",34),e.k0s(),e.j41(67,"div",35)(68,"ion-textarea",36),e.mxI("ngModelChange",function(o){return e.eBV(n),e.DH7(t.message,o)||(t.message=o),e.Njj(o)}),e.k0s(),e.nrm(69,"div",37),e.j41(70,"div",38),e.bIt("click",function(){return e.eBV(n),e.Njj(t.sendMessage())}),e.j41(71,"span",29),e.EFF(72,"Send"),e.k0s()()()()()}2&s&&(e.Y8G("title","Load Test For "+t.productStep),e.R7$(),e.Y8G("fullscreen",!0),e.R7$(2),e.Y8G("title","New Load Test"),e.R7$(5),e.R50("ngModel",t.target),e.R7$(6),e.Y8G("title","Analytics For "+t.productStep),e.R7$(9),e.JRh(e.i5U(24,14,t.totalNumberOfRequests,"1.0-0")),e.R7$(12),e.Y8G("options",t.statusCodesOptions),e.R7$(11),e.Y8G("options",t.responseTimeOptions),e.R7$(),e.Y8G("title","Results for date: "),e.R7$(4),e.Y8G("ngForOf",t.listOfDates),e.R7$(4),e.AVh("hidden",!t.aiModal),e.R7$(11),e.Y8G("ngForOf",t.messages),e.R7$(2),e.R50("ngModel",t.message))},dependencies:[p.Sq,p.bT,b.BC,b.vS,d.mC,d.Jm,d.b_,d.I9,d.ME,d.tN,d.hU,d.W9,d.Q8,d.lO,d.iq,d.$w,d.uz,d.he,d.nf,d.ln,d.nc,d.Gw,O.W,M.p,L.$P,P.NN,p.QX]}),T})()}];let S=(()=>{var l;class T{}return(l=T).\u0275fac=function(s){return new(s||l)},l.\u0275mod=e.$C({type:l}),l.\u0275inj=e.G2t({imports:[_.iI.forChild(N),_.iI]}),T})();var $=u(5553);let G=(()=>{var l;class T{}return(l=T).\u0275fac=function(s){return new(s||l)},l.\u0275mod=e.$C({type:l}),l.\u0275inj=e.G2t({imports:[p.MD,b.YN,d.bv,S,$.h,P.NN]}),T})()}}]); \ No newline at end of file diff --git a/www/index.html b/www/index.html index 1c43cbc..07d7218 100644 --- a/www/index.html +++ b/www/index.html @@ -17,10 +17,10 @@ - + - + diff --git a/www/runtime.eb3737bff0a50111.js b/www/runtime.615e791cd0faaacf.js similarity index 97% rename from www/runtime.eb3737bff0a50111.js rename to www/runtime.615e791cd0faaacf.js index ef26ae9..d2f8a4c 100644 --- a/www/runtime.eb3737bff0a50111.js +++ b/www/runtime.615e791cd0faaacf.js @@ -1 +1 @@ -(()=>{"use strict";var e,v={},g={};function f(e){var t=g[e];if(void 0!==t)return t.exports;var a=g[e]={exports:{}};return v[e].call(a.exports,a,a.exports,f),a.exports}f.m=v,e=[],f.O=(t,a,d,b)=>{if(!a){var c=1/0;for(r=0;r=b)&&Object.keys(f.O).every(p=>f.O[p](a[n]))?a.splice(n--,1):(l=!1,b0&&e[r-1][2]>b;r--)e[r]=e[r-1];e[r]=[a,d,b]},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},(()=>{var t,e=Object.getPrototypeOf?a=>Object.getPrototypeOf(a):a=>a.__proto__;f.t=function(a,d){if(1&d&&(a=this(a)),8&d||"object"==typeof a&&a&&(4&d&&a.__esModule||16&d&&"function"==typeof a.then))return a;var b=Object.create(null);f.r(b);var r={};t=t||[null,e({}),e([]),e(e)];for(var c=2&d&&a;"object"==typeof c&&!~t.indexOf(c);c=e(c))Object.getOwnPropertyNames(c).forEach(l=>r[l]=()=>a[l]);return r.default=()=>a,f.d(b,r),b}})(),f.d=(e,t)=>{for(var a in t)f.o(t,a)&&!f.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce((t,a)=>(f.f[a](e,t),t),[])),f.u=e=>(({2076:"common",7278:"polyfills-dom",9329:"polyfills-core-js"}[e]||e)+"."+{441:"c8d135e5d56e5723",839:"283ada25cfa51ac0",964:"466b88054b5c618c",1010:"1b7d4731c58dd6ba",1015:"3d449385ac057e7f",1049:"7ef232095c56e4df",1081:"724852e553670d61",1102:"010dfe13f6ca7e15",1143:"b164be066fa92bd6",1293:"ee80f2d33790618d",1313:"46ae0a0d0e94f2f8",1459:"32c41a59c0fd4cf1",1577:"0604cac29dd79422",2075:"1971ba880d06cc30",2076:"d9f0bff8bd5e1759",2144:"5d46fa3641b801f2",2348:"12b471577685ffbe",2375:"efb0d99d1467ed67",2415:"dddee43f1c9b92e7",2494:"167cdb5e4cc4b3b7",2560:"f34ba2c5e85b55c8",2757:"83b4060f3177be94",2885:"d64fa10bd441cbc8",3100:"be59eccfa5c9316f",3162:"825364e1635b086f",3451:"5cb648a56743fe4c",3506:"899dcc5e5d913023",3511:"16739e7034875331",3646:"554cb7eb2d8d0ce0",3814:"aed692045b27c466",4163:"dd6bee594e4d801a",4171:"f5bc55c1acb0f5c1",4183:"0d54a4cc8cbc3a61",4304:"1ee0ef2bdf588c3d",4348:"16e6409072fc8e11",4406:"03b087c2d77cb960",4443:"74ec71e1102d5a82",4463:"ce74c63a27a7a872",4559:"893444f9e022cfc0",4591:"7a48c0cf9464e62b",4699:"01733b3942afbe92",4839:"1358f2425ffb5332",4867:"17817bc208c2836c",4914:"52404a177d9d7dd4",5054:"a36f0725f93c0766",5100:"659224ed1f94442c",5197:"38b8cc3181b51450",5222:"9cbea5f62b0fb679",5371:"f8138eed060f579e",5399:"0706ad352f9b7c14",5712:"a9a2db8da6f1a8cd",5887:"708ea3877f30ffcd",5949:"2ed93c457aa1e9fb",5995:"2de4ee42f61961e5",6024:"3c02ab7fe82fedfe",6303:"4ea7e81fd1aa1e01",6433:"91353c3d7c453322",6480:"2d3c5432c242ecc0",6521:"a8a508f41e539cc5",6536:"a4f178f939f2d134",6695:"8ae905fc907dc6ca",6840:"fd32dada9c8ec44e",6975:"6d2e5de0574c6402",7030:"f2a9bf080bedfc5b",7056:"876606fe67c74125",7076:"2b7ea8b1f54f4458",7179:"80391eb100990080",7240:"680a87741a5535b1",7278:"bf542500b6fca113",7356:"911eacb1ce959b5e",7372:"e306385d972d6e2c",7428:"cb325b96b92ea4c2",7720:"78509b154c08b472",7762:"6371eca429bb8376",8066:"67e76a5c3f71f306",8193:"476b12959c4b189d",8314:"52348a57ed623e38",8361:"3d466d853997fbb0",8477:"15dacf21c512c8d4",8566:"52fa7b8c5c22d53f",8584:"94ca33677cedf961",8711:"158e69ebbe7b5f91",8805:"7a687270c4acd743",8814:"4175e28b98837400",8886:"87f743bcbe3c6802",8970:"89f040d889f287fc",8984:"d28cf89bc8592645",9013:"2e347313286de95b",9070:"29b18cc91c088f3f",9273:"16673f4c5278d1b8",9329:"c76198334f717402",9344:"2d668603b6130b28",9456:"0b4cbaf1cbe8b46a",9546:"dd2455bcd410532c",9697:"57e559625e67bb53",9977:"948bf38bed890db4"}[e]+".js"),f.miniCssF=e=>{},f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="app:";f.l=(a,d,b,r)=>{if(e[a])e[a].push(d);else{var c,l;if(void 0!==b)for(var n=document.getElementsByTagName("script"),i=0;i{c.onerror=c.onload=null,clearTimeout(u);var y=e[a];if(delete e[a],c.parentNode&&c.parentNode.removeChild(c),y&&y.forEach(_=>_(p)),m)return m(p)},u=setTimeout(s.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=s.bind(null,c.onerror),c.onload=s.bind(null,c.onload),l&&document.head.appendChild(c)}}})(),f.r=e=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;f.tt=()=>(void 0===e&&(e={createScriptURL:t=>t},typeof trustedTypes<"u"&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),f.tu=e=>f.tt().createScriptURL(e),f.p="",(()=>{var e={9121:0};f.f.j=(d,b)=>{var r=f.o(e,d)?e[d]:void 0;if(0!==r)if(r)b.push(r[2]);else if(9121!=d){var c=new Promise((o,s)=>r=e[d]=[o,s]);b.push(r[2]=c);var l=f.p+f.u(d),n=new Error;f.l(l,o=>{if(f.o(e,d)&&(0!==(r=e[d])&&(e[d]=void 0),r)){var s=o&&("load"===o.type?"missing":o.type),u=o&&o.target&&o.target.src;n.message="Loading chunk "+d+" failed.\n("+s+": "+u+")",n.name="ChunkLoadError",n.type=s,n.request=u,r[1](n)}},"chunk-"+d,d)}else e[d]=0},f.O.j=d=>0===e[d];var t=(d,b)=>{var n,i,[r,c,l]=b,o=0;if(r.some(u=>0!==e[u])){for(n in c)f.o(c,n)&&(f.m[n]=c[n]);if(l)var s=l(f)}for(d&&d(b);o{"use strict";var e,v={},g={};function f(e){var t=g[e];if(void 0!==t)return t.exports;var a=g[e]={exports:{}};return v[e].call(a.exports,a,a.exports,f),a.exports}f.m=v,e=[],f.O=(t,a,d,b)=>{if(!a){var c=1/0;for(r=0;r=b)&&Object.keys(f.O).every(p=>f.O[p](a[n]))?a.splice(n--,1):(l=!1,b0&&e[r-1][2]>b;r--)e[r]=e[r-1];e[r]=[a,d,b]},f.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return f.d(t,{a:t}),t},(()=>{var t,e=Object.getPrototypeOf?a=>Object.getPrototypeOf(a):a=>a.__proto__;f.t=function(a,d){if(1&d&&(a=this(a)),8&d||"object"==typeof a&&a&&(4&d&&a.__esModule||16&d&&"function"==typeof a.then))return a;var b=Object.create(null);f.r(b);var r={};t=t||[null,e({}),e([]),e(e)];for(var c=2&d&&a;"object"==typeof c&&!~t.indexOf(c);c=e(c))Object.getOwnPropertyNames(c).forEach(l=>r[l]=()=>a[l]);return r.default=()=>a,f.d(b,r),b}})(),f.d=(e,t)=>{for(var a in t)f.o(t,a)&&!f.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},f.f={},f.e=e=>Promise.all(Object.keys(f.f).reduce((t,a)=>(f.f[a](e,t),t),[])),f.u=e=>(({2076:"common",7278:"polyfills-dom",9329:"polyfills-core-js"}[e]||e)+"."+{441:"c8d135e5d56e5723",839:"283ada25cfa51ac0",964:"466b88054b5c618c",1010:"1b7d4731c58dd6ba",1015:"3d449385ac057e7f",1049:"7ef232095c56e4df",1081:"724852e553670d61",1102:"010dfe13f6ca7e15",1143:"b164be066fa92bd6",1293:"ee80f2d33790618d",1313:"46ae0a0d0e94f2f8",1459:"32c41a59c0fd4cf1",1577:"0604cac29dd79422",2075:"1971ba880d06cc30",2076:"d9f0bff8bd5e1759",2144:"5d46fa3641b801f2",2348:"12b471577685ffbe",2375:"efb0d99d1467ed67",2415:"dddee43f1c9b92e7",2494:"167cdb5e4cc4b3b7",2560:"f34ba2c5e85b55c8",2757:"83b4060f3177be94",2885:"d64fa10bd441cbc8",3100:"be59eccfa5c9316f",3162:"825364e1635b086f",3451:"5cb648a56743fe4c",3506:"899dcc5e5d913023",3511:"16739e7034875331",3646:"554cb7eb2d8d0ce0",3814:"aed692045b27c466",4163:"dd6bee594e4d801a",4171:"f5bc55c1acb0f5c1",4183:"0d54a4cc8cbc3a61",4304:"5e919bf908d2ac02",4348:"16e6409072fc8e11",4406:"03b087c2d77cb960",4443:"74ec71e1102d5a82",4463:"ce74c63a27a7a872",4559:"303a6d01dbac6106",4591:"7a48c0cf9464e62b",4699:"01733b3942afbe92",4839:"1358f2425ffb5332",4867:"17817bc208c2836c",4914:"52404a177d9d7dd4",5054:"a36f0725f93c0766",5100:"659224ed1f94442c",5197:"38b8cc3181b51450",5222:"9cbea5f62b0fb679",5371:"f8138eed060f579e",5399:"0706ad352f9b7c14",5712:"a9a2db8da6f1a8cd",5887:"708ea3877f30ffcd",5949:"2ed93c457aa1e9fb",5995:"2de4ee42f61961e5",6024:"3c02ab7fe82fedfe",6303:"4ea7e81fd1aa1e01",6433:"91353c3d7c453322",6480:"2d3c5432c242ecc0",6521:"a8a508f41e539cc5",6536:"a4f178f939f2d134",6695:"8ae905fc907dc6ca",6840:"fd32dada9c8ec44e",6975:"6d2e5de0574c6402",7030:"f2a9bf080bedfc5b",7056:"876606fe67c74125",7076:"2b7ea8b1f54f4458",7179:"80391eb100990080",7240:"680a87741a5535b1",7278:"bf542500b6fca113",7356:"911eacb1ce959b5e",7372:"e306385d972d6e2c",7428:"cb325b96b92ea4c2",7720:"78509b154c08b472",7762:"6371eca429bb8376",8066:"67e76a5c3f71f306",8193:"476b12959c4b189d",8314:"52348a57ed623e38",8361:"3d466d853997fbb0",8477:"15dacf21c512c8d4",8566:"52fa7b8c5c22d53f",8584:"94ca33677cedf961",8711:"158e69ebbe7b5f91",8805:"7a687270c4acd743",8814:"4175e28b98837400",8886:"87f743bcbe3c6802",8970:"89f040d889f287fc",8984:"d28cf89bc8592645",9013:"2e347313286de95b",9070:"29b18cc91c088f3f",9273:"16673f4c5278d1b8",9329:"c76198334f717402",9344:"2d668603b6130b28",9456:"0b4cbaf1cbe8b46a",9546:"dd2455bcd410532c",9697:"57e559625e67bb53",9977:"948bf38bed890db4"}[e]+".js"),f.miniCssF=e=>{},f.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={},t="app:";f.l=(a,d,b,r)=>{if(e[a])e[a].push(d);else{var c,l;if(void 0!==b)for(var n=document.getElementsByTagName("script"),i=0;i{c.onerror=c.onload=null,clearTimeout(u);var y=e[a];if(delete e[a],c.parentNode&&c.parentNode.removeChild(c),y&&y.forEach(_=>_(p)),m)return m(p)},u=setTimeout(s.bind(null,void 0,{type:"timeout",target:c}),12e4);c.onerror=s.bind(null,c.onerror),c.onload=s.bind(null,c.onload),l&&document.head.appendChild(c)}}})(),f.r=e=>{typeof Symbol<"u"&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},(()=>{var e;f.tt=()=>(void 0===e&&(e={createScriptURL:t=>t},typeof trustedTypes<"u"&&trustedTypes.createPolicy&&(e=trustedTypes.createPolicy("angular#bundler",e))),e)})(),f.tu=e=>f.tt().createScriptURL(e),f.p="",(()=>{var e={9121:0};f.f.j=(d,b)=>{var r=f.o(e,d)?e[d]:void 0;if(0!==r)if(r)b.push(r[2]);else if(9121!=d){var c=new Promise((o,s)=>r=e[d]=[o,s]);b.push(r[2]=c);var l=f.p+f.u(d),n=new Error;f.l(l,o=>{if(f.o(e,d)&&(0!==(r=e[d])&&(e[d]=void 0),r)){var s=o&&("load"===o.type?"missing":o.type),u=o&&o.target&&o.target.src;n.message="Loading chunk "+d+" failed.\n("+s+": "+u+")",n.name="ChunkLoadError",n.type=s,n.request=u,r[1](n)}},"chunk-"+d,d)}else e[d]=0},f.O.j=d=>0===e[d];var t=(d,b)=>{var n,i,[r,c,l]=b,o=0;if(r.some(u=>0!==e[u])){for(n in c)f.o(c,n)&&(f.m[n]=c[n]);if(l)var s=l(f)}for(d&&d(b);o.ion-page{position:relative;contain:layout style;height:100%}.split-pane-visible>.ion-page.split-pane-main{position:relative}ion-route,ion-route-redirect,ion-router,ion-select-option,ion-nav-controller,ion-menu-controller,ion-action-sheet-controller,ion-alert-controller,ion-loading-controller,ion-modal-controller,ion-picker-controller,ion-popover-controller,ion-toast-controller,.ion-page-hidden{display:none!important}.ion-page-invisible{opacity:0}.can-go-back>ion-header ion-back-button{display:block}html.plt-ios.plt-hybrid,html.plt-ios.plt-pwa{--ion-statusbar-padding: 20px}@supports (padding-top: 20px){html{--ion-safe-area-top: var(--ion-statusbar-padding)}}@supports (padding-top: env(safe-area-inset-top)){html{--ion-safe-area-top: env(safe-area-inset-top);--ion-safe-area-bottom: env(safe-area-inset-bottom);--ion-safe-area-left: env(safe-area-inset-left);--ion-safe-area-right: env(safe-area-inset-right)}}ion-card.ion-color .ion-inherit-color,ion-card-header.ion-color .ion-inherit-color{color:inherit}.menu-content{transform:translateZ(0)}.menu-content-open{cursor:pointer;touch-action:manipulation;pointer-events:none;overflow-y:hidden}.menu-content-open ion-content{--overflow: hidden}.menu-content-open .ion-content-scroll-host{overflow:hidden}.ios .menu-content-reveal{box-shadow:-8px 0 42px #00000014}[dir=rtl].ios .menu-content-reveal{box-shadow:8px 0 42px #00000014}.md .menu-content-reveal,.md .menu-content-push{box-shadow:4px 0 16px #0000002e}ion-accordion-group.accordion-group-expand-inset>ion-accordion:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}ion-accordion-group.accordion-group-expand-inset>ion-accordion:last-of-type{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ion-accordion-group>ion-accordion:last-of-type ion-item[slot=header]{--border-width: 0px}ion-accordion.accordion-animated>[slot=header] .ion-accordion-toggle-icon{transition:.3s transform cubic-bezier(.25,.8,.5,1)}@media (prefers-reduced-motion: reduce){ion-accordion .ion-accordion-toggle-icon{transition:none!important}}ion-accordion.accordion-expanding>[slot=header] .ion-accordion-toggle-icon,ion-accordion.accordion-expanded>[slot=header] .ion-accordion-toggle-icon{transform:rotate(180deg)}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-previous ion-item[slot=header]{--border-width: 0px;--inner-border-width: 0px}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanding:first-of-type,ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanded:first-of-type{margin-top:0}ion-input input::-webkit-date-and-time-value{text-align:start}.ion-datetime-button-overlay{--width: fit-content;--height: fit-content}.ion-datetime-button-overlay ion-datetime.datetime-grid{width:320px;min-height:320px}[ion-last-focus],header[tabindex="-1"]:focus,[role=banner][tabindex="-1"]:focus,main[tabindex="-1"]:focus,[role=main][tabindex="-1"]:focus,h1[tabindex="-1"]:focus,[role=heading][aria-level="1"][tabindex="-1"]:focus{outline:none}.popover-viewport:has(>ion-content){overflow:hidden}@supports not selector(:has(> ion-content)){.popover-viewport{overflow:hidden}}audio,canvas,progress,video{vertical-align:baseline}audio:not([controls]){display:none;height:0}b,strong{font-weight:700}img{max-width:100%}hr{height:1px;border-width:0;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}label,input,select,textarea{font-family:inherit;line-height:normal}textarea{overflow:auto;height:auto;font:inherit;color:inherit}textarea::placeholder{padding-left:2px}form,input,optgroup,select{margin:0;font:inherit;color:inherit}html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}a,a div,a span,a ion-icon,a ion-label,button,button div,button span,button ion-icon,button ion-label,.ion-tappable,[tappable],[tappable] div,[tappable] span,[tappable] ion-icon,[tappable] ion-label,input,textarea{touch-action:manipulation}a ion-label,button ion-label{pointer-events:none}button{padding:0;border:0;border-radius:0;font-family:inherit;font-style:inherit;font-variant:inherit;line-height:1;text-transform:none;cursor:pointer;-webkit-appearance:button}[tappable]{cursor:pointer}a[disabled],button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}html{width:100%;height:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}html:not(.hydrated) body{display:none}html.ion-ce body{display:block}html.plt-pwa{height:100vh}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin:0;padding:0;position:fixed;width:100%;max-width:100%;height:100%;max-height:100%;transform:translateZ(0);text-rendering:optimizeLegibility;overflow:hidden;touch-action:manipulation;-webkit-user-drag:none;-ms-content-zooming:none;word-wrap:break-word;overscroll-behavior-y:none;-webkit-text-size-adjust:none;text-size-adjust:none}html{font-family:var(--ion-font-family)}@supports (-webkit-touch-callout: none){html{font:var(--ion-dynamic-font, 16px var(--ion-font-family))}}a{background-color:transparent;color:var(--ion-color-primary, #0054e9)}h1,h2,h3,h4,h5,h6{margin-top:16px;margin-bottom:10px;font-weight:500;line-height:1.2}h1{margin-top:20px;font-size:1.625rem}h2{margin-top:18px;font-size:1.5rem}h3{font-size:1.375rem}h4{font-size:1.25rem}h5{font-size:1.125rem}h6{font-size:1rem}small{font-size:75%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.ion-hide,.ion-hide-up,.ion-hide-down{display:none!important}@media (min-width: 576px){.ion-hide-sm-up{display:none!important}}@media (max-width: 575.98px){.ion-hide-sm-down{display:none!important}}@media (min-width: 768px){.ion-hide-md-up{display:none!important}}@media (max-width: 767.98px){.ion-hide-md-down{display:none!important}}@media (min-width: 992px){.ion-hide-lg-up{display:none!important}}@media (max-width: 991.98px){.ion-hide-lg-down{display:none!important}}@media (min-width: 1200px){.ion-hide-xl-up{display:none!important}}@media (max-width: 1199.98px){.ion-hide-xl-down{display:none!important}}.ion-no-padding{--padding-start: 0;--padding-end: 0;--padding-top: 0;--padding-bottom: 0;padding:0}.ion-padding{--padding-start: var(--ion-padding, 16px);--padding-end: var(--ion-padding, 16px);--padding-top: var(--ion-padding, 16px);--padding-bottom: var(--ion-padding, 16px);padding-inline-start:var(--ion-padding, 16px);padding-inline-end:var(--ion-padding, 16px);padding-top:var(--ion-padding, 16px);padding-bottom:var(--ion-padding, 16px)}.ion-padding-top{--padding-top: var(--ion-padding, 16px);padding-top:var(--ion-padding, 16px)}.ion-padding-start{--padding-start: var(--ion-padding, 16px);padding-inline-start:var(--ion-padding, 16px)}.ion-padding-end{--padding-end: var(--ion-padding, 16px);padding-inline-end:var(--ion-padding, 16px)}.ion-padding-bottom{--padding-bottom: var(--ion-padding, 16px);padding-bottom:var(--ion-padding, 16px)}.ion-padding-vertical{--padding-top: var(--ion-padding, 16px);--padding-bottom: var(--ion-padding, 16px);padding-top:var(--ion-padding, 16px);padding-bottom:var(--ion-padding, 16px)}.ion-padding-horizontal{--padding-start: var(--ion-padding, 16px);--padding-end: var(--ion-padding, 16px);padding-inline-start:var(--ion-padding, 16px);padding-inline-end:var(--ion-padding, 16px)}.ion-no-margin{--margin-start: 0;--margin-end: 0;--margin-top: 0;--margin-bottom: 0;margin:0}.ion-margin{--margin-start: var(--ion-margin, 16px);--margin-end: var(--ion-margin, 16px);--margin-top: var(--ion-margin, 16px);--margin-bottom: var(--ion-margin, 16px);margin-inline-start:var(--ion-margin, 16px);margin-inline-end:var(--ion-margin, 16px);margin-top:var(--ion-margin, 16px);margin-bottom:var(--ion-margin, 16px)}.ion-margin-top{--margin-top: var(--ion-margin, 16px);margin-top:var(--ion-margin, 16px)}.ion-margin-start{--margin-start: var(--ion-margin, 16px);margin-inline-start:var(--ion-margin, 16px)}.ion-margin-end{--margin-end: var(--ion-margin, 16px);margin-inline-end:var(--ion-margin, 16px)}.ion-margin-bottom{--margin-bottom: var(--ion-margin, 16px);margin-bottom:var(--ion-margin, 16px)}.ion-margin-vertical{--margin-top: var(--ion-margin, 16px);--margin-bottom: var(--ion-margin, 16px);margin-top:var(--ion-margin, 16px);margin-bottom:var(--ion-margin, 16px)}.ion-margin-horizontal{--margin-start: var(--ion-margin, 16px);--margin-end: var(--ion-margin, 16px);margin-inline-start:var(--ion-margin, 16px);margin-inline-end:var(--ion-margin, 16px)}.ion-float-left{float:left!important}.ion-float-right{float:right!important}.ion-float-start{float:left!important}:host-context([dir=rtl]) .ion-float-start{float:right!important}[dir=rtl] .ion-float-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-start:dir(rtl){float:right!important}}.ion-float-end{float:right!important}:host-context([dir=rtl]) .ion-float-end{float:left!important}[dir=rtl] .ion-float-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-end:dir(rtl){float:left!important}}@media (min-width: 576px){.ion-float-sm-left{float:left!important}.ion-float-sm-right{float:right!important}.ion-float-sm-start{float:left!important}:host-context([dir=rtl]) .ion-float-sm-start{float:right!important}[dir=rtl] .ion-float-sm-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-sm-start:dir(rtl){float:right!important}}.ion-float-sm-end{float:right!important}:host-context([dir=rtl]) .ion-float-sm-end{float:left!important}[dir=rtl] .ion-float-sm-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-sm-end:dir(rtl){float:left!important}}}@media (min-width: 768px){.ion-float-md-left{float:left!important}.ion-float-md-right{float:right!important}.ion-float-md-start{float:left!important}:host-context([dir=rtl]) .ion-float-md-start{float:right!important}[dir=rtl] .ion-float-md-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-md-start:dir(rtl){float:right!important}}.ion-float-md-end{float:right!important}:host-context([dir=rtl]) .ion-float-md-end{float:left!important}[dir=rtl] .ion-float-md-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-md-end:dir(rtl){float:left!important}}}@media (min-width: 992px){.ion-float-lg-left{float:left!important}.ion-float-lg-right{float:right!important}.ion-float-lg-start{float:left!important}:host-context([dir=rtl]) .ion-float-lg-start{float:right!important}[dir=rtl] .ion-float-lg-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-lg-start:dir(rtl){float:right!important}}.ion-float-lg-end{float:right!important}:host-context([dir=rtl]) .ion-float-lg-end{float:left!important}[dir=rtl] .ion-float-lg-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-lg-end:dir(rtl){float:left!important}}}@media (min-width: 1200px){.ion-float-xl-left{float:left!important}.ion-float-xl-right{float:right!important}.ion-float-xl-start{float:left!important}:host-context([dir=rtl]) .ion-float-xl-start{float:right!important}[dir=rtl] .ion-float-xl-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-xl-start:dir(rtl){float:right!important}}.ion-float-xl-end{float:right!important}:host-context([dir=rtl]) .ion-float-xl-end{float:left!important}[dir=rtl] .ion-float-xl-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-xl-end:dir(rtl){float:left!important}}}.ion-text-center{text-align:center!important}.ion-text-justify{text-align:justify!important}.ion-text-start{text-align:start!important}.ion-text-end{text-align:end!important}.ion-text-left{text-align:left!important}.ion-text-right{text-align:right!important}.ion-text-nowrap{white-space:nowrap!important}.ion-text-wrap{white-space:normal!important}@media (min-width: 576px){.ion-text-sm-center{text-align:center!important}.ion-text-sm-justify{text-align:justify!important}.ion-text-sm-start{text-align:start!important}.ion-text-sm-end{text-align:end!important}.ion-text-sm-left{text-align:left!important}.ion-text-sm-right{text-align:right!important}.ion-text-sm-nowrap{white-space:nowrap!important}.ion-text-sm-wrap{white-space:normal!important}}@media (min-width: 768px){.ion-text-md-center{text-align:center!important}.ion-text-md-justify{text-align:justify!important}.ion-text-md-start{text-align:start!important}.ion-text-md-end{text-align:end!important}.ion-text-md-left{text-align:left!important}.ion-text-md-right{text-align:right!important}.ion-text-md-nowrap{white-space:nowrap!important}.ion-text-md-wrap{white-space:normal!important}}@media (min-width: 992px){.ion-text-lg-center{text-align:center!important}.ion-text-lg-justify{text-align:justify!important}.ion-text-lg-start{text-align:start!important}.ion-text-lg-end{text-align:end!important}.ion-text-lg-left{text-align:left!important}.ion-text-lg-right{text-align:right!important}.ion-text-lg-nowrap{white-space:nowrap!important}.ion-text-lg-wrap{white-space:normal!important}}@media (min-width: 1200px){.ion-text-xl-center{text-align:center!important}.ion-text-xl-justify{text-align:justify!important}.ion-text-xl-start{text-align:start!important}.ion-text-xl-end{text-align:end!important}.ion-text-xl-left{text-align:left!important}.ion-text-xl-right{text-align:right!important}.ion-text-xl-nowrap{white-space:nowrap!important}.ion-text-xl-wrap{white-space:normal!important}}.ion-text-uppercase{text-transform:uppercase!important}.ion-text-lowercase{text-transform:lowercase!important}.ion-text-capitalize{text-transform:capitalize!important}@media (min-width: 576px){.ion-text-sm-uppercase{text-transform:uppercase!important}.ion-text-sm-lowercase{text-transform:lowercase!important}.ion-text-sm-capitalize{text-transform:capitalize!important}}@media (min-width: 768px){.ion-text-md-uppercase{text-transform:uppercase!important}.ion-text-md-lowercase{text-transform:lowercase!important}.ion-text-md-capitalize{text-transform:capitalize!important}}@media (min-width: 992px){.ion-text-lg-uppercase{text-transform:uppercase!important}.ion-text-lg-lowercase{text-transform:lowercase!important}.ion-text-lg-capitalize{text-transform:capitalize!important}}@media (min-width: 1200px){.ion-text-xl-uppercase{text-transform:uppercase!important}.ion-text-xl-lowercase{text-transform:lowercase!important}.ion-text-xl-capitalize{text-transform:capitalize!important}}.ion-align-self-start{align-self:flex-start!important}.ion-align-self-end{align-self:flex-end!important}.ion-align-self-center{align-self:center!important}.ion-align-self-stretch{align-self:stretch!important}.ion-align-self-baseline{align-self:baseline!important}.ion-align-self-auto{align-self:auto!important}.ion-wrap{flex-wrap:wrap!important}.ion-nowrap{flex-wrap:nowrap!important}.ion-wrap-reverse{flex-wrap:wrap-reverse!important}.ion-justify-content-start{justify-content:flex-start!important}.ion-justify-content-center{justify-content:center!important}.ion-justify-content-end{justify-content:flex-end!important}.ion-justify-content-around{justify-content:space-around!important}.ion-justify-content-between{justify-content:space-between!important}.ion-justify-content-evenly{justify-content:space-evenly!important}.ion-align-items-start{align-items:flex-start!important}.ion-align-items-center{align-items:center!important}.ion-align-items-end{align-items:flex-end!important}.ion-align-items-stretch{align-items:stretch!important}.ion-align-items-baseline{align-items:baseline!important}:root{--ion-color-primary: #4d8dff;--ion-color-primary-rgb: 77, 141, 255;--ion-color-primary-contrast: #000;--ion-color-primary-contrast-rgb: 0, 0, 0;--ion-color-primary-shade: #447ce0;--ion-color-primary-tint: #5f98ff;--ion-color-secondary: #46b1ff;--ion-color-secondary-rgb: 70, 177, 255;--ion-color-secondary-contrast: #000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #3e9ce0;--ion-color-secondary-tint: #59b9ff;--ion-color-tertiary: #8482fb;--ion-color-tertiary-rgb: 132, 130, 251;--ion-color-tertiary-contrast: #000;--ion-color-tertiary-contrast-rgb: 0, 0, 0;--ion-color-tertiary-shade: #7472dd;--ion-color-tertiary-tint: #908ffb;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffce31;--ion-color-warning-rgb: 255, 206, 49;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0b52b;--ion-color-warning-tint: #ffd346;--ion-color-danger: #f24c58;--ion-color-danger-rgb: 242, 76, 88;--ion-color-danger-contrast: #000;--ion-color-danger-contrast-rgb: 0, 0, 0;--ion-color-danger-shade: #d5434d;--ion-color-danger-tint: #f35e69;--ion-color-light: #222428;--ion-color-light-rgb: 34, 36, 40;--ion-color-light-contrast: #fff;--ion-color-light-contrast-rgb: 255, 255, 255;--ion-color-light-shade: #1e2023;--ion-color-light-tint: #383a3e;--ion-color-medium: #989aa2;--ion-color-medium-rgb: 152, 154, 162;--ion-color-medium-contrast: #000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #86888f;--ion-color-medium-tint: #a2a4ab;--ion-color-dark: #f4f5f8;--ion-color-dark-rgb: 244, 245, 248;--ion-color-dark-contrast: #000;--ion-color-dark-contrast-rgb: 0, 0, 0;--ion-color-dark-shade: #d7d8da;--ion-color-dark-tint: #f5f6f9}:root.ios{--ion-background-color: #000000;--ion-background-color-rgb: 0, 0, 0;--ion-text-color: #ffffff;--ion-text-color-rgb: 255, 255, 255;--ion-background-color-step-50: #0d0d0d;--ion-background-color-step-100: #1a1a1a;--ion-background-color-step-150: #262626;--ion-background-color-step-200: #333333;--ion-background-color-step-250: #404040;--ion-background-color-step-300: #4d4d4d;--ion-background-color-step-350: #595959;--ion-background-color-step-400: #666666;--ion-background-color-step-450: #737373;--ion-background-color-step-500: #808080;--ion-background-color-step-550: #8c8c8c;--ion-background-color-step-600: #999999;--ion-background-color-step-650: #a6a6a6;--ion-background-color-step-700: #b3b3b3;--ion-background-color-step-750: #bfbfbf;--ion-background-color-step-800: #cccccc;--ion-background-color-step-850: #d9d9d9;--ion-background-color-step-900: #e6e6e6;--ion-background-color-step-950: #f2f2f2;--ion-text-color-step-50: #f2f2f2;--ion-text-color-step-100: #e6e6e6;--ion-text-color-step-150: #d9d9d9;--ion-text-color-step-200: #cccccc;--ion-text-color-step-250: #bfbfbf;--ion-text-color-step-300: #b3b3b3;--ion-text-color-step-350: #a6a6a6;--ion-text-color-step-400: #999999;--ion-text-color-step-450: #8c8c8c;--ion-text-color-step-500: #808080;--ion-text-color-step-550: #737373;--ion-text-color-step-600: #666666;--ion-text-color-step-650: #595959;--ion-text-color-step-700: #4d4d4d;--ion-text-color-step-750: #404040;--ion-text-color-step-800: #333333;--ion-text-color-step-850: #262626;--ion-text-color-step-900: #1a1a1a;--ion-text-color-step-950: #0d0d0d;--ion-item-background: #000000;--ion-card-background: #1c1c1d}:root.ios ion-modal{--ion-background-color: var(--ion-color-step-100, var(--ion-background-color-step-100));--ion-toolbar-background: var(--ion-color-step-150, var(--ion-background-color-step-150));--ion-toolbar-border-color: var(--ion-color-step-250, var(--ion-background-color-step-250))}:root.md{--ion-background-color: #121212;--ion-background-color-rgb: 18, 18, 18;--ion-text-color: #ffffff;--ion-text-color-rgb: 255, 255, 255;--ion-background-color-step-50: #1e1e1e;--ion-background-color-step-100: #2a2a2a;--ion-background-color-step-150: #363636;--ion-background-color-step-200: #414141;--ion-background-color-step-250: #4d4d4d;--ion-background-color-step-300: #595959;--ion-background-color-step-350: #656565;--ion-background-color-step-400: #717171;--ion-background-color-step-450: #7d7d7d;--ion-background-color-step-500: #898989;--ion-background-color-step-550: #949494;--ion-background-color-step-600: #a0a0a0;--ion-background-color-step-650: #acacac;--ion-background-color-step-700: #b8b8b8;--ion-background-color-step-750: #c4c4c4;--ion-background-color-step-800: #d0d0d0;--ion-background-color-step-850: #dbdbdb;--ion-background-color-step-900: #e7e7e7;--ion-background-color-step-950: #f3f3f3;--ion-text-color-step-50: #f3f3f3;--ion-text-color-step-100: #e7e7e7;--ion-text-color-step-150: #dbdbdb;--ion-text-color-step-200: #d0d0d0;--ion-text-color-step-250: #c4c4c4;--ion-text-color-step-300: #b8b8b8;--ion-text-color-step-350: #acacac;--ion-text-color-step-400: #a0a0a0;--ion-text-color-step-450: #949494;--ion-text-color-step-500: #898989;--ion-text-color-step-550: #7d7d7d;--ion-text-color-step-600: #717171;--ion-text-color-step-650: #656565;--ion-text-color-step-700: #595959;--ion-text-color-step-750: #4d4d4d;--ion-text-color-step-800: #414141;--ion-text-color-step-850: #363636;--ion-text-color-step-900: #2a2a2a;--ion-text-color-step-950: #1e1e1e;--ion-item-background: #1e1e1e;--ion-toolbar-background: #1f1f1f;--ion-tab-bar-background: #1f1f1f;--ion-card-background: #1e1e1e}.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:#ffffff80}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px #000000a6;border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px #0006;background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(layers.ef6db8722c2c3f9a.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(layers-2x.9859cd1231006a4a.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(marker-icon.d577052aa271e13f.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:#fffc;margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;box-sizing:border-box;background:#fffc;text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px #0006}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.-right-5{right:-1.25rem}.-top-5{top:-1.25rem}.bottom-0{bottom:0}.right-0{right:0}.z-10{z-index:10}.z-50{z-index:50}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-4{margin:1rem}.m-6{margin:1.5rem}.mb-2{margin-bottom:.5rem}.mb-6{margin-bottom:1.5rem}.ml-auto{margin-left:auto}.mt-2{margin-top:.5rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-12{height:3rem}.h-48{height:12rem}.h-60{height:15rem}.h-96{height:24rem}.h-\[25em\]{height:25em}.h-full{height:100%}.min-h-full{min-height:100%}.w-1\/3{width:33.333333%}.w-1\/6{width:16.666667%}.w-12{width:3rem}.w-2\/3{width:66.666667%}.w-full{width:100%}.min-w-full{min-width:100%}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-tl-2xl{border-top-left-radius:1rem}.rounded-tr-2xl{border-top-right-radius:1rem}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-cyan-800{--tw-bg-opacity: 1;background-color:rgb(21 94 117 / var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity: 1;background-color:rgb(216 180 254 / var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity))}.bg-purple-600{--tw-bg-opacity: 1;background-color:rgb(147 51 234 / var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity: 1;background-color:rgb(107 33 168 / var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-opacity-60{--tw-bg-opacity: .6}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.pr-2{padding-right:.5rem}.text-right{text-align:right}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}@media (min-width: 768px){.md\:m-10{margin:2.5rem}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-3\/4{height:75%}.md\:h-full{height:100%}.md\:flex-row{flex-direction:row}.md\:justify-end{justify-content:flex-end}.md\:text-2xl{font-size:1.5rem;line-height:2rem}}@media (min-width: 1024px){.lg\:m-10{margin:2.5rem}.lg\:ml-2{margin-left:.5rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-3\/4{height:75%}.lg\:h-96{height:24rem}.lg\:h-full{height:100%}.lg\:min-w-20{min-width:5rem}.lg\:flex-row{flex-direction:row}.lg\:justify-center{justify-content:center}.lg\:p-32{padding:8rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}}:root{--ion-color-ai_purple: #9d68be;--ion-color-ai_purple-rgb: 157,104,190;--ion-color-ai_purple-contrast: #000000;--ion-color-ai_purple-contrast-rgb: 0,0,0;--ion-color-ai_purple-shade: #8a5ca7;--ion-color-ai_purple-tint: #a777c5}.ion-color-ai_purple{--ion-color-base: var(--ion-color-ai_purple);--ion-color-base-rgb: var(--ion-color-ai_purple-rgb);--ion-color-contrast: var(--ion-color-ai_purple-contrast);--ion-color-contrast-rgb: var(--ion-color-ai_purple-contrast-rgb);--ion-color-shade: var(--ion-color-ai_purple-shade);--ion-color-tint: var(--ion-color-ai_purple-tint)} +:root{--ion-color-primary: #0054e9;--ion-color-primary-rgb: 0, 84, 233;--ion-color-primary-contrast: #fff;--ion-color-primary-contrast-rgb: 255, 255, 255;--ion-color-primary-shade: #004acd;--ion-color-primary-tint: #1a65eb;--ion-color-secondary: #0163aa;--ion-color-secondary-rgb: 1, 99, 170;--ion-color-secondary-contrast: #fff;--ion-color-secondary-contrast-rgb: 255, 255, 255;--ion-color-secondary-shade: #015796;--ion-color-secondary-tint: #1a73b3;--ion-color-tertiary: #6030ff;--ion-color-tertiary-rgb: 96, 48, 255;--ion-color-tertiary-contrast: #fff;--ion-color-tertiary-contrast-rgb: 255, 255, 255;--ion-color-tertiary-shade: #542ae0;--ion-color-tertiary-tint: #7045ff;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffc409;--ion-color-warning-rgb: 255, 196, 9;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0ac08;--ion-color-warning-tint: #ffca22;--ion-color-danger: #c5000f;--ion-color-danger-rgb: 197, 0, 15;--ion-color-danger-contrast: #fff;--ion-color-danger-contrast-rgb: 255, 255, 255;--ion-color-danger-shade: #ad000d;--ion-color-danger-tint: #cb1a27;--ion-color-light: #f4f5f8;--ion-color-light-rgb: 244, 245, 248;--ion-color-light-contrast: #000;--ion-color-light-contrast-rgb: 0, 0, 0;--ion-color-light-shade: #d7d8da;--ion-color-light-tint: #f5f6f9;--ion-color-medium: #636469;--ion-color-medium-rgb: 99, 100, 105;--ion-color-medium-contrast: #fff;--ion-color-medium-contrast-rgb: 255, 255, 255;--ion-color-medium-shade: #57585c;--ion-color-medium-tint: #737478;--ion-color-dark: #222428;--ion-color-dark-rgb: 34, 36, 40;--ion-color-dark-contrast: #fff;--ion-color-dark-contrast-rgb: 255, 255, 255;--ion-color-dark-shade: #1e2023;--ion-color-dark-tint: #383a3e}html.ios{--ion-default-font: -apple-system, BlinkMacSystemFont, "Helvetica Neue", "Roboto", sans-serif}html.md{--ion-default-font: "Roboto", "Helvetica Neue", sans-serif}html{--ion-dynamic-font: -apple-system-body;--ion-font-family: var(--ion-default-font)}body{background:var(--ion-background-color);color:var(--ion-text-color)}body.backdrop-no-scroll{overflow:hidden}html.ios ion-modal.modal-card ion-header ion-toolbar:first-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:first-of-type,html.ios ion-modal ion-footer ion-toolbar:first-of-type{padding-top:6px}html.ios ion-modal.modal-card ion-header ion-toolbar:last-of-type,html.ios ion-modal.modal-sheet ion-header ion-toolbar:last-of-type{padding-bottom:6px}html.ios ion-modal ion-toolbar{padding-right:calc(var(--ion-safe-area-right) + 8px);padding-left:calc(var(--ion-safe-area-left) + 8px)}@media screen and (min-width: 768px){html.ios ion-modal.modal-card:first-of-type{--backdrop-opacity: .18}}ion-modal.modal-default.show-modal~ion-modal.modal-default{--backdrop-opacity: 0;--box-shadow: none}html.ios ion-modal.modal-card .ion-page{border-top-left-radius:var(--border-radius)}.ion-color-primary{--ion-color-base: var(--ion-color-primary, #0054e9) !important;--ion-color-base-rgb: var(--ion-color-primary-rgb, 0, 84, 233) !important;--ion-color-contrast: var(--ion-color-primary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-primary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-primary-shade, #004acd) !important;--ion-color-tint: var(--ion-color-primary-tint, #1a65eb) !important}.ion-color-secondary{--ion-color-base: var(--ion-color-secondary, #0163aa) !important;--ion-color-base-rgb: var(--ion-color-secondary-rgb, 1, 99, 170) !important;--ion-color-contrast: var(--ion-color-secondary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-secondary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-secondary-shade, #015796) !important;--ion-color-tint: var(--ion-color-secondary-tint, #1a73b3) !important}.ion-color-tertiary{--ion-color-base: var(--ion-color-tertiary, #6030ff) !important;--ion-color-base-rgb: var(--ion-color-tertiary-rgb, 96, 48, 255) !important;--ion-color-contrast: var(--ion-color-tertiary-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-tertiary-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-tertiary-shade, #542ae0) !important;--ion-color-tint: var(--ion-color-tertiary-tint, #7045ff) !important}.ion-color-success{--ion-color-base: var(--ion-color-success, #2dd55b) !important;--ion-color-base-rgb: var(--ion-color-success-rgb, 45, 213, 91) !important;--ion-color-contrast: var(--ion-color-success-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-success-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-success-shade, #28bb50) !important;--ion-color-tint: var(--ion-color-success-tint, #42d96b) !important}.ion-color-warning{--ion-color-base: var(--ion-color-warning, #ffc409) !important;--ion-color-base-rgb: var(--ion-color-warning-rgb, 255, 196, 9) !important;--ion-color-contrast: var(--ion-color-warning-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-warning-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-warning-shade, #e0ac08) !important;--ion-color-tint: var(--ion-color-warning-tint, #ffca22) !important}.ion-color-danger{--ion-color-base: var(--ion-color-danger, #c5000f) !important;--ion-color-base-rgb: var(--ion-color-danger-rgb, 197, 0, 15) !important;--ion-color-contrast: var(--ion-color-danger-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-danger-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-danger-shade, #ad000d) !important;--ion-color-tint: var(--ion-color-danger-tint, #cb1a27) !important}.ion-color-light{--ion-color-base: var(--ion-color-light, #f4f5f8) !important;--ion-color-base-rgb: var(--ion-color-light-rgb, 244, 245, 248) !important;--ion-color-contrast: var(--ion-color-light-contrast, #000) !important;--ion-color-contrast-rgb: var(--ion-color-light-contrast-rgb, 0, 0, 0) !important;--ion-color-shade: var(--ion-color-light-shade, #d7d8da) !important;--ion-color-tint: var(--ion-color-light-tint, #f5f6f9) !important}.ion-color-medium{--ion-color-base: var(--ion-color-medium, #636469) !important;--ion-color-base-rgb: var(--ion-color-medium-rgb, 99, 100, 105) !important;--ion-color-contrast: var(--ion-color-medium-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-medium-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-medium-shade, #57585c) !important;--ion-color-tint: var(--ion-color-medium-tint, #737478) !important}.ion-color-dark{--ion-color-base: var(--ion-color-dark, #222428) !important;--ion-color-base-rgb: var(--ion-color-dark-rgb, 34, 36, 40) !important;--ion-color-contrast: var(--ion-color-dark-contrast, #fff) !important;--ion-color-contrast-rgb: var(--ion-color-dark-contrast-rgb, 255, 255, 255) !important;--ion-color-shade: var(--ion-color-dark-shade, #1e2023) !important;--ion-color-tint: var(--ion-color-dark-tint, #383a3e) !important}.ion-page{left:0;right:0;top:0;bottom:0;display:flex;position:absolute;flex-direction:column;justify-content:space-between;contain:layout size style;z-index:0}ion-modal>.ion-page{position:relative;contain:layout style;height:100%}.split-pane-visible>.ion-page.split-pane-main{position:relative}ion-route,ion-route-redirect,ion-router,ion-select-option,ion-nav-controller,ion-menu-controller,ion-action-sheet-controller,ion-alert-controller,ion-loading-controller,ion-modal-controller,ion-picker-controller,ion-popover-controller,ion-toast-controller,.ion-page-hidden{display:none!important}.ion-page-invisible{opacity:0}.can-go-back>ion-header ion-back-button{display:block}html.plt-ios.plt-hybrid,html.plt-ios.plt-pwa{--ion-statusbar-padding: 20px}@supports (padding-top: 20px){html{--ion-safe-area-top: var(--ion-statusbar-padding)}}@supports (padding-top: env(safe-area-inset-top)){html{--ion-safe-area-top: env(safe-area-inset-top);--ion-safe-area-bottom: env(safe-area-inset-bottom);--ion-safe-area-left: env(safe-area-inset-left);--ion-safe-area-right: env(safe-area-inset-right)}}ion-card.ion-color .ion-inherit-color,ion-card-header.ion-color .ion-inherit-color{color:inherit}.menu-content{transform:translateZ(0)}.menu-content-open{cursor:pointer;touch-action:manipulation;pointer-events:none;overflow-y:hidden}.menu-content-open ion-content{--overflow: hidden}.menu-content-open .ion-content-scroll-host{overflow:hidden}.ios .menu-content-reveal{box-shadow:-8px 0 42px #00000014}[dir=rtl].ios .menu-content-reveal{box-shadow:8px 0 42px #00000014}.md .menu-content-reveal,.md .menu-content-push{box-shadow:4px 0 16px #0000002e}ion-accordion-group.accordion-group-expand-inset>ion-accordion:first-of-type{border-top-left-radius:8px;border-top-right-radius:8px}ion-accordion-group.accordion-group-expand-inset>ion-accordion:last-of-type{border-bottom-left-radius:8px;border-bottom-right-radius:8px}ion-accordion-group>ion-accordion:last-of-type ion-item[slot=header]{--border-width: 0px}ion-accordion.accordion-animated>[slot=header] .ion-accordion-toggle-icon{transition:.3s transform cubic-bezier(.25,.8,.5,1)}@media (prefers-reduced-motion: reduce){ion-accordion .ion-accordion-toggle-icon{transition:none!important}}ion-accordion.accordion-expanding>[slot=header] .ion-accordion-toggle-icon,ion-accordion.accordion-expanded>[slot=header] .ion-accordion-toggle-icon{transform:rotate(180deg)}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-previous ion-item[slot=header]{--border-width: 0px;--inner-border-width: 0px}ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanding:first-of-type,ion-accordion-group.accordion-group-expand-inset.md>ion-accordion.accordion-expanded:first-of-type{margin-top:0}ion-input input::-webkit-date-and-time-value{text-align:start}.ion-datetime-button-overlay{--width: fit-content;--height: fit-content}.ion-datetime-button-overlay ion-datetime.datetime-grid{width:320px;min-height:320px}[ion-last-focus],header[tabindex="-1"]:focus,[role=banner][tabindex="-1"]:focus,main[tabindex="-1"]:focus,[role=main][tabindex="-1"]:focus,h1[tabindex="-1"]:focus,[role=heading][aria-level="1"][tabindex="-1"]:focus{outline:none}.popover-viewport:has(>ion-content){overflow:hidden}@supports not selector(:has(> ion-content)){.popover-viewport{overflow:hidden}}audio,canvas,progress,video{vertical-align:baseline}audio:not([controls]){display:none;height:0}b,strong{font-weight:700}img{max-width:100%}hr{height:1px;border-width:0;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}label,input,select,textarea{font-family:inherit;line-height:normal}textarea{overflow:auto;height:auto;font:inherit;color:inherit}textarea::placeholder{padding-left:2px}form,input,optgroup,select{margin:0;font:inherit;color:inherit}html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}a,a div,a span,a ion-icon,a ion-label,button,button div,button span,button ion-icon,button ion-label,.ion-tappable,[tappable],[tappable] div,[tappable] span,[tappable] ion-icon,[tappable] ion-label,input,textarea{touch-action:manipulation}a ion-label,button ion-label{pointer-events:none}button{padding:0;border:0;border-radius:0;font-family:inherit;font-style:inherit;font-variant:inherit;line-height:1;text-transform:none;cursor:pointer;-webkit-appearance:button}[tappable]{cursor:pointer}a[disabled],button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}*{box-sizing:border-box;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}html{width:100%;height:100%;-webkit-text-size-adjust:100%;text-size-adjust:100%}html:not(.hydrated) body{display:none}html.ion-ce body{display:block}html.plt-pwa{height:100vh}body{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;margin:0;padding:0;position:fixed;width:100%;max-width:100%;height:100%;max-height:100%;transform:translateZ(0);text-rendering:optimizeLegibility;overflow:hidden;touch-action:manipulation;-webkit-user-drag:none;-ms-content-zooming:none;word-wrap:break-word;overscroll-behavior-y:none;-webkit-text-size-adjust:none;text-size-adjust:none}html{font-family:var(--ion-font-family)}@supports (-webkit-touch-callout: none){html{font:var(--ion-dynamic-font, 16px var(--ion-font-family))}}a{background-color:transparent;color:var(--ion-color-primary, #0054e9)}h1,h2,h3,h4,h5,h6{margin-top:16px;margin-bottom:10px;font-weight:500;line-height:1.2}h1{margin-top:20px;font-size:1.625rem}h2{margin-top:18px;font-size:1.5rem}h3{font-size:1.375rem}h4{font-size:1.25rem}h5{font-size:1.125rem}h6{font-size:1rem}small{font-size:75%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}.ion-hide,.ion-hide-up,.ion-hide-down{display:none!important}@media (min-width: 576px){.ion-hide-sm-up{display:none!important}}@media (max-width: 575.98px){.ion-hide-sm-down{display:none!important}}@media (min-width: 768px){.ion-hide-md-up{display:none!important}}@media (max-width: 767.98px){.ion-hide-md-down{display:none!important}}@media (min-width: 992px){.ion-hide-lg-up{display:none!important}}@media (max-width: 991.98px){.ion-hide-lg-down{display:none!important}}@media (min-width: 1200px){.ion-hide-xl-up{display:none!important}}@media (max-width: 1199.98px){.ion-hide-xl-down{display:none!important}}.ion-no-padding{--padding-start: 0;--padding-end: 0;--padding-top: 0;--padding-bottom: 0;padding:0}.ion-padding{--padding-start: var(--ion-padding, 16px);--padding-end: var(--ion-padding, 16px);--padding-top: var(--ion-padding, 16px);--padding-bottom: var(--ion-padding, 16px);padding-inline-start:var(--ion-padding, 16px);padding-inline-end:var(--ion-padding, 16px);padding-top:var(--ion-padding, 16px);padding-bottom:var(--ion-padding, 16px)}.ion-padding-top{--padding-top: var(--ion-padding, 16px);padding-top:var(--ion-padding, 16px)}.ion-padding-start{--padding-start: var(--ion-padding, 16px);padding-inline-start:var(--ion-padding, 16px)}.ion-padding-end{--padding-end: var(--ion-padding, 16px);padding-inline-end:var(--ion-padding, 16px)}.ion-padding-bottom{--padding-bottom: var(--ion-padding, 16px);padding-bottom:var(--ion-padding, 16px)}.ion-padding-vertical{--padding-top: var(--ion-padding, 16px);--padding-bottom: var(--ion-padding, 16px);padding-top:var(--ion-padding, 16px);padding-bottom:var(--ion-padding, 16px)}.ion-padding-horizontal{--padding-start: var(--ion-padding, 16px);--padding-end: var(--ion-padding, 16px);padding-inline-start:var(--ion-padding, 16px);padding-inline-end:var(--ion-padding, 16px)}.ion-no-margin{--margin-start: 0;--margin-end: 0;--margin-top: 0;--margin-bottom: 0;margin:0}.ion-margin{--margin-start: var(--ion-margin, 16px);--margin-end: var(--ion-margin, 16px);--margin-top: var(--ion-margin, 16px);--margin-bottom: var(--ion-margin, 16px);margin-inline-start:var(--ion-margin, 16px);margin-inline-end:var(--ion-margin, 16px);margin-top:var(--ion-margin, 16px);margin-bottom:var(--ion-margin, 16px)}.ion-margin-top{--margin-top: var(--ion-margin, 16px);margin-top:var(--ion-margin, 16px)}.ion-margin-start{--margin-start: var(--ion-margin, 16px);margin-inline-start:var(--ion-margin, 16px)}.ion-margin-end{--margin-end: var(--ion-margin, 16px);margin-inline-end:var(--ion-margin, 16px)}.ion-margin-bottom{--margin-bottom: var(--ion-margin, 16px);margin-bottom:var(--ion-margin, 16px)}.ion-margin-vertical{--margin-top: var(--ion-margin, 16px);--margin-bottom: var(--ion-margin, 16px);margin-top:var(--ion-margin, 16px);margin-bottom:var(--ion-margin, 16px)}.ion-margin-horizontal{--margin-start: var(--ion-margin, 16px);--margin-end: var(--ion-margin, 16px);margin-inline-start:var(--ion-margin, 16px);margin-inline-end:var(--ion-margin, 16px)}.ion-float-left{float:left!important}.ion-float-right{float:right!important}.ion-float-start{float:left!important}:host-context([dir=rtl]) .ion-float-start{float:right!important}[dir=rtl] .ion-float-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-start:dir(rtl){float:right!important}}.ion-float-end{float:right!important}:host-context([dir=rtl]) .ion-float-end{float:left!important}[dir=rtl] .ion-float-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-end:dir(rtl){float:left!important}}@media (min-width: 576px){.ion-float-sm-left{float:left!important}.ion-float-sm-right{float:right!important}.ion-float-sm-start{float:left!important}:host-context([dir=rtl]) .ion-float-sm-start{float:right!important}[dir=rtl] .ion-float-sm-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-sm-start:dir(rtl){float:right!important}}.ion-float-sm-end{float:right!important}:host-context([dir=rtl]) .ion-float-sm-end{float:left!important}[dir=rtl] .ion-float-sm-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-sm-end:dir(rtl){float:left!important}}}@media (min-width: 768px){.ion-float-md-left{float:left!important}.ion-float-md-right{float:right!important}.ion-float-md-start{float:left!important}:host-context([dir=rtl]) .ion-float-md-start{float:right!important}[dir=rtl] .ion-float-md-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-md-start:dir(rtl){float:right!important}}.ion-float-md-end{float:right!important}:host-context([dir=rtl]) .ion-float-md-end{float:left!important}[dir=rtl] .ion-float-md-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-md-end:dir(rtl){float:left!important}}}@media (min-width: 992px){.ion-float-lg-left{float:left!important}.ion-float-lg-right{float:right!important}.ion-float-lg-start{float:left!important}:host-context([dir=rtl]) .ion-float-lg-start{float:right!important}[dir=rtl] .ion-float-lg-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-lg-start:dir(rtl){float:right!important}}.ion-float-lg-end{float:right!important}:host-context([dir=rtl]) .ion-float-lg-end{float:left!important}[dir=rtl] .ion-float-lg-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-lg-end:dir(rtl){float:left!important}}}@media (min-width: 1200px){.ion-float-xl-left{float:left!important}.ion-float-xl-right{float:right!important}.ion-float-xl-start{float:left!important}:host-context([dir=rtl]) .ion-float-xl-start{float:right!important}[dir=rtl] .ion-float-xl-start{float:right!important}@supports selector(:dir(rtl)){.ion-float-xl-start:dir(rtl){float:right!important}}.ion-float-xl-end{float:right!important}:host-context([dir=rtl]) .ion-float-xl-end{float:left!important}[dir=rtl] .ion-float-xl-end{float:left!important}@supports selector(:dir(rtl)){.ion-float-xl-end:dir(rtl){float:left!important}}}.ion-text-center{text-align:center!important}.ion-text-justify{text-align:justify!important}.ion-text-start{text-align:start!important}.ion-text-end{text-align:end!important}.ion-text-left{text-align:left!important}.ion-text-right{text-align:right!important}.ion-text-nowrap{white-space:nowrap!important}.ion-text-wrap{white-space:normal!important}@media (min-width: 576px){.ion-text-sm-center{text-align:center!important}.ion-text-sm-justify{text-align:justify!important}.ion-text-sm-start{text-align:start!important}.ion-text-sm-end{text-align:end!important}.ion-text-sm-left{text-align:left!important}.ion-text-sm-right{text-align:right!important}.ion-text-sm-nowrap{white-space:nowrap!important}.ion-text-sm-wrap{white-space:normal!important}}@media (min-width: 768px){.ion-text-md-center{text-align:center!important}.ion-text-md-justify{text-align:justify!important}.ion-text-md-start{text-align:start!important}.ion-text-md-end{text-align:end!important}.ion-text-md-left{text-align:left!important}.ion-text-md-right{text-align:right!important}.ion-text-md-nowrap{white-space:nowrap!important}.ion-text-md-wrap{white-space:normal!important}}@media (min-width: 992px){.ion-text-lg-center{text-align:center!important}.ion-text-lg-justify{text-align:justify!important}.ion-text-lg-start{text-align:start!important}.ion-text-lg-end{text-align:end!important}.ion-text-lg-left{text-align:left!important}.ion-text-lg-right{text-align:right!important}.ion-text-lg-nowrap{white-space:nowrap!important}.ion-text-lg-wrap{white-space:normal!important}}@media (min-width: 1200px){.ion-text-xl-center{text-align:center!important}.ion-text-xl-justify{text-align:justify!important}.ion-text-xl-start{text-align:start!important}.ion-text-xl-end{text-align:end!important}.ion-text-xl-left{text-align:left!important}.ion-text-xl-right{text-align:right!important}.ion-text-xl-nowrap{white-space:nowrap!important}.ion-text-xl-wrap{white-space:normal!important}}.ion-text-uppercase{text-transform:uppercase!important}.ion-text-lowercase{text-transform:lowercase!important}.ion-text-capitalize{text-transform:capitalize!important}@media (min-width: 576px){.ion-text-sm-uppercase{text-transform:uppercase!important}.ion-text-sm-lowercase{text-transform:lowercase!important}.ion-text-sm-capitalize{text-transform:capitalize!important}}@media (min-width: 768px){.ion-text-md-uppercase{text-transform:uppercase!important}.ion-text-md-lowercase{text-transform:lowercase!important}.ion-text-md-capitalize{text-transform:capitalize!important}}@media (min-width: 992px){.ion-text-lg-uppercase{text-transform:uppercase!important}.ion-text-lg-lowercase{text-transform:lowercase!important}.ion-text-lg-capitalize{text-transform:capitalize!important}}@media (min-width: 1200px){.ion-text-xl-uppercase{text-transform:uppercase!important}.ion-text-xl-lowercase{text-transform:lowercase!important}.ion-text-xl-capitalize{text-transform:capitalize!important}}.ion-align-self-start{align-self:flex-start!important}.ion-align-self-end{align-self:flex-end!important}.ion-align-self-center{align-self:center!important}.ion-align-self-stretch{align-self:stretch!important}.ion-align-self-baseline{align-self:baseline!important}.ion-align-self-auto{align-self:auto!important}.ion-wrap{flex-wrap:wrap!important}.ion-nowrap{flex-wrap:nowrap!important}.ion-wrap-reverse{flex-wrap:wrap-reverse!important}.ion-justify-content-start{justify-content:flex-start!important}.ion-justify-content-center{justify-content:center!important}.ion-justify-content-end{justify-content:flex-end!important}.ion-justify-content-around{justify-content:space-around!important}.ion-justify-content-between{justify-content:space-between!important}.ion-justify-content-evenly{justify-content:space-evenly!important}.ion-align-items-start{align-items:flex-start!important}.ion-align-items-center{align-items:center!important}.ion-align-items-end{align-items:flex-end!important}.ion-align-items-stretch{align-items:stretch!important}.ion-align-items-baseline{align-items:baseline!important}:root{--ion-color-primary: #4d8dff;--ion-color-primary-rgb: 77, 141, 255;--ion-color-primary-contrast: #000;--ion-color-primary-contrast-rgb: 0, 0, 0;--ion-color-primary-shade: #447ce0;--ion-color-primary-tint: #5f98ff;--ion-color-secondary: #46b1ff;--ion-color-secondary-rgb: 70, 177, 255;--ion-color-secondary-contrast: #000;--ion-color-secondary-contrast-rgb: 0, 0, 0;--ion-color-secondary-shade: #3e9ce0;--ion-color-secondary-tint: #59b9ff;--ion-color-tertiary: #8482fb;--ion-color-tertiary-rgb: 132, 130, 251;--ion-color-tertiary-contrast: #000;--ion-color-tertiary-contrast-rgb: 0, 0, 0;--ion-color-tertiary-shade: #7472dd;--ion-color-tertiary-tint: #908ffb;--ion-color-success: #2dd55b;--ion-color-success-rgb: 45, 213, 91;--ion-color-success-contrast: #000;--ion-color-success-contrast-rgb: 0, 0, 0;--ion-color-success-shade: #28bb50;--ion-color-success-tint: #42d96b;--ion-color-warning: #ffce31;--ion-color-warning-rgb: 255, 206, 49;--ion-color-warning-contrast: #000;--ion-color-warning-contrast-rgb: 0, 0, 0;--ion-color-warning-shade: #e0b52b;--ion-color-warning-tint: #ffd346;--ion-color-danger: #f24c58;--ion-color-danger-rgb: 242, 76, 88;--ion-color-danger-contrast: #000;--ion-color-danger-contrast-rgb: 0, 0, 0;--ion-color-danger-shade: #d5434d;--ion-color-danger-tint: #f35e69;--ion-color-light: #222428;--ion-color-light-rgb: 34, 36, 40;--ion-color-light-contrast: #fff;--ion-color-light-contrast-rgb: 255, 255, 255;--ion-color-light-shade: #1e2023;--ion-color-light-tint: #383a3e;--ion-color-medium: #989aa2;--ion-color-medium-rgb: 152, 154, 162;--ion-color-medium-contrast: #000;--ion-color-medium-contrast-rgb: 0, 0, 0;--ion-color-medium-shade: #86888f;--ion-color-medium-tint: #a2a4ab;--ion-color-dark: #f4f5f8;--ion-color-dark-rgb: 244, 245, 248;--ion-color-dark-contrast: #000;--ion-color-dark-contrast-rgb: 0, 0, 0;--ion-color-dark-shade: #d7d8da;--ion-color-dark-tint: #f5f6f9}:root.ios{--ion-background-color: #000000;--ion-background-color-rgb: 0, 0, 0;--ion-text-color: #ffffff;--ion-text-color-rgb: 255, 255, 255;--ion-background-color-step-50: #0d0d0d;--ion-background-color-step-100: #1a1a1a;--ion-background-color-step-150: #262626;--ion-background-color-step-200: #333333;--ion-background-color-step-250: #404040;--ion-background-color-step-300: #4d4d4d;--ion-background-color-step-350: #595959;--ion-background-color-step-400: #666666;--ion-background-color-step-450: #737373;--ion-background-color-step-500: #808080;--ion-background-color-step-550: #8c8c8c;--ion-background-color-step-600: #999999;--ion-background-color-step-650: #a6a6a6;--ion-background-color-step-700: #b3b3b3;--ion-background-color-step-750: #bfbfbf;--ion-background-color-step-800: #cccccc;--ion-background-color-step-850: #d9d9d9;--ion-background-color-step-900: #e6e6e6;--ion-background-color-step-950: #f2f2f2;--ion-text-color-step-50: #f2f2f2;--ion-text-color-step-100: #e6e6e6;--ion-text-color-step-150: #d9d9d9;--ion-text-color-step-200: #cccccc;--ion-text-color-step-250: #bfbfbf;--ion-text-color-step-300: #b3b3b3;--ion-text-color-step-350: #a6a6a6;--ion-text-color-step-400: #999999;--ion-text-color-step-450: #8c8c8c;--ion-text-color-step-500: #808080;--ion-text-color-step-550: #737373;--ion-text-color-step-600: #666666;--ion-text-color-step-650: #595959;--ion-text-color-step-700: #4d4d4d;--ion-text-color-step-750: #404040;--ion-text-color-step-800: #333333;--ion-text-color-step-850: #262626;--ion-text-color-step-900: #1a1a1a;--ion-text-color-step-950: #0d0d0d;--ion-item-background: #000000;--ion-card-background: #1c1c1d}:root.ios ion-modal{--ion-background-color: var(--ion-color-step-100, var(--ion-background-color-step-100));--ion-toolbar-background: var(--ion-color-step-150, var(--ion-background-color-step-150));--ion-toolbar-border-color: var(--ion-color-step-250, var(--ion-background-color-step-250))}:root.md{--ion-background-color: #121212;--ion-background-color-rgb: 18, 18, 18;--ion-text-color: #ffffff;--ion-text-color-rgb: 255, 255, 255;--ion-background-color-step-50: #1e1e1e;--ion-background-color-step-100: #2a2a2a;--ion-background-color-step-150: #363636;--ion-background-color-step-200: #414141;--ion-background-color-step-250: #4d4d4d;--ion-background-color-step-300: #595959;--ion-background-color-step-350: #656565;--ion-background-color-step-400: #717171;--ion-background-color-step-450: #7d7d7d;--ion-background-color-step-500: #898989;--ion-background-color-step-550: #949494;--ion-background-color-step-600: #a0a0a0;--ion-background-color-step-650: #acacac;--ion-background-color-step-700: #b8b8b8;--ion-background-color-step-750: #c4c4c4;--ion-background-color-step-800: #d0d0d0;--ion-background-color-step-850: #dbdbdb;--ion-background-color-step-900: #e7e7e7;--ion-background-color-step-950: #f3f3f3;--ion-text-color-step-50: #f3f3f3;--ion-text-color-step-100: #e7e7e7;--ion-text-color-step-150: #dbdbdb;--ion-text-color-step-200: #d0d0d0;--ion-text-color-step-250: #c4c4c4;--ion-text-color-step-300: #b8b8b8;--ion-text-color-step-350: #acacac;--ion-text-color-step-400: #a0a0a0;--ion-text-color-step-450: #949494;--ion-text-color-step-500: #898989;--ion-text-color-step-550: #7d7d7d;--ion-text-color-step-600: #717171;--ion-text-color-step-650: #656565;--ion-text-color-step-700: #595959;--ion-text-color-step-750: #4d4d4d;--ion-text-color-step-800: #414141;--ion-text-color-step-850: #363636;--ion-text-color-step-900: #2a2a2a;--ion-text-color-step-950: #1e1e1e;--ion-item-background: #1e1e1e;--ion-toolbar-background: #1f1f1f;--ion-tab-bar-background: #1f1f1f;--ion-card-background: #1e1e1e}.leaflet-pane,.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-tile-container,.leaflet-pane>svg,.leaflet-pane>canvas,.leaflet-zoom-box,.leaflet-image-layer,.leaflet-layer{position:absolute;left:0;top:0}.leaflet-container{overflow:hidden}.leaflet-tile,.leaflet-marker-icon,.leaflet-marker-shadow{-webkit-user-select:none;user-select:none;-webkit-user-drag:none}.leaflet-tile::selection{background:transparent}.leaflet-safari .leaflet-tile{image-rendering:-webkit-optimize-contrast}.leaflet-safari .leaflet-tile-container{width:1600px;height:1600px;-webkit-transform-origin:0 0}.leaflet-marker-icon,.leaflet-marker-shadow{display:block}.leaflet-container .leaflet-overlay-pane svg{max-width:none!important;max-height:none!important}.leaflet-container .leaflet-marker-pane img,.leaflet-container .leaflet-shadow-pane img,.leaflet-container .leaflet-tile-pane img,.leaflet-container img.leaflet-image-layer,.leaflet-container .leaflet-tile{max-width:none!important;max-height:none!important;width:auto;padding:0}.leaflet-container img.leaflet-tile{mix-blend-mode:plus-lighter}.leaflet-container.leaflet-touch-zoom{touch-action:pan-x pan-y}.leaflet-container.leaflet-touch-drag{touch-action:none;touch-action:pinch-zoom}.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom{touch-action:none}.leaflet-container{-webkit-tap-highlight-color:transparent}.leaflet-container a{-webkit-tap-highlight-color:rgba(51,181,229,.4)}.leaflet-tile{filter:inherit;visibility:hidden}.leaflet-tile-loaded{visibility:inherit}.leaflet-zoom-box{width:0;height:0;box-sizing:border-box;z-index:800}.leaflet-overlay-pane svg{-moz-user-select:none}.leaflet-pane{z-index:400}.leaflet-tile-pane{z-index:200}.leaflet-overlay-pane{z-index:400}.leaflet-shadow-pane{z-index:500}.leaflet-marker-pane{z-index:600}.leaflet-tooltip-pane{z-index:650}.leaflet-popup-pane{z-index:700}.leaflet-map-pane canvas{z-index:100}.leaflet-map-pane svg{z-index:200}.leaflet-vml-shape{width:1px;height:1px}.lvml{behavior:url(#default#VML);display:inline-block;position:absolute}.leaflet-control{position:relative;z-index:800;pointer-events:visiblePainted;pointer-events:auto}.leaflet-top,.leaflet-bottom{position:absolute;z-index:1000;pointer-events:none}.leaflet-top{top:0}.leaflet-right{right:0}.leaflet-bottom{bottom:0}.leaflet-left{left:0}.leaflet-control{float:left;clear:both}.leaflet-right .leaflet-control{float:right}.leaflet-top .leaflet-control{margin-top:10px}.leaflet-bottom .leaflet-control{margin-bottom:10px}.leaflet-left .leaflet-control{margin-left:10px}.leaflet-right .leaflet-control{margin-right:10px}.leaflet-fade-anim .leaflet-popup{opacity:0;transition:opacity .2s linear}.leaflet-fade-anim .leaflet-map-pane .leaflet-popup{opacity:1}.leaflet-zoom-animated{transform-origin:0 0}svg.leaflet-zoom-animated{will-change:transform}.leaflet-zoom-anim .leaflet-zoom-animated{transition:transform .25s cubic-bezier(0,0,.25,1)}.leaflet-zoom-anim .leaflet-tile,.leaflet-pan-anim .leaflet-tile{transition:none}.leaflet-zoom-anim .leaflet-zoom-hide{visibility:hidden}.leaflet-interactive{cursor:pointer}.leaflet-grab{cursor:grab}.leaflet-crosshair,.leaflet-crosshair .leaflet-interactive{cursor:crosshair}.leaflet-popup-pane,.leaflet-control{cursor:auto}.leaflet-dragging .leaflet-grab,.leaflet-dragging .leaflet-grab .leaflet-interactive,.leaflet-dragging .leaflet-marker-draggable{cursor:move;cursor:grabbing}.leaflet-marker-icon,.leaflet-marker-shadow,.leaflet-image-layer,.leaflet-pane>svg path,.leaflet-tile-container{pointer-events:none}.leaflet-marker-icon.leaflet-interactive,.leaflet-image-layer.leaflet-interactive,.leaflet-pane>svg path.leaflet-interactive,svg.leaflet-image-layer.leaflet-interactive path{pointer-events:visiblePainted;pointer-events:auto}.leaflet-container{background:#ddd;outline-offset:1px}.leaflet-container a{color:#0078a8}.leaflet-zoom-box{border:2px dotted #38f;background:#ffffff80}.leaflet-container{font-family:Helvetica Neue,Arial,Helvetica,sans-serif;font-size:12px;font-size:.75rem;line-height:1.5}.leaflet-bar{box-shadow:0 1px 5px #000000a6;border-radius:4px}.leaflet-bar a{background-color:#fff;border-bottom:1px solid #ccc;width:26px;height:26px;line-height:26px;display:block;text-align:center;text-decoration:none;color:#000}.leaflet-bar a,.leaflet-control-layers-toggle{background-position:50% 50%;background-repeat:no-repeat;display:block}.leaflet-bar a:hover,.leaflet-bar a:focus{background-color:#f4f4f4}.leaflet-bar a:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.leaflet-bar a:last-child{border-bottom-left-radius:4px;border-bottom-right-radius:4px;border-bottom:none}.leaflet-bar a.leaflet-disabled{cursor:default;background-color:#f4f4f4;color:#bbb}.leaflet-touch .leaflet-bar a{width:30px;height:30px;line-height:30px}.leaflet-touch .leaflet-bar a:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.leaflet-touch .leaflet-bar a:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px}.leaflet-control-zoom-in,.leaflet-control-zoom-out{font:700 18px Lucida Console,Monaco,monospace;text-indent:1px}.leaflet-touch .leaflet-control-zoom-in,.leaflet-touch .leaflet-control-zoom-out{font-size:22px}.leaflet-control-layers{box-shadow:0 1px 5px #0006;background:#fff;border-radius:5px}.leaflet-control-layers-toggle{background-image:url(layers.ef6db8722c2c3f9a.png);width:36px;height:36px}.leaflet-retina .leaflet-control-layers-toggle{background-image:url(layers-2x.9859cd1231006a4a.png);background-size:26px 26px}.leaflet-touch .leaflet-control-layers-toggle{width:44px;height:44px}.leaflet-control-layers .leaflet-control-layers-list,.leaflet-control-layers-expanded .leaflet-control-layers-toggle{display:none}.leaflet-control-layers-expanded .leaflet-control-layers-list{display:block;position:relative}.leaflet-control-layers-expanded{padding:6px 10px 6px 6px;color:#333;background:#fff}.leaflet-control-layers-scrollbar{overflow-y:scroll;overflow-x:hidden;padding-right:5px}.leaflet-control-layers-selector{margin-top:2px;position:relative;top:1px}.leaflet-control-layers label{display:block;font-size:13px;font-size:1.08333em}.leaflet-control-layers-separator{height:0;border-top:1px solid #ddd;margin:5px -10px 5px -6px}.leaflet-default-icon-path{background-image:url(marker-icon.d577052aa271e13f.png)}.leaflet-container .leaflet-control-attribution{background:#fff;background:#fffc;margin:0}.leaflet-control-attribution,.leaflet-control-scale-line{padding:0 5px;color:#333;line-height:1.4}.leaflet-control-attribution a{text-decoration:none}.leaflet-control-attribution a:hover,.leaflet-control-attribution a:focus{text-decoration:underline}.leaflet-attribution-flag{display:inline!important;vertical-align:baseline!important;width:1em;height:.6669em}.leaflet-left .leaflet-control-scale{margin-left:5px}.leaflet-bottom .leaflet-control-scale{margin-bottom:5px}.leaflet-control-scale-line{border:2px solid #777;border-top:none;line-height:1.1;padding:2px 5px 1px;white-space:nowrap;box-sizing:border-box;background:#fffc;text-shadow:1px 1px #fff}.leaflet-control-scale-line:not(:first-child){border-top:2px solid #777;border-bottom:none;margin-top:-2px}.leaflet-control-scale-line:not(:first-child):not(:last-child){border-bottom:2px solid #777}.leaflet-touch .leaflet-control-attribution,.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{box-shadow:none}.leaflet-touch .leaflet-control-layers,.leaflet-touch .leaflet-bar{border:2px solid rgba(0,0,0,.2);background-clip:padding-box}.leaflet-popup{position:absolute;text-align:center;margin-bottom:20px}.leaflet-popup-content-wrapper{padding:1px;text-align:left;border-radius:12px}.leaflet-popup-content{margin:13px 24px 13px 20px;line-height:1.3;font-size:13px;font-size:1.08333em;min-height:1px}.leaflet-popup-content p{margin:1.3em 0}.leaflet-popup-tip-container{width:40px;height:20px;position:absolute;left:50%;margin-top:-1px;margin-left:-20px;overflow:hidden;pointer-events:none}.leaflet-popup-tip{width:17px;height:17px;padding:1px;margin:-10px auto 0;pointer-events:auto;transform:rotate(45deg)}.leaflet-popup-content-wrapper,.leaflet-popup-tip{background:#fff;color:#333;box-shadow:0 3px 14px #0006}.leaflet-container a.leaflet-popup-close-button{position:absolute;top:0;right:0;border:none;text-align:center;width:24px;height:24px;font:16px/24px Tahoma,Verdana,sans-serif;color:#757575;text-decoration:none;background:transparent}.leaflet-container a.leaflet-popup-close-button:hover,.leaflet-container a.leaflet-popup-close-button:focus{color:#585858}.leaflet-popup-scrolled{overflow:auto}.leaflet-oldie .leaflet-popup-content-wrapper{-ms-zoom:1}.leaflet-oldie .leaflet-popup-tip{width:24px;margin:0 auto;-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";filter:progid:DXImageTransform.Microsoft.Matrix(M11=.70710678,M12=.70710678,M21=-.70710678,M22=.70710678)}.leaflet-oldie .leaflet-control-zoom,.leaflet-oldie .leaflet-control-layers,.leaflet-oldie .leaflet-popup-content-wrapper,.leaflet-oldie .leaflet-popup-tip{border:1px solid #999}.leaflet-div-icon{background:#fff;border:1px solid #666}.leaflet-tooltip{position:absolute;padding:6px;background-color:#fff;border:1px solid #fff;border-radius:3px;color:#222;white-space:nowrap;-webkit-user-select:none;user-select:none;pointer-events:none;box-shadow:0 1px 3px #0006}.leaflet-tooltip.leaflet-interactive{cursor:pointer;pointer-events:auto}.leaflet-tooltip-top:before,.leaflet-tooltip-bottom:before,.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{position:absolute;pointer-events:none;border:6px solid transparent;background:transparent;content:""}.leaflet-tooltip-bottom{margin-top:6px}.leaflet-tooltip-top{margin-top:-6px}.leaflet-tooltip-bottom:before,.leaflet-tooltip-top:before{left:50%;margin-left:-6px}.leaflet-tooltip-top:before{bottom:0;margin-bottom:-12px;border-top-color:#fff}.leaflet-tooltip-bottom:before{top:0;margin-top:-12px;margin-left:-6px;border-bottom-color:#fff}.leaflet-tooltip-left{margin-left:-6px}.leaflet-tooltip-right{margin-left:6px}.leaflet-tooltip-left:before,.leaflet-tooltip-right:before{top:50%;margin-top:-6px}.leaflet-tooltip-left:before{right:0;margin-right:-12px;border-left-color:#fff}.leaflet-tooltip-right:before{left:0;margin-left:-12px;border-right-color:#fff}@media print{.leaflet-control{-webkit-print-color-adjust:exact;color-adjust:exact;print-color-adjust:exact}}*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.bottom-0{bottom:0}.right-0{right:0}.z-10{z-index:10}.z-50{z-index:50}.m-1{margin:.25rem}.m-2{margin:.5rem}.m-4{margin:1rem}.m-6{margin:1.5rem}.mb-2{margin-bottom:.5rem}.mb-6{margin-bottom:1.5rem}.ml-auto{margin-left:auto}.mt-2{margin-top:.5rem}.mt-auto{margin-top:auto}.block{display:block}.flex{display:flex}.grid{display:grid}.hidden{display:none}.h-12{height:3rem}.h-48{height:12rem}.h-60{height:15rem}.h-96{height:24rem}.h-\[25em\]{height:25em}.h-full{height:100%}.min-h-full{min-height:100%}.w-1\/3{width:33.333333%}.w-1\/6{width:16.666667%}.w-12{width:3rem}.w-2\/3{width:66.666667%}.w-full{width:100%}.min-w-full{min-width:100%}.flex-grow{flex-grow:1}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.overflow-y-auto{overflow-y:auto}.rounded-2xl{border-radius:1rem}.rounded-3xl{border-radius:1.5rem}.rounded-full{border-radius:9999px}.rounded-tl-2xl{border-top-left-radius:1rem}.rounded-tr-2xl{border-top-right-radius:1rem}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity))}.bg-cyan-800{--tw-bg-opacity: 1;background-color:rgb(21 94 117 / var(--tw-bg-opacity))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity))}.bg-gray-500{--tw-bg-opacity: 1;background-color:rgb(107 114 128 / var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity))}.bg-purple-300{--tw-bg-opacity: 1;background-color:rgb(216 180 254 / var(--tw-bg-opacity))}.bg-purple-400{--tw-bg-opacity: 1;background-color:rgb(192 132 252 / var(--tw-bg-opacity))}.bg-purple-800{--tw-bg-opacity: 1;background-color:rgb(107 33 168 / var(--tw-bg-opacity))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity))}.bg-transparent{background-color:transparent}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity))}.bg-opacity-60{--tw-bg-opacity: .6}.p-1{padding:.25rem}.p-10{padding:2.5rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.pr-2{padding-right:.5rem}.text-right{text-align:right}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-4xl{font-size:2.25rem;line-height:2.5rem}.text-5xl{font-size:3rem;line-height:1}.text-6xl{font-size:3.75rem;line-height:1}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity))}.outline{outline-style:solid}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.hover\:bg-gray-300:hover{--tw-bg-opacity: 1;background-color:rgb(209 213 219 / var(--tw-bg-opacity))}.hover\:bg-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity))}@media (min-width: 768px){.md\:m-10{margin:2.5rem}.md\:flex{display:flex}.md\:hidden{display:none}.md\:h-3\/4{height:75%}.md\:h-full{height:100%}.md\:flex-row{flex-direction:row}.md\:justify-end{justify-content:flex-end}.md\:p-4{padding:1rem}.md\:text-2xl{font-size:1.5rem;line-height:2rem}}@media (min-width: 1024px){.lg\:m-10{margin:2.5rem}.lg\:ml-2{margin-left:.5rem}.lg\:block{display:block}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:h-3\/4{height:75%}.lg\:h-96{height:24rem}.lg\:h-full{height:100%}.lg\:min-w-20{min-width:5rem}.lg\:flex-row{flex-direction:row}.lg\:justify-center{justify-content:center}.lg\:p-32{padding:8rem}.lg\:p-4{padding:1rem}.lg\:text-2xl{font-size:1.5rem;line-height:2rem}.lg\:text-6xl{font-size:3.75rem;line-height:1}.lg\:text-lg{font-size:1.125rem;line-height:1.75rem}}:root{--ion-color-ai_purple: #9d68be;--ion-color-ai_purple-rgb: 157,104,190;--ion-color-ai_purple-contrast: #000000;--ion-color-ai_purple-contrast-rgb: 0,0,0;--ion-color-ai_purple-shade: #8a5ca7;--ion-color-ai_purple-tint: #a777c5}.ion-color-ai_purple{--ion-color-base: var(--ion-color-ai_purple);--ion-color-base-rgb: var(--ion-color-ai_purple-rgb);--ion-color-contrast: var(--ion-color-ai_purple-contrast);--ion-color-contrast-rgb: var(--ion-color-ai_purple-contrast-rgb);--ion-color-shade: var(--ion-color-ai_purple-shade);--ion-color-tint: var(--ion-color-ai_purple-tint)}