From 92744c8797bf9da622b22d1b867447e493dd4f23 Mon Sep 17 00:00:00 2001 From: plg22 Date: Tue, 11 Apr 2023 17:29:24 +0200 Subject: [PATCH 01/66] Added some design decisions --- docs/09_design_decisions.adoc | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/09_design_decisions.adoc b/docs/09_design_decisions.adoc index c413451..1440211 100644 --- a/docs/09_design_decisions.adoc +++ b/docs/09_design_decisions.adoc @@ -10,4 +10,9 @@ | React Libraries | In order to make our life easier while the development of the application, we made the decision to include some libraries in the project. These libraries we used are listed on issue #42. | SonarCloud | This has been presented to us on one laboratory, it measures how many lines of code are being tested using TDD. | Cucumber | In order to make the mandatory BDD tests, we are going to use a tool that we somewhat knew from other courses in the degree, used to make the acceptance tests. +| Prioritize | As we have seen until the third deliverable, we are having some trouble on some things. As a result, we have decided to focus on the more functional requirements on this last deliverable. +| MongoDB | The application main place for storing information is still Solid. We made the decision to store in a database on the cloud with the users that log into our app. Each time a new user logs into the lomap application, its username and webID of solid are stored in our database in order to help the interactions of users on the app, making sure each user can only see the friends that have logged into the app. +| Landmarks | We have been dealing with a problem related with the persistence of the landmarks on solid, as a temporal solution, we decided to store them in the mongo database, which in the future will be changed. +| Friends | We had a little discussion over this topic on a meeting, reaching an agreement over only allowing the users to add friends via lomap. As the way of adding friends is quite special on this app and is done via Solid, we decided not allowing to cancel a friendship via lomap, as we thought it was something external to lomap, more related only with Solid. +| Coordinates | When we were dealing with adding landmarks, we were trying to add coordinates by writing the number, and we are changing our inicial approach to be able to click on the map and retrieve the coords of that point. |=== \ No newline at end of file From a0e0a99b7cb8af5c6f8c7d463d02dcebdc20240e Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 16 Apr 2023 18:13:11 +0200 Subject: [PATCH 02/66] The single marker part now actually works --- webapp/src/components/map/Map.tsx | 14 ++------ webapp/src/pages/addLandmark/AddLandmark.tsx | 37 ++++++++++++++------ 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/webapp/src/components/map/Map.tsx b/webapp/src/components/map/Map.tsx index bf83628..166c527 100644 --- a/webapp/src/components/map/Map.tsx +++ b/webapp/src/components/map/Map.tsx @@ -1,4 +1,4 @@ -import { MapContainer, TileLayer} from 'react-leaflet'; +import { MapContainer, TileLayer, useMapEvents} from 'react-leaflet'; import 'leaflet-css' import { useRef } from 'react'; import { useLeafletContext } from '@react-leaflet/core'; @@ -15,6 +15,7 @@ export default function Map(props : any): JSX.Element { attribution='© OpenStreetMap contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> + {props.otherComponents} < GetCenter /> ; } @@ -31,15 +32,6 @@ export function GetCenter() { } export function SingleMarker(props : any) { - props.map.on("click", (e : LeafletMouseEvent) => { - if (props.marker == null) { - props.marker = new L.Marker(e.latlng); - props.marker.addTo(props.map); - } else { - props.marker.setLatLng(e.latlng); - } - (document.getElementById("latitude") as HTMLInputElement).value = e.latlng.lat.toPrecision(4).toString(); - (document.getElementById("latitude") as HTMLInputElement).value = e.latlng.lng.toPrecision(4).toString(); - }); + return null; } \ No newline at end of file diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index f213283..55a26ca 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -1,4 +1,4 @@ -import Map from "../../components/map/Map"; +import Map, { SingleMarker } from "../../components/map/Map"; import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; import "../../components/map/stylesheets/addLandmark.css" @@ -9,19 +9,21 @@ import L from "leaflet"; import { LandmarkCategories } from "../../shared/shareddtypes"; import { makeRequest } from "../../axios"; import { useSession } from "@inrupt/solid-ui-react"; +import { MapContainer, TileLayer, useMapEvents } from "react-leaflet"; export default function AddLandmark() { const [coords, setCoords] = useState([0,0]); - let setCoordinates = () => { - let latitude : number | undefined = parseFloat((document.getElementById("latitude") as HTMLInputElement).value); - let longitude : number | undefined = parseFloat((document.getElementById("longitude") as HTMLInputElement).value); + const setCoordinates = (latitude : number, longitude : number) => { setCoords([latitude, longitude]); (map.current as L.Map).panTo([latitude, longitude]); - // Manual delete, since scoping the variable outside the function and updating it does not seem to work + // Manual delete to create the effect of moving the marker, + // since scoping the variable outside the function and updating it does not seem to work let markerNode : ChildNode = (document.querySelector("img[alt='Marker'") as ChildNode); if (markerNode) markerNode.remove(); new L.Marker([latitude, longitude]).setIcon(L.icon({iconUrl: markerIcon})).addTo(map.current as L.Map); + (document.getElementById("latitude") as HTMLInputElement).value = coords[0].toPrecision(4); + (document.getElementById("longitude") as HTMLInputElement).value = coords[1].toPrecision(4); } const {session} = useSession(); @@ -45,11 +47,22 @@ export default function AddLandmark() { // Here goes the access to SOLID }; + const map = useRef(null); let selectItems : JSX.Element[] = Object.keys(LandmarkCategories).map(key => { return {key}; }); + const MapEvents = () => { + useMapEvents({ + click(e) { + setCoordinates(e.latlng.lat, e.latlng.lng); + }, + }); + return null; + } + + return Add a landmark @@ -77,10 +90,7 @@ export default function AddLandmark() { Longitude - - - - + @@ -89,8 +99,13 @@ export default function AddLandmark() { - - + + + + ; ; From 07140b286f07d17c06e406e9c78e7add47915db4 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 16 Apr 2023 18:20:20 +0200 Subject: [PATCH 03/66] Fixed the CSS --- .../components/map/stylesheets/addLandmark.css | 2 +- webapp/src/pages/addLandmark/AddLandmark.tsx | 15 ++++++--------- webapp/src/pages/addLandmark/addLandmark.css | 1 - 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/webapp/src/components/map/stylesheets/addLandmark.css b/webapp/src/components/map/stylesheets/addLandmark.css index 7a5e126..d2c2caf 100644 --- a/webapp/src/components/map/stylesheets/addLandmark.css +++ b/webapp/src/components/map/stylesheets/addLandmark.css @@ -4,5 +4,5 @@ div [class="leaflet-container leaflet-touch leaflet-fade-anim leaflet-grab leafl align-items: center; width: 90%; height: 87vh; - margin-left: 5em; + margin-left: 2em; } \ No newline at end of file diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 55a26ca..cef982f 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -22,8 +22,8 @@ export default function AddLandmark() { let markerNode : ChildNode = (document.querySelector("img[alt='Marker'") as ChildNode); if (markerNode) markerNode.remove(); new L.Marker([latitude, longitude]).setIcon(L.icon({iconUrl: markerIcon})).addTo(map.current as L.Map); - (document.getElementById("latitude") as HTMLInputElement).value = coords[0].toPrecision(4); - (document.getElementById("longitude") as HTMLInputElement).value = coords[1].toPrecision(4); + (document.getElementById("latitude") as HTMLParagraphElement).textContent = latitude.toFixed(3); + (document.getElementById("longitude") as HTMLParagraphElement).textContent = longitude.toFixed(3); } const {session} = useSession(); @@ -62,7 +62,6 @@ export default function AddLandmark() { return null; } - return Add a landmark @@ -82,14 +81,12 @@ export default function AddLandmark() { - Latitude - + Latitude: + - Longitude - + Longitude: + diff --git a/webapp/src/pages/addLandmark/addLandmark.css b/webapp/src/pages/addLandmark/addLandmark.css index 9118514..f822998 100644 --- a/webapp/src/pages/addLandmark/addLandmark.css +++ b/webapp/src/pages/addLandmark/addLandmark.css @@ -3,7 +3,6 @@ h1 { } .myLandmarksContainer > div[class="leaflet-container leaflet-touch leaflet-fade-anim leaflet-grab leaflet-touch-drag leaflet-touch-zoom"]{ - margin-left: 3em; width: 80%; min-width: 20%; height: 100%; From 662d7e69c1f6f7350f65480859c7309f2f91d320 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 16 Apr 2023 18:29:04 +0200 Subject: [PATCH 04/66] Fixed a line of code that may cause a delay in the coordinates --- webapp/src/pages/addLandmark/AddLandmark.tsx | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index cef982f..4b61399 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -2,7 +2,7 @@ import Map, { SingleMarker } from "../../components/map/Map"; import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; import "../../components/map/stylesheets/addLandmark.css" -import { useRef, useState } from "react"; +import { useRef } from "react"; import { Button, MenuItem, Grid, Input, InputLabel, Select, Typography, FormControl } from "@mui/material"; import React from "react"; import L from "leaflet"; @@ -12,9 +12,9 @@ import { useSession } from "@inrupt/solid-ui-react"; import { MapContainer, TileLayer, useMapEvents } from "react-leaflet"; export default function AddLandmark() { - const [coords, setCoords] = useState([0,0]); + let coords : [number, number] = [0,0]; const setCoordinates = (latitude : number, longitude : number) => { - setCoords([latitude, longitude]); + coords = [latitude, longitude]; (map.current as L.Map).panTo([latitude, longitude]); // Manual delete to create the effect of moving the marker, @@ -54,11 +54,13 @@ export default function AddLandmark() { }); const MapEvents = () => { - useMapEvents({ - click(e) { - setCoordinates(e.latlng.lat, e.latlng.lng); - }, - }); + useMapEvents( + { + click(e) { + setCoordinates(e.latlng.lat, e.latlng.lng); + } + } + ); return null; } From 674b6283d5cecddfd8f51683b57288c62d34c1cb Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 17 Apr 2023 16:49:40 +0200 Subject: [PATCH 05/66] Added some tests --- webapp/src/pages/addLandmark/AddLandmark.tsx | 12 ++++---- webapp/test/LandmarkCategories.test.tsx | 32 ++++++++++++++++++++ 2 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 webapp/test/LandmarkCategories.test.tsx diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index f213283..aaeb324 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -47,7 +47,7 @@ export default function AddLandmark() { }; const map = useRef(null); let selectItems : JSX.Element[] = Object.keys(LandmarkCategories).map(key => { - return {key}; + return {key}; }); return @@ -55,19 +55,19 @@ export default function AddLandmark() { Add a landmark -
+ - + Name of the landmark - + Category of the landmark - {selectItems} - + Latitude { + const {getAllByTestId} = render() + let values : string[] = Object.values(Landmark); + let renderedValues : string[] = getAllByTestId("option-test").map(elem => elem.toString()); + + expect(renderedValues.length === values.length).toBeTruthy(); + for (let i : number = 0; i < values.length; i++){ + expect(renderedValues[i] === values[i]).toBeTruthy(); + } +}); + +test("Check the form is correctly rendered", () => { + const {getByTestId, getByText, getByLabelText} = render() + expect(getByTestId("form-testid")).toBeInTheDocument(); + // First field group + expect(getByTestId("firstField-testid")).toBeInTheDocument(); + expect(getByText("Name of the landmark")).toBeInTheDocument(); + expect(getByLabelText("Name of the landmark")).toBeInTheDocument(); + // Second field group + expect(getByTestId("secondField-testid")).toBeInTheDocument(); + expect(getByText("Category of the landmark")).toBeInTheDocument(); + expect(getByLabelText("Category of the landmark")).toBeInTheDocument(); + // Third field group + expect(getByTestId("thirdField-testid")).toBeInTheDocument(); + expect(getByText("Latitude")).toBeInTheDocument(); + expect(getByTestId("Latitude-test")).toBeInTheDocument(); +}); \ No newline at end of file From fe27e9ad2edfd89ec54834368dcdcd2fc7eeee67 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 17 Apr 2023 17:06:34 +0200 Subject: [PATCH 06/66] Added new tests for the AddLandmarks page --- webapp/src/pages/addLandmark/AddLandmark.tsx | 6 ++-- ...egories.test.tsx => AddLandmarks.test.tsx} | 28 ++++++++++++++++++- webapp/test/OtherUsersLandmarks.tsx | 0 3 files changed, 30 insertions(+), 4 deletions(-) rename webapp/test/{LandmarkCategories.test.tsx => AddLandmarks.test.tsx} (56%) create mode 100644 webapp/test/OtherUsersLandmarks.tsx diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index aaeb324..0308b03 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -71,19 +71,19 @@ export default function AddLandmark() { Latitude + id = "latitude" style={{color:"#FFF"}} data-testid="Latitude-test"/> Longitude + id = "longitude" style={{color:"#FFF"}} data-testid="Longitude-test"/> - + diff --git a/webapp/test/LandmarkCategories.test.tsx b/webapp/test/AddLandmarks.test.tsx similarity index 56% rename from webapp/test/LandmarkCategories.test.tsx rename to webapp/test/AddLandmarks.test.tsx index 2cb7ed7..f8dedf1 100644 --- a/webapp/test/LandmarkCategories.test.tsx +++ b/webapp/test/AddLandmarks.test.tsx @@ -29,4 +29,30 @@ test("Check the form is correctly rendered", () => { expect(getByTestId("thirdField-testid")).toBeInTheDocument(); expect(getByText("Latitude")).toBeInTheDocument(); expect(getByTestId("Latitude-test")).toBeInTheDocument(); -}); \ No newline at end of file + // Fourth field group + expect(getByTestId("fourthField-testid")).toBeInTheDocument(); + expect(getByText("Longitude")).toBeInTheDocument(); + expect(getByTestId("Longitude-test")).toBeInTheDocument(); + // Button + expect(getByText("Save new landmark")).toBeInTheDocument(); +}); + +test("Check the map is rendered", () => { + const {container} = render() + expect(container.querySelector("div[class *= \"leaflet\"]")).toBeInTheDocument(); +}); + +test("Check clicking in the map once generates a landmark", () => { + const {container} = render(); + const mapElement = container.querySelector("div[class *= \"leaflet\"]"); + fireEvent.click(mapElement); + expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); +}); + +test("Check clicking in the map twice does not generate a landmark", () => { + const {container} = render(); + const mapElement = container.querySelector("div[class *= \"leaflet\"]"); + fireEvent.dblClick(mapElement); + expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); +}); + diff --git a/webapp/test/OtherUsersLandmarks.tsx b/webapp/test/OtherUsersLandmarks.tsx new file mode 100644 index 0000000..e69de29 From ce1c576ad8dc84ecd7fd9d004dd409acd9e82665 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 17 Apr 2023 19:44:39 +0200 Subject: [PATCH 07/66] Refactored the home page and landmark friend pages, removing the map interface --- webapp/src/pages/addLandmark/AddLandmark.tsx | 2 +- webapp/src/pages/home/Home.tsx | 12 +++++++++--- .../src/pages/otherUsersLandmark/LandmarkFriend.tsx | 13 +++++++++---- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 4b61399..d18eada 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -98,7 +98,7 @@ export default function AddLandmark() {
- +

Home

- {landmarks} + + + {landmarks} + ; ); } diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index e0e532d..7f0b934 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -1,8 +1,9 @@ import { Grid, Typography } from "@mui/material"; import Map from "../../components/map/Map"; -import { useRef } from "react"; +import React, { useRef } from "react"; import * as LFF from "./LandmarkFriendFunctions"; import "../../components/map/stylesheets/addLandmark.css" +import {MapContainer, TileLayer} from "react-leaflet"; export default function LandmarkFriend() : JSX.Element{ @@ -24,10 +25,14 @@ export default function LandmarkFriend() : JSX.Element{
- - + + + - + ;
; From dec32b9ee20d1a29e326e5bb437045ac937dd7c8 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 17 Apr 2023 20:25:58 +0200 Subject: [PATCH 08/66] Nearly finished the refactor. All is left is the retrieval for type safety --- .../otherUsersLandmark/LandmarkFriend.tsx | 151 ++++++++++++++++-- .../LandmarkFriendFunctions.tsx | 124 -------------- 2 files changed, 135 insertions(+), 140 deletions(-) delete mode 100644 webapp/src/pages/otherUsersLandmark/LandmarkFriendFunctions.tsx diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 7f0b934..c211d4f 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -1,29 +1,34 @@ -import { Grid, Typography } from "@mui/material"; -import Map from "../../components/map/Map"; -import React, { useRef } from "react"; -import * as LFF from "./LandmarkFriendFunctions"; +import { + Button, Checkbox, + FormControl, FormControlLabel, + Grid, Input, + InputLabel, MenuItem, Select, + TextField, + Typography +} from "@mui/material"; +import markerIcon from "leaflet/dist/images/marker-icon.png"; +import React, {useRef, useState} from "react"; import "../../components/map/stylesheets/addLandmark.css" -import {MapContainer, TileLayer} from "react-leaflet"; +import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; +import {useParams} from "react-router-dom"; +import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; +import {useQuery} from "@tanstack/react-query"; +import {makeRequest} from "../../axios"; export default function LandmarkFriend() : JSX.Element{ const map = useRef(null); - const isCommentEnabled = useRef(true); // TODO: Changes to true when selecting a landmark + const [isCommentEnabled, setIsCommentEnabled] = useState(false); + const [selectedMarker, setSelectedMarker] = useState(null); return See friends' landmarks -
- - -
- - -
- - + + { isCommentEnabled ? : null} + { isCommentEnabled ? : null }
@@ -31,9 +36,123 @@ export default function LandmarkFriend() : JSX.Element{ attribution='© OpenStreetMap contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> - + ;
; +} + +function AddScoreForm() : JSX.Element { + return
+ + Add a comment + + + + + + + +
+ ; +} + +function AddCommentForm() : JSX.Element { + return
+ + Add a score + + Score + + + + + + ; +
; +} + +function LandmarkPlacer(props : any) : JSX.Element { + + const setIsCommentEnabled = props.commFunction; + const setSelectedMarker = props.markerFunction; + const clickHandler : any = (e : any) => { + setIsCommentEnabled(true); + setSelectedMarker(e.target); + return null; + }; + + // TODO: Retrieve all the landmarks. The array that follows is a temporal placeholder. + let landmarks : JSX.Element[] = [].map(element => { + + + {element.text} + + + }); + return {landmarks}; +} + +function LandmarkFilter(props : any) : JSX.Element { + + const uuid = useParams().id; + const [landmarks,setLandmarks] = useState([]); + const { isLoading, error, data:friends } = useQuery(["results"], () => + + makeRequest.get("/solid/" + uuid + "/friends").then((res) => { + let landmks:Landmark[] = []; + for (let i = 0; i < res.data.length; i++) { + + + makeRequest.post("/landmarks/friend",{webId: res.data[i].solidURL}).then((res1) => { + for (let i = 0; i < res1.data.length; i++) { + let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude,res1.data[i].category); + landmks.push(landmark); + } + } + ) + } + setLandmarks(landmks); + console.log(landmks); + }) + ); + + // TODO: Import here the users that are friends with the logged one + const loadUsers = () => { + let userList : User[] = []; + let userItems : JSX.Element[] = userList.map(key => { + return {key}; + }); + + userItems.push(All users); + return ; + } + const loadCategories = () => { + let categoryList : string[] = Object.values(LandmarkCategories); + let categories : JSX.Element[] = categoryList.map(key => { + return + } label={key} /> + + }); + + return + {categories} + ; + } + return
+ + + User + {loadUsers()} + + + Category + {loadCategories()} + + +
; } \ No newline at end of file diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriendFunctions.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriendFunctions.tsx deleted file mode 100644 index ff29bf2..0000000 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriendFunctions.tsx +++ /dev/null @@ -1,124 +0,0 @@ -import { InputLabel, Select, MenuItem, Box, TextField, Button, FormControl, Grid, Checkbox, FormControlLabel, Typography, Input} from "@mui/material"; -import { LandmarkCategories, User } from "../../shared/shareddtypes"; -import { Marker, Popup } from "react-leaflet"; -import { Form, useParams } from "react-router-dom"; -import { makeRequest } from "../../axios"; -import { useQuery } from "@tanstack/react-query"; -import { useState } from "react"; -import { Landmark } from "../../shared/shareddtypes"; -export function LandmarkFilter(props : any) : JSX.Element { - const uuid = useParams().id; - const [landmarks,setLandmarks] = useState([]); - const { isLoading, error, data:friends } = useQuery(["results"], () => - - makeRequest.get("/solid/" + uuid + "/friends").then((res) => { - let landmks:Landmark[] = []; - for (let i = 0; i < res.data.length; i++) { - - - makeRequest.post("/landmarks/friend",{webId: res.data[i].solidURL}).then((res1) => { - for (let i = 0; i < res1.data.length; i++) { - let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude,res1.data[i].category); - landmks.push(landmark); - } - } - ) - } - setLandmarks(landmks); - console.log(landmks); - }) - ); - - // TODO: Import here the users that are friends with the logged one - const loadUsers = () => { - let userList : User[] = []; - let userItems : JSX.Element[] = userList.map(key => { - return {key}; - }); - - userItems.push(All users); - return ; - } - const loadCategories = () => { - let categoryList : string[] = Object.values(LandmarkCategories); - let categories : JSX.Element[] = categoryList.map(key => { - return - } label={key} /> - - }); - - return - {categories} - ; - } - return - - User - {loadUsers()} - - - Category - {loadCategories()} - - ; -} -export function LandmarkPlacer(props : any) : JSX.Element { - let map : L.Map = props.any; - if (map == undefined || map == null) { - throw "The map is undefined"; - } - - // TODO: Retrieve all the landmarks. The array that follows is a temporal placeholder. - let landmarks : any[] = []; - return
- { - landmarks.forEach(element => { - - - {element.name} - - - }) - } -
-} - -export function LandmarkAddComment(props : any) : JSX.Element { - let commentsEnabled : boolean = props.isCommentEnabled.current as boolean; - let returnElement : any = null; - if (commentsEnabled) { - returnElement = - Add a comment - - - - - - - ; - } - return returnElement; - ; -} - -export function LandmarkAddScore(props : any) : JSX.Element { - let commentsEnabled : boolean = props.isCommentEnabled.current as boolean; - let returnElement : any = null; - if (commentsEnabled) { - returnElement = - Add a score - - Score - - - - - - ; - } - return returnElement; - ; -} \ No newline at end of file From 6721532361c19103a116664cd81d5357791ac316 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 17 Apr 2023 20:28:17 +0200 Subject: [PATCH 09/66] Minor changes. Added original state of the test for commenting landmarks --- webapp/test/AddLandmarks.test.tsx | 4 +- webapp/test/OtherUsersLandmarks.tsx | 57 +++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 2 deletions(-) diff --git a/webapp/test/AddLandmarks.test.tsx b/webapp/test/AddLandmarks.test.tsx index f8dedf1..36796ab 100644 --- a/webapp/test/AddLandmarks.test.tsx +++ b/webapp/test/AddLandmarks.test.tsx @@ -1,7 +1,7 @@ -import { render, fireEvent, act } from "@testing-library/react"; +import { render, fireEvent } from "@testing-library/react"; import AddLandmarks from "../src/pages/addLandmark/AddLandmark" import {Landmark} from '../src/shared/shareddtypes'; -jest.mock('../api/api'); +import React from "react"; test("Check all the landmark types are rendered", () => { const {getAllByTestId} = render() diff --git a/webapp/test/OtherUsersLandmarks.tsx b/webapp/test/OtherUsersLandmarks.tsx index e69de29..ac41039 100644 --- a/webapp/test/OtherUsersLandmarks.tsx +++ b/webapp/test/OtherUsersLandmarks.tsx @@ -0,0 +1,57 @@ +import { render, fireEvent } from "@testing-library/react"; +import LandmarkFriend from "../src/pages/otherUsersLandmark/LandmarkFriend" +import {Landmark} from '../src/shared/shareddtypes'; +import React from "react"; + +test("Check all the landmark types are rendered", () => { + const {getAllByTestId} = render() + let values : string[] = Object.values(Landmark); + let renderedValues : string[] = getAllByTestId("option-test").map(elem => elem.toString()); + + expect(renderedValues.length === values.length).toBeTruthy(); + for (let i : number = 0; i < values.length; i++){ + expect(renderedValues[i] === values[i]).toBeTruthy(); + } +}); + +test("Check the form is correctly rendered", () => { + const {getByTestId, getByText, getByLabelText} = render() + expect(getByTestId("form-testid")).toBeInTheDocument(); + // First field group + expect(getByTestId("firstField-testid")).toBeInTheDocument(); + expect(getByText("Name of the landmark")).toBeInTheDocument(); + expect(getByLabelText("Name of the landmark")).toBeInTheDocument(); + // Second field group + expect(getByTestId("secondField-testid")).toBeInTheDocument(); + expect(getByText("Category of the landmark")).toBeInTheDocument(); + expect(getByLabelText("Category of the landmark")).toBeInTheDocument(); + // Third field group + expect(getByTestId("thirdField-testid")).toBeInTheDocument(); + expect(getByText("Latitude")).toBeInTheDocument(); + expect(getByTestId("Latitude-test")).toBeInTheDocument(); + // Fourth field group + expect(getByTestId("fourthField-testid")).toBeInTheDocument(); + expect(getByText("Longitude")).toBeInTheDocument(); + expect(getByTestId("Longitude-test")).toBeInTheDocument(); + // Button + expect(getByText("Save new landmark")).toBeInTheDocument(); +}); + +test("Check the map is rendered", () => { + const {container} = render() + expect(container.querySelector("div[class *= \"leaflet\"]")).toBeInTheDocument(); +}); + +test("Check clicking in the map once generates a landmark", () => { + const {container} = render(); + const mapElement = container.querySelector("div[class *= \"leaflet\"]"); + fireEvent.click(mapElement); + expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); +}); + +test("Check clicking in the map twice does not generate a landmark", () => { + const {container} = render(); + const mapElement = container.querySelector("div[class *= \"leaflet\"]"); + fireEvent.dblClick(mapElement); + expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); +}); \ No newline at end of file From 399c809ce3aed33c33366b0874a88479cc963229 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 18 Apr 2023 21:03:17 +0200 Subject: [PATCH 10/66] Refactored a lot of code, removing useless imports. Fixed the test errors --- webapp/package.json | 2 +- webapp/src/App.tsx | 8 +- webapp/src/components/leftBar/LeftBar.tsx | 10 +- webapp/src/components/map/Map.tsx | 7 +- webapp/src/components/map/MapMarker.tsx | 4 +- webapp/src/components/navbar/Navbar.tsx | 5 +- webapp/src/index.tsx | 3 +- webapp/src/pages/addLandmark/AddLandmark.tsx | 37 ++++--- webapp/src/pages/friends/Friends.tsx | 74 +++++++------- webapp/src/pages/home/Home.tsx | 97 ++++++++++--------- webapp/src/pages/home/home.css | 2 +- webapp/src/pages/login/Login.tsx | 69 ++++++------- webapp/src/pages/login/login.css | 10 +- .../otherUsersLandmark/LandmarkFriend.tsx | 35 ++++--- webapp/src/pages/profile/Profile.tsx | 21 ++-- webapp/src/pages/profile/profile.css | 22 ++--- webapp/src/pages/users/Users.tsx | 74 +++++++------- webapp/src/reportWebVitals.ts | 2 +- webapp/src/setupTests.ts | 4 + .../test/AddLandmarks.test.tsx} | 30 +++--- webapp/src/unused/App.test.tsx | 9 -- webapp/src/unused/EmailForm.test.tsx | 33 ------- webapp/src/unused/EmailForm.tsx | 6 +- webapp/src/unused/UserList.test.tsx | 11 --- webapp/src/unused/UserList.tsx | 1 - webapp/src/unused/Welcome.test.tsx | 9 -- webapp/src/unused/api/userApi.ts | 2 +- webapp/test/AddLandmarks.test.tsx | 58 ----------- 28 files changed, 272 insertions(+), 373 deletions(-) rename webapp/{test/OtherUsersLandmarks.tsx => src/test/AddLandmarks.test.tsx} (70%) delete mode 100644 webapp/src/unused/App.test.tsx delete mode 100644 webapp/src/unused/EmailForm.test.tsx delete mode 100644 webapp/src/unused/UserList.test.tsx delete mode 100644 webapp/src/unused/Welcome.test.tsx delete mode 100644 webapp/test/AddLandmarks.test.tsx diff --git a/webapp/package.json b/webapp/package.json index 20e9bb6..825e139 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -34,7 +34,7 @@ "scripts": { "start": "react-scripts start", "build": "react-scripts build", - "test": "react-scripts test --coverage", + "test": "react-scripts test --transformIgnorePatterns \"node_modules/(?!ol)/\" --coverage ./test", "test:e2e": "start-server-and-test 'npm --prefix ../restapi start' http://localhost:5000/api/users/list prod 3000 'cd e2e && jest'", "eject": "react-scripts eject", "prod": "ts-node-dev ./server.ts" diff --git a/webapp/src/App.tsx b/webapp/src/App.tsx index 38a164e..b708565 100644 --- a/webapp/src/App.tsx +++ b/webapp/src/App.tsx @@ -1,11 +1,9 @@ - import './App.css'; -import { QueryClient,QueryClientProvider} from '@tanstack/react-query'; -import { createBrowserRouter,Outlet,Navigate,RouterProvider } from 'react-router-dom'; +import {QueryClient, QueryClientProvider} from '@tanstack/react-query'; +import {createBrowserRouter, Outlet, RouterProvider} from 'react-router-dom'; import Navbar from './components/navbar/Navbar'; -import { SessionContext, useSession} from "@inrupt/solid-ui-react"; - +import {useSession} from "@inrupt/solid-ui-react"; import Home from './pages/home/Home'; diff --git a/webapp/src/components/leftBar/LeftBar.tsx b/webapp/src/components/leftBar/LeftBar.tsx index f2a3f9a..4a58845 100644 --- a/webapp/src/components/leftBar/LeftBar.tsx +++ b/webapp/src/components/leftBar/LeftBar.tsx @@ -1,13 +1,11 @@ import "./leftBar.css"; -import { Link } from "react-router-dom"; +import {Link} from "react-router-dom"; import PersonIcon from '@mui/icons-material/Person'; import LocationOnIcon from '@mui/icons-material/LocationOn'; -import DirectionsIcon from '@mui/icons-material/Directions'; import PeopleAltIcon from '@mui/icons-material/PeopleAlt'; -import { useEffect } from "react"; -import { makeRequest } from "../../axios"; -import { useState } from "react"; -import { useSession } from "@inrupt/solid-ui-react"; +import {useEffect, useState} from "react"; +import {makeRequest} from "../../axios"; +import {useSession} from "@inrupt/solid-ui-react"; function LeftBar(): JSX.Element{ const [user, setUser] = useState(""); diff --git a/webapp/src/components/map/Map.tsx b/webapp/src/components/map/Map.tsx index 166c527..5bda8d7 100644 --- a/webapp/src/components/map/Map.tsx +++ b/webapp/src/components/map/Map.tsx @@ -1,8 +1,7 @@ -import { MapContainer, TileLayer, useMapEvents} from 'react-leaflet'; +import {MapContainer, TileLayer} from 'react-leaflet'; import 'leaflet-css' -import { useRef } from 'react'; -import { useLeafletContext } from '@react-leaflet/core'; -import L, { LeafletMouseEvent } from 'leaflet'; +import {useRef} from 'react'; +import {useLeafletContext} from '@react-leaflet/core'; export default function Map(props : any): JSX.Element { let map = useRef(null); diff --git a/webapp/src/components/map/MapMarker.tsx b/webapp/src/components/map/MapMarker.tsx index 6510efd..f2d2821 100644 --- a/webapp/src/components/map/MapMarker.tsx +++ b/webapp/src/components/map/MapMarker.tsx @@ -1,6 +1,6 @@ import React from 'react'; -import { Landmark } from '../../shared/shareddtypes'; -import { Marker, Popup } from 'react-leaflet'; +import {Landmark} from '../../shared/shareddtypes'; +import {Marker, Popup} from 'react-leaflet'; class MapMarker extends React.Component { diff --git a/webapp/src/components/navbar/Navbar.tsx b/webapp/src/components/navbar/Navbar.tsx index 4fec78d..f2edae4 100644 --- a/webapp/src/components/navbar/Navbar.tsx +++ b/webapp/src/components/navbar/Navbar.tsx @@ -1,7 +1,6 @@ -import React, { useState } from "react"; -import { Link, useNavigate } from "react-router-dom"; +import React, {useState} from "react"; +import {Link, useNavigate} from "react-router-dom"; import "./navbar.css"; -import { makeRequest } from "../../axios"; import PersonSearchIcon from '@mui/icons-material/PersonSearch'; import {LogoutButton, useSession} from "@inrupt/solid-ui-react"; diff --git a/webapp/src/index.tsx b/webapp/src/index.tsx index 94cb3d4..aa8a586 100644 --- a/webapp/src/index.tsx +++ b/webapp/src/index.tsx @@ -3,8 +3,9 @@ import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; import reportWebVitals from './reportWebVitals'; +import "leaflet/dist/leaflet.css"; +import {SessionProvider} from '@inrupt/solid-ui-react'; -import { SessionProvider } from '@inrupt/solid-ui-react'; ReactDOM.render( diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 8352576..39547a3 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -1,27 +1,34 @@ -import Map, { SingleMarker } from "../../components/map/Map"; import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; import "../../components/map/stylesheets/addLandmark.css" -import { useRef } from "react"; -import { Button, MenuItem, Grid, Input, InputLabel, Select, Typography, FormControl } from "@mui/material"; -import React from "react"; +import React, {useRef} from "react"; +import { + Button, + FormControl, + Grid, + Input, + InputLabel, + MenuItem, + Select, + Typography +} from "@mui/material"; import L from "leaflet"; -import { LandmarkCategories } from "../../shared/shareddtypes"; -import { makeRequest } from "../../axios"; -import { useSession } from "@inrupt/solid-ui-react"; -import { MapContainer, TileLayer, useMapEvents } from "react-leaflet"; +import {LandmarkCategories} from "../../shared/shareddtypes"; +import {makeRequest} from "../../axios"; +import {useSession} from "@inrupt/solid-ui-react"; +import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; + export default function AddLandmark() { let coords : [number, number] = [0,0]; + let marker : L.Marker; const setCoordinates = (latitude : number, longitude : number) => { coords = [latitude, longitude]; (map.current as L.Map).panTo([latitude, longitude]); - - // Manual delete to create the effect of moving the marker, - // since scoping the variable outside the function and updating it does not seem to work - let markerNode : ChildNode = (document.querySelector("img[alt='Marker'") as ChildNode); - if (markerNode) markerNode.remove(); - new L.Marker([latitude, longitude]).setIcon(L.icon({iconUrl: markerIcon})).addTo(map.current as L.Map); + if (marker !== undefined) { + (map.current as L.Map).removeLayer(marker); + } + marker = new L.Marker([latitude, longitude]).setIcon(L.icon({iconUrl: markerIcon})).addTo(map.current as L.Map); (document.getElementById("latitude") as HTMLParagraphElement).textContent = latitude.toFixed(3); (document.getElementById("longitude") as HTMLParagraphElement).textContent = longitude.toFixed(3); } @@ -98,7 +105,7 @@ export default function AddLandmark() {
- + + const {isLoading, error, data} = useQuery(["results"], () => makeRequest.get("/solid/" + uuid + "/friends").then((res) => { return res.data; }) - ); + ); - return( -
-
-
- Friends: + return ( +
+
+
+ Friends: +
+
+ { + error + ? "Something went wrong" + : isLoading + ? "loading" + : data.map((user: User) => ( + +
+
+ {"User solidURL: " + user.solidURL} +
+
+ {"User name: " + user.username} +
+
+ + ))} +
+
-
- { - error - ? "Something went wrong" - : isLoading - ? "loading" - : data.map( (user : User) => ( - -
-
- {"User solidURL: " + user.solidURL} -
-
- {"User name: " + user.username} -
-
- - ))} -
-
-
- ); + ); } export default Friends; \ No newline at end of file diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index 36f2021..39a12a8 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -1,61 +1,64 @@ -import React, { useEffect } from "react"; -import Map from "../../components/map/Map"; +import {useEffect, useState} from "react"; import "../../components/map/stylesheets/home.css"; import "./home.css" -import { useSession } from "@inrupt/solid-ui-react"; -import { makeRequest } from "../../axios"; -import { Landmark } from "../../shared/shareddtypes"; +import {useSession} from "@inrupt/solid-ui-react"; +import {makeRequest} from "../../axios"; +import {Landmark} from "../../shared/shareddtypes"; import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; -import { useState } from "react"; function Home(): JSX.Element { - const {session} = useSession(); - const [landmarks, setLandmarks] = useState([]); - - useEffect(() => { - if (session.info.webId !== undefined && session.info.webId !== "") { - console.log(session.info.webId); - makeRequest.post("/users/",{solidURL: session.info.webId}); - } - async function fetchLandmarks() { - let landmks: Landmark[] = []; - makeRequest.post("/landmarks/friend", { webId: session.info.webId?.split("#")[0] }).then((res1) => { - for (let i = 0; i < res1.data.length; i++) { - let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude, res1.data[i].category); - landmks.push(landmark); + const {session} = useSession(); + const [landmarks, setLandmarks] = useState([]); + + useEffect(() => { + if (session.info.webId !== undefined && session.info.webId !== "") { + console.log(session.info.webId); + makeRequest.post("/users/", {solidURL: session.info.webId}); } - setLandmarks(loadLandmarks(landmks)); - }); - } - fetchLandmarks(); - }, [session,landmarks,setLandmarks]); + async function fetchLandmarks() { + let landmks: Landmark[] = []; + makeRequest.post("/landmarks/friend", {webId: session.info.webId?.split("#")[0]}).then((res1) => { + for (let i = 0; i < res1.data.length; i++) { + let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude, res1.data[i].category); + landmks.push(landmark); + } + setLandmarks(loadLandmarks(landmks)); + }); + + } + + fetchLandmarks(); + }, [session, landmarks, setLandmarks]); - function loadLandmarks(data: Landmark[]) { + function loadLandmarks(data: Landmark[]) { let results = data.map((landmark) => { - return ( - - -

{landmark.name}

- -
-
- ); + return ( + + +

{landmark.name}

+ +
+
+ ); }); return results; - } - return ( -
-

Home

- - - {landmarks} - ; -
- ); + } + + return ( +
+

Home

+ + + {landmarks} + ; +
+ ); } + export default Home; \ No newline at end of file diff --git a/webapp/src/pages/home/home.css b/webapp/src/pages/home/home.css index c04af3a..1df4b0b 100644 --- a/webapp/src/pages/home/home.css +++ b/webapp/src/pages/home/home.css @@ -1,4 +1,4 @@ -.homeContainer{ +.homeContainer { height: 92vh; display: flex; flex-direction: column; diff --git a/webapp/src/pages/login/Login.tsx b/webapp/src/pages/login/Login.tsx index 3482adb..45d4213 100644 --- a/webapp/src/pages/login/Login.tsx +++ b/webapp/src/pages/login/Login.tsx @@ -1,44 +1,45 @@ -import { useContext, useState } from "react"; -import { Button, TextField, FormGroup, Container } from "@mui/material"; - -import { login } from "@inrupt/solid-client-authn-browser"; +import {useState} from "react"; +import {Button, Container, FormGroup, TextField} from "@mui/material"; import "./login.css" -import { LoginButton } from "@inrupt/solid-ui-react"; -import { makeRequest } from "../../axios"; +import {LoginButton} from "@inrupt/solid-ui-react"; const Login = () => { const [idp, setIdp] = useState("https://inrupt.net"); - - return ( - -

Login

-

Welcome to LoMap!

-

This application runs using the solid principles, this means, you need an account on a pod provider to use it.

-

If you already have one, please log in.

-

If not, please create an account in a pod provider as inrupt.net

- - setIdp(e.target.value)} - InputProps={{ - endAdornment: ( - - - - ), - }} - /> - -
+ +

Login

+

Welcome to LoMap!

+

This application runs using the solid + principles, this means, you need an account on a pod provider to + use it.

+

If you already have one, please log + in.

+

If not, please create an account in a pod + provider as inrupt.net

+ + setIdp(e.target.value)} + InputProps={{ + endAdornment: ( + + + + ), + }} + /> + +
); - } +} export default Login; \ No newline at end of file diff --git a/webapp/src/pages/login/login.css b/webapp/src/pages/login/login.css index cf1bdef..1ac012e 100644 --- a/webapp/src/pages/login/login.css +++ b/webapp/src/pages/login/login.css @@ -1,18 +1,18 @@ -body{ - background-color: rgb(247, 243, 255); +body { + background-color: rgb(247, 243, 255); } -.loginContainer{ +.loginContainer { background-color: rgba(206, 169, 169, 0.678); } -.loginHeader{ +.loginHeader { color: purple; text-align: center; font-weight: bold; font-size: 5em; } -.loginText{ +.loginText { font-size: 1.1em; } \ No newline at end of file diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index c211d4f..7f67c5b 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -1,8 +1,13 @@ import { - Button, Checkbox, - FormControl, FormControlLabel, - Grid, Input, - InputLabel, MenuItem, Select, + Button, + Checkbox, + FormControl, + FormControlLabel, + Grid, + Input, + InputLabel, + MenuItem, + Select, TextField, Typography } from "@mui/material"; @@ -14,12 +19,13 @@ import {useParams} from "react-router-dom"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; import {useQuery} from "@tanstack/react-query"; import {makeRequest} from "../../axios"; +import L from "leaflet"; export default function LandmarkFriend() : JSX.Element{ const map = useRef(null); const [isCommentEnabled, setIsCommentEnabled] = useState(false); - const [selectedMarker, setSelectedMarker] = useState(null); + const [selectedMarker, setSelectedMarker] = useState(new L.Marker([0,0])); return @@ -74,7 +80,7 @@ function AddCommentForm() : JSX.Element { ; } -function LandmarkPlacer(props : any) : JSX.Element { +function LandmarkPlacer(props : any) { const setIsCommentEnabled = props.commFunction; const setSelectedMarker = props.markerFunction; @@ -83,16 +89,17 @@ function LandmarkPlacer(props : any) : JSX.Element { setSelectedMarker(e.target); return null; }; + return null; // TODO: Retrieve all the landmarks. The array that follows is a temporal placeholder. - let landmarks : JSX.Element[] = [].map(element => { - - - {element.text} - - - }); - return {landmarks}; +// let landmarks : JSX.Element[] = [].map(element => { +// +// +// {element.text} +// +// +// }); +// return {landmarks}; } function LandmarkFilter(props : any) : JSX.Element { diff --git a/webapp/src/pages/profile/Profile.tsx b/webapp/src/pages/profile/Profile.tsx index d891e44..b1eabcb 100644 --- a/webapp/src/pages/profile/Profile.tsx +++ b/webapp/src/pages/profile/Profile.tsx @@ -1,15 +1,11 @@ import "./profile.css"; -import Map from "../../components/map/Map"; -import { makeRequest } from "../../axios"; -import { useParams } from "react-router"; -import { useState } from "react"; -import {useEffect} from "react"; -import { useQuery } from '@tanstack/react-query'; -import { getStringNoLocale,Thing } from "@inrupt/solid-client"; -import { FOAF } from "@inrupt/vocab-common-rdf"; -import { useSession } from "@inrupt/solid-ui-react"; +import {makeRequest} from "../../axios"; +import {useParams} from "react-router"; +import {useEffect, useState} from "react"; +import {useSession} from "@inrupt/solid-ui-react"; +import {MapContainer, TileLayer} from "react-leaflet"; function Profile(): JSX.Element { @@ -80,7 +76,12 @@ function Profile(): JSX.Element {
- + + + ; ); diff --git a/webapp/src/pages/profile/profile.css b/webapp/src/pages/profile/profile.css index 64f1671..f24aa7f 100644 --- a/webapp/src/pages/profile/profile.css +++ b/webapp/src/pages/profile/profile.css @@ -1,27 +1,27 @@ -.profile{ +.profile { height: 92vh; display: flex; flex-direction: column; align-items: center; - + } -.profileRight{ +.profileRight { flex: 9; } -.profileCover{ +.profileCover { height: 320px; position: relative; } -.profileCoverImg{ +.profileCoverImg { width: 100%; height: 250px; object-fit: cover; } -.profileUserImg{ +.profileUserImg { width: 150px; height: 150px; border-radius: 50%; @@ -34,28 +34,28 @@ border: 3px solid white; } -.profileInfo{ +.profileInfo { display: flex; flex-direction: column; align-items: center; justify-content: center; } -.profileInfoName{ +.profileInfoName { font-size: 24px; color: white; } -.profileInfoDesc{ +.profileInfoDesc { font-weight: 300; } -.profileRightBottom{ +.profileRightBottom { display: flex; flex-direction: row; } -.profileBottom{ +.profileBottom { flex: 1; display: flex; flex-direction: row; diff --git a/webapp/src/pages/users/Users.tsx b/webapp/src/pages/users/Users.tsx index 09afa1d..d8464a3 100644 --- a/webapp/src/pages/users/Users.tsx +++ b/webapp/src/pages/users/Users.tsx @@ -1,49 +1,49 @@ -import { makeRequest } from "../../axios"; +import {makeRequest} from "../../axios"; import './users.css' -import { useParams } from "react-router"; +import {useParams} from "react-router"; import React from "react"; -import { User } from "../../shared/shareddtypes"; -import { useQuery } from '@tanstack/react-query'; -import { Link } from "react-router-dom"; +import {User} from "../../shared/shareddtypes"; +import {useQuery} from '@tanstack/react-query'; +import {Link} from "react-router-dom"; function Users() { - const username = useParams().text; + const username = useParams().text; - //function below triggers the helper function - const { isLoading, error, data } = useQuery(["results"], () => + //function below triggers the helper function + const {isLoading, error, data} = useQuery(["results"], () => makeRequest.get("/users/" + username).then((res) => { return res.data; }) - ); + ); - return( -
-
-
- Users Found: -
-
- { - error - ? "Something went wrong" - : isLoading - ? "loading" - : data.map( (user : User) => ( - -
-
- {"User solidURL: " + user.solidURL} -
-
- {"User name: " + user.username} -
-
- - ))} -
+ return ( +
+
+
+ Users Found: +
+
+ { + error + ? "Something went wrong" + : isLoading + ? "loading" + : data.map((user: User) => ( + +
+
+ {"User solidURL: " + user.solidURL} +
+
+ {"User name: " + user.username} +
+
+ + ))} +
+
-
- ); + ); } - + export default Users; \ No newline at end of file diff --git a/webapp/src/reportWebVitals.ts b/webapp/src/reportWebVitals.ts index 49a2a16..16ffde3 100644 --- a/webapp/src/reportWebVitals.ts +++ b/webapp/src/reportWebVitals.ts @@ -1,4 +1,4 @@ -import { ReportHandler } from 'web-vitals'; +import {ReportHandler} from 'web-vitals'; const reportWebVitals = (onPerfEntry?: ReportHandler) => { if (onPerfEntry && onPerfEntry instanceof Function) { diff --git a/webapp/src/setupTests.ts b/webapp/src/setupTests.ts index 8f2609b..d0126ed 100644 --- a/webapp/src/setupTests.ts +++ b/webapp/src/setupTests.ts @@ -3,3 +3,7 @@ // expect(element).toHaveTextContent(/react/i) // learn more: https://github.com/testing-library/jest-dom import '@testing-library/jest-dom'; +import {TextDecoder, TextEncoder} from 'util'; + +global.TextEncoder = TextEncoder; +(global as any).TextDecoder = TextDecoder; \ No newline at end of file diff --git a/webapp/test/OtherUsersLandmarks.tsx b/webapp/src/test/AddLandmarks.test.tsx similarity index 70% rename from webapp/test/OtherUsersLandmarks.tsx rename to webapp/src/test/AddLandmarks.test.tsx index ac41039..5f7ac8d 100644 --- a/webapp/test/OtherUsersLandmarks.tsx +++ b/webapp/src/test/AddLandmarks.test.tsx @@ -1,21 +1,22 @@ -import { render, fireEvent } from "@testing-library/react"; -import LandmarkFriend from "../src/pages/otherUsersLandmark/LandmarkFriend" -import {Landmark} from '../src/shared/shareddtypes'; +import {fireEvent, render} from "@testing-library/react"; +import AddLandmarks from "../pages/addLandmark/AddLandmark" +import {Landmark} from '../shared/shareddtypes'; import React from "react"; +import assert from "assert"; test("Check all the landmark types are rendered", () => { - const {getAllByTestId} = render() - let values : string[] = Object.values(Landmark); - let renderedValues : string[] = getAllByTestId("option-test").map(elem => elem.toString()); + const {getAllByTestId} = render() + let values: string[] = Object.values(Landmark); + let renderedValues: string[] = getAllByTestId("option-test").map(elem => elem.toString()); expect(renderedValues.length === values.length).toBeTruthy(); - for (let i : number = 0; i < values.length; i++){ + for (let i: number = 0; i < values.length; i++) { expect(renderedValues[i] === values[i]).toBeTruthy(); } }); test("Check the form is correctly rendered", () => { - const {getByTestId, getByText, getByLabelText} = render() + const {getByTestId, getByText, getByLabelText} = render() expect(getByTestId("form-testid")).toBeInTheDocument(); // First field group expect(getByTestId("firstField-testid")).toBeInTheDocument(); @@ -38,20 +39,23 @@ test("Check the form is correctly rendered", () => { }); test("Check the map is rendered", () => { - const {container} = render() + const {container} = render() expect(container.querySelector("div[class *= \"leaflet\"]")).toBeInTheDocument(); }); test("Check clicking in the map once generates a landmark", () => { - const {container} = render(); - const mapElement = container.querySelector("div[class *= \"leaflet\"]"); + const {container} = render(); + const mapElement: HTMLElement | null = container.querySelector("div[class *= \"leaflet\"]"); + assert(mapElement !== null); fireEvent.click(mapElement); expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); }); test("Check clicking in the map twice does not generate a landmark", () => { - const {container} = render(); + const {container} = render(); const mapElement = container.querySelector("div[class *= \"leaflet\"]"); + assert(mapElement !== null); fireEvent.dblClick(mapElement); expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); -}); \ No newline at end of file +}); + diff --git a/webapp/src/unused/App.test.tsx b/webapp/src/unused/App.test.tsx deleted file mode 100644 index 193102c..0000000 --- a/webapp/src/unused/App.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react'; -import { render, screen } from '@testing-library/react'; -import App from '../App'; - -test('renders learn react link', () => { - render(); - const linkElement = screen.getByText(/Source code/i); - expect(linkElement).toBeInTheDocument(); -}); diff --git a/webapp/src/unused/EmailForm.test.tsx b/webapp/src/unused/EmailForm.test.tsx deleted file mode 100644 index 2f62c0a..0000000 --- a/webapp/src/unused/EmailForm.test.tsx +++ /dev/null @@ -1,33 +0,0 @@ -import { render, fireEvent, act } from "@testing-library/react"; -import EmailForm from "./EmailForm"; -import {User} from '../shared/shareddtypes'; -import * as api from './api/userApi' - -jest.mock('../api/api'); - -test('check register fail', async () => { - jest.spyOn(api,'add').mockImplementation((user:User):Promise => Promise.resolve(false)) - await act(async () => { - const {container, getByText} = render({}}/>) - const inputName = container.querySelector('input[name="username"]')!; - const inputEmail = container.querySelector('input[name="email"]')!; - fireEvent.change(inputName, { target: { value: "Pablo" } }); - fireEvent.change(inputEmail, { target: { value: "gonzalezgpablo@uniovi.es" } }); - const button = getByText("Accept"); - fireEvent.click(button); - }); -}) - -test('check register ok', async () => { - - jest.spyOn(api,'add').mockImplementation((user:User):Promise => Promise.resolve(true)) - await act(async () => { - const {container, getByText} = render({}}/>) - const inputName = container.querySelector('input[name="username"]')!; - const inputEmail = container.querySelector('input[name="email"]')!; - fireEvent.change(inputName, { target: { value: "Pablo" } }); - fireEvent.change(inputEmail, { target: { value: "gonzalezgpablo@uniovi.es" } }); - const button = getByText("Accept"); - fireEvent.click(button); - }); -}) diff --git a/webapp/src/unused/EmailForm.tsx b/webapp/src/unused/EmailForm.tsx index e08425a..ad654f2 100644 --- a/webapp/src/unused/EmailForm.tsx +++ b/webapp/src/unused/EmailForm.tsx @@ -1,11 +1,9 @@ -import React, { useState } from 'react'; +import React, {useState} from 'react'; import Button from '@mui/material/Button'; import TextField from '@mui/material/TextField'; import Snackbar from '@mui/material/Snackbar'; +import type {AlertColor} from '@mui/material/Alert'; import Alert from '@mui/material/Alert'; -import type { AlertColor } from '@mui/material/Alert'; -import {add} from './api/userApi'; -import {User} from '../shared/shareddtypes'; type EmailFormProps = { OnUserListChange: () => void; diff --git a/webapp/src/unused/UserList.test.tsx b/webapp/src/unused/UserList.test.tsx deleted file mode 100644 index c9a1bf2..0000000 --- a/webapp/src/unused/UserList.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react' -import { render } from "@testing-library/react"; -import UserList from "./UserList"; -import {User} from "../shared/shareddtypes"; - -test('check that the list of users renders propertly', async () => { - // const userList:User[] = [{username: 'Pablo', email: 'gonzalezgpablo@uniovi.es' }]; - // const {getByText} = render(); - // expect(getByText(userList[0].username)).toBeInTheDocument(); - // expect(getByText(userList[0].email)).toBeInTheDocument(); - }); \ No newline at end of file diff --git a/webapp/src/unused/UserList.tsx b/webapp/src/unused/UserList.tsx index 765de78..162f70a 100644 --- a/webapp/src/unused/UserList.tsx +++ b/webapp/src/unused/UserList.tsx @@ -6,7 +6,6 @@ import ListItemText from '@mui/material/ListItemText'; import ContactPageIcon from '@mui/icons-material/ContactPage'; - type UserListProps = { users: User[]; } diff --git a/webapp/src/unused/Welcome.test.tsx b/webapp/src/unused/Welcome.test.tsx deleted file mode 100644 index b44070a..0000000 --- a/webapp/src/unused/Welcome.test.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React from 'react' -import { render } from "@testing-library/react"; -import Welcome from "./Welcome"; - -test('check that everything is rendering propertly', async () => { - const message:string = "students"; - const { getByText } = render(); - expect(getByText('Hi, '+message)).toBeInTheDocument(); -}); \ No newline at end of file diff --git a/webapp/src/unused/api/userApi.ts b/webapp/src/unused/api/userApi.ts index 93f7908..256c159 100644 --- a/webapp/src/unused/api/userApi.ts +++ b/webapp/src/unused/api/userApi.ts @@ -1,4 +1,4 @@ -import { User } from "../../shared/shareddtypes"; +import {User} from "../../shared/shareddtypes"; export async function add(user : User) : Promise { const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000/api' diff --git a/webapp/test/AddLandmarks.test.tsx b/webapp/test/AddLandmarks.test.tsx deleted file mode 100644 index 36796ab..0000000 --- a/webapp/test/AddLandmarks.test.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { render, fireEvent } from "@testing-library/react"; -import AddLandmarks from "../src/pages/addLandmark/AddLandmark" -import {Landmark} from '../src/shared/shareddtypes'; -import React from "react"; - -test("Check all the landmark types are rendered", () => { - const {getAllByTestId} = render() - let values : string[] = Object.values(Landmark); - let renderedValues : string[] = getAllByTestId("option-test").map(elem => elem.toString()); - - expect(renderedValues.length === values.length).toBeTruthy(); - for (let i : number = 0; i < values.length; i++){ - expect(renderedValues[i] === values[i]).toBeTruthy(); - } -}); - -test("Check the form is correctly rendered", () => { - const {getByTestId, getByText, getByLabelText} = render() - expect(getByTestId("form-testid")).toBeInTheDocument(); - // First field group - expect(getByTestId("firstField-testid")).toBeInTheDocument(); - expect(getByText("Name of the landmark")).toBeInTheDocument(); - expect(getByLabelText("Name of the landmark")).toBeInTheDocument(); - // Second field group - expect(getByTestId("secondField-testid")).toBeInTheDocument(); - expect(getByText("Category of the landmark")).toBeInTheDocument(); - expect(getByLabelText("Category of the landmark")).toBeInTheDocument(); - // Third field group - expect(getByTestId("thirdField-testid")).toBeInTheDocument(); - expect(getByText("Latitude")).toBeInTheDocument(); - expect(getByTestId("Latitude-test")).toBeInTheDocument(); - // Fourth field group - expect(getByTestId("fourthField-testid")).toBeInTheDocument(); - expect(getByText("Longitude")).toBeInTheDocument(); - expect(getByTestId("Longitude-test")).toBeInTheDocument(); - // Button - expect(getByText("Save new landmark")).toBeInTheDocument(); -}); - -test("Check the map is rendered", () => { - const {container} = render() - expect(container.querySelector("div[class *= \"leaflet\"]")).toBeInTheDocument(); -}); - -test("Check clicking in the map once generates a landmark", () => { - const {container} = render(); - const mapElement = container.querySelector("div[class *= \"leaflet\"]"); - fireEvent.click(mapElement); - expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); -}); - -test("Check clicking in the map twice does not generate a landmark", () => { - const {container} = render(); - const mapElement = container.querySelector("div[class *= \"leaflet\"]"); - fireEvent.dblClick(mapElement); - expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); -}); - From 7459ea708db5982155fa4c64edc52105b55585ff Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 18 Apr 2023 21:48:15 +0200 Subject: [PATCH 11/66] Added test for the add landmarks page --- webapp/src/test/AddLandmarks.test.tsx | 79 +++++++++++++-------------- 1 file changed, 39 insertions(+), 40 deletions(-) diff --git a/webapp/src/test/AddLandmarks.test.tsx b/webapp/src/test/AddLandmarks.test.tsx index 5f7ac8d..d535778 100644 --- a/webapp/src/test/AddLandmarks.test.tsx +++ b/webapp/src/test/AddLandmarks.test.tsx @@ -1,13 +1,16 @@ -import {fireEvent, render} from "@testing-library/react"; +import { + screen, + render, + fireEvent +} from "@testing-library/react"; import AddLandmarks from "../pages/addLandmark/AddLandmark" import {Landmark} from '../shared/shareddtypes'; -import React from "react"; import assert from "assert"; test("Check all the landmark types are rendered", () => { - const {getAllByTestId} = render() + const {container} = render() let values: string[] = Object.values(Landmark); - let renderedValues: string[] = getAllByTestId("option-test").map(elem => elem.toString()); + let renderedValues: string[] = Array.from(container.querySelectorAll("option")).map(elem => elem.toString()); expect(renderedValues.length === values.length).toBeTruthy(); for (let i: number = 0; i < values.length; i++) { @@ -15,47 +18,43 @@ test("Check all the landmark types are rendered", () => { } }); -test("Check the form is correctly rendered", () => { - const {getByTestId, getByText, getByLabelText} = render() - expect(getByTestId("form-testid")).toBeInTheDocument(); - // First field group - expect(getByTestId("firstField-testid")).toBeInTheDocument(); - expect(getByText("Name of the landmark")).toBeInTheDocument(); - expect(getByLabelText("Name of the landmark")).toBeInTheDocument(); - // Second field group - expect(getByTestId("secondField-testid")).toBeInTheDocument(); - expect(getByText("Category of the landmark")).toBeInTheDocument(); - expect(getByLabelText("Category of the landmark")).toBeInTheDocument(); - // Third field group - expect(getByTestId("thirdField-testid")).toBeInTheDocument(); - expect(getByText("Latitude")).toBeInTheDocument(); - expect(getByTestId("Latitude-test")).toBeInTheDocument(); - // Fourth field group - expect(getByTestId("fourthField-testid")).toBeInTheDocument(); - expect(getByText("Longitude")).toBeInTheDocument(); - expect(getByTestId("Longitude-test")).toBeInTheDocument(); - // Button - expect(getByText("Save new landmark")).toBeInTheDocument(); +test("Check the different containers are rendered", () => { + const {container} = render(); + expect(container.querySelector("h1")).toBeInTheDocument(); + expect(screen.getByText("Add a landmark")).toBeInTheDocument(); + expect(container.querySelector("div[class*='leftPane']")).toBeInTheDocument(); + expect(container.querySelector("div[class*='rightPane']")).toBeInTheDocument(); }); -test("Check the map is rendered", () => { - const {container} = render() - expect(container.querySelector("div[class *= \"leaflet\"]")).toBeInTheDocument(); +test("Check the map is rendered in the right panel, and it does not contain any mark", () => { + const {container} = render(); + expect(container.querySelector("div[class*='rightPane'] > div")).toBeInTheDocument(); + expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); }); -test("Check clicking in the map once generates a landmark", () => { - const {container} = render(); - const mapElement: HTMLElement | null = container.querySelector("div[class *= \"leaflet\"]"); - assert(mapElement !== null); - fireEvent.click(mapElement); - expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); +test("Check the map is rendered in the right panel, and it does not contain any mark", () => { + const {container} = render(); + expect(container.querySelector("div[class*='rightPane'] > div")).toBeInTheDocument(); }); -test("Check clicking in the map twice does not generate a landmark", () => { - const {container} = render(); - const mapElement = container.querySelector("div[class *= \"leaflet\"]"); - assert(mapElement !== null); - fireEvent.dblClick(mapElement); - expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); +test("Check the form is rendered in the left panel", () => { + const {container} = render(); + expect(container.querySelector("div[class*='leftPane'] > form")).toBeInTheDocument(); + expect(screen.getByText("Name of the landmark")).toBeInTheDocument(); + expect(container.querySelector("input[class*='MuiSelect']")).toBeInTheDocument(); + + expect(screen.getByText("Latitude:")).toBeInTheDocument(); + expect(screen.getByText("Longitude:")).toBeInTheDocument(); + expect(container.querySelector("button[class*='MuiButton']")).toBeInTheDocument(); }); +test("Check that, when clicking the map, a marker appears", () => { + const {container} = render(); + let mapContainer = container.querySelector("div[class*='rightPane'] > div"); + assert(mapContainer !== null); + expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); + fireEvent(mapContainer, new MouseEvent('click')); + expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); + assert(container.querySelector("#latitude")?.textContent != "") + assert(container.querySelector("#longitude")?.textContent != "") +}); \ No newline at end of file From 604f4d20b3656c0828a04af28c6094afde277b70 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 18 Apr 2023 22:02:45 +0200 Subject: [PATCH 12/66] Minor fixes for the test tool --- .github/workflows/lomap_en2b.yml | 1 - restapi/controllers/landmarks.ts | 6 ++--- restapi/controllers/users.ts | 2 +- sonar-project.properties | 2 +- webapp/src/components/map/Map.tsx | 36 ------------------------- webapp/src/components/map/MapMarker.tsx | 22 --------------- 6 files changed, 5 insertions(+), 64 deletions(-) delete mode 100644 webapp/src/components/map/Map.tsx delete mode 100644 webapp/src/components/map/MapMarker.tsx diff --git a/.github/workflows/lomap_en2b.yml b/.github/workflows/lomap_en2b.yml index 0e3895a..8882d4b 100644 --- a/.github/workflows/lomap_en2b.yml +++ b/.github/workflows/lomap_en2b.yml @@ -35,7 +35,6 @@ jobs: - run: npm ci - run: npm test --coverage --watchAll - name: Analyze with SonarCloud - uses: sonarsource/sonarcloud-github-action@master env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/restapi/controllers/landmarks.ts b/restapi/controllers/landmarks.ts index 53b71dc..b84c4f0 100644 --- a/restapi/controllers/landmarks.ts +++ b/restapi/controllers/landmarks.ts @@ -7,7 +7,7 @@ router.post("/friend", async (req: any, res: any) => { try { console.log("POST /landmarks/friend"); - const results = await Landmark.find({webId: req.body.webID}); + const results = await Landmark.find({webId: req.body.webID.toString()}); res.status(200).send(results); } catch (err) { @@ -19,8 +19,8 @@ router.post("/", async (req: any, res: any, next: any) => { try { console.log("POST /landmarks/"); const landmark = Landmark.create( - {name: req.body.name, category: req.body.category, latitude: req.body.latitude, - longitude: req.body.longitude, webID: req.body.webID}); + {name: req.body.name.toString(), category: req.body.category.toString(), latitude: req.body.latitude, + longitude: req.body.longitude, webID: req.body.webID.toString()}); const result = await landmark.save(); res.status(200).send(result); diff --git a/restapi/controllers/users.ts b/restapi/controllers/users.ts index d387deb..4b596d2 100644 --- a/restapi/controllers/users.ts +++ b/restapi/controllers/users.ts @@ -33,7 +33,7 @@ router.patch("/", async (req : any, res : any, next : any) => { try { console.log("PATCH /users/"); - const result = await User.findOne({solidURL: req.body.webId}); + const result = await User.findOne({solidURL: req.body.webId.toString()}); res.status(200).json(result._id); }catch(err){ diff --git a/sonar-project.properties b/sonar-project.properties index 74116ee..1c77609 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -7,7 +7,7 @@ sonar.projectName=lomap_en2b sonar.projectVersion=1.0.4 sonar.coverage.exclusions=**/*.test.tsx,**/*.test.ts -sonar.sources=webapp/src/components,restapi +sonar.sources=webapp/src/pages,restapi sonar.sourceEncoding=UTF-8 sonar.exclusions=node_modules/** sonar.typescript.lcov.reportPaths=**/coverage/lcov.info \ No newline at end of file diff --git a/webapp/src/components/map/Map.tsx b/webapp/src/components/map/Map.tsx deleted file mode 100644 index 5bda8d7..0000000 --- a/webapp/src/components/map/Map.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import {MapContainer, TileLayer} from 'react-leaflet'; -import 'leaflet-css' -import {useRef} from 'react'; -import {useLeafletContext} from '@react-leaflet/core'; - -export default function Map(props : any): JSX.Element { - let map = useRef(null); - if (props.map !== undefined) { - map = props.map; - } - - return - - {props.otherComponents} - < GetCenter /> - ; -} - -export function GetCenter() { - const map = useLeafletContext().map; - navigator.geolocation.getCurrentPosition((pos) => { - let position : [number, number] = [pos.coords.latitude, pos.coords.longitude]; - map.panTo(position, {animate: true}); - } - ); - - return null; -} - -export function SingleMarker(props : any) { - - return null; -} \ No newline at end of file diff --git a/webapp/src/components/map/MapMarker.tsx b/webapp/src/components/map/MapMarker.tsx deleted file mode 100644 index f2d2821..0000000 --- a/webapp/src/components/map/MapMarker.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from 'react'; -import {Landmark} from '../../shared/shareddtypes'; -import {Marker, Popup} from 'react-leaflet'; - -class MapMarker extends React.Component { - - private mark : Landmark; - - constructor(props : any, mark : Landmark) { - super(props); - this.mark = mark; - } - - render() { - return - - {this.mark.name} - - {this.mark.category} - - - } -} \ No newline at end of file From 62e3fb764be2025aa0d8a472ec093c44174de738 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 18 Apr 2023 22:22:03 +0200 Subject: [PATCH 13/66] Added small feature to the addLandmark page --- webapp/src/pages/addLandmark/AddLandmark.tsx | 17 ++++++++++++----- webapp/src/test/AddLandmarks.test.tsx | 7 ++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 39547a3..270b87a 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -1,7 +1,7 @@ import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; import "../../components/map/stylesheets/addLandmark.css" -import React, {useRef} from "react"; +import React, {useRef, useState} from "react"; import { Button, FormControl, @@ -22,7 +22,9 @@ export default function AddLandmark() { let coords : [number, number] = [0,0]; let marker : L.Marker; + const [isButtonEnabled, setIsButtonEnabled] = useState(false); const setCoordinates = (latitude : number, longitude : number) => { + setIsButtonEnabled(true); coords = [latitude, longitude]; (map.current as L.Map).panTo([latitude, longitude]); if (marker !== undefined) { @@ -98,13 +100,18 @@ export default function AddLandmark() { - - - + {isButtonEnabled + ? + + + : null + } - + { expect(screen.getByText("Latitude:")).toBeInTheDocument(); expect(screen.getByText("Longitude:")).toBeInTheDocument(); - expect(container.querySelector("button[class*='MuiButton']")).toBeInTheDocument(); + expect(container.querySelector("button[class*='MuiButton']")).not.toBeInTheDocument(); }); test("Check that, when clicking the map, a marker appears", () => { @@ -55,6 +55,7 @@ test("Check that, when clicking the map, a marker appears", () => { expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); fireEvent(mapContainer, new MouseEvent('click')); expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); - assert(container.querySelector("#latitude")?.textContent != "") - assert(container.querySelector("#longitude")?.textContent != "") + assert(container.querySelector("#latitude")?.textContent != ""); + assert(container.querySelector("#longitude")?.textContent != ""); + expect(container.querySelector("button[class*='MuiButton']")).toBeVisible(); }); \ No newline at end of file From 897dd6bdfc25658efeccd942bfd135a2731fff7e Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Wed, 19 Apr 2023 18:59:17 +0200 Subject: [PATCH 14/66] Updated the points 2, 4, 5 and 12 of the documentation. Added a design decision --- docs/02_architecture_constraints.adoc | 2 +- docs/04_solution_strategy.adoc | 2 +- docs/05_building_block_view.adoc | 59 +++++++-------------------- docs/07_deployment_view.adoc | 2 +- docs/09_design_decisions.adoc | 1 + docs/12_glossary.adoc | 1 - 6 files changed, 19 insertions(+), 48 deletions(-) diff --git a/docs/02_architecture_constraints.adoc b/docs/02_architecture_constraints.adoc index ae19178..10ed7af 100644 --- a/docs/02_architecture_constraints.adoc +++ b/docs/02_architecture_constraints.adoc @@ -8,7 +8,7 @@ These constraints are the base of the architecture process, and are the roots of [options="header",cols="1,4"] |=== |Constraint|Description -| Solid | _Provided by the stakeholders. A way of building decentralized social apps, it gives every user a choice about where data is stored, helping the privacy of each user._ +| SOLID | _Provided by the stakeholders. A way of building decentralized social apps, it gives every user a choice about where data is stored, helping the privacy of each user._ | Github | _The development team was given a starting draft of a project in GitHub as a public repository. From then on, all the work related with this project will be tracked and uploaded in this repository._ | Time | _The application is developed in a semester during a course, that means time is limited._ |=== \ No newline at end of file diff --git a/docs/04_solution_strategy.adoc b/docs/04_solution_strategy.adoc index 0dc2288..a49011b 100644 --- a/docs/04_solution_strategy.adoc +++ b/docs/04_solution_strategy.adoc @@ -10,7 +10,7 @@ Up until now, we have made some decisions about the project, those decisions can * Map API: Used to plot the map in the application in order to allow the user to do every possible action. The selected API to do it is Leaflet. . *Decisions on top-level decomposition:* -* MVC: We are using the MVC (Model-View-Controller) pattern in order to organize the code in a clean and obvious way. +* N-Layers: We are using an N-Layers pattern: persistence, controllers and view. * Editor: We are all using Visual Studio Code to work on this project, it is the editor we are used to program in and it has some features that made us work using it. * Github: The project is on a public repository as given by the professors of the subject. We are all able to work using it, and the main features of it are the pull requests in order to upload code. diff --git a/docs/05_building_block_view.adoc b/docs/05_building_block_view.adoc index 609edc0..faf3f0b 100644 --- a/docs/05_building_block_view.adoc +++ b/docs/05_building_block_view.adoc @@ -16,9 +16,14 @@ This diagram is motivated by the need of having a clear separation of the compos header Architecture of the application title Architecture of the application -agent "View" -agent "Controller" -agent "Persistance" +rectangle webapp/src/ { + agent "View" +} + +rectangle restapi/ { + agent "Controller" + agent "Persistance" +} "Controller" -> "Persistance" "View" -> "Controller" @@ -45,11 +50,9 @@ As already explained this layer will be composed of those components that the us Since we are not using interfaces, we will be seeing important components: -* *Map*: This component is one of the most important parts of the application. It returns a working map that can be extended, adding functionality through other components. It can be found in _/webapp/src/components/map_, and can be applied several stylesheets. - * *The main UI*: It is divided in several components: the left bar, the navbar and the rightbar, each one with its one subfolder in _/webapp/src/components_. -* *The pages*: These are the React components that compose the web. They can be found in _/webapp/src/pages_. +* *The pages*: These are the React components that compose the web. They can be found in _/webapp/src/pages_, in their own folder. ===== Open Issues/Problems/Risks @@ -63,45 +66,15 @@ The controller layer will handle internal communication between the view and the ===== Interfaces -No interfaces have been defined yet. +* *The controllers*: they handle the communication between the persistence and the view layers, and can be found in the _restapi/controllers_ folder. ===== Open Issues/Problems/Risks No issues, problems or risks are known. -==== Service layer - -===== Purpose/responsability - -The service layer will handle communication with the persistence layer. - -===== Interfaces - -No interfaces have been defined yet. - -===== Open Issues/Problems/Risks - -It is important to consider how we will handle communication between the server and the pods, and if there will be any difference to communicating with the database. - -==== Model layer - -===== Purpose/responsability - -The model layer will handle internal logic. - -===== Interfaces - -No interfaces have been defined yet. - -===== Open Issues/Problems/Risks - -No issues, problems or risks are known. - -=== Level 2 - ==== Persistence layer -Currently, the only layer we have somewhat structured is the persistance layer. +The persistance layer is structured the following way: [plantuml,png, id = "PersistenceLayer"] ---- @@ -114,15 +87,13 @@ folder "Persistence layer"{ agent Database agent "User pod" } -agent "Service layer" -Database <-- "Service layer" -"User pod" <-- "Service layer" +agent "Controller layer" +Database <-- "Controller layer" +"User pod" <-- "Controller layer" @enduml ---- As you can see, it is divided in in several two components: the pods and the database. * The pods will store the user data. -* The database. - -What the database will store and what will also be included in the pods is yet to be decided, as we are trying to reach a compromise between storing mostly everything in the pods (which will significantly harm performance) and storing mostly everything in the database (which will harm privacy and does not follow SOLID). \ No newline at end of file +* The database. \ No newline at end of file diff --git a/docs/07_deployment_view.adoc b/docs/07_deployment_view.adoc index 8a50cb5..05e21a7 100644 --- a/docs/07_deployment_view.adoc +++ b/docs/07_deployment_view.adoc @@ -46,4 +46,4 @@ Although we have yet to choose the operating system that will run it, it will pr ==== The database management system -We have chosen to use MongoDB. This decision was considered due to the experience of one member of the group using MongoDB through Mongoose, as well as using Typescript to run the product and, thus being posible to manipulate the data directly. \ No newline at end of file +We have chosen to use MongoDB. This decision was considered due to the experience of one member of the group using MongoDB through Mongoose, as well as using Typescript to run the product and, thus being posible to manipulate the data directly using JSON notation. \ No newline at end of file diff --git a/docs/09_design_decisions.adoc b/docs/09_design_decisions.adoc index 1440211..bc28af1 100644 --- a/docs/09_design_decisions.adoc +++ b/docs/09_design_decisions.adoc @@ -15,4 +15,5 @@ | Landmarks | We have been dealing with a problem related with the persistence of the landmarks on solid, as a temporal solution, we decided to store them in the mongo database, which in the future will be changed. | Friends | We had a little discussion over this topic on a meeting, reaching an agreement over only allowing the users to add friends via lomap. As the way of adding friends is quite special on this app and is done via Solid, we decided not allowing to cancel a friendship via lomap, as we thought it was something external to lomap, more related only with Solid. | Coordinates | When we were dealing with adding landmarks, we were trying to add coordinates by writing the number, and we are changing our inicial approach to be able to click on the map and retrieve the coords of that point. +| The old map interface | In prior versions, we used a custom _Map_ component to handle the map logic. This component has been discarded in version 1.1 due to it becoming an obstacle when implementing event handling related to the map. |=== \ No newline at end of file diff --git a/docs/12_glossary.adoc b/docs/12_glossary.adoc index f47f3ce..04797a9 100644 --- a/docs/12_glossary.adoc +++ b/docs/12_glossary.adoc @@ -6,5 +6,4 @@ | Term | Definition | SOLID | SOLID is a web decentralization project where the users have control over their data. It is led by the inventor of the WWW, Tim Berners-Lee. SOLID guarantees that users decide what and with whom they should share their data. | N-Tier architecture | Client–server architecture in which different layers are separated allowing the development of flexible and reusable applications. -| MVC architecture | Architecture style that separates the application data, the UI and the business logic in three different components. |=== From af48cb1a6e9ac1aca1aaecb8d033f20f6d734570 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 22 Apr 2023 12:48:08 +0200 Subject: [PATCH 15/66] Renamed a folder, and created a new test file --- webapp/src/test/LandmarkFriend.test.tsx | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 webapp/src/test/LandmarkFriend.test.tsx diff --git a/webapp/src/test/LandmarkFriend.test.tsx b/webapp/src/test/LandmarkFriend.test.tsx new file mode 100644 index 0000000..2dbcf83 --- /dev/null +++ b/webapp/src/test/LandmarkFriend.test.tsx @@ -0,0 +1,8 @@ +import { + screen, + render, + fireEvent +} from "@testing-library/react"; +import LandmarkFriend from "../pages/otherUsersLandmark/LandmarkFriend" +import {Landmark} from '../shared/shareddtypes'; +import assert from "assert"; From 078c9c54e6f2a0d241baa2f1f8f4371005a2bfbe Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 22 Apr 2023 13:55:27 +0200 Subject: [PATCH 16/66] Added some new tests to home and login pages --- .../map/stylesheets/addLandmark.css | 0 .../{components => }/map/stylesheets/home.css | 0 webapp/src/pages/addLandmark/AddLandmark.tsx | 2 +- webapp/src/pages/home/Home.tsx | 2 +- .../otherUsersLandmark/LandmarkFriend.tsx | 2 +- webapp/src/test/Home.test.tsx | 18 +++++++++++++ webapp/src/test/LandmarkFriend.test.tsx | 8 ------ webapp/src/test/Login.test.tsx | 27 +++++++++++++++++++ 8 files changed, 48 insertions(+), 11 deletions(-) rename webapp/src/{components => }/map/stylesheets/addLandmark.css (100%) rename webapp/src/{components => }/map/stylesheets/home.css (100%) create mode 100644 webapp/src/test/Home.test.tsx delete mode 100644 webapp/src/test/LandmarkFriend.test.tsx create mode 100644 webapp/src/test/Login.test.tsx diff --git a/webapp/src/components/map/stylesheets/addLandmark.css b/webapp/src/map/stylesheets/addLandmark.css similarity index 100% rename from webapp/src/components/map/stylesheets/addLandmark.css rename to webapp/src/map/stylesheets/addLandmark.css diff --git a/webapp/src/components/map/stylesheets/home.css b/webapp/src/map/stylesheets/home.css similarity index 100% rename from webapp/src/components/map/stylesheets/home.css rename to webapp/src/map/stylesheets/home.css diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 270b87a..06e00d5 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -1,6 +1,6 @@ import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; -import "../../components/map/stylesheets/addLandmark.css" +import "../../map/stylesheets/addLandmark.css" import React, {useRef, useState} from "react"; import { Button, diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index 39a12a8..0de8d6b 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -1,5 +1,5 @@ import {useEffect, useState} from "react"; -import "../../components/map/stylesheets/home.css"; +import "../../map/stylesheets/home.css"; import "./home.css" import {useSession} from "@inrupt/solid-ui-react"; import {makeRequest} from "../../axios"; diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 7f67c5b..0f05931 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -13,7 +13,7 @@ import { } from "@mui/material"; import markerIcon from "leaflet/dist/images/marker-icon.png"; import React, {useRef, useState} from "react"; -import "../../components/map/stylesheets/addLandmark.css" +import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {useParams} from "react-router-dom"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; diff --git a/webapp/src/test/Home.test.tsx b/webapp/src/test/Home.test.tsx new file mode 100644 index 0000000..7f745a3 --- /dev/null +++ b/webapp/src/test/Home.test.tsx @@ -0,0 +1,18 @@ +import { + render +} from "@testing-library/react"; +import Home from "../pages/home/Home"; +import assert from "assert"; + +test("Check the text of the page is correctly rendered", () => { + const{container} = render(); + let title : HTMLHeadingElement = container.querySelector("h1") as HTMLHeadingElement; + assert(title != null); + expect(title).toBeInTheDocument(); + assert((title.textContent as string).trim() === "Home"); +}); + +test("Check the map is rendered", () => { + const{container} = render(); + expect(container.querySelector(".homeContainer > div[class*='leaflet']")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/test/LandmarkFriend.test.tsx b/webapp/src/test/LandmarkFriend.test.tsx deleted file mode 100644 index 2dbcf83..0000000 --- a/webapp/src/test/LandmarkFriend.test.tsx +++ /dev/null @@ -1,8 +0,0 @@ -import { - screen, - render, - fireEvent -} from "@testing-library/react"; -import LandmarkFriend from "../pages/otherUsersLandmark/LandmarkFriend" -import {Landmark} from '../shared/shareddtypes'; -import assert from "assert"; diff --git a/webapp/src/test/Login.test.tsx b/webapp/src/test/Login.test.tsx new file mode 100644 index 0000000..ade740e --- /dev/null +++ b/webapp/src/test/Login.test.tsx @@ -0,0 +1,27 @@ +import { + render +} from "@testing-library/react"; +import Login from "../pages/login/Login"; +import assert from "assert"; + +// Axios printsq an error, but otherwise the tests pass + +test("Check the text of the page is correctly rendered", () => { + const{container, getByText} = render(); + let title : HTMLHeadingElement = container.querySelector("h1") as HTMLHeadingElement; + assert(title != null); + expect(title).toBeInTheDocument(); + assert((title.textContent as string).trim() === "Login"); + expect(getByText("Welcome to LoMap!")).toBeInTheDocument(); + expect(getByText("This application runs using the solid principles, this means, you need an account on a pod provider to use it.")).toBeInTheDocument(); + expect(getByText("If you already have one, please log in.")).toBeInTheDocument(); + expect(getByText("If not, please create an account in a pod provider as inrupt.net")).toBeInTheDocument(); + assert(container.querySelectorAll("p").length === 4); +}); + +test("Check the input box of the page is correctly rendered", () => { + const{container} = render(); + expect(container.querySelector("button")).toBeInTheDocument(); + expect(container.querySelector("input")).toBeInTheDocument(); + assert(container.querySelector("input")?.value === "https://inrupt.net"); +}); \ No newline at end of file From df4b8ab8d3e9786c644a763d938f8fba45bc004c Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 22 Apr 2023 14:07:34 +0200 Subject: [PATCH 17/66] Fixed some security hotspots according to the testing tool --- restapi/controllers/landmarks.ts | 4 ++-- restapi/index.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/restapi/controllers/landmarks.ts b/restapi/controllers/landmarks.ts index b84c4f0..a40d60d 100644 --- a/restapi/controllers/landmarks.ts +++ b/restapi/controllers/landmarks.ts @@ -19,8 +19,8 @@ router.post("/", async (req: any, res: any, next: any) => { try { console.log("POST /landmarks/"); const landmark = Landmark.create( - {name: req.body.name.toString(), category: req.body.category.toString(), latitude: req.body.latitude, - longitude: req.body.longitude, webID: req.body.webID.toString()}); + {name: req.body.name.toString(), category: req.body.category.toString(), latitude: req.body.latitude.toString(), + longitude: req.body.longitude.toString(), webID: req.body.webID.toString()}); const result = await landmark.save(); res.status(200).send(result); diff --git a/restapi/index.ts b/restapi/index.ts index dcd8c8c..185cdcd 100644 --- a/restapi/index.ts +++ b/restapi/index.ts @@ -14,6 +14,7 @@ const users = require("./controllers/users"); const landmarks = require("./controllers/landmarks"); const app = express(); +app.disable("x-powered-by"); const metricsMiddleware:RequestHandler = promBundle({includeMethod: true}); @@ -51,7 +52,6 @@ app.use( "Required, but value not relevant for this demo - key2", ], maxAge: 1 * 60 * 60 * 1000, // 1 hour - httpOnly: false, }) ); From 5c10bbab20e03f9edb15db0140074baf092c73c7 Mon Sep 17 00:00:00 2001 From: plg22 Date: Tue, 25 Apr 2023 10:12:00 +0200 Subject: [PATCH 18/66] Some api and webapp tests added --- restapi/controllers/users.ts | 7 ++--- restapi/tests/api.test.ts | 37 ++++++++++++++++++++--- webapp/src/components/leftBar/LeftBar.tsx | 8 ++--- webapp/src/components/navbar/Navbar.tsx | 11 ++++--- webapp/src/pages/friends/Friends.tsx | 2 +- webapp/src/pages/users/Users.tsx | 2 +- webapp/src/test/Leftbar.test.tsx | 12 ++++++++ webapp/src/test/Navbar.test.tsx | 14 +++++++++ 8 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 webapp/src/test/Leftbar.test.tsx create mode 100644 webapp/src/test/Navbar.test.tsx diff --git a/restapi/controllers/users.ts b/restapi/controllers/users.ts index 4b596d2..6c961cc 100644 --- a/restapi/controllers/users.ts +++ b/restapi/controllers/users.ts @@ -59,10 +59,9 @@ router.post("/", async (req : any, res : any, next : any) => { console.log("POST /users/"); res.status(201).json(result); + } catch(err){ + res.status(404).json(err); } - catch(err){ - - } - }); + }); module.exports = router; diff --git a/restapi/tests/api.test.ts b/restapi/tests/api.test.ts index f5de86f..2732cdd 100644 --- a/restapi/tests/api.test.ts +++ b/restapi/tests/api.test.ts @@ -16,7 +16,7 @@ beforeAll(async () => { }; app.use(cors(options)); app.use(bp.json()); - app.use("/api", api) + app.use("/api", api); server = app.listen(port, ():void => { console.log('Restapi server for testing listening on '+ port); @@ -30,14 +30,43 @@ afterAll(async () => { }) describe('user ', () => { + /** - * Test that we can list users without any error. + * Test that we can search users that exist. */ - it('can be listed',async () => { - const response:Response = await request(app).get("/api/users/list"); + it('can be found',async () => { + const response:Response = await request(app).get("users/plg22"); expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we can search users that exist. + */ + it('cannot be found',async () => { + const response:Response = await request(app).get("users/abcdefghi"); + expect(response.statusCode).toBe(404); }); + /** + * Test that we can find by his id a user that exist. + */ + it('cannot be found',async () => { + const response:Response = await request(app).get("users/id/6433c2435e3283d2f3f7207e"); + expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we cannot find by his id a user that does not exist. + */ + it('cannot be found',async () => { + const response:Response = await request(app).get("users/id/pepe"); + expect(response.statusCode).toBe(404); + }); + + + /** * Tests that a user can be created through the productService without throwing any errors. */ diff --git a/webapp/src/components/leftBar/LeftBar.tsx b/webapp/src/components/leftBar/LeftBar.tsx index 4a58845..acd2f86 100644 --- a/webapp/src/components/leftBar/LeftBar.tsx +++ b/webapp/src/components/leftBar/LeftBar.tsx @@ -27,19 +27,19 @@ function LeftBar(): JSX.Element{
  • - + Profile
  • - + Add a landmark
  • - + See friends' landmarks @@ -51,7 +51,7 @@ function LeftBar(): JSX.Element{
  • */}
  • - + Friends diff --git a/webapp/src/components/navbar/Navbar.tsx b/webapp/src/components/navbar/Navbar.tsx index f2edae4..50bc6df 100644 --- a/webapp/src/components/navbar/Navbar.tsx +++ b/webapp/src/components/navbar/Navbar.tsx @@ -27,8 +27,8 @@ function Navbar(): JSX.Element { return (
    - - bug + + bug @@ -37,22 +37,23 @@ function Navbar(): JSX.Element {
    - + setInputValue(event.target.value)} /> - +
    -
    +
    {getLoginButton()} diff --git a/webapp/src/pages/friends/Friends.tsx b/webapp/src/pages/friends/Friends.tsx index 9744d31..87bfa0a 100644 --- a/webapp/src/pages/friends/Friends.tsx +++ b/webapp/src/pages/friends/Friends.tsx @@ -28,7 +28,7 @@ function Friends(): JSX.Element { error ? "Something went wrong" : isLoading - ? "loading" + ? "Loading..." : data.map((user: User) => (
    diff --git a/webapp/src/pages/users/Users.tsx b/webapp/src/pages/users/Users.tsx index d8464a3..ace82ae 100644 --- a/webapp/src/pages/users/Users.tsx +++ b/webapp/src/pages/users/Users.tsx @@ -27,7 +27,7 @@ function Users() { error ? "Something went wrong" : isLoading - ? "loading" + ? "Loading..." : data.map((user: User) => (
    diff --git a/webapp/src/test/Leftbar.test.tsx b/webapp/src/test/Leftbar.test.tsx new file mode 100644 index 0000000..803b13c --- /dev/null +++ b/webapp/src/test/Leftbar.test.tsx @@ -0,0 +1,12 @@ +import { + render +} from "@testing-library/react"; +import Leftbar from "../components/leftBar/LeftBar"; + +test("Check the links of the leftbar are correctly rendered", () => { + const{container} = render(); + expect(container.querySelector("#addlandmarkLB")).toBeInTheDocument(); + expect(container.querySelector("#seelandmarksLB")).toBeInTheDocument(); + expect(container.querySelector("#profileLB")).toBeInTheDocument(); + expect(container.querySelector("#friendsLB")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/test/Navbar.test.tsx b/webapp/src/test/Navbar.test.tsx new file mode 100644 index 0000000..14a1af0 --- /dev/null +++ b/webapp/src/test/Navbar.test.tsx @@ -0,0 +1,14 @@ +import { + render +} from "@testing-library/react"; +import Navbar from "../components/navbar/Navbar"; + +test("Check the elements of the navbar are correctly rendered", () => { + const{container} = render(); + expect(container.querySelector("#logoLinkNB")).toBeInTheDocument(); + expect(container.querySelector("#logoImgNB")).toBeInTheDocument(); + expect(container.querySelector("#searchIconNB")).toBeInTheDocument(); + expect(container.querySelector("#searchInputNB")).toBeInTheDocument(); + expect(container.querySelector("#submitButtonNB")).toBeInTheDocument(); + expect(container.querySelector("#rightPaneNB")).toBeInTheDocument(); +}); \ No newline at end of file From 99fa8b75e28c79b96d1117be37829647421d4784 Mon Sep 17 00:00:00 2001 From: plg22 Date: Tue, 25 Apr 2023 12:59:56 +0200 Subject: [PATCH 19/66] Added more tests for the restApi --- docs/09_design_decisions.adoc | 1 + restapi/controllers/users.ts | 20 +++++ restapi/package-lock.json | 1 - restapi/tests/api.test.ts | 152 ++++++++++++++++++++++++++++++++-- webapp/package-lock.json | 1 - 5 files changed, 165 insertions(+), 10 deletions(-) diff --git a/docs/09_design_decisions.adoc b/docs/09_design_decisions.adoc index bc28af1..d7ec0bc 100644 --- a/docs/09_design_decisions.adoc +++ b/docs/09_design_decisions.adoc @@ -16,4 +16,5 @@ | Friends | We had a little discussion over this topic on a meeting, reaching an agreement over only allowing the users to add friends via lomap. As the way of adding friends is quite special on this app and is done via Solid, we decided not allowing to cancel a friendship via lomap, as we thought it was something external to lomap, more related only with Solid. | Coordinates | When we were dealing with adding landmarks, we were trying to add coordinates by writing the number, and we are changing our inicial approach to be able to click on the map and retrieve the coords of that point. | The old map interface | In prior versions, we used a custom _Map_ component to handle the map logic. This component has been discarded in version 1.1 due to it becoming an obstacle when implementing event handling related to the map. +| Monitoring and profiling | We are quite short of time so we decided to try to improve the tests and the features of the app rather than recording our perfonmance, as it was optional, we thought we should put all our focus on delivering a nice app. |=== \ No newline at end of file diff --git a/restapi/controllers/users.ts b/restapi/controllers/users.ts index 6c961cc..3949a89 100644 --- a/restapi/controllers/users.ts +++ b/restapi/controllers/users.ts @@ -63,5 +63,25 @@ router.post("/", async (req : any, res : any, next : any) => { res.status(404).json(err); } }); + +router.delete("/", async (req : any, res : any, next : any) => { + try { + + if(!req.body.solidURL){ + res.status(400).json("No solidURL provided"); + return; + } + let id = req.body.solidURL; + id = id.split("#")[0]; + + const user = User.deleteOne({ solidURL: id }); + console.log("DELETE /users/"); + res.status(201).json(user); + + } catch(err){ + res.status(404).json(err); + } + }); + module.exports = router; diff --git a/restapi/package-lock.json b/restapi/package-lock.json index b456e13..b42e4f6 100644 --- a/restapi/package-lock.json +++ b/restapi/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "restapi", "version": "1.0.0", "license": "ISC", "dependencies": { diff --git a/restapi/tests/api.test.ts b/restapi/tests/api.test.ts index 2732cdd..bcf588a 100644 --- a/restapi/tests/api.test.ts +++ b/restapi/tests/api.test.ts @@ -35,7 +35,7 @@ describe('user ', () => { * Test that we can search users that exist. */ it('can be found',async () => { - const response:Response = await request(app).get("users/plg22"); + const response:Response = await request(app).get("/users/plg22"); expect(response.statusCode).toBe(200); expect(response.type).toEqual("application/json"); }); @@ -44,15 +44,15 @@ describe('user ', () => { * Test that we can search users that exist. */ it('cannot be found',async () => { - const response:Response = await request(app).get("users/abcdefghi"); + const response:Response = await request(app).get("/users/abcdefghi"); expect(response.statusCode).toBe(404); }); /** * Test that we can find by his id a user that exist. */ - it('cannot be found',async () => { - const response:Response = await request(app).get("users/id/6433c2435e3283d2f3f7207e"); + it('can be found by id',async () => { + const response:Response = await request(app).get("/users/id/6433c2435e3283d2f3f7207e"); expect(response.statusCode).toBe(200); expect(response.type).toEqual("application/json"); }); @@ -60,20 +60,156 @@ describe('user ', () => { /** * Test that we cannot find by his id a user that does not exist. */ - it('cannot be found',async () => { - const response:Response = await request(app).get("users/id/pepe"); + it('cannot be found by id',async () => { + const response:Response = await request(app).get("/users/id/pepe"); + expect(response.statusCode).toBe(404); + }); + + + /** + * Test that we can retrieve some users from our mongo. + */ + it('can retrieve the user from our database',async () => { + const response:Response = (await request(app).patch("/users/").send({ + webId: "https://arqsoftlomapen2b.inrupt.net/profile/card" + })); + expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we cannot retrieve some users that are not in mongo. + */ + it('cannot retrieve a non existant user',async () => { + const response:Response = (await request(app).patch("/users/").send({ + webId: "https://pepe.inrupt.net/profile/card" + })); expect(response.statusCode).toBe(404); }); + /** + * Test that we can add a user to our mongo. + */ + it('can add a user to our mongo',async () => { + const response:Response = (await request(app).post("/users/").send({ + solidURL: "https://juan.inrupt.net/profile/card" + })); + expect(response.statusCode).toBe(201); + expect(response.type).toEqual("application/json"); + + const response2:Response = (await request(app).delete("/users/").send({ + solidURL: "https://juan.inrupt.net/profile/card" + })); + expect(response.statusCode).toBe(201); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we cannot add a user to our mongo when we dont receive the correct params. + */ + it('cannot add a user to our mongo when we dont receive the correct params',async () => { + const response:Response = (await request(app).post("/users/").send({ /* EMPTY */ })); + expect(response.statusCode).toBe(400); + }); + + + //SOLID tests + + /** + * Test that we retrieve the information for the profile. + */ + it('can find profile info',async () => { + const response:Response = await request(app).get("/solid/643425320fcf0094a003db0f"); + expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we retrieve the information for the profile. + */ + it('cannot find profile info of non existant user',async () => { + const response:Response = await request(app).get("/solid/pepe"); + expect(response.statusCode).toBe(500); + }); + + /** + * Test that we retrieve the friends of some user. + */ + it('can find friends info',async () => { + const response:Response = await request(app).get("/solid/643425320fcf0094a003db0f/friends"); + expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we cannot retrieve friends of a non existant user. + */ + it('cannot find friends info of non existant user',async () => { + const response:Response = await request(app).get("/solid/pepe/frineds"); + expect(response.statusCode).toBe(500); + }); + + //Add friend + + + //Landmark Tests + + /** + * Test that we can retrieve landmarks from a user(friend). + */ + it('can retrieve landmarks',async () => { + const response:Response = (await request(app).post("/landmarks/friend").send({ + webID: "https://juan.inrupt.net/profile/card" + })); + expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we cannot retrieve landmarks from a user(friend) that does not exist. + */ + it('cannot retrieve landmarks',async () => { + const response:Response = (await request(app).post("/landmarks/friend").send({ + webID: "pepe" + })); + expect(response.statusCode).toBe(500); + }); + + + /** + * Test that we add a landmark in mongo. + */ + it('can add a landmark in mongo',async () => { + const rname = Math.random()*100; + const response:Response = (await request(app).post("/landmarks/").send({ + name: "prueba" + rname, + category: "Bar" , + latitude: 45 , + longitude: 45, + webID: "https://arqsoftlomapen2b.inrupt.net/profile/card" + })); + expect(response.statusCode).toBe(200); + expect(response.type).toEqual("application/json"); + }); + + /** + * Test that we cannot add an erroneous landmark in mongo. + */ + it('cannot add an erroneous landmark in mongo',async () => { + const response:Response = (await request(app).post("/landmarks/").send({ + /* EMPTY */ + })); + expect(response.statusCode).toBe(500); + }); /** * Tests that a user can be created through the productService without throwing any errors. */ - it('can be created correctly', async () => { + /* it('can be created correctly', async () => { let username:string = 'Pablo' let email:string = 'gonzalezgpablo@uniovi.es' const response:Response = await request(app).post('/api/users/add').send({name: username,email: email}).set('Accept', 'application/json') expect(response.statusCode).toBe(200); - }); + }); */ }); \ No newline at end of file diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 57c7246..7c8f856 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -5,7 +5,6 @@ "requires": true, "packages": { "": { - "name": "webapp", "version": "0.1.0", "dependencies": { "@emotion/react": "^11.10.6", From bec1bbac981b0536d08ccb18506d203bc58ac16b Mon Sep 17 00:00:00 2001 From: plg22 Date: Tue, 25 Apr 2023 13:00:42 +0200 Subject: [PATCH 20/66] tests --- webapp/src/pages/addLandmark/AddLandmark.tsx | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 06e00d5..8f3871e 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -1,7 +1,7 @@ import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; import "../../map/stylesheets/addLandmark.css" -import React, {useRef, useState} from "react"; +import React, {SelectHTMLAttributes, useRef, useState} from "react"; import { Button, FormControl, @@ -17,6 +17,7 @@ import {LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; +import { JsxElement } from "typescript"; export default function AddLandmark() { @@ -41,7 +42,7 @@ export default function AddLandmark() { // Collect everything let name : string | undefined = (document.getElementById("name") as HTMLInputElement).value; - let category : string | undefined = (document.getElementById("category") as HTMLInputElement)?.value; + let category : any = (document.getElementById("category") as HTMLInputElement).value; let latitude : number = coords[0]; let longitude : number = coords[1]; let obj = { @@ -52,6 +53,12 @@ export default function AddLandmark() { webID: session.info.webId }; + console.log(obj.name); + console.log(obj.category); + console.log(obj.latitude); + console.log(obj.longitude); + console.log(obj.webID); + await makeRequest.post("/landmarks/", obj); // Here goes the access to SOLID From e08b7863bbbc798983b1e7ff095183d20155fcc2 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 25 Apr 2023 20:58:33 +0200 Subject: [PATCH 21/66] Fixed a minor error in the add landmarks page --- webapp/src/pages/addLandmark/AddLandmark.tsx | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 06e00d5..7a86523 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -21,6 +21,7 @@ import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; export default function AddLandmark() { let coords : [number, number] = [0,0]; + let option : string = "Other"; let marker : L.Marker; const [isButtonEnabled, setIsButtonEnabled] = useState(false); const setCoordinates = (latitude : number, longitude : number) => { @@ -41,7 +42,7 @@ export default function AddLandmark() { // Collect everything let name : string | undefined = (document.getElementById("name") as HTMLInputElement).value; - let category : string | undefined = (document.getElementById("category") as HTMLInputElement)?.value; + let category : string = option; let latitude : number = coords[0]; let longitude : number = coords[1]; let obj = { @@ -51,15 +52,15 @@ export default function AddLandmark() { longitude : longitude, webID: session.info.webId }; - - await makeRequest.post("/landmarks/", obj); + console.log(obj); + //await makeRequest.post("/landmarks/", obj); // Here goes the access to SOLID }; const map = useRef(null); let selectItems : JSX.Element[] = Object.keys(LandmarkCategories).map(key => { - return {key}; + return option = key}>{key}; }); const MapEvents = () => { From 0400f70e5280b0ea502ee8424fdc0622ec04ab42 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Tue, 25 Apr 2023 21:05:10 +0200 Subject: [PATCH 22/66] Improved the implementation of the fix --- webapp/src/pages/addLandmark/AddLandmark.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 7a86523..6f2d38c 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -21,7 +21,7 @@ import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; export default function AddLandmark() { let coords : [number, number] = [0,0]; - let option : string = "Other"; + const [option, setOption] = useState("Other"); let marker : L.Marker; const [isButtonEnabled, setIsButtonEnabled] = useState(false); const setCoordinates = (latitude : number, longitude : number) => { @@ -60,7 +60,7 @@ export default function AddLandmark() { const map = useRef(null); let selectItems : JSX.Element[] = Object.keys(LandmarkCategories).map(key => { - return option = key}>{key}; + return setOption(key)}>{key}; }); const MapEvents = () => { From 42d17f762de540e0f5f52ff6512bc7fce49ab3da Mon Sep 17 00:00:00 2001 From: plg22 Date: Wed, 26 Apr 2023 14:12:33 +0200 Subject: [PATCH 23/66] Reversing changes on add landmark --- webapp/src/pages/addLandmark/AddLandmark.tsx | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 8f3871e..1d16085 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -1,7 +1,7 @@ import markerIcon from "leaflet/dist/images/marker-icon.png" import "./addLandmark.css"; import "../../map/stylesheets/addLandmark.css" -import React, {SelectHTMLAttributes, useRef, useState} from "react"; +import React, {useRef, useState} from "react"; import { Button, FormControl, @@ -17,7 +17,6 @@ import {LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; -import { JsxElement } from "typescript"; export default function AddLandmark() { @@ -42,7 +41,7 @@ export default function AddLandmark() { // Collect everything let name : string | undefined = (document.getElementById("name") as HTMLInputElement).value; - let category : any = (document.getElementById("category") as HTMLInputElement).value; + let category : string | undefined = (document.getElementById("category") as HTMLInputElement)?.value; let latitude : number = coords[0]; let longitude : number = coords[1]; let obj = { @@ -53,12 +52,6 @@ export default function AddLandmark() { webID: session.info.webId }; - console.log(obj.name); - console.log(obj.category); - console.log(obj.latitude); - console.log(obj.longitude); - console.log(obj.webID); - await makeRequest.post("/landmarks/", obj); // Here goes the access to SOLID @@ -129,4 +122,4 @@ export default function AddLandmark() { ; -} \ No newline at end of file +} From 2cfb2723cd12b4c71628df11c9816cc57cbe8c2c Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 26 Apr 2023 19:03:15 +0200 Subject: [PATCH 24/66] Adding landmarks is now done in Solid, at least at a basic level. We need to change what the user can input as we do not fulfil the basic requirements. --- restapi/package-lock.json | 1 + webapp/package-lock.json | 1 + webapp/src/pages/addLandmark/AddLandmark.tsx | 23 +++++++++++++++++--- webapp/src/shared/shareddtypes.ts | 4 ++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/restapi/package-lock.json b/restapi/package-lock.json index b42e4f6..b456e13 100644 --- a/restapi/package-lock.json +++ b/restapi/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "restapi", "version": "1.0.0", "license": "ISC", "dependencies": { diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 7c8f856..57c7246 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -5,6 +5,7 @@ "requires": true, "packages": { "": { + "name": "webapp", "version": "0.1.0", "dependencies": { "@emotion/react": "^11.10.6", diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 5e301bd..499c3c8 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -13,10 +13,11 @@ import { Typography } from "@mui/material"; import L from "leaflet"; -import {LandmarkCategories} from "../../shared/shareddtypes"; +import {Landmark, LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; +import {createLocation} from "./addLandmarkSolid"; export default function AddLandmark() { @@ -45,14 +46,30 @@ export default function AddLandmark() { let category : string = option; let latitude : number = coords[0]; let longitude : number = coords[1]; - let obj = { + /*let obj = { name : name, category : category, latitude : latitude, longitude : longitude, webID: session.info.webId }; - console.log(obj); + console.log(obj);*/ + + let landmark : Landmark = { + name : name, + category : category, + latitude : latitude, + longitude : longitude + } + console.log(landmark); + + let webID = session.info.webId; + if (webID === undefined) { + webID = ""; + } + + await createLocation(webID, landmark); + //await makeRequest.post("/landmarks/", obj); // Here goes the access to SOLID diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts index d384077..1600fa9 100644 --- a/webapp/src/shared/shareddtypes.ts +++ b/webapp/src/shared/shareddtypes.ts @@ -8,13 +8,13 @@ export type User = { export class Landmark { name:string; - category?:string; + category:string; latitude:number; longitude:number; comment?:string; score?:number; picture?:string; - constructor(title:string, latitude:number, longitude:number, category?:string, comment?:string, score?:number, picture?:string){ + constructor(title:string, latitude:number, longitude:number, category:string, comment?:string, score?:number, picture?:string){ this.name = title; this.category = category; this.latitude = latitude; From 6828b47b22119de90f54109b9485fa5109c1247d Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 26 Apr 2023 19:10:35 +0200 Subject: [PATCH 25/66] Now writing in solid is possible --- .../pages/addLandmark/addLandmarkSolid.tsx | 190 ++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 webapp/src/pages/addLandmark/addLandmarkSolid.tsx diff --git a/webapp/src/pages/addLandmark/addLandmarkSolid.tsx b/webapp/src/pages/addLandmark/addLandmarkSolid.tsx new file mode 100644 index 0000000..c8ca4ea --- /dev/null +++ b/webapp/src/pages/addLandmark/addLandmarkSolid.tsx @@ -0,0 +1,190 @@ +import type { Landmark }from "../../shared/shareddtypes"; +import { fetch } from "@inrupt/solid-client-authn-browser"; + +import { + createThing, setThing, buildThing, + getSolidDataset, saveSolidDatasetAt, + createSolidDataset + } from "@inrupt/solid-client"; + + import { SCHEMA_INRUPT, RDF} from "@inrupt/vocab-common-rdf" + + import {v4 as uuid} from "uuid" // for the uuids of the locations + + // **************************************** +/* +=== POD STRUCTURE === +At this moment, the structure of the information stored in the pod sticks to the following architecture: ++ All the information belonging to LoMap is stored in the private folder of the user's pod, more precisely in + private/lomap. ++ A dataset for each location was created to ease the manipulation of data and the granting of the access + to some locations (friends logic). This datasets are contained in private/lomap/locations/{locationId}/index.ttl + This dataset contains: + # The location Thing itselft (name, description, longitude, latitude ...) + # Things representing the images of the location + # Things representing the reviews of the location + # Things representing the ratings of the location. ++ Apart from that folder hierarchy, another one is needed to register the locations. If this was not done, we would have + to iterate through all the folders of the locations directory in order to retrieve all of them. Since we did not + find an efficient way of doing this, we keep a locations record, which stores the location path for each one of them. + This record is stored in /private/lomap/inventory/index.ttl + + TREE REPRESENTATION + - private + - lomap + - locations + - LOC_ID1 + - location Thing + - images Things + - reviews Things + - scores Things + - LOC_ID2 + - . . . + - . . . + - inventory + - LOC_ID1 path (private/lomap/locations/LOC_ID1) + - LOC_ID2 path (private/lomap/locations/LOC_ID2) + - . . . +*/ + + +// ************** FUNCTIONS ***************** + +// READ FUNCTIONS + + +// WRITE FUNCTIONS + +/** + * Add the location to the inventory and creates the location dataset. + * @param webID contains the user webID + * @param location contains the location to be added + */ +export async function createLocation(webID:string, location:Landmark) { + let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ + let locationsFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path + let locationId; + // add location to inventory + try { + locationId = await addLocationToInventory(locationsFolder, location) // add the location to the inventory and get its ID + } catch (error){ + // if the inventory does not exist, create it and add the location + locationId = await createInventory(locationsFolder, location) + } + if (locationId === undefined) + return; // if the location could not be added, return (error) + + // path for the new location dataset + let individualLocationFolder = baseURL + "private/lomap/locations/" + locationId + "/index.ttl"; + + // create dataset for the location + try { + await createLocationDataSet(individualLocationFolder, location, locationId) + } catch (error) { + console.log(error) + } +} + +/** + * Adds the given location to the location inventory + * @param locationsFolder contains the inventory folder + * @param location contains the location to be added + * @returns string containing the uuid of the location + */ +export async function addLocationToInventory(locationsFolder:string, location:Landmark) { + let locationId = "LOC_" + uuid(); // create location uuid + let locationURL = locationsFolder.split("private")[0] + "private/lomap/locations/" + locationId + "/index.ttl#" + locationId // location dataset path + + let newLocation = buildThing(createThing({name: locationId})) + .addStringNoLocale(SCHEMA_INRUPT.identifier, locationURL) // add to the thing the path of the location dataset + .build(); + + let inventory = await getSolidDataset(locationsFolder, {fetch: fetch}) // get the inventory + inventory = setThing(inventory, newLocation); // add thing to inventory + try { + await saveSolidDatasetAt(locationsFolder, inventory, {fetch: fetch}) //save the inventory + return locationId; + } catch (error) { + console.log(error); + } +} + + /** + * Creates the location inventory and adds the given location to it + * @param locationsFolder contains the path of the inventory + * @param location contains the location object + * @returns location uuid + */ +export async function createInventory(locationsFolder: string, location:Landmark){ + let locationId = "LOC_" + uuid(); // location uuid + let locationURL = locationsFolder.split("private")[0] + "private/lomap/locations/" + locationId + "/index.ttl#" + locationId; // location dataset path + + let newLocation = buildThing(createThing({name: locationId})) // create thing with the location dataset path + .addStringNoLocale(SCHEMA_INRUPT.identifier, locationURL) + .build(); + + let inventory = createSolidDataset() // create dataset for the inventory + inventory = setThing(inventory, newLocation); // add name to inventory + try { + await saveSolidDatasetAt(locationsFolder, inventory, {fetch: fetch}) // save inventory dataset + return locationId; + } catch (error) { + console.log(error); + } +} + +/** + * Create the location in the given folder + * @param locationFolder contains the folder to store the location .../private/lomap/locations/${locationId}/index.ttl + * @param location contains the location to be created + * @param id contains the location uuid + */ +export async function createLocationDataSet(locationFolder:string, location:Landmark, id:string) { + let locationIdUrl = `${locationFolder}#${id}` // construct the url of the location + + // create dataset for the location + let dataSet = createSolidDataset(); + // build location thing + let newLocation = buildThing(createThing({name: id})) + .addStringNoLocale(SCHEMA_INRUPT.name, location.name.toString()) + .addStringNoLocale(SCHEMA_INRUPT.longitude, location.longitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.latitude, location.latitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.description, "No description") + .addStringNoLocale(SCHEMA_INRUPT.identifier, locationIdUrl) // store the url of the location + .addStringNoLocale(SCHEMA_INRUPT.Product, location.category) // store string containing the categories + .addUrl(RDF.type, "https://schema.org/Place") + .build(); + + + dataSet = setThing(dataSet, newLocation); // store thing in dataset + // save dataset to later add the images + dataSet = await saveSolidDatasetAt(locationFolder, dataSet, {fetch: fetch}) // save dataset + await addLocationImage(locationFolder, location); // store the images + try { + await saveSolidDatasetAt(locationFolder, dataSet, {fetch: fetch}) // save dataset + } catch (error) { + console.log(error) + } + } + + + /** + * Add the location images to the given folder + * @param url contains the folder of the images + * @param location contains the location + */ +export async function addLocationImage(url: string, location:Landmark) { + /*let locationDataset = await getSolidDataset(url, {fetch: fetch}) + location.images?.forEach(async image => { // for each image of the location, build a thing and store it in dataset + let newImage = buildThing(createThing({name: image})) + .addStringNoLocale(SCHEMA_INRUPT.image, image) + .build(); + locationDataset = setThing(locationDataset, newImage); + try { + locationDataset = await saveSolidDatasetAt(url, locationDataset, {fetch: fetch}); + } catch (error){ + console.log(error); + } + } + );*/ + } \ No newline at end of file From 99ca90c6228386c54ffa171363aec011a9ef0a21 Mon Sep 17 00:00:00 2001 From: Diego Date: Wed, 26 Apr 2023 20:19:54 +0200 Subject: [PATCH 26/66] Added the read functionm, still needed to plot the pins so i dont know if it works properly. Also we need to store the reviews, images, sccore... properly --- webapp/src/pages/addLandmark/AddLandmark.tsx | 2 +- ...kSolid.tsx => solidLandmarkManagement.tsx} | 77 ++++++++++++++++++- webapp/src/shared/shareddtypes.ts | 4 +- 3 files changed, 80 insertions(+), 3 deletions(-) rename webapp/src/pages/addLandmark/{addLandmarkSolid.tsx => solidLandmarkManagement.tsx} (71%) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 499c3c8..36a829b 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -17,7 +17,7 @@ import {Landmark, LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; -import {createLocation} from "./addLandmarkSolid"; +import {createLocation} from "./solidLandmarkManagement"; export default function AddLandmark() { diff --git a/webapp/src/pages/addLandmark/addLandmarkSolid.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx similarity index 71% rename from webapp/src/pages/addLandmark/addLandmarkSolid.tsx rename to webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index c8ca4ea..6f2dc81 100644 --- a/webapp/src/pages/addLandmark/addLandmarkSolid.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -4,7 +4,8 @@ import { fetch } from "@inrupt/solid-client-authn-browser"; import { createThing, setThing, buildThing, getSolidDataset, saveSolidDatasetAt, - createSolidDataset + createSolidDataset, getStringNoLocale, + Thing, getThing, getThingAll } from "@inrupt/solid-client"; import { SCHEMA_INRUPT, RDF} from "@inrupt/vocab-common-rdf" @@ -52,6 +53,80 @@ At this moment, the structure of the information stored in the pod sticks to the // READ FUNCTIONS +/** + * Get all the locations from the pod + * @param webID contains the user webID + * @returns array of locations + */ +export async function getLocations(webID:string) { + let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path + let locations: Landmark[] = []; // initialize array of locations + let locationPaths; + try { + let dataSet = await getSolidDataset(inventoryFolder, {fetch: fetch}); // get the inventory dataset + locationPaths = getThingAll(dataSet) // get the things from the dataset (location paths) + for (let locationPath of locationPaths) { // for each location in the dataset + // get the path of the actual location + let path = getStringNoLocale(locationPath, SCHEMA_INRUPT.identifier) as string; + // get the location : Location from the dataset of that location + try{ + let location = await getLocationFromDataset(path) + locations.push(location) + // add the location to the array + } + catch(error){ + //The url is not accessed(no permision) + } + + } + } catch (error) { + // if the location dataset does no exist, return empty array of locations + locations = []; + } + // return the locations + return locations; +} + +/** + * Retrieve the location from its dataset + * @param locationPath contains the path of the location dataset + * @returns location object + */ +export async function getLocationFromDataset(locationPath:string){ + let datasetPath = locationPath.split('#')[0] // get until index.ttl + let locationDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset + let locationAsThing = getThing(locationDataset, locationPath) as Thing; // get the location as thing + + // retrieve location information + let name = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.name) as string; + let longitude = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.longitude) as string; + let latitude = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.latitude) as string; + let description = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.description) as string; + let url = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.identifier) as string; + let categoriesDeserialized = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.Product) as string; + + /* + let locationImages: string = ""; // initialize array to store the images as strings + locationImages = await getLocationImage(datasetPath); // get the images + let reviews: string = ""; // initialize array to store the reviews + reviews = await getLocationReviews(datasetPath) // get the reviews + let scores : number; // map to store the ratings + scores = await getLocationScores(datasetPath); // get the ratings + */ + + // create Location object + let landmark : Landmark = { + name: name, + longitude: parseFloat(longitude), + latitude: parseFloat(latitude), + url: url, + category: categoriesDeserialized, + } + return landmark; +} + + + // WRITE FUNCTIONS diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts index 1600fa9..ee19a45 100644 --- a/webapp/src/shared/shareddtypes.ts +++ b/webapp/src/shared/shareddtypes.ts @@ -14,7 +14,8 @@ export class Landmark { comment?:string; score?:number; picture?:string; - constructor(title:string, latitude:number, longitude:number, category:string, comment?:string, score?:number, picture?:string){ + url?:string; + constructor(title:string, latitude:number, longitude:number, category:string, comment?:string, score?:number, picture?:string, url?:string){ this.name = title; this.category = category; this.latitude = latitude; @@ -22,6 +23,7 @@ export class Landmark { this.comment = comment; this.score = score; this.picture = picture; + this.url = url; } }; From 20356ebd4902e490b3efffea1d790e6389bff721 Mon Sep 17 00:00:00 2001 From: plg22 Date: Thu, 27 Apr 2023 09:27:55 +0200 Subject: [PATCH 27/66] Created up to 6 features for e2e tests (No login) --- webapp/e2e/features/add-landmarks.feature | 6 +++ webapp/e2e/features/see-landmarks.feature | 6 +++ webapp/e2e/steps/add-landmark.steps.ts | 49 +++++++++++++++++++++++ webapp/e2e/steps/find-friends.steps.ts | 2 +- webapp/e2e/steps/friends-list.steps.ts | 2 +- webapp/e2e/steps/profile.steps.ts | 2 +- webapp/e2e/steps/see-landmarks.steps.ts | 46 +++++++++++++++++++++ 7 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 webapp/e2e/features/add-landmarks.feature create mode 100644 webapp/e2e/features/see-landmarks.feature create mode 100644 webapp/e2e/steps/add-landmark.steps.ts create mode 100644 webapp/e2e/steps/see-landmarks.steps.ts diff --git a/webapp/e2e/features/add-landmarks.feature b/webapp/e2e/features/add-landmarks.feature new file mode 100644 index 0000000..19fe7fb --- /dev/null +++ b/webapp/e2e/features/add-landmarks.feature @@ -0,0 +1,6 @@ +Feature: Adding landmarks + +Scenario: The user logs in the site + Given A logged user + When I click on the addLandmark tab + Then I am able to see the form to add a new landmark \ No newline at end of file diff --git a/webapp/e2e/features/see-landmarks.feature b/webapp/e2e/features/see-landmarks.feature new file mode 100644 index 0000000..edc4f93 --- /dev/null +++ b/webapp/e2e/features/see-landmarks.feature @@ -0,0 +1,6 @@ +Feature: Seeing landmarks + +Scenario: The user logs in the site + Given A logged user + When I click on the see Landmarks tab + Then I am able to see the page to see other landmarks \ No newline at end of file diff --git a/webapp/e2e/steps/add-landmark.steps.ts b/webapp/e2e/steps/add-landmark.steps.ts new file mode 100644 index 0000000..2f45bfc --- /dev/null +++ b/webapp/e2e/steps/add-landmark.steps.ts @@ -0,0 +1,49 @@ +import { defineFeature, loadFeature } from 'jest-cucumber'; +import puppeteer from "puppeteer"; + +const feature = loadFeature('../features/add-landmarks.feature'); + +let page: puppeteer.Page; +let browser: puppeteer.Browser; + +defineFeature(feature, test => { + + beforeAll(async () => { + browser = process.env.GITHUB_ACTIONS + ? await puppeteer.launch() + : await puppeteer.launch({ headless: false, slowMo: 50 }); + page = await browser.newPage(); + + await page + .goto("http://localhost:3000", { + waitUntil: "networkidle0", + }) + .catch(() => {}); + }); + + test('The user logs in the site', ({given,when,then}) => { + + let email:string; + let username:string; + + given('A logged user', () => { + + }); + + when('I click on the addLandmark tab', async () => { + await expect(page).toClick('Link', { text: 'Add a landmark' }) + }); + + then('I am able to see my information', async () => { + await expect(page).toMatch('Name of the landmark') + await expect(page).toMatch('Category of the landmark') + await expect(page).toMatch('Latitude:') + await expect(page).toMatch('Longitude:') + }); + }) + + afterAll(async ()=>{ + browser.close() + }) + +}); \ No newline at end of file diff --git a/webapp/e2e/steps/find-friends.steps.ts b/webapp/e2e/steps/find-friends.steps.ts index 82c3866..635f35d 100644 --- a/webapp/e2e/steps/find-friends.steps.ts +++ b/webapp/e2e/steps/find-friends.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('./features/profile.feature'); +const feature = loadFeature('../features/profile.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; diff --git a/webapp/e2e/steps/friends-list.steps.ts b/webapp/e2e/steps/friends-list.steps.ts index 7d08a76..c0c2707 100644 --- a/webapp/e2e/steps/friends-list.steps.ts +++ b/webapp/e2e/steps/friends-list.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('./features/profile.feature'); +const feature = loadFeature('../features/profile.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; diff --git a/webapp/e2e/steps/profile.steps.ts b/webapp/e2e/steps/profile.steps.ts index ad39fd3..ca26ae6 100644 --- a/webapp/e2e/steps/profile.steps.ts +++ b/webapp/e2e/steps/profile.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('./features/profile.feature'); +const feature = loadFeature('../features/profile.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; diff --git a/webapp/e2e/steps/see-landmarks.steps.ts b/webapp/e2e/steps/see-landmarks.steps.ts new file mode 100644 index 0000000..d37ccb9 --- /dev/null +++ b/webapp/e2e/steps/see-landmarks.steps.ts @@ -0,0 +1,46 @@ +import { defineFeature, loadFeature } from 'jest-cucumber'; +import puppeteer from "puppeteer"; + +const feature = loadFeature('../features/see-landmarks.feature'); + +let page: puppeteer.Page; +let browser: puppeteer.Browser; + +defineFeature(feature, test => { + + beforeAll(async () => { + browser = process.env.GITHUB_ACTIONS + ? await puppeteer.launch() + : await puppeteer.launch({ headless: false, slowMo: 50 }); + page = await browser.newPage(); + + await page + .goto("http://localhost:3000", { + waitUntil: "networkidle0", + }) + .catch(() => {}); + }); + + test('The user logs in the site', ({given,when,then}) => { + + let email:string; + let username:string; + + given('A logged user', () => { + + }); + + when('I click on the see Landmarks tab', async () => { + await expect(page).toClick('Link', { text: 'Add a landmark' }) + }); + + then('I am able to see the page to see other landmarks', async () => { + await expect(page).toMatch('See friends\' landmarks') + }); + }) + + afterAll(async ()=>{ + browser.close() + }) + +}); \ No newline at end of file From c3c23c924de2220ea37a682b7758fa5e609003b3 Mon Sep 17 00:00:00 2001 From: plg22 Date: Thu, 27 Apr 2023 09:38:39 +0200 Subject: [PATCH 28/66] Some more design decisions --- docs/09_design_decisions.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/09_design_decisions.adoc b/docs/09_design_decisions.adoc index d7ec0bc..5bc39a0 100644 --- a/docs/09_design_decisions.adoc +++ b/docs/09_design_decisions.adoc @@ -17,4 +17,7 @@ | Coordinates | When we were dealing with adding landmarks, we were trying to add coordinates by writing the number, and we are changing our inicial approach to be able to click on the map and retrieve the coords of that point. | The old map interface | In prior versions, we used a custom _Map_ component to handle the map logic. This component has been discarded in version 1.1 due to it becoming an obstacle when implementing event handling related to the map. | Monitoring and profiling | We are quite short of time so we decided to try to improve the tests and the features of the app rather than recording our perfonmance, as it was optional, we thought we should put all our focus on delivering a nice app. +| Puppeteer | We think it was the easier way in order to implement the necesary e2e tests for the application, we considered other options seen in class and that we tried searching for, but finally decided to use puppeteer. +| Use of pods and interoperability | We as a team participated in the debates on the other github issues about the interoperability, not arriving to a very clear conclusion. As a result we spoke to some colleagues in order to try and make our applications interoperable, causing this decision to change our approach of storing landmarks on the pods. +| Way of storing landmarks | Connecting with the previous decision and probably as a result of having trouble with storing information on solid through the restApi, we decided to stop that approach and start dealing with writing and reading from the pods from the webApp. |=== \ No newline at end of file From 2721aac196dd276d3004323f84956d47ff884b1d Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Fri, 28 Apr 2023 21:15:50 +0200 Subject: [PATCH 29/66] Added some code that should work for retrieving and filtering landmarks --- .../addLandmark/solidLandmarkManagement.tsx | 6 +- .../otherUsersLandmark/LandmarkFriend.tsx | 108 ++++++++++-------- 2 files changed, 63 insertions(+), 51 deletions(-) diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index 6f2dc81..d238cab 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -58,7 +58,11 @@ At this moment, the structure of the information stored in the pod sticks to the * @param webID contains the user webID * @returns array of locations */ -export async function getLocations(webID:string) { +export async function getLocations(webID:string | undefined) { + if (webID === undefined) { + throw new Error("The user is not logged in"); + return; + } let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path let locations: Landmark[] = []; // initialize array of locations let locationPaths; diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 0f05931..fd0be78 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -12,7 +12,7 @@ import { Typography } from "@mui/material"; import markerIcon from "leaflet/dist/images/marker-icon.png"; -import React, {useRef, useState} from "react"; +import React, {useEffect, useRef, useState} from "react"; import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {useParams} from "react-router-dom"; @@ -20,35 +20,76 @@ import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; import {useQuery} from "@tanstack/react-query"; import {makeRequest} from "../../axios"; import L from "leaflet"; +import { getLocations } from "../addLandmark/solidLandmarkManagement"; +import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ const map = useRef(null); const [isCommentEnabled, setIsCommentEnabled] = useState(false); - const [selectedMarker, setSelectedMarker] = useState(new L.Marker([0,0])); + const [selectedMarker, setSelectedMarker] = useState(null); + const [landmarksReact, setLandmarksReact] = useState([]); + const [filters, setFilters] = useState | null>(null); + + const clickHandler : any = (e : any) => { + setIsCommentEnabled(true); + setSelectedMarker(e.target); + return null; + }; + + useEffect( () => { + if (useSession().session.info.webId !== undefined) { + getData(setIsCommentEnabled, setSelectedMarker, setLandmarksReact, filters); + } + }); return See friends' landmarks - + { isCommentEnabled ? : null} { isCommentEnabled ? : null } - + - ; ; } +async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, setLandmarksReact : Function, map : Map | null) { + let landmarks : Landmark[] | undefined = await getLocations(useSession().session.info.webId); + if (landmarks === undefined || map === null) return null; + + if (!(document.getElementById("all") as HTMLInputElement).checked) { + landmarks = landmarks.filter(landmark => map.get(landmark.category)) + } + + let landmarksComponent : JSX.Element[] = landmarks.map(landmark => { + return { + setIsCommentEnabled(true); + setSelectedMarker(e.target); + } + } + }> + + {landmark.name} - {landmark.category} + + + }); + + setLandmarksReact(landmarksComponent); +} + function AddScoreForm() : JSX.Element { return
    @@ -80,52 +121,8 @@ function AddCommentForm() : JSX.Element { ; } -function LandmarkPlacer(props : any) { - - const setIsCommentEnabled = props.commFunction; - const setSelectedMarker = props.markerFunction; - const clickHandler : any = (e : any) => { - setIsCommentEnabled(true); - setSelectedMarker(e.target); - return null; - }; - return null; - - // TODO: Retrieve all the landmarks. The array that follows is a temporal placeholder. -// let landmarks : JSX.Element[] = [].map(element => { -// -// -// {element.text} -// -// -// }); -// return {landmarks}; -} - function LandmarkFilter(props : any) : JSX.Element { - const uuid = useParams().id; - const [landmarks,setLandmarks] = useState([]); - const { isLoading, error, data:friends } = useQuery(["results"], () => - - makeRequest.get("/solid/" + uuid + "/friends").then((res) => { - let landmks:Landmark[] = []; - for (let i = 0; i < res.data.length; i++) { - - - makeRequest.post("/landmarks/friend",{webId: res.data[i].solidURL}).then((res1) => { - for (let i = 0; i < res1.data.length; i++) { - let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude,res1.data[i].category); - landmks.push(landmark); - } - } - ) - } - setLandmarks(landmks); - console.log(landmks); - }) - ); - // TODO: Import here the users that are friends with the logged one const loadUsers = () => { let userList : User[] = []; @@ -138,14 +135,25 @@ function LandmarkFilter(props : any) : JSX.Element { {userItems} ; } + const loadCategories = () => { let categoryList : string[] = Object.values(LandmarkCategories); + let map : Map = new Map(); + categoryList.forEach(category => map.set(category, true)); + + const changeValue = (id : string) => { + let newValue : boolean = (document.getElementById(id) as HTMLInputElement).checked; + map.set(id, newValue); + } + let categories : JSX.Element[] = categoryList.map(key => { return - } label={key} /> + changeValue(key))} defaultChecked/>} label={key} /> }); + props.setFilters(map); + return {categories} ; From 79bb09096d05b2a9201f24e8e98f5eaf5bc55730 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 29 Apr 2023 16:19:14 +0200 Subject: [PATCH 30/66] Improved the add landmark page --- webapp/src/pages/addLandmark/AddLandmark.tsx | 40 ++++++++------------ 1 file changed, 16 insertions(+), 24 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 36a829b..dd8e927 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -21,39 +21,36 @@ import {createLocation} from "./solidLandmarkManagement"; export default function AddLandmark() { - let coords : [number, number] = [0,0]; + const [coords, setCoords] = useState([0,0]); const [option, setOption] = useState("Other"); - let marker : L.Marker; + const [marker, setMarker] = useState(null); const [isButtonEnabled, setIsButtonEnabled] = useState(false); - const setCoordinates = (latitude : number, longitude : number) => { - setIsButtonEnabled(true); - coords = [latitude, longitude]; + const {session} = useSession(); + + const setCoordinates = async (latitude : number, longitude : number) => { + setIsButtonEnabled(false); (map.current as L.Map).panTo([latitude, longitude]); - if (marker !== undefined) { + if (marker !== null) { (map.current as L.Map).removeLayer(marker); } - marker = new L.Marker([latitude, longitude]).setIcon(L.icon({iconUrl: markerIcon})).addTo(map.current as L.Map); (document.getElementById("latitude") as HTMLParagraphElement).textContent = latitude.toFixed(3); (document.getElementById("longitude") as HTMLParagraphElement).textContent = longitude.toFixed(3); + await setMarker(new L.Marker([latitude, longitude]).setIcon(L.icon({iconUrl: markerIcon})).addTo(map.current as L.Map)); + await setCoords([latitude, longitude]); + setIsButtonEnabled(true); } - const {session} = useSession(); const submit = async (e : React.FormEvent) => { e.preventDefault(); // Collect everything let name : string | undefined = (document.getElementById("name") as HTMLInputElement).value; + if (name.trim() === "") { + return; + } let category : string = option; let latitude : number = coords[0]; let longitude : number = coords[1]; - /*let obj = { - name : name, - category : category, - latitude : latitude, - longitude : longitude, - webID: session.info.webId - }; - console.log(obj);*/ let landmark : Landmark = { name : name, @@ -63,16 +60,11 @@ export default function AddLandmark() { } console.log(landmark); + // Access to SOLID let webID = session.info.webId; - if (webID === undefined) { - webID = ""; + if (webID !== undefined) { + await createLocation(webID, landmark); } - - await createLocation(webID, landmark); - - //await makeRequest.post("/landmarks/", obj); - - // Here goes the access to SOLID }; const map = useRef(null); From 52c0fdfc354f490f8397130fc47bb707e4771e31 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 29 Apr 2023 16:20:08 +0200 Subject: [PATCH 31/66] Improved the home page to show the user's landmarks --- webapp/src/pages/home/Home.tsx | 63 +++++++++++++--------------------- 1 file changed, 24 insertions(+), 39 deletions(-) diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index 0de8d6b..b573c44 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -2,60 +2,45 @@ import {useEffect, useState} from "react"; import "../../map/stylesheets/home.css"; import "./home.css" import {useSession} from "@inrupt/solid-ui-react"; -import {makeRequest} from "../../axios"; import {Landmark} from "../../shared/shareddtypes"; import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; +import { getLocations } from "../addLandmark/solidLandmarkManagement"; +import markerIcon from "leaflet/dist/images/marker-icon.png" +import { Icon } from "leaflet"; function Home(): JSX.Element { const {session} = useSession(); - const [landmarks, setLandmarks] = useState([]); - - useEffect(() => { - if (session.info.webId !== undefined && session.info.webId !== "") { - console.log(session.info.webId); - makeRequest.post("/users/", {solidURL: session.info.webId}); - } - - async function fetchLandmarks() { - let landmks: Landmark[] = []; - makeRequest.post("/landmarks/friend", {webId: session.info.webId?.split("#")[0]}).then((res1) => { - for (let i = 0; i < res1.data.length; i++) { - let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude, res1.data[i].category); - landmks.push(landmark); - } - setLandmarks(loadLandmarks(landmks)); - }); - - } - - fetchLandmarks(); - }, [session, landmarks, setLandmarks]); - - function loadLandmarks(data: Landmark[]) { - let results = data.map((landmark) => { - return ( - - -

    {landmark.name}

    - -
    -
    - ); - }); - - return results; + const [landmarks, setLandmarks] = useState([]); + + async function getLandmarks() { + let fetchedLandmarks : Landmark[] | undefined = await getLocations(session.info.webId); + console.log(fetchedLandmarks); + if (fetchedLandmarks === undefined) return null;; + + await setLandmarks(fetchedLandmarks); + console.log(landmarks); } return (

    Home

    + scrollWheelZoom={true} whenReady={async () => { + await getLandmarks(); + }}> - {landmarks} + {landmarks.map(landmark => { + return + + {landmark.name} - {landmark.category} + + ; + } + ) + } ;
    ); From f9a4da7668acdb2352878ed53eb9c3437cb61392 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 29 Apr 2023 16:43:46 +0200 Subject: [PATCH 32/66] Improved the previous commit so that it actually works now --- webapp/src/pages/home/Home.tsx | 35 +++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index b573c44..7cb4897 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -11,7 +11,7 @@ import { Icon } from "leaflet"; function Home(): JSX.Element { const {session} = useSession(); const [landmarks, setLandmarks] = useState([]); - + const [generatedLandmarks, setGeneratedLandmarks] = useState([]); async function getLandmarks() { let fetchedLandmarks : Landmark[] | undefined = await getLocations(session.info.webId); console.log(fetchedLandmarks); @@ -21,26 +21,35 @@ function Home(): JSX.Element { console.log(landmarks); } + useEffect( () => { + async function doGetLandmarks() { + await getLandmarks(); + let array : JSX.Element[] = []; + landmarks.forEach(landmark => { + let element = + + {landmark.name} - {landmark.category} + + ; + array.push(element); + } + ); + + await setGeneratedLandmarks(array); + } + doGetLandmarks(); + }); + return (

    Home

    { - await getLandmarks(); - }}> + scrollWheelZoom={true}> - {landmarks.map(landmark => { - return - - {landmark.name} - {landmark.category} - - ; - } - ) - } + { generatedLandmarks } ;
    ); From 01402fdfc062c04eb48f4b054982dc912a8d451f Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 29 Apr 2023 16:50:59 +0200 Subject: [PATCH 33/66] Improved the use of filters --- .../pages/otherUsersLandmark/LandmarkFriend.tsx | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index fd0be78..ec6e1af 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -30,7 +30,7 @@ export default function LandmarkFriend() : JSX.Element{ const [selectedMarker, setSelectedMarker] = useState(null); const [landmarksReact, setLandmarksReact] = useState([]); const [filters, setFilters] = useState | null>(null); - + const session = useRef(useSession().session.info.webId); const clickHandler : any = (e : any) => { setIsCommentEnabled(true); setSelectedMarker(e.target); @@ -38,17 +38,17 @@ export default function LandmarkFriend() : JSX.Element{ }; useEffect( () => { - if (useSession().session.info.webId !== undefined) { - getData(setIsCommentEnabled, setSelectedMarker, setLandmarksReact, filters); + if (session.current !== undefined) { + getData(setIsCommentEnabled, setSelectedMarker, setLandmarksReact, filters, session.current); } - }); + }, [filters]); return See friends' landmarks - + { isCommentEnabled ? : null} { isCommentEnabled ? : null } @@ -64,8 +64,8 @@ export default function LandmarkFriend() : JSX.Element{ ; } -async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, setLandmarksReact : Function, map : Map | null) { - let landmarks : Landmark[] | undefined = await getLocations(useSession().session.info.webId); +async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, setLandmarksReact : Function, map : Map | null, webId : string | undefined) { + let landmarks : Landmark[] | undefined = await getLocations(webId); if (landmarks === undefined || map === null) return null; if (!(document.getElementById("all") as HTMLInputElement).checked) { @@ -144,6 +144,7 @@ function LandmarkFilter(props : any) : JSX.Element { const changeValue = (id : string) => { let newValue : boolean = (document.getElementById(id) as HTMLInputElement).checked; map.set(id, newValue); + props.setFilters(map); } let categories : JSX.Element[] = categoryList.map(key => { @@ -152,8 +153,6 @@ function LandmarkFilter(props : any) : JSX.Element { }); - props.setFilters(map); - return {categories} ; From 06019c09546f4609e2b72baace675398e5049aa9 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sat, 29 Apr 2023 16:56:01 +0200 Subject: [PATCH 34/66] Added the icon of the icon and fixed a minor visual bug --- .../src/pages/otherUsersLandmark/LandmarkFriend.tsx | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index ec6e1af..ceb55d2 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -12,13 +12,10 @@ import { Typography } from "@mui/material"; import markerIcon from "leaflet/dist/images/marker-icon.png"; -import React, {useEffect, useRef, useState} from "react"; +import {useEffect, useRef, useState} from "react"; import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; -import {useParams} from "react-router-dom"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; -import {useQuery} from "@tanstack/react-query"; -import {makeRequest} from "../../axios"; import L from "leaflet"; import { getLocations } from "../addLandmark/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; @@ -47,12 +44,12 @@ export default function LandmarkFriend() : JSX.Element{ See friends' landmarks - + { isCommentEnabled ? : null} { isCommentEnabled ? : null } - + + } icon = {L.icon({iconUrl: markerIcon})}> {landmark.name} - {landmark.category} From 1678decf8ac79b214f38479694c3a0c453f6bdd5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= Date: Sat, 29 Apr 2023 20:30:59 +0200 Subject: [PATCH 35/66] added the touches, now "/" is the login page --- webapp/src/App.tsx | 16 ++++++++-------- webapp/src/components/leftBar/LeftBar.tsx | 8 ++++---- webapp/src/components/navbar/Navbar.tsx | 8 ++++---- webapp/src/pages/friends/Friends.tsx | 2 +- webapp/src/pages/home/Home.tsx | 2 +- webapp/src/pages/login/Login.tsx | 2 +- webapp/src/pages/users/Users.tsx | 2 +- 7 files changed, 20 insertions(+), 20 deletions(-) diff --git a/webapp/src/App.tsx b/webapp/src/App.tsx index b708565..4c85f6b 100644 --- a/webapp/src/App.tsx +++ b/webapp/src/App.tsx @@ -57,7 +57,7 @@ function App(): JSX.Element { const router = createBrowserRouter([ { - path: "/", + path: "/main", element: ( @@ -65,34 +65,34 @@ function App(): JSX.Element { ), children: [ { - path: "/", + path: "/main/", element: , }, { - path: "/profile/:id", + path: "/main/profile/:id", element: , }, { - path: "/friends/:id", + path: "/main/friends/:id", element: , }, { - path: "/landmarks/add", + path: "/main/landmarks/add", element: , }, { - path: "/landmarks/filter/:id", + path: "/main/landmarks/filter/:id", element: , }, { - path: "/users/:text", + path: "/main/users/:text", element: , }, ], }, { - path: "/login", + path: "/", element: , }, { diff --git a/webapp/src/components/leftBar/LeftBar.tsx b/webapp/src/components/leftBar/LeftBar.tsx index acd2f86..b029aad 100644 --- a/webapp/src/components/leftBar/LeftBar.tsx +++ b/webapp/src/components/leftBar/LeftBar.tsx @@ -27,19 +27,19 @@ function LeftBar(): JSX.Element{
    • - + Profile
    • - + Add a landmark
    • - + See friends' landmarks @@ -51,7 +51,7 @@ function LeftBar(): JSX.Element{
    • */}
    • - + Friends diff --git a/webapp/src/components/navbar/Navbar.tsx b/webapp/src/components/navbar/Navbar.tsx index 50bc6df..cf2e66e 100644 --- a/webapp/src/components/navbar/Navbar.tsx +++ b/webapp/src/components/navbar/Navbar.tsx @@ -14,11 +14,11 @@ function Navbar(): JSX.Element { const getLoginButton = () => { if (sessionStarted) { - return } else { - return } @@ -27,7 +27,7 @@ function Navbar(): JSX.Element { return (
      - + bug @@ -46,7 +46,7 @@ function Navbar(): JSX.Element { id="searchInputNB" onChange={(event) => setInputValue(event.target.value)} /> - +
      diff --git a/webapp/src/pages/friends/Friends.tsx b/webapp/src/pages/friends/Friends.tsx index 87bfa0a..b3a52b2 100644 --- a/webapp/src/pages/friends/Friends.tsx +++ b/webapp/src/pages/friends/Friends.tsx @@ -30,7 +30,7 @@ function Friends(): JSX.Element { : isLoading ? "Loading..." : data.map((user: User) => ( - +
      {"User solidURL: " + user.solidURL} diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index 0de8d6b..f2f59b0 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -18,7 +18,7 @@ function Home(): JSX.Element { async function fetchLandmarks() { let landmks: Landmark[] = []; - makeRequest.post("/landmarks/friend", {webId: session.info.webId?.split("#")[0]}).then((res1) => { + makeRequest.post("/main/landmarks/friend", {webId: session.info.webId?.split("#")[0]}).then((res1) => { for (let i = 0; i < res1.data.length; i++) { let landmark = new Landmark(res1.data[i].name, res1.data[i].latitude, res1.data[i].longitude, res1.data[i].category); landmks.push(landmark); diff --git a/webapp/src/pages/login/Login.tsx b/webapp/src/pages/login/Login.tsx index 45d4213..e3cc24e 100644 --- a/webapp/src/pages/login/Login.tsx +++ b/webapp/src/pages/login/Login.tsx @@ -28,7 +28,7 @@ const Login = () => { InputProps={{ endAdornment: ( + + +
      +
      +
      + + + + + + + + + + + + + + + + + + + + + + + + +
      RequestsExecutionsResponse Time (ms)
      TotalOKKO% KOCnt/sMin50th pct75th pct95th pct99th pctMaxMeanStd Dev
      + + +
      +
      +
      +
    + +
    +
    +
    +
    +
    + + + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    + +
    +
    +
    +
    +
    +
+ +
+ + diff --git a/webapp/loadTests/150UsersIn1Min.html b/webapp/loadTests/150UsersIn1Min.html new file mode 100644 index 0000000..0b12f58 --- /dev/null +++ b/webapp/loadTests/150UsersIn1Min.html @@ -0,0 +1,1127 @@ + + + + + + + + + + + + + + + + + + + +Gatling Stats - Global Information + + +
+
+
+ + Try Gatling Enterprise
+
+ +
+
+
+
+ RecordedSimulation +
+
+
+ + +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+
+ Gatling Version + + Version: + 3.9.3 + + + Released: + 2023-04-03 + +
+
+ Run Information +
+ + Date: + 2023-04-30 10:01:21 GMT + + + Duration: + 1m 35s + + + Description: + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ + diff --git a/webapp/loadTests/1user.html b/webapp/loadTests/1user.html new file mode 100644 index 0000000..024f61d --- /dev/null +++ b/webapp/loadTests/1user.html @@ -0,0 +1,1095 @@ + + + + + + + + + + + + + + + + + + + +Gatling Stats - Global Information + + +
+
+
+ + Try Gatling Enterprise
+
+ +
+
+
+
+ RecordedSimulation +
+
+
+ + +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+
+ Gatling Version + + Version: + 3.9.3 + + + Released: + 2023-04-03 + +
+
+ Run Information +
+ + Date: + 2023-04-30 09:52:08 GMT + + + Duration: + 33s + + + Description: + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ + diff --git a/webapp/loadTests/250UsersIn1Min.html b/webapp/loadTests/250UsersIn1Min.html new file mode 100644 index 0000000..4c8b0b6 --- /dev/null +++ b/webapp/loadTests/250UsersIn1Min.html @@ -0,0 +1,1127 @@ + + + + + + + + + + + + + + + + + + + +Gatling Stats - Global Information + + +
+
+
+ + Try Gatling Enterprise
+
+ +
+
+
+
+ RecordedSimulation +
+
+
+ + +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+
+ Gatling Version + + Version: + 3.9.3 + + + Released: + 2023-04-03 + +
+
+ Run Information +
+ + Date: + 2023-04-30 10:06:20 GMT + + + Duration: + 1m 47s + + + Description: + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ + diff --git a/webapp/loadTests/25usersAtOnce.html b/webapp/loadTests/25usersAtOnce.html new file mode 100644 index 0000000..85263ca --- /dev/null +++ b/webapp/loadTests/25usersAtOnce.html @@ -0,0 +1,1127 @@ + + + + + + + + + + + + + + + + + + + +Gatling Stats - Global Information + + +
+
+
+ + Try Gatling Enterprise
+
+ +
+
+
+
+ RecordedSimulation +
+
+
+ + +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+
+ Gatling Version + + Version: + 3.9.3 + + + Released: + 2023-04-03 + +
+
+ Run Information +
+ + Date: + 2023-04-30 09:54:28 GMT + + + Duration: + 40s + + + Description: + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ + diff --git a/webapp/loadTests/50UsersIn1Min.html b/webapp/loadTests/50UsersIn1Min.html new file mode 100644 index 0000000..0ef87da --- /dev/null +++ b/webapp/loadTests/50UsersIn1Min.html @@ -0,0 +1,1122 @@ + + + + + + + + + + + + + + + + + + + +Gatling Stats - Global Information + + +
+
+
+ + Try Gatling Enterprise
+
+ +
+
+
+
+ RecordedSimulation +
+
+
+ + +
+
+
+
+
+
+ + +
+ +
+
+ +
+
+
+
+
+ Gatling Version + + Version: + 3.9.3 + + + Released: + 2023-04-03 + +
+
+ Run Information +
+ + Date: + 2023-04-30 09:58:11 GMT + + + Duration: + 1m 33s + + + Description: + + + +
+
+
+
+ +
+ +
+ +
+
+
+
+
+ + + +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+
+
+
+
+
+ +
+ + From 3e643c58952fcd9f2f1f3900d5ff0dfebbf9e731 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 30 Apr 2023 14:42:46 +0200 Subject: [PATCH 38/66] SharedTypes Changed the landmark type to correctly model the problem --- webapp/src/shared/shareddtypes.ts | 34 +++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts index ee19a45..ea9d47d 100644 --- a/webapp/src/shared/shareddtypes.ts +++ b/webapp/src/shared/shareddtypes.ts @@ -11,22 +11,40 @@ export class Landmark { category:string; latitude:number; longitude:number; - comment?:string; - score?:number; - picture?:string; + description?:string; + reviews?:Array; + scores?:Map; + pictures?:string[]; url?:string; - constructor(title:string, latitude:number, longitude:number, category:string, comment?:string, score?:number, picture?:string, url?:string){ + constructor(title:string, category:string, latitude:number, longitude:number, description:string, reviews?:Array, scores?:Map, pictures?:string[], url?:string){ this.name = title; this.category = category; this.latitude = latitude; this.longitude = longitude; - this.comment = comment; - this.score = score; - this.picture = picture; + this.description = description; + this.reviews = reviews; + this.scores = scores; + this.pictures = pictures; this.url = url; } }; +export class Review { + webId:string; + date: string; + username:string; + title:string; + content:string; + + constructor(webId:string, date:string, username:string, title:string, content:string){ + this.webId = webId; + this.date = date; + this.username = username; + this.title = title; + this.content = content; + } +} + export const LandmarkCategories = { Shop: "Shop", Bar: "Bar", @@ -35,4 +53,4 @@ export const LandmarkCategories = { Monument: "Monument", Entertainment: "Entertainment", Other: "Other", -}; \ No newline at end of file +}; From f75da3e2cdea6bc0c18f3f778586f4061053b9d4 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 30 Apr 2023 14:44:45 +0200 Subject: [PATCH 39/66] Backend landmark management improved Backend for managing the reviews, scores and multiple images of the landmarks --- .../addLandmark/solidLandmarkManagement.tsx | 387 ++++++++++++------ 1 file changed, 270 insertions(+), 117 deletions(-) diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index 13bfaae..6dc5c7a 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -1,4 +1,4 @@ -import type { Landmark }from "../../shared/shareddtypes"; +import type { Landmark, Review }from "../../shared/shareddtypes"; import { fetch } from "@inrupt/solid-client-authn-browser"; import { @@ -10,10 +10,11 @@ import { hasFallbackAcl, hasAccessibleAcl, createAcl, createAclFromFallbackAcl, getResourceAcl, setAgentResourceAccess, saveAclFor, - setAgentDefaultAccess, getUrl, getUrlAll + setAgentDefaultAccess, getUrl, getUrlAll, + getFile, isRawData, } from "@inrupt/solid-client"; - import { SCHEMA_INRUPT, RDF, FOAF} from "@inrupt/vocab-common-rdf"; + import { SCHEMA_INRUPT, RDF, FOAF, VCARD} from "@inrupt/vocab-common-rdf"; import {v4 as uuid} from "uuid"; @@ -21,9 +22,9 @@ import { // Reading landmarks from POD /** - * Get all the locations from the pod + * Get all the landmarks from the pod * @param webID contains the user webID - * @returns array of locations + * @returns array of landmarks */ export async function getLocations(webID:string | undefined) { if (webID === undefined) { @@ -31,19 +32,19 @@ export async function getLocations(webID:string | undefined) { return; } let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path - let locations: Landmark[] = []; // initialize array of locations - let locationPaths; + let landmarks: Landmark[] = []; // initialize array of landmarks + let landmarkPaths; try { let dataSet = await getSolidDataset(inventoryFolder, {fetch: fetch}); // get the inventory dataset - locationPaths = getThingAll(dataSet) // get the things from the dataset (location paths) - for (let locationPath of locationPaths) { // for each location in the dataset - // get the path of the actual location - let path = getStringNoLocale(locationPath, SCHEMA_INRUPT.identifier) as string; - // get the location : Location from the dataset of that location + landmarkPaths = getThingAll(dataSet) // get the things from the dataset (landmark paths) + for (let landmarkPath of landmarkPaths) { // for each landmark in the dataset + // get the path of the actual landmark + let path = getStringNoLocale(landmarkPath, SCHEMA_INRUPT.identifier) as string; + // get the landmark : Location from the dataset of that landmark try{ - let location = await getLocationFromDataset(path) - locations.push(location) - // add the location to the array + let landmark = await getLocationFromDataset(path) + landmarks.push(landmark) + // add the landmark to the array } catch(error){ //The url is not accessed(no permision) @@ -51,163 +52,259 @@ export async function getLocations(webID:string | undefined) { } } catch (error) { - // if the location dataset does no exist, return empty array of locations - locations = []; + // if the landmark dataset does no exist, return empty array of landmarks + landmarks = []; } - // return the locations - return locations; + // return the landmarks + return landmarks; } /** - * Retrieve the location from its dataset - * @param locationPath contains the path of the location dataset - * @returns location object + * Retrieve the landmark from its dataset + * @param landmarkPath contains the path of the landmark dataset + * @returns landmark object */ -export async function getLocationFromDataset(locationPath:string){ - let datasetPath = locationPath.split('#')[0] // get until index.ttl - let locationDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset - let locationAsThing = getThing(locationDataset, locationPath) as Thing; // get the location as thing - - // retrieve location information - let name = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.name) as string; - let longitude = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.longitude) as string; - let latitude = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.latitude) as string; - let description = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.description) as string; - let url = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.identifier) as string; - let categoriesDeserialized = getStringNoLocale(locationAsThing, SCHEMA_INRUPT.Product) as string; - - /* - let locationImages: string = ""; // initialize array to store the images as strings - locationImages = await getLocationImage(datasetPath); // get the images - let reviews: string = ""; // initialize array to store the reviews +export async function getLocationFromDataset(landmarkPath:string){ + let datasetPath = landmarkPath.split('#')[0] // get until index.ttl + let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset + let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing + + // retrieve landmark information + let name = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.name) as string; + let longitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.longitude) as string; + let latitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.latitude) as string; + let description = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.description) as string; + let url = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.identifier) as string; + let categoriesDeserialized = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.Product) as string; + + + let pictures: string [] = []; // initialize array to store the images as strings + pictures = await getLocationImage(datasetPath); // get the images + let reviews: Review[] = []; // initialize array to store the reviews reviews = await getLocationReviews(datasetPath) // get the reviews - let scores : number; // map to store the ratings + let scores : Map; // map to store the ratings scores = await getLocationScores(datasetPath); // get the ratings - */ + // create Location object let landmark : Landmark = { - name: name, - longitude: parseFloat(longitude), - latitude: parseFloat(latitude), - url: url, - category: categoriesDeserialized, + name: name, + category: categoriesDeserialized, + latitude: parseFloat(latitude), + longitude: parseFloat(longitude), + description: description, + reviews: reviews, + scores: scores, + pictures: pictures, + url: url, } + + return landmark; } +/** + * Given the folder containing the images of the landmarks, gets the images (things) inside the dataset. + * @param imagesFolderUrl url of the images folder + * @returns string[] containing the images + */ +export async function getLocationImage(imagesFolderUrl:string){ + let images: string[] = []; + let imagesThings; + try { + let imagesDataSet = await getSolidDataset(imagesFolderUrl, {fetch: fetch}); // get images dataset + imagesThings = getThingAll(imagesDataSet) // get all the things in the images dataset + for (let image of imagesThings){ + try{ + const file = await getFile( + image.url, // File in Pod to Read + { fetch: fetch } // fetch from authenticated session + ); + if(isRawData(file)){//If it's a file(not dataset) + images.push(URL.createObjectURL(file));//Creates the file as URL and pushes it to the + } + }catch(e){ + + } + } + } catch (error){ + // if the dataset does not exist, return empty array of images + images = []; + } + return images; +} +/** + * Get the reviews of a landmark + * @param folder contains the dataset containing the reviews + * @returns array of reviews + */ +export async function getLocationReviews(folder:string) { + let reviews : Review[] = []; + try { + let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get dataset + // get all things in the dataset of type review + let things = getThingAll(dataSet).filter((thing) => getUrl(thing, VCARD.Type) === VCARD.hasNote) + // for each review, create it and add it to the array + for (let review of things) { + // get review information + let title = getStringNoLocale(review, SCHEMA_INRUPT.name) as string; + let content = getStringNoLocale(review, SCHEMA_INRUPT.description) as string; + let date = getStringNoLocale(review, SCHEMA_INRUPT.startDate) as string; + let webId = getStringNoLocale(review, SCHEMA_INRUPT.Person) as string; + let name = getStringNoLocale(await getUserProfile(webId),FOAF.name) as string; + + let newReview : Review = { + title: title, + content: content, + date: date, + webId: webId, + username: name + } + reviews.push(newReview); + } + + } catch (error) { + // if there are any errors, retrieve empty array of reviews + reviews = []; + } + return reviews; + } +/** + * Get the scores of a landmark + * @param folder contains the dataset containing the scores + * @returns Map containing the scores and their creator + */ +export async function getLocationScores(folder:string) { + let scores : Map = new Map(); + try { + let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get the whole dataset + // get things of type score + let things = getThingAll(dataSet).filter((thing) => getUrl(thing, VCARD.Type) === VCARD.hasValue) + // for each score, create it and add it to the map + for (let score of things) { + let value = parseInt(getStringNoLocale(score, SCHEMA_INRUPT.value) as string); + let webId = getStringNoLocale(score, SCHEMA_INRUPT.Person) as string; + + scores.set(webId, value); + } + + } catch (error) { + scores = new Map(); // retrieve empty map + } + return scores; + } -// Wrtiting landmarks to POD +// Writing landmarks to POD /** - * Add the location to the inventory and creates the location dataset. + * Add the landmark to the inventory and creates the landmark dataset. * @param webID contains the user webID - * @param location contains the location to be added + * @param landmark contains the landmark to be added */ -export async function createLocation(webID:string, location:Landmark) { +export async function createLocation(webID:string, landmark:Landmark) { let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ - let locationsFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path - let locationId; - // add location to inventory + let landmarksFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path + let landmarkId; + // add landmark to inventory try { - locationId = await addLocationToInventory(locationsFolder, location) // add the location to the inventory and get its ID + landmarkId = await addLocationToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID } catch (error){ - // if the inventory does not exist, create it and add the location - locationId = await createInventory(locationsFolder, location) + // if the inventory does not exist, create it and add the landmark + landmarkId = await createInventory(landmarksFolder, landmark) } - if (locationId === undefined) - return; // if the location could not be added, return (error) + if (landmarkId === undefined) + return; // if the landmark could not be added, return (error) - // path for the new location dataset - let individualLocationFolder = baseURL + "private/lomap/locations/" + locationId + "/index.ttl"; + // path for the new landmark dataset + let individualLocationFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; - // create dataset for the location + // create dataset for the landmark try { - await createLocationDataSet(individualLocationFolder, location, locationId) + await createLocationDataSet(individualLocationFolder, landmark, landmarkId) } catch (error) { console.log(error) } } /** - * Adds the given location to the location inventory - * @param locationsFolder contains the inventory folder - * @param location contains the location to be added - * @returns string containing the uuid of the location + * Adds the given landmark to the landmark inventory + * @param landmarksFolder contains the inventory folder + * @param landmark contains the landmark to be added + * @returns string containing the uuid of the landmark */ -export async function addLocationToInventory(locationsFolder:string, location:Landmark) { - let locationId = "LOC_" + uuid(); // create location uuid - let locationURL = locationsFolder.split("private")[0] + "private/lomap/locations/" + locationId + "/index.ttl#" + locationId // location dataset path +export async function addLocationToInventory(landmarksFolder:string, landmark:Landmark) { + let landmarkId = "LOC_" + uuid(); // create landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path - let newLocation = buildThing(createThing({name: locationId})) - .addStringNoLocale(SCHEMA_INRUPT.identifier, locationURL) // add to the thing the path of the location dataset + let newLocation = buildThing(createThing({name: landmarkId})) + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset .build(); - let inventory = await getSolidDataset(locationsFolder, {fetch: fetch}) // get the inventory + let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory inventory = setThing(inventory, newLocation); // add thing to inventory try { - await saveSolidDatasetAt(locationsFolder, inventory, {fetch: fetch}) //save the inventory - return locationId; + await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) //save the inventory + return landmarkId; } catch (error) { console.log(error); } } /** - * Creates the location inventory and adds the given location to it - * @param locationsFolder contains the path of the inventory - * @param location contains the location object - * @returns location uuid + * Creates the landmark inventory and adds the given landmark to it + * @param landmarksFolder contains the path of the inventory + * @param landmark contains the landmark object + * @returns landmark uuid */ -export async function createInventory(locationsFolder: string, location:Landmark){ - let locationId = "LOC_" + uuid(); // location uuid - let locationURL = locationsFolder.split("private")[0] + "private/lomap/locations/" + locationId + "/index.ttl#" + locationId; // location dataset path +export async function createInventory(landmarksFolder: string, landmark:Landmark){ + let landmarkId = "LOC_" + uuid(); // landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path - let newLocation = buildThing(createThing({name: locationId})) // create thing with the location dataset path - .addStringNoLocale(SCHEMA_INRUPT.identifier, locationURL) + let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) .build(); let inventory = createSolidDataset() // create dataset for the inventory inventory = setThing(inventory, newLocation); // add name to inventory try { - await saveSolidDatasetAt(locationsFolder, inventory, {fetch: fetch}) // save inventory dataset - return locationId; + await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) // save inventory dataset + return landmarkId; } catch (error) { console.log(error); } } /** - * Create the location in the given folder - * @param locationFolder contains the folder to store the location .../private/lomap/locations/${locationId}/index.ttl - * @param location contains the location to be created - * @param id contains the location uuid + * Create the landmark in the given folder + * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl + * @param landmark contains the landmark to be created + * @param id contains the landmark uuid */ -export async function createLocationDataSet(locationFolder:string, location:Landmark, id:string) { - let locationIdUrl = `${locationFolder}#${id}` // construct the url of the location +export async function createLocationDataSet(landmarkFolder:string, landmark:Landmark, id:string) { + let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the landmark - // create dataset for the location + // create dataset for the landmark let dataSet = createSolidDataset(); - // build location thing + // build landmark thing let newLocation = buildThing(createThing({name: id})) - .addStringNoLocale(SCHEMA_INRUPT.name, location.name.toString()) - .addStringNoLocale(SCHEMA_INRUPT.longitude, location.longitude.toString()) - .addStringNoLocale(SCHEMA_INRUPT.latitude, location.latitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.name, landmark.name.toString()) + .addStringNoLocale(SCHEMA_INRUPT.longitude, landmark.longitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.latitude, landmark.latitude.toString()) .addStringNoLocale(SCHEMA_INRUPT.description, "No description") - .addStringNoLocale(SCHEMA_INRUPT.identifier, locationIdUrl) // store the url of the location - .addStringNoLocale(SCHEMA_INRUPT.Product, location.category) // store string containing the categories + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the landmark + .addStringNoLocale(SCHEMA_INRUPT.Product, landmark.category) // store string containing the categories .addUrl(RDF.type, "https://schema.org/Place") .build(); dataSet = setThing(dataSet, newLocation); // store thing in dataset // save dataset to later add the images - dataSet = await saveSolidDatasetAt(locationFolder, dataSet, {fetch: fetch}) // save dataset - await addLocationImage(locationFolder, location); // store the images + dataSet = await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset + await addLocationImage(landmarkFolder, landmark); // store the images try { - await saveSolidDatasetAt(locationFolder, dataSet, {fetch: fetch}) // save dataset + await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset } catch (error) { console.log(error) } @@ -215,39 +312,95 @@ export async function createLocationDataSet(locationFolder:string, location:Land /** - * Add the location images to the given folder + * Add the landmark images to the given folder * @param url contains the folder of the images - * @param location contains the location + * @param landmark contains the landmark */ -export async function addLocationImage(url: string, location:Landmark) { - /*let locationDataset = await getSolidDataset(url, {fetch: fetch}) - location.images?.forEach(async image => { // for each image of the location, build a thing and store it in dataset - let newImage = buildThing(createThing({name: image})) - .addStringNoLocale(SCHEMA_INRUPT.image, image) +export async function addLocationImage(url: string, landmark:Landmark) { + let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) + landmark.pictures?.forEach(async picture => { // for each picture of the landmark, build a thing and store it in dataset + let newImage = buildThing(createThing({name: picture})) + .addStringNoLocale(SCHEMA_INRUPT.image, picture) .build(); - locationDataset = setThing(locationDataset, newImage); + landmarkDataset = setThing(landmarkDataset, newImage); try { - locationDataset = await saveSolidDatasetAt(url, locationDataset, {fetch: fetch}); + landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); } catch (error){ console.log(error); } } - );*/ + ); + } + + + /** + * Add a review to the given landmark + * @param landmark contains the landmark + * @param review contains the review to be added to the landmark + */ +export async function addLocationReview(landmark:Landmark, review:Review){ + let url = landmark.url?.split("#")[0] as string; // get the path of the landmark dataset + // get dataset + let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) + // create review + let newReview = buildThing(createThing()) + .addStringNoLocale(SCHEMA_INRUPT.name, review.title) + .addStringNoLocale(SCHEMA_INRUPT.description, review.content) + .addStringNoLocale(SCHEMA_INRUPT.startDate, review.date) + .addStringNoLocale(SCHEMA_INRUPT.Person, review.webId) + .addUrl(VCARD.Type, VCARD.hasNote) + .build(); + // store the review in the landmark dataset + landmarkDataset = setThing(landmarkDataset, newReview) + + try { + // save dataset + landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); + } catch (error){ + console.log(error); + } + } + + /** + * Add a rating to the given landmark + * @param webId contains the webid of the user rating the landmark + * @param landmark contains the landmark + * @param score contains the score of the rating + */ + export async function addLocationScore(webId:string, landmark:Landmark, score:number){ + let url = landmark.url?.split("#")[0] as string; // get landmark dataset path + // get dataset + let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) + // create score + let newScore = buildThing(createThing()) + .addStringNoLocale(SCHEMA_INRUPT.value, score.toString()) + .addStringNoLocale(SCHEMA_INRUPT.Person, webId) + .addUrl(VCARD.Type, VCARD.hasValue) + .build(); + // add score to the dataset + landmarkDataset = setThing(landmarkDataset, newScore) + + try { + // save dataset + landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); + } catch (error){ + console.log(error); + } } // Friend management /** - * Grant/ Revoke permissions of friends regarding a particular location + * Grant/ Revoke permissions of friends regarding a particular landmark * @param friend webID of the friend to grant or revoke permissions - * @param locationURL location to give/revoke permission to + * @param landmarkURL landmark to give/revoke permission to * @param giveAccess if true, permissions are granted, if false permissions are revoked */ -export async function setAccessToFriend(friend:string, locationURL:string, giveAccess:boolean){ - let myInventory = `${locationURL.split("private")[0]}private/lomap/inventory/index.ttl` +export async function setAccessToFriend(friend:string, landmarkURL:string, giveAccess:boolean){ + let myInventory = `${landmarkURL.split("private")[0]}private/lomap/inventory/index.ttl` await giveAccessToInventory(myInventory, friend); - let resourceURL = locationURL.split("#")[0]; // dataset path + let resourceURL = landmarkURL.split("#")[0]; // dataset path // Fetch the SolidDataset and its associated ACL, if available: let myDatasetWithAcl : any; try { @@ -367,4 +520,4 @@ export async function addSolidFriend(webID: string,friendURL: string): Promise<{ let dataSet = await getSolidDataset(profile, {fetch: fetch}); // return the dataset as a thing return getThing(dataSet, webID) as Thing; -} \ No newline at end of file +} From b6d1636c06d76d5c0b6e0eb34bf3b7c2a119f7a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= Date: Sun, 30 Apr 2023 16:59:58 +0200 Subject: [PATCH 40/66] Added small register fix --- webapp/e2e/features/add-landmarks.feature | 2 +- webapp/e2e/features/find-friends.feature | 4 +-- webapp/e2e/features/friends-list.feature | 2 +- webapp/e2e/features/profile.feature | 2 +- webapp/e2e/features/see-landmarks.feature | 2 +- webapp/e2e/steps/add-landmark.steps.ts | 19 ++++++++--- webapp/e2e/steps/find-friends.steps.ts | 39 ++++++++++++++++------- webapp/e2e/steps/friends-list.steps.ts | 21 ++++++++---- webapp/e2e/steps/profile.steps.ts | 19 ++++++++--- webapp/e2e/steps/see-landmarks.steps.ts | 23 +++++++++---- webapp/package.json | 2 +- webapp/src/pages/home/Home.tsx | 6 ++++ 12 files changed, 100 insertions(+), 41 deletions(-) diff --git a/webapp/e2e/features/add-landmarks.feature b/webapp/e2e/features/add-landmarks.feature index 19fe7fb..76c11d0 100644 --- a/webapp/e2e/features/add-landmarks.feature +++ b/webapp/e2e/features/add-landmarks.feature @@ -1,6 +1,6 @@ Feature: Adding landmarks Scenario: The user logs in the site - Given A logged user + Given The user logs in When I click on the addLandmark tab Then I am able to see the form to add a new landmark \ No newline at end of file diff --git a/webapp/e2e/features/find-friends.feature b/webapp/e2e/features/find-friends.feature index ed66aaf..ff37fde 100644 --- a/webapp/e2e/features/find-friends.feature +++ b/webapp/e2e/features/find-friends.feature @@ -1,11 +1,11 @@ Feature: Finding people on the app Scenario: The user is logged in the site - Given A logged user + Given The user logs in When He searches for garabato Then Some test people should appear Scenario: The user is logged in the site - Given A logged user + Given The user logs in When He searches for asdfgh Then No one should appear \ No newline at end of file diff --git a/webapp/e2e/features/friends-list.feature b/webapp/e2e/features/friends-list.feature index d3a217b..c62bb54 100644 --- a/webapp/e2e/features/friends-list.feature +++ b/webapp/e2e/features/friends-list.feature @@ -1,6 +1,6 @@ Feature: See the list of my friends Scenario: The user is logged in the site - Given A logged user + Given The user logs in When I click on the friends tab Then I am able to see my friends \ No newline at end of file diff --git a/webapp/e2e/features/profile.feature b/webapp/e2e/features/profile.feature index e07dc57..5ccd37c 100644 --- a/webapp/e2e/features/profile.feature +++ b/webapp/e2e/features/profile.feature @@ -1,6 +1,6 @@ Feature: See my profile Scenario: The user is logged in the site - Given A logged user + Given The user logs in When I click on the profile Then I am able to see my information \ No newline at end of file diff --git a/webapp/e2e/features/see-landmarks.feature b/webapp/e2e/features/see-landmarks.feature index edc4f93..bfa0ac4 100644 --- a/webapp/e2e/features/see-landmarks.feature +++ b/webapp/e2e/features/see-landmarks.feature @@ -1,6 +1,6 @@ Feature: Seeing landmarks Scenario: The user logs in the site - Given A logged user + Given The user logs in When I click on the see Landmarks tab Then I am able to see the page to see other landmarks \ No newline at end of file diff --git a/webapp/e2e/steps/add-landmark.steps.ts b/webapp/e2e/steps/add-landmark.steps.ts index 2f45bfc..dd1302a 100644 --- a/webapp/e2e/steps/add-landmark.steps.ts +++ b/webapp/e2e/steps/add-landmark.steps.ts @@ -23,12 +23,21 @@ defineFeature(feature, test => { test('The user logs in the site', ({given,when,then}) => { - let email:string; - let username:string; - - given('A logged user', () => { + given("The user logs in", async () => { + await expect(page).toClick("button", {text:"Login"}); - }); + await page.waitForNavigation(); // wait for the login page to load + + await page.type('#username', "ArqSoftLoMapEn2b") + await page.type('#password', "#HappySW123") + + await page.click('#login') + + await page.waitForNavigation(); // wait for the redirect + // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) + await page.waitForTimeout(8000); + + }); when('I click on the addLandmark tab', async () => { await expect(page).toClick('Link', { text: 'Add a landmark' }) diff --git a/webapp/e2e/steps/find-friends.steps.ts b/webapp/e2e/steps/find-friends.steps.ts index 635f35d..dc04002 100644 --- a/webapp/e2e/steps/find-friends.steps.ts +++ b/webapp/e2e/steps/find-friends.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/profile.feature'); +const feature = loadFeature('../features/find-friends.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -22,13 +22,22 @@ defineFeature(feature, test => { }); test('The user is logged in the site', ({given,when,then}) => { - - let email:string; - let username:string; - given('A logged user', () => { + given("The user logs in", async () => { + await expect(page).toClick("button", {text:"Login"}); - }); + await page.waitForNavigation(); // wait for the login page to load + + await page.type('#username', "ArqSoftLoMapEn2b") + await page.type('#password', "#HappySW123") + + await page.click('#login') + + await page.waitForNavigation(); // wait for the redirect + // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) + await page.waitForTimeout(8000); + + }); when('He searches for garabato', async () => { await expect(page).toFill("input[className='searchInput']", "garabato"); @@ -43,13 +52,21 @@ defineFeature(feature, test => { test('The user is logged in the site', ({given,when,then}) => { - let email:string; - let username:string; - - given('A logged user', () => { + given("The user logs in", async () => { + await expect(page).toClick("button", {text:"Login"}); - }); + await page.waitForNavigation(); // wait for the login page to load + + await page.type('#username', "ArqSoftLoMapEn2b") + await page.type('#password', "#HappySW123") + await page.click('#login') + + await page.waitForNavigation(); // wait for the redirect + // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) + await page.waitForTimeout(8000); + + }); when('When He searches for asdfgh', async () => { await expect(page).toFill("input[className='searchInput']", "garabato"); await expect(page).toClick('button', { text: 'Search' }) diff --git a/webapp/e2e/steps/friends-list.steps.ts b/webapp/e2e/steps/friends-list.steps.ts index c0c2707..8690e45 100644 --- a/webapp/e2e/steps/friends-list.steps.ts +++ b/webapp/e2e/steps/friends-list.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/profile.feature'); +const feature = loadFeature('../features/friends-list.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -23,12 +23,21 @@ defineFeature(feature, test => { test('The user is logged in the site', ({given,when,then}) => { - let email:string; - let username:string; - - given('A logged user', () => { + given("The user logs in", async () => { + await expect(page).toClick("button", {text:"Login"}); - }); + await page.waitForNavigation(); // wait for the login page to load + + await page.type('#username', "ArqSoftLoMapEn2b") + await page.type('#password', "#HappySW123") + + await page.click('#login') + + await page.waitForNavigation(); // wait for the redirect + // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) + await page.waitForTimeout(8000); + + }); when('I click on the friends tab', async () => { await expect(page).toClick('Link', { text: 'Friends' }) diff --git a/webapp/e2e/steps/profile.steps.ts b/webapp/e2e/steps/profile.steps.ts index ca26ae6..4c13222 100644 --- a/webapp/e2e/steps/profile.steps.ts +++ b/webapp/e2e/steps/profile.steps.ts @@ -23,12 +23,21 @@ defineFeature(feature, test => { test('The user is logged in the site', ({given,when,then}) => { - let email:string; - let username:string; - - given('A logged user', () => { + given("The user logs in", async () => { + await expect(page).toClick("button", {text:"Login"}); - }); + await page.waitForNavigation(); // wait for the login page to load + + await page.type('#username', "ArqSoftLoMapEn2b") + await page.type('#password', "#HappySW123") + + await page.click('#login') + + await page.waitForNavigation(); // wait for the redirect + // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) + await page.waitForTimeout(8000); + + }); when('I click on the profile', async () => { await expect(page).toClick('Link', { text: 'Profile' }) diff --git a/webapp/e2e/steps/see-landmarks.steps.ts b/webapp/e2e/steps/see-landmarks.steps.ts index d37ccb9..0e1376f 100644 --- a/webapp/e2e/steps/see-landmarks.steps.ts +++ b/webapp/e2e/steps/see-landmarks.steps.ts @@ -22,13 +22,22 @@ defineFeature(feature, test => { }); test('The user logs in the site', ({given,when,then}) => { - - let email:string; - let username:string; - - given('A logged user', () => { + given("The user logs in", async () => { + console.log("The user logs in"); + await expect(page).toClick("button", {text:"Login"}); - }); + await page.waitForNavigation(); // wait for the login page to load + + await page.type('#username', "ArqSoftLoMapEn2b") + await page.type('#password', "#HappySW123") + + await page.click('#login') + + await page.waitForNavigation(); // wait for the redirect + // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) + await page.waitForTimeout(8000); + + }); when('I click on the see Landmarks tab', async () => { await expect(page).toClick('Link', { text: 'Add a landmark' }) @@ -40,7 +49,7 @@ defineFeature(feature, test => { }) afterAll(async ()=>{ - browser.close() + // browser.close() }) }); \ No newline at end of file diff --git a/webapp/package.json b/webapp/package.json index 825e139..bb5df62 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -35,7 +35,7 @@ "start": "react-scripts start", "build": "react-scripts build", "test": "react-scripts test --transformIgnorePatterns \"node_modules/(?!ol)/\" --coverage ./test", - "test:e2e": "start-server-and-test 'npm --prefix ../restapi start' http://localhost:5000/api/users/list prod 3000 'cd e2e && jest'", + "test:e2e": "start-server-and-test prod 3000 \"cd e2e && jest\"", "eject": "react-scripts eject", "prod": "ts-node-dev ./server.ts" }, diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index 7cb4897..b1043c2 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -7,6 +7,7 @@ import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import { getLocations } from "../addLandmark/solidLandmarkManagement"; import markerIcon from "leaflet/dist/images/marker-icon.png" import { Icon } from "leaflet"; +import {makeRequest} from "../../axios"; function Home(): JSX.Element { const {session} = useSession(); @@ -22,6 +23,11 @@ function Home(): JSX.Element { } useEffect( () => { + if (session.info.webId !== undefined && session.info.webId !== "") { + console.log(session.info.webId); + makeRequest.post("/users/",{solidURL: session.info.webId}); + } + async function doGetLandmarks() { await getLandmarks(); let array : JSX.Element[] = []; From 66da17e30631d40abb55a70235da3a4ecf00170f Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 30 Apr 2023 18:16:59 +0200 Subject: [PATCH 41/66] Added POD to glossary --- docs/12_glossary.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/12_glossary.adoc b/docs/12_glossary.adoc index 04797a9..22b3704 100644 --- a/docs/12_glossary.adoc +++ b/docs/12_glossary.adoc @@ -4,6 +4,7 @@ [options="header"] |=== | Term | Definition -| SOLID | SOLID is a web decentralization project where the users have control over their data. It is led by the inventor of the WWW, Tim Berners-Lee. SOLID guarantees that users decide what and with whom they should share their data. | N-Tier architecture | Client–server architecture in which different layers are separated allowing the development of flexible and reusable applications. +| SOLID | SOLID is a web decentralization project where the users have control over their data. It is led by the inventor of the WWW, Tim Berners-Lee. SOLID guarantees that users decide what and with whom they should share their data. +| POD | Secure personal web servers for data. When data is stored in someone's Pod, they control which people and applications can access it. |=== From 0596d4c78b08bb383107ad6bb5d6e63b32fa5a7c Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Sun, 30 Apr 2023 18:23:36 +0200 Subject: [PATCH 42/66] Little improvement in the description --- docs/01_introduction_and_goals.adoc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/01_introduction_and_goals.adoc b/docs/01_introduction_and_goals.adoc index 4fe0ad6..f123208 100644 --- a/docs/01_introduction_and_goals.adoc +++ b/docs/01_introduction_and_goals.adoc @@ -1,9 +1,10 @@ [[section-introduction-and-goals]] == Introduction and Goals -This project consists on developing an application that allows users to personalize a map of their city. +This project consists on developing an application that allows users to personalize a map of Brussels. In their map they can add the landmarks they want, like shops, sights or restaurants. In addition, users will be able to share their map information with the users they want while restricting other users from seeing it. +Ideally, this application should easily be implemented for using it in a different city, while it should be interoperable with similar applications. === Requirements Overview From 54be41329fb3f55ddfa60d54d3c0f8d325920194 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 1 May 2023 00:30:18 +0200 Subject: [PATCH 43/66] Adding description when creating Landmark --- webapp/src/pages/addLandmark/AddLandmark.tsx | 27 ++++++++++++-------- webapp/src/shared/shareddtypes.ts | 4 +-- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index dd8e927..121d726 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -3,14 +3,9 @@ import "./addLandmark.css"; import "../../map/stylesheets/addLandmark.css" import React, {useRef, useState} from "react"; import { - Button, - FormControl, - Grid, - Input, - InputLabel, - MenuItem, - Select, - Typography + Button, FormControl, + Grid, Input, InputLabel, + MenuItem, Select, Typography } from "@mui/material"; import L from "leaflet"; import {Landmark, LandmarkCategories} from "../../shared/shareddtypes"; @@ -51,18 +46,24 @@ export default function AddLandmark() { let category : string = option; let latitude : number = coords[0]; let longitude : number = coords[1]; + + let description : string | undefined = (document.getElementById("name") as HTMLInputElement).value; + if (description.trim() === "") { + return; + } let landmark : Landmark = { name : name, category : category, latitude : latitude, - longitude : longitude + longitude : longitude, + description : description } console.log(landmark); // Access to SOLID let webID = session.info.webId; - if (webID !== undefined) { + if (webID !== undefined) { await createLocation(webID, landmark); } }; @@ -108,7 +109,11 @@ export default function AddLandmark() { Longitude: - + + + Description + +
{isButtonEnabled ? diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts index ea9d47d..d6bdc4b 100644 --- a/webapp/src/shared/shareddtypes.ts +++ b/webapp/src/shared/shareddtypes.ts @@ -16,8 +16,8 @@ export class Landmark { scores?:Map; pictures?:string[]; url?:string; - constructor(title:string, category:string, latitude:number, longitude:number, description:string, reviews?:Array, scores?:Map, pictures?:string[], url?:string){ - this.name = title; + constructor(name:string, category:string, latitude:number, longitude:number, description:string, reviews?:Array, scores?:Map, pictures?:string[], url?:string){ + this.name = name; this.category = category; this.latitude = latitude; this.longitude = longitude; From e7e41cc254a26e64c7e55a447878ab75d431ac3e Mon Sep 17 00:00:00 2001 From: plg22 Date: Mon, 1 May 2023 10:47:26 +0200 Subject: [PATCH 44/66] Results of the load tests --- .../{ => 10users}/10usersAtOnce.html | 0 webapp/loadTests/10users/js/all_sessions.js | 11 + webapp/loadTests/10users/js/assertions.json | 10 + webapp/loadTests/10users/js/assertions.xml | 3 + webapp/loadTests/10users/js/bootstrap.min.js | 7 + webapp/loadTests/10users/js/ellipsis.js | 26 + webapp/loadTests/10users/js/gatling.js | 137 + webapp/loadTests/10users/js/global_stats.json | 77 + .../loadTests/10users/js/highcharts-more.js | 60 + webapp/loadTests/10users/js/highstock.js | 496 ++ .../loadTests/10users/js/jquery-3.5.1.min.js | 2 + webapp/loadTests/10users/js/menu.js | 83 + webapp/loadTests/10users/js/stats.js | 4065 ++++++++++++++++ webapp/loadTests/10users/js/stats.json | 4023 ++++++++++++++++ webapp/loadTests/10users/js/theme.js | 127 + webapp/loadTests/10users/js/unpack.js | 38 + webapp/loadTests/10users/style/arrow_down.png | Bin 0 -> 983 bytes .../10users/style/arrow_down_black.png | Bin 0 -> 218 bytes .../loadTests/10users/style/arrow_right.png | Bin 0 -> 146 bytes .../10users/style/arrow_right_black.png | Bin 0 -> 225 bytes .../loadTests/10users/style/bootstrap.min.css | 27 + webapp/loadTests/10users/style/favicon.ico | Bin 0 -> 15086 bytes .../10users/style/little_arrow_right.png | Bin 0 -> 212 bytes .../10users/style/logo-enterprise.svg | 15 + webapp/loadTests/10users/style/logo.svg | 6 + webapp/loadTests/10users/style/sortable.png | Bin 0 -> 230 bytes .../loadTests/10users/style/sorted-down.png | Bin 0 -> 204 bytes webapp/loadTests/10users/style/sorted-up.png | Bin 0 -> 200 bytes .../10users/style/stat-fleche-bas.png | Bin 0 -> 625 bytes .../loadTests/10users/style/stat-l-roue.png | Bin 0 -> 471 bytes .../loadTests/10users/style/stat-l-temps.png | Bin 0 -> 470 bytes webapp/loadTests/10users/style/style.css | 988 ++++ .../{ => 150users1minute}/150UsersIn1Min.html | 0 .../150users1minute/js/all_sessions.js | 11 + .../150users1minute/js/assertions.json | 10 + .../150users1minute/js/assertions.xml | 3 + .../150users1minute/js/bootstrap.min.js | 7 + .../loadTests/150users1minute/js/ellipsis.js | 26 + .../loadTests/150users1minute/js/gatling.js | 137 + .../150users1minute/js/global_stats.json | 77 + .../150users1minute/js/highcharts-more.js | 60 + .../loadTests/150users1minute/js/highstock.js | 496 ++ .../150users1minute/js/jquery-3.5.1.min.js | 2 + webapp/loadTests/150users1minute/js/menu.js | 83 + webapp/loadTests/150users1minute/js/stats.js | 4065 ++++++++++++++++ .../loadTests/150users1minute/js/stats.json | 4023 ++++++++++++++++ webapp/loadTests/150users1minute/js/theme.js | 127 + webapp/loadTests/150users1minute/js/unpack.js | 38 + .../150users1minute/style/arrow_down.png | Bin 0 -> 983 bytes .../style/arrow_down_black.png | Bin 0 -> 218 bytes .../150users1minute/style/arrow_right.png | Bin 0 -> 146 bytes .../style/arrow_right_black.png | Bin 0 -> 225 bytes .../150users1minute/style/bootstrap.min.css | 27 + .../150users1minute/style/favicon.ico | Bin 0 -> 15086 bytes .../style/little_arrow_right.png | Bin 0 -> 212 bytes .../150users1minute/style/logo-enterprise.svg | 15 + .../loadTests/150users1minute/style/logo.svg | 6 + .../150users1minute/style/sortable.png | Bin 0 -> 230 bytes .../150users1minute/style/sorted-down.png | Bin 0 -> 204 bytes .../150users1minute/style/sorted-up.png | Bin 0 -> 200 bytes .../150users1minute/style/stat-fleche-bas.png | Bin 0 -> 625 bytes .../150users1minute/style/stat-l-roue.png | Bin 0 -> 471 bytes .../150users1minute/style/stat-l-temps.png | Bin 0 -> 470 bytes .../loadTests/150users1minute/style/style.css | 988 ++++ webapp/loadTests/{ => 1user}/1user.html | 0 webapp/loadTests/1user/js/all_sessions.js | 11 + webapp/loadTests/1user/js/assertions.json | 10 + webapp/loadTests/1user/js/assertions.xml | 3 + webapp/loadTests/1user/js/bootstrap.min.js | 7 + webapp/loadTests/1user/js/ellipsis.js | 26 + webapp/loadTests/1user/js/gatling.js | 137 + webapp/loadTests/1user/js/global_stats.json | 77 + webapp/loadTests/1user/js/highcharts-more.js | 60 + webapp/loadTests/1user/js/highstock.js | 496 ++ webapp/loadTests/1user/js/jquery-3.5.1.min.js | 2 + webapp/loadTests/1user/js/menu.js | 83 + webapp/loadTests/1user/js/stats.js | 3819 +++++++++++++++ webapp/loadTests/1user/js/stats.json | 3777 +++++++++++++++ webapp/loadTests/1user/js/theme.js | 127 + webapp/loadTests/1user/js/unpack.js | 38 + webapp/loadTests/1user/style/arrow_down.png | Bin 0 -> 983 bytes .../1user/style/arrow_down_black.png | Bin 0 -> 218 bytes webapp/loadTests/1user/style/arrow_right.png | Bin 0 -> 146 bytes .../1user/style/arrow_right_black.png | Bin 0 -> 225 bytes .../loadTests/1user/style/bootstrap.min.css | 27 + webapp/loadTests/1user/style/favicon.ico | Bin 0 -> 15086 bytes .../1user/style/little_arrow_right.png | Bin 0 -> 212 bytes .../loadTests/1user/style/logo-enterprise.svg | 15 + webapp/loadTests/1user/style/logo.svg | 6 + webapp/loadTests/1user/style/sortable.png | Bin 0 -> 230 bytes webapp/loadTests/1user/style/sorted-down.png | Bin 0 -> 204 bytes webapp/loadTests/1user/style/sorted-up.png | Bin 0 -> 200 bytes .../loadTests/1user/style/stat-fleche-bas.png | Bin 0 -> 625 bytes webapp/loadTests/1user/style/stat-l-roue.png | Bin 0 -> 471 bytes webapp/loadTests/1user/style/stat-l-temps.png | Bin 0 -> 470 bytes webapp/loadTests/1user/style/style.css | 988 ++++ .../{ => 250users1minute}/250UsersIn1Min.html | 0 .../250users1minute/js/all_sessions.js | 11 + .../250users1minute/js/assertions.json | 10 + .../250users1minute/js/assertions.xml | 3 + .../250users1minute/js/bootstrap.min.js | 7 + .../loadTests/250users1minute/js/ellipsis.js | 26 + .../loadTests/250users1minute/js/gatling.js | 137 + .../250users1minute/js/global_stats.json | 77 + .../250users1minute/js/highcharts-more.js | 60 + .../loadTests/250users1minute/js/highstock.js | 496 ++ .../250users1minute/js/jquery-3.5.1.min.js | 2 + webapp/loadTests/250users1minute/js/menu.js | 83 + webapp/loadTests/250users1minute/js/stats.js | 4065 ++++++++++++++++ .../loadTests/250users1minute/js/stats.json | 4023 ++++++++++++++++ webapp/loadTests/250users1minute/js/theme.js | 127 + webapp/loadTests/250users1minute/js/unpack.js | 38 + .../250users1minute/style/arrow_down.png | Bin 0 -> 983 bytes .../style/arrow_down_black.png | Bin 0 -> 218 bytes .../250users1minute/style/arrow_right.png | Bin 0 -> 146 bytes .../style/arrow_right_black.png | Bin 0 -> 225 bytes .../250users1minute/style/bootstrap.min.css | 27 + .../250users1minute/style/favicon.ico | Bin 0 -> 15086 bytes .../style/little_arrow_right.png | Bin 0 -> 212 bytes .../250users1minute/style/logo-enterprise.svg | 15 + .../loadTests/250users1minute/style/logo.svg | 6 + .../250users1minute/style/sortable.png | Bin 0 -> 230 bytes .../250users1minute/style/sorted-down.png | Bin 0 -> 204 bytes .../250users1minute/style/sorted-up.png | Bin 0 -> 200 bytes .../250users1minute/style/stat-fleche-bas.png | Bin 0 -> 625 bytes .../250users1minute/style/stat-l-roue.png | Bin 0 -> 471 bytes .../250users1minute/style/stat-l-temps.png | Bin 0 -> 470 bytes .../loadTests/250users1minute/style/style.css | 988 ++++ .../{ => 25users}/25usersAtOnce.html | 0 webapp/loadTests/25users/js/all_sessions.js | 11 + webapp/loadTests/25users/js/assertions.json | 10 + webapp/loadTests/25users/js/assertions.xml | 3 + webapp/loadTests/25users/js/bootstrap.min.js | 7 + webapp/loadTests/25users/js/ellipsis.js | 26 + webapp/loadTests/25users/js/gatling.js | 137 + webapp/loadTests/25users/js/global_stats.json | 77 + .../loadTests/25users/js/highcharts-more.js | 60 + webapp/loadTests/25users/js/highstock.js | 496 ++ .../loadTests/25users/js/jquery-3.5.1.min.js | 2 + webapp/loadTests/25users/js/menu.js | 83 + webapp/loadTests/25users/js/stats.js | 4147 +++++++++++++++++ webapp/loadTests/25users/js/stats.json | 4105 ++++++++++++++++ webapp/loadTests/25users/js/theme.js | 127 + webapp/loadTests/25users/js/unpack.js | 38 + webapp/loadTests/25users/style/arrow_down.png | Bin 0 -> 983 bytes .../25users/style/arrow_down_black.png | Bin 0 -> 218 bytes .../loadTests/25users/style/arrow_right.png | Bin 0 -> 146 bytes .../25users/style/arrow_right_black.png | Bin 0 -> 225 bytes .../loadTests/25users/style/bootstrap.min.css | 27 + webapp/loadTests/25users/style/favicon.ico | Bin 0 -> 15086 bytes .../25users/style/little_arrow_right.png | Bin 0 -> 212 bytes .../25users/style/logo-enterprise.svg | 15 + webapp/loadTests/25users/style/logo.svg | 6 + webapp/loadTests/25users/style/sortable.png | Bin 0 -> 230 bytes .../loadTests/25users/style/sorted-down.png | Bin 0 -> 204 bytes webapp/loadTests/25users/style/sorted-up.png | Bin 0 -> 200 bytes .../25users/style/stat-fleche-bas.png | Bin 0 -> 625 bytes .../loadTests/25users/style/stat-l-roue.png | Bin 0 -> 471 bytes .../loadTests/25users/style/stat-l-temps.png | Bin 0 -> 470 bytes webapp/loadTests/25users/style/style.css | 988 ++++ .../{ => 50users1minute}/50UsersIn1Min.html | 0 .../50users1minute/js/all_sessions.js | 11 + .../50users1minute/js/assertions.json | 10 + .../50users1minute/js/assertions.xml | 3 + .../50users1minute/js/bootstrap.min.js | 7 + .../loadTests/50users1minute/js/ellipsis.js | 26 + webapp/loadTests/50users1minute/js/gatling.js | 137 + .../50users1minute/js/global_stats.json | 77 + .../50users1minute/js/highcharts-more.js | 60 + .../loadTests/50users1minute/js/highstock.js | 496 ++ .../50users1minute/js/jquery-3.5.1.min.js | 2 + webapp/loadTests/50users1minute/js/menu.js | 83 + webapp/loadTests/50users1minute/js/stats.js | 4065 ++++++++++++++++ webapp/loadTests/50users1minute/js/stats.json | 4023 ++++++++++++++++ webapp/loadTests/50users1minute/js/theme.js | 127 + webapp/loadTests/50users1minute/js/unpack.js | 38 + .../50users1minute/style/arrow_down.png | Bin 0 -> 983 bytes .../50users1minute/style/arrow_down_black.png | Bin 0 -> 218 bytes .../50users1minute/style/arrow_right.png | Bin 0 -> 146 bytes .../style/arrow_right_black.png | Bin 0 -> 225 bytes .../50users1minute/style/bootstrap.min.css | 27 + .../50users1minute/style/favicon.ico | Bin 0 -> 15086 bytes .../style/little_arrow_right.png | Bin 0 -> 212 bytes .../50users1minute/style/logo-enterprise.svg | 15 + .../loadTests/50users1minute/style/logo.svg | 6 + .../50users1minute/style/sortable.png | Bin 0 -> 230 bytes .../50users1minute/style/sorted-down.png | Bin 0 -> 204 bytes .../50users1minute/style/sorted-up.png | Bin 0 -> 200 bytes .../50users1minute/style/stat-fleche-bas.png | Bin 0 -> 625 bytes .../50users1minute/style/stat-l-roue.png | Bin 0 -> 471 bytes .../50users1minute/style/stat-l-temps.png | Bin 0 -> 470 bytes .../loadTests/50users1minute/style/style.css | 988 ++++ webapp/loadTests/Commentary.txt | 36 + webapp/loadtestexample/GetUsersList.scala | 79 - .../getuserslist/0004_request.txt | 1 - 195 files changed, 60914 insertions(+), 80 deletions(-) rename webapp/loadTests/{ => 10users}/10usersAtOnce.html (100%) create mode 100644 webapp/loadTests/10users/js/all_sessions.js create mode 100644 webapp/loadTests/10users/js/assertions.json create mode 100644 webapp/loadTests/10users/js/assertions.xml create mode 100644 webapp/loadTests/10users/js/bootstrap.min.js create mode 100644 webapp/loadTests/10users/js/ellipsis.js create mode 100644 webapp/loadTests/10users/js/gatling.js create mode 100644 webapp/loadTests/10users/js/global_stats.json create mode 100644 webapp/loadTests/10users/js/highcharts-more.js create mode 100644 webapp/loadTests/10users/js/highstock.js create mode 100644 webapp/loadTests/10users/js/jquery-3.5.1.min.js create mode 100644 webapp/loadTests/10users/js/menu.js create mode 100644 webapp/loadTests/10users/js/stats.js create mode 100644 webapp/loadTests/10users/js/stats.json create mode 100644 webapp/loadTests/10users/js/theme.js create mode 100644 webapp/loadTests/10users/js/unpack.js create mode 100644 webapp/loadTests/10users/style/arrow_down.png create mode 100644 webapp/loadTests/10users/style/arrow_down_black.png create mode 100644 webapp/loadTests/10users/style/arrow_right.png create mode 100644 webapp/loadTests/10users/style/arrow_right_black.png create mode 100644 webapp/loadTests/10users/style/bootstrap.min.css create mode 100644 webapp/loadTests/10users/style/favicon.ico create mode 100644 webapp/loadTests/10users/style/little_arrow_right.png create mode 100644 webapp/loadTests/10users/style/logo-enterprise.svg create mode 100644 webapp/loadTests/10users/style/logo.svg create mode 100644 webapp/loadTests/10users/style/sortable.png create mode 100644 webapp/loadTests/10users/style/sorted-down.png create mode 100644 webapp/loadTests/10users/style/sorted-up.png create mode 100644 webapp/loadTests/10users/style/stat-fleche-bas.png create mode 100644 webapp/loadTests/10users/style/stat-l-roue.png create mode 100644 webapp/loadTests/10users/style/stat-l-temps.png create mode 100644 webapp/loadTests/10users/style/style.css rename webapp/loadTests/{ => 150users1minute}/150UsersIn1Min.html (100%) create mode 100644 webapp/loadTests/150users1minute/js/all_sessions.js create mode 100644 webapp/loadTests/150users1minute/js/assertions.json create mode 100644 webapp/loadTests/150users1minute/js/assertions.xml create mode 100644 webapp/loadTests/150users1minute/js/bootstrap.min.js create mode 100644 webapp/loadTests/150users1minute/js/ellipsis.js create mode 100644 webapp/loadTests/150users1minute/js/gatling.js create mode 100644 webapp/loadTests/150users1minute/js/global_stats.json create mode 100644 webapp/loadTests/150users1minute/js/highcharts-more.js create mode 100644 webapp/loadTests/150users1minute/js/highstock.js create mode 100644 webapp/loadTests/150users1minute/js/jquery-3.5.1.min.js create mode 100644 webapp/loadTests/150users1minute/js/menu.js create mode 100644 webapp/loadTests/150users1minute/js/stats.js create mode 100644 webapp/loadTests/150users1minute/js/stats.json create mode 100644 webapp/loadTests/150users1minute/js/theme.js create mode 100644 webapp/loadTests/150users1minute/js/unpack.js create mode 100644 webapp/loadTests/150users1minute/style/arrow_down.png create mode 100644 webapp/loadTests/150users1minute/style/arrow_down_black.png create mode 100644 webapp/loadTests/150users1minute/style/arrow_right.png create mode 100644 webapp/loadTests/150users1minute/style/arrow_right_black.png create mode 100644 webapp/loadTests/150users1minute/style/bootstrap.min.css create mode 100644 webapp/loadTests/150users1minute/style/favicon.ico create mode 100644 webapp/loadTests/150users1minute/style/little_arrow_right.png create mode 100644 webapp/loadTests/150users1minute/style/logo-enterprise.svg create mode 100644 webapp/loadTests/150users1minute/style/logo.svg create mode 100644 webapp/loadTests/150users1minute/style/sortable.png create mode 100644 webapp/loadTests/150users1minute/style/sorted-down.png create mode 100644 webapp/loadTests/150users1minute/style/sorted-up.png create mode 100644 webapp/loadTests/150users1minute/style/stat-fleche-bas.png create mode 100644 webapp/loadTests/150users1minute/style/stat-l-roue.png create mode 100644 webapp/loadTests/150users1minute/style/stat-l-temps.png create mode 100644 webapp/loadTests/150users1minute/style/style.css rename webapp/loadTests/{ => 1user}/1user.html (100%) create mode 100644 webapp/loadTests/1user/js/all_sessions.js create mode 100644 webapp/loadTests/1user/js/assertions.json create mode 100644 webapp/loadTests/1user/js/assertions.xml create mode 100644 webapp/loadTests/1user/js/bootstrap.min.js create mode 100644 webapp/loadTests/1user/js/ellipsis.js create mode 100644 webapp/loadTests/1user/js/gatling.js create mode 100644 webapp/loadTests/1user/js/global_stats.json create mode 100644 webapp/loadTests/1user/js/highcharts-more.js create mode 100644 webapp/loadTests/1user/js/highstock.js create mode 100644 webapp/loadTests/1user/js/jquery-3.5.1.min.js create mode 100644 webapp/loadTests/1user/js/menu.js create mode 100644 webapp/loadTests/1user/js/stats.js create mode 100644 webapp/loadTests/1user/js/stats.json create mode 100644 webapp/loadTests/1user/js/theme.js create mode 100644 webapp/loadTests/1user/js/unpack.js create mode 100644 webapp/loadTests/1user/style/arrow_down.png create mode 100644 webapp/loadTests/1user/style/arrow_down_black.png create mode 100644 webapp/loadTests/1user/style/arrow_right.png create mode 100644 webapp/loadTests/1user/style/arrow_right_black.png create mode 100644 webapp/loadTests/1user/style/bootstrap.min.css create mode 100644 webapp/loadTests/1user/style/favicon.ico create mode 100644 webapp/loadTests/1user/style/little_arrow_right.png create mode 100644 webapp/loadTests/1user/style/logo-enterprise.svg create mode 100644 webapp/loadTests/1user/style/logo.svg create mode 100644 webapp/loadTests/1user/style/sortable.png create mode 100644 webapp/loadTests/1user/style/sorted-down.png create mode 100644 webapp/loadTests/1user/style/sorted-up.png create mode 100644 webapp/loadTests/1user/style/stat-fleche-bas.png create mode 100644 webapp/loadTests/1user/style/stat-l-roue.png create mode 100644 webapp/loadTests/1user/style/stat-l-temps.png create mode 100644 webapp/loadTests/1user/style/style.css rename webapp/loadTests/{ => 250users1minute}/250UsersIn1Min.html (100%) create mode 100644 webapp/loadTests/250users1minute/js/all_sessions.js create mode 100644 webapp/loadTests/250users1minute/js/assertions.json create mode 100644 webapp/loadTests/250users1minute/js/assertions.xml create mode 100644 webapp/loadTests/250users1minute/js/bootstrap.min.js create mode 100644 webapp/loadTests/250users1minute/js/ellipsis.js create mode 100644 webapp/loadTests/250users1minute/js/gatling.js create mode 100644 webapp/loadTests/250users1minute/js/global_stats.json create mode 100644 webapp/loadTests/250users1minute/js/highcharts-more.js create mode 100644 webapp/loadTests/250users1minute/js/highstock.js create mode 100644 webapp/loadTests/250users1minute/js/jquery-3.5.1.min.js create mode 100644 webapp/loadTests/250users1minute/js/menu.js create mode 100644 webapp/loadTests/250users1minute/js/stats.js create mode 100644 webapp/loadTests/250users1minute/js/stats.json create mode 100644 webapp/loadTests/250users1minute/js/theme.js create mode 100644 webapp/loadTests/250users1minute/js/unpack.js create mode 100644 webapp/loadTests/250users1minute/style/arrow_down.png create mode 100644 webapp/loadTests/250users1minute/style/arrow_down_black.png create mode 100644 webapp/loadTests/250users1minute/style/arrow_right.png create mode 100644 webapp/loadTests/250users1minute/style/arrow_right_black.png create mode 100644 webapp/loadTests/250users1minute/style/bootstrap.min.css create mode 100644 webapp/loadTests/250users1minute/style/favicon.ico create mode 100644 webapp/loadTests/250users1minute/style/little_arrow_right.png create mode 100644 webapp/loadTests/250users1minute/style/logo-enterprise.svg create mode 100644 webapp/loadTests/250users1minute/style/logo.svg create mode 100644 webapp/loadTests/250users1minute/style/sortable.png create mode 100644 webapp/loadTests/250users1minute/style/sorted-down.png create mode 100644 webapp/loadTests/250users1minute/style/sorted-up.png create mode 100644 webapp/loadTests/250users1minute/style/stat-fleche-bas.png create mode 100644 webapp/loadTests/250users1minute/style/stat-l-roue.png create mode 100644 webapp/loadTests/250users1minute/style/stat-l-temps.png create mode 100644 webapp/loadTests/250users1minute/style/style.css rename webapp/loadTests/{ => 25users}/25usersAtOnce.html (100%) create mode 100644 webapp/loadTests/25users/js/all_sessions.js create mode 100644 webapp/loadTests/25users/js/assertions.json create mode 100644 webapp/loadTests/25users/js/assertions.xml create mode 100644 webapp/loadTests/25users/js/bootstrap.min.js create mode 100644 webapp/loadTests/25users/js/ellipsis.js create mode 100644 webapp/loadTests/25users/js/gatling.js create mode 100644 webapp/loadTests/25users/js/global_stats.json create mode 100644 webapp/loadTests/25users/js/highcharts-more.js create mode 100644 webapp/loadTests/25users/js/highstock.js create mode 100644 webapp/loadTests/25users/js/jquery-3.5.1.min.js create mode 100644 webapp/loadTests/25users/js/menu.js create mode 100644 webapp/loadTests/25users/js/stats.js create mode 100644 webapp/loadTests/25users/js/stats.json create mode 100644 webapp/loadTests/25users/js/theme.js create mode 100644 webapp/loadTests/25users/js/unpack.js create mode 100644 webapp/loadTests/25users/style/arrow_down.png create mode 100644 webapp/loadTests/25users/style/arrow_down_black.png create mode 100644 webapp/loadTests/25users/style/arrow_right.png create mode 100644 webapp/loadTests/25users/style/arrow_right_black.png create mode 100644 webapp/loadTests/25users/style/bootstrap.min.css create mode 100644 webapp/loadTests/25users/style/favicon.ico create mode 100644 webapp/loadTests/25users/style/little_arrow_right.png create mode 100644 webapp/loadTests/25users/style/logo-enterprise.svg create mode 100644 webapp/loadTests/25users/style/logo.svg create mode 100644 webapp/loadTests/25users/style/sortable.png create mode 100644 webapp/loadTests/25users/style/sorted-down.png create mode 100644 webapp/loadTests/25users/style/sorted-up.png create mode 100644 webapp/loadTests/25users/style/stat-fleche-bas.png create mode 100644 webapp/loadTests/25users/style/stat-l-roue.png create mode 100644 webapp/loadTests/25users/style/stat-l-temps.png create mode 100644 webapp/loadTests/25users/style/style.css rename webapp/loadTests/{ => 50users1minute}/50UsersIn1Min.html (100%) create mode 100644 webapp/loadTests/50users1minute/js/all_sessions.js create mode 100644 webapp/loadTests/50users1minute/js/assertions.json create mode 100644 webapp/loadTests/50users1minute/js/assertions.xml create mode 100644 webapp/loadTests/50users1minute/js/bootstrap.min.js create mode 100644 webapp/loadTests/50users1minute/js/ellipsis.js create mode 100644 webapp/loadTests/50users1minute/js/gatling.js create mode 100644 webapp/loadTests/50users1minute/js/global_stats.json create mode 100644 webapp/loadTests/50users1minute/js/highcharts-more.js create mode 100644 webapp/loadTests/50users1minute/js/highstock.js create mode 100644 webapp/loadTests/50users1minute/js/jquery-3.5.1.min.js create mode 100644 webapp/loadTests/50users1minute/js/menu.js create mode 100644 webapp/loadTests/50users1minute/js/stats.js create mode 100644 webapp/loadTests/50users1minute/js/stats.json create mode 100644 webapp/loadTests/50users1minute/js/theme.js create mode 100644 webapp/loadTests/50users1minute/js/unpack.js create mode 100644 webapp/loadTests/50users1minute/style/arrow_down.png create mode 100644 webapp/loadTests/50users1minute/style/arrow_down_black.png create mode 100644 webapp/loadTests/50users1minute/style/arrow_right.png create mode 100644 webapp/loadTests/50users1minute/style/arrow_right_black.png create mode 100644 webapp/loadTests/50users1minute/style/bootstrap.min.css create mode 100644 webapp/loadTests/50users1minute/style/favicon.ico create mode 100644 webapp/loadTests/50users1minute/style/little_arrow_right.png create mode 100644 webapp/loadTests/50users1minute/style/logo-enterprise.svg create mode 100644 webapp/loadTests/50users1minute/style/logo.svg create mode 100644 webapp/loadTests/50users1minute/style/sortable.png create mode 100644 webapp/loadTests/50users1minute/style/sorted-down.png create mode 100644 webapp/loadTests/50users1minute/style/sorted-up.png create mode 100644 webapp/loadTests/50users1minute/style/stat-fleche-bas.png create mode 100644 webapp/loadTests/50users1minute/style/stat-l-roue.png create mode 100644 webapp/loadTests/50users1minute/style/stat-l-temps.png create mode 100644 webapp/loadTests/50users1minute/style/style.css create mode 100644 webapp/loadTests/Commentary.txt delete mode 100644 webapp/loadtestexample/GetUsersList.scala delete mode 100644 webapp/loadtestexample/getuserslist/0004_request.txt diff --git a/webapp/loadTests/10usersAtOnce.html b/webapp/loadTests/10users/10usersAtOnce.html similarity index 100% rename from webapp/loadTests/10usersAtOnce.html rename to webapp/loadTests/10users/10usersAtOnce.html diff --git a/webapp/loadTests/10users/js/all_sessions.js b/webapp/loadTests/10users/js/all_sessions.js new file mode 100644 index 0000000..73b19fc --- /dev/null +++ b/webapp/loadTests/10users/js/all_sessions.js @@ -0,0 +1,11 @@ +allUsersData = { + +color: '#FFA900', +name: 'Active Users', +data: [ + [1682849459000,10],[1682849460000,10],[1682849461000,10],[1682849462000,10],[1682849463000,10],[1682849464000,10],[1682849465000,10],[1682849466000,10],[1682849467000,10],[1682849468000,10],[1682849469000,10],[1682849470000,10],[1682849471000,10],[1682849472000,10],[1682849473000,10],[1682849474000,10],[1682849475000,10],[1682849476000,10],[1682849477000,10],[1682849478000,10],[1682849479000,10],[1682849480000,10],[1682849481000,10],[1682849482000,10],[1682849483000,10],[1682849484000,10],[1682849485000,10],[1682849486000,10],[1682849487000,10],[1682849488000,10],[1682849489000,10],[1682849490000,10],[1682849491000,10],[1682849492000,10],[1682849493000,10],[1682849494000,10],[1682849495000,10] +], +tooltip: { yDecimals: 0, ySuffix: '', valueDecimals: 0 } + , zIndex: 20 + , yAxis: 1 +}; \ No newline at end of file diff --git a/webapp/loadTests/10users/js/assertions.json b/webapp/loadTests/10users/js/assertions.json new file mode 100644 index 0000000..bc2c707 --- /dev/null +++ b/webapp/loadTests/10users/js/assertions.json @@ -0,0 +1,10 @@ +{ + "simulation": "RecordedSimulation", + "simulationId": "recordedsimulation-20230430101057734", + "start": 1682849458833, + "description": "", + "scenarios": ["RecordedSimulation"], + "assertions": [ + + ] +} \ No newline at end of file diff --git a/webapp/loadTests/10users/js/assertions.xml b/webapp/loadTests/10users/js/assertions.xml new file mode 100644 index 0000000..5e4dbe9 --- /dev/null +++ b/webapp/loadTests/10users/js/assertions.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/webapp/loadTests/10users/js/bootstrap.min.js b/webapp/loadTests/10users/js/bootstrap.min.js new file mode 100644 index 0000000..ea41042 --- /dev/null +++ b/webapp/loadTests/10users/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-tooltip.js, bootstrap-popover.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

'})}(window.jQuery) \ No newline at end of file diff --git a/webapp/loadTests/10users/js/ellipsis.js b/webapp/loadTests/10users/js/ellipsis.js new file mode 100644 index 0000000..781d0de --- /dev/null +++ b/webapp/loadTests/10users/js/ellipsis.js @@ -0,0 +1,26 @@ +function parentId(name) { + return "parent-" + name; +} + +function isEllipsed(name) { + const child = document.getElementById(name); + const parent = document.getElementById(parentId(name)); + const emptyData = parent.getAttribute("data-content") === ""; + const hasOverflow = child.clientWidth < child.scrollWidth; + + if (hasOverflow) { + if (emptyData) { + parent.setAttribute("data-content", name); + } + } else { + if (!emptyData) { + parent.setAttribute("data-content", ""); + } + } +} + +function ellipsedLabel ({ name, parentClass = "", childClass = "" }) { + const child = "" + name + ""; + + return "" + child + ""; +} diff --git a/webapp/loadTests/10users/js/gatling.js b/webapp/loadTests/10users/js/gatling.js new file mode 100644 index 0000000..0208f82 --- /dev/null +++ b/webapp/loadTests/10users/js/gatling.js @@ -0,0 +1,137 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function ($) { + $.fn.expandable = function () { + var scope = this; + + this.find('.expand-button:not([class*=hidden])').addClass('collapse').on('click', function () { + var $this = $(this); + + if ($this.hasClass('expand')) + $this.expand(scope); + else + $this.collapse(scope); + }); + + this.find('.expand-all-button').on('click', function () { + $(this).expandAll(scope); + }); + + this.find('.collapse-all-button').on('click', function () { + $(this).collapseAll(scope); + }); + + this.collapseAll(this); + + return this; + }; + + $.fn.expand = function (scope, recursive) { + return this.each(function () { + var $this = $(this); + + if (recursive) { + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + } + + if ($this.hasClass('expand')) { + $('*[data-parent=' + $this.attr('id') + ']').toggle(true); + $this.toggleClass('expand').toggleClass('collapse'); + } + }); + }; + + $.fn.expandAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.expand').expand(scope, true); + $('*[data-parent=ROOT]').find('.expand-button.collapse').expand(scope, true); + }; + + $.fn.collapse = function (scope) { + return this.each(function () { + var $this = $(this); + + scope.find('*[data-parent=' + $this.attr('id') + '] .expand-button.collapse').collapse(scope); + scope.find('*[data-parent=' + $this.attr('id') + ']').toggle(false); + $this.toggleClass('expand').toggleClass('collapse'); + }); + }; + + $.fn.collapseAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.collapse').collapse(scope); + }; + + $.fn.sortable = function (target) { + var table = this; + + this.find('thead .sortable').on('click', function () { + var $this = $(this); + + if ($this.hasClass('sorted-down')) { + var desc = false; + var style = 'sorted-up'; + } + else { + var desc = true; + var style = 'sorted-down'; + } + + $(target).sortTable($this.attr('id'), desc); + + table.find('thead .sortable').removeClass('sorted-up sorted-down'); + $this.addClass(style); + + return false; + }); + + return this; + }; + + $.fn.sortTable = function (col, desc) { + function getValue(line) { + var cell = $(line).find('.' + col); + + if (cell.hasClass('value')) + var value = cell.text(); + else + var value = cell.find('.value').text(); + + return parseFloat(value); + } + + function sortLines (lines, group) { + var notErrorTable = col.search("error") == -1; + var linesToSort = notErrorTable ? lines.filter('*[data-parent=' + group + ']') : lines; + + var sortedLines = linesToSort.sort(function (a, b) { + return desc ? getValue(b) - getValue(a): getValue(a) - getValue(b); + }).toArray(); + + var result = []; + $.each(sortedLines, function (i, line) { + result.push(line); + if (notErrorTable) + result = result.concat(sortLines(lines, $(line).attr('id'))); + }); + + return result; + } + + this.find('tbody').append(sortLines(this.find('tbody tr').detach(), 'ROOT')); + + return this; + }; +})(jQuery); diff --git a/webapp/loadTests/10users/js/global_stats.json b/webapp/loadTests/10users/js/global_stats.json new file mode 100644 index 0000000..f0fdd16 --- /dev/null +++ b/webapp/loadTests/10users/js/global_stats.json @@ -0,0 +1,77 @@ +{ + "name": "All Requests", + "numberOfRequests": { + "total": 461, + "ok": 395, + "ko": 66 + }, + "minResponseTime": { + "total": 8, + "ok": 8, + "ko": 538 + }, + "maxResponseTime": { + "total": 3234, + "ok": 3234, + "ko": 2798 + }, + "meanResponseTime": { + "total": 613, + "ok": 463, + "ko": 1506 + }, + "standardDeviation": { + "total": 814, + "ok": 681, + "ko": 965 + }, + "percentiles1": { + "total": 200, + "ok": 138, + "ko": 955 + }, + "percentiles2": { + "total": 806, + "ok": 583, + "ko": 2606 + }, + "percentiles3": { + "total": 2622, + "ok": 2373, + "ko": 2785 + }, + "percentiles4": { + "total": 2836, + "ok": 2894, + "ko": 2793 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 317, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
t < 1200 ms", + "count": 40, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 38, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 66, + "percentage": 14 +}, + "meanNumberOfRequestsPerSecond": { + "total": 12.45945945945946, + "ok": 10.675675675675675, + "ko": 1.7837837837837838 + } +} \ No newline at end of file diff --git a/webapp/loadTests/10users/js/highcharts-more.js b/webapp/loadTests/10users/js/highcharts-more.js new file mode 100644 index 0000000..2d78893 --- /dev/null +++ b/webapp/loadTests/10users/js/highcharts-more.js @@ -0,0 +1,60 @@ +/* + Highcharts JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(x){"object"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(b){function r(b,a,d){this.init(b,a,d)}var t=b.each,w=b.extend,m=b.merge,q=b.splat;w(r.prototype,{init:function(b,a,d){var f=this,h=f.defaultOptions;f.chart=a;f.options=b=m(h,a.angular?{background:{}}:void 0,b);(b=b.background)&&t([].concat(q(b)).reverse(),function(a){var c,h=d.userOptions;c=m(f.defaultBackgroundOptions,a);a.backgroundColor&&(c.backgroundColor=a.backgroundColor);c.color=c.backgroundColor; +d.options.plotBands.unshift(c);h.plotBands=h.plotBands||[];h.plotBands!==d.options.plotBands&&h.plotBands.unshift(c)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{className:"highcharts-pane",shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});b.Pane=r})(x);(function(b){var r=b.CenteredSeriesMixin, +t=b.each,w=b.extend,m=b.map,q=b.merge,e=b.noop,a=b.Pane,d=b.pick,f=b.pInt,h=b.splat,u=b.wrap,c,l,k=b.Axis.prototype;b=b.Tick.prototype;c={getOffset:e,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:e,setCategories:e,setTitle:e};l={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2}, +defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);a.plotBands||(a.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= +r.getCenter.call(this.pane)},getLinePath:function(a,g){a=this.center;var c=this.chart,f=d(g,a[2]/2-this.offset);this.isCircular||void 0!==g?g=this.chart.renderer.symbols.arc(this.left+a[0],this.top+a[1],f,f,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(g=this.postTranslate(this.angleRad,f),g=["M",a[0]+c.plotLeft,a[1]+c.plotTop,"L",g.x,g.y]);return g},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/ +(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===d(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.center=this.pane.center=r.getCenter.call(this.pane),this.isCircular&& +(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*d(this.sector,1)/2)},getPosition:function(a,g){return this.postTranslate(this.isCircular?this.translate(a):this.angleRad,d(this.isCircular?g:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,g){var d=this.chart,c=this.center;a=this.startAngleRad+a;return{x:d.plotLeft+c[0]+Math.cos(a)*g,y:d.plotTop+c[1]+Math.sin(a)*g}},getPlotBandPath:function(a,g,c){var h=this.center,p=this.startAngleRad, +k=h[2]/2,n=[d(c.outerRadius,"100%"),c.innerRadius,d(c.thickness,10)],b=Math.min(this.offset,0),l=/%$/,u,e=this.isCircular;"polygon"===this.options.gridLineInterpolation?h=this.getPlotLinePath(a).concat(this.getPlotLinePath(g,!0)):(a=Math.max(a,this.min),g=Math.min(g,this.max),e||(n[0]=this.translate(a),n[1]=this.translate(g)),n=m(n,function(a){l.test(a)&&(a=f(a,10)*k/100);return a}),"circle"!==c.shape&&e?(a=p+this.translate(a),g=p+this.translate(g)):(a=-Math.PI/2,g=1.5*Math.PI,u=!0),n[0]-=b,n[2]-= +b,h=this.chart.renderer.symbols.arc(this.left+h[0],this.top+h[1],n[0],n[0],{start:Math.min(a,g),end:Math.max(a,g),innerR:d(n[1],n[0]-n[2]),open:u}));return h},getPlotLinePath:function(a,g){var d=this,c=d.center,f=d.chart,h=d.getPosition(a),k,b,p;d.isCircular?p=["M",c[0]+f.plotLeft,c[1]+f.plotTop,"L",h.x,h.y]:"circle"===d.options.gridLineInterpolation?(a=d.translate(a))&&(p=d.getLinePath(0,a)):(t(f.xAxis,function(a){a.pane===d.pane&&(k=a)}),p=[],a=d.translate(a),c=k.tickPositions,k.autoConnect&&(c= +c.concat([c[0]])),g&&(c=[].concat(c).reverse()),t(c,function(g,d){b=k.getPosition(g,a);p.push(d?"L":"M",b.x,b.y)}));return p},getTitlePosition:function(){var a=this.center,g=this.chart,d=this.options.title;return{x:g.plotLeft+a[0]+(d.x||0),y:g.plotTop+a[1]-{high:.5,middle:.25,low:0}[d.align]*a[2]+(d.y||0)}}};u(k,"init",function(f,g,k){var b=g.angular,p=g.polar,n=k.isX,u=b&&n,e,A=g.options,m=k.pane||0;if(b){if(w(this,u?c:l),e=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(w(this, +l),this.defaultRadialOptions=(e=n)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions));b||p?(this.isRadial=!0,g.inverted=!1,A.chart.zoomType=null):this.isRadial=!1;f.call(this,g,k);u||!b&&!p||(f=this.options,g.panes||(g.panes=[]),this.pane=g=g.panes[m]=g.panes[m]||new a(h(A.pane)[m],g,this),g=g.options,this.angleRad=(f.angle||0)*Math.PI/180,this.startAngleRad=(g.startAngle-90)*Math.PI/180,this.endAngleRad=(d(g.endAngle,g.startAngle+360)-90)*Math.PI/180,this.offset=f.offset|| +0,this.isCircular=e)});u(k,"autoLabelAlign",function(a){if(!this.isRadial)return a.apply(this,[].slice.call(arguments,1))});u(b,"getPosition",function(a,d,c,f,h){var g=this.axis;return g.getPosition?g.getPosition(c):a.call(this,d,c,f,h)});u(b,"getLabelPosition",function(a,g,c,f,h,k,b,l,u){var n=this.axis,p=k.y,e=20,y=k.align,v=(n.translate(this.pos)+n.startAngleRad+Math.PI/2)/Math.PI*180%360;n.isRadial?(a=n.getPosition(this.pos,n.center[2]/2+d(k.distance,-25)),"auto"===k.rotation?f.attr({rotation:v}): +null===p&&(p=n.chart.renderer.fontMetrics(f.styles.fontSize).b-f.getBBox().height/2),null===y&&(n.isCircular?(this.label.getBBox().width>n.len*n.tickInterval/(n.max-n.min)&&(e=0),y=v>e&&v<180-e?"left":v>180+e&&v<360-e?"right":"center"):y="center",f.attr({align:y})),a.x+=k.x,a.y+=p):a=a.call(this,g,c,f,h,k,b,l,u);return a});u(b,"getMarkPath",function(a,d,c,f,h,k,b){var g=this.axis;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+f),d=["M",d,c,"L",a.x,a.y]):d=a.call(this,d,c,f,h,k,b);return d})})(x); +(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.Series,q=b.seriesType,e=b.seriesTypes;q("arearange","area",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:["low","high"],dataLabelCollections:["dataLabel", +"dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var d=this.chart,f=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=f.x-d.plotLeft;a.plotHigh=f.y-d.plotTop},translate:function(){var a=this,d=a.yAxis,f=!!a.modifyValue;e.area.prototype.translate.apply(a);r(a.points,function(h){var b=h.low,c=h.high,l=h.plotY;null===c||null===b?h.isNull=!0:(h.plotLow=l,h.plotHigh=d.translate(f?a.modifyValue(c,h):c,0,1, +0,1),f&&(h.yBottom=h.plotHigh))});this.chart.polar&&r(this.points,function(d){a.highToXY(d)})},getGraphPath:function(a){var d=[],f=[],h,b=e.area.prototype.getGraphPath,c,l,k;k=this.options;var p=k.step;a=a||this.points;for(h=a.length;h--;)c=a[h],c.isNull||k.connectEnds||a[h+1]&&!a[h+1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),l={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,yBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},f.push(l),d.push(l),c.isNull|| +k.connectEnds||a[h-1]&&!a[h-1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=b.call(this,a);p&&(!0===p&&(p="left"),k.step={left:"right",center:"center",right:"left"}[p]);d=b.call(this,d);f=b.call(this,f);k.step=p;k=[].concat(a,d);this.chart.polar||"M"!==f[0]||(f[0]="L");this.graphPath=k;this.areaPath=this.areaPath.concat(a,f);k.isArea=!0;k.xMap=a.xMap;this.areaPath.xMap=a.xMap;return k},drawDataLabels:function(){var a=this.data,d=a.length,f,h=[],b=m.prototype,c=this.options.dataLabels, +l=c.align,k=c.verticalAlign,p=c.inside,g,n,e=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,h[f]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=n,e?l||(c.align=n?"right":"left"):k||(c.verticalAlign=n?"top":"bottom"),c.x=c.xHigh,c.y=c.yHigh;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.dataLabelUpper= +g.dataLabel,g.dataLabel=h[f],g.y=g.low,g.plotY=g._plotY,g.below=!n,e?l||(c.align=n?"left":"right"):k||(c.verticalAlign=n?"bottom":"top"),c.x=c.xLow,c.y=c.yLow;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}c.align=l;c.verticalAlign=k},alignDataLabel:function(){e.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(x);(function(b){var r=b.seriesType;r("areasplinerange","arearange",null,{getPointSpline:b.seriesTypes.spline.prototype.getPointSpline})})(x); +(function(b){var r=b.defaultPlotOptions,t=b.each,w=b.merge,m=b.noop,q=b.pick,e=b.seriesType,a=b.seriesTypes.column.prototype;e("columnrange","arearange",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var d=this,f=d.yAxis,b=d.xAxis,u=b.startAngleRad,c,l=d.chart,k=d.xAxis.isRadial,p;a.translate.apply(d);t(d.points,function(a){var g=a.shapeArgs,h=d.options.minPointLength,e,v;a.plotHigh=p=f.translate(a.high,0,1,0,1);a.plotLow=a.plotY;v=p;e=q(a.rectPlotY,a.plotY)-p;Math.abs(e)< +h?(h-=e,e+=h,v-=h/2):0>e&&(e*=-1,v-=e);k?(c=a.barX+u,a.shapeType="path",a.shapeArgs={d:d.polarArc(v+e,v,c,c+a.pointWidth)}):(g.height=e,g.y=v,a.tooltipPos=l.inverted?[f.len+f.pos-l.plotLeft-v-e/2,b.len+b.pos-l.plotTop-g.x-g.width/2,e]:[b.left-l.plotLeft+g.x+g.width/2,f.pos-l.plotTop+v+e/2,e])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:m,crispCol:a.crispCol,drawPoints:a.drawPoints,drawTracker:a.drawTracker,getColumnMetrics:a.getColumnMetrics,animate:function(){return a.animate.apply(this, +arguments)},polarArc:function(){return a.polarArc.apply(this,arguments)},pointAttribs:a.pointAttribs})})(x);(function(b){var r=b.each,t=b.isNumber,w=b.merge,m=b.pick,q=b.pInt,e=b.Series,a=b.seriesType,d=b.TrackerMixin;a("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:b.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,d=this.options,b=a.center;this.generatePoints();r(this.points,function(c){var f=w(d.dial,c.dial),k=q(m(f.radius,80))*b[2]/200,h=q(m(f.baseLength,70))*k/100,g=q(m(f.rearLength,10))*k/100,n=f.baseWidth||3,u=f.topWidth||1,e=d.overshoot,v=a.startAngleRad+a.translate(c.y,null,null,null,!0);t(e)?(e=e/180*Math.PI,v=Math.max(a.startAngleRad-e,Math.min(a.endAngleRad+e,v))):!1===d.wrap&&(v=Math.max(a.startAngleRad,Math.min(a.endAngleRad, +v)));v=180*v/Math.PI;c.shapeType="path";c.shapeArgs={d:f.path||["M",-g,-n/2,"L",h,-n/2,k,-u/2,k,u/2,h,n/2,-g,n/2,"z"],translateX:b[0],translateY:b[1],rotation:v};c.plotX=b[0];c.plotY=b[1]})},drawPoints:function(){var a=this,d=a.yAxis.center,b=a.pivot,c=a.options,l=c.pivot,k=a.chart.renderer;r(a.points,function(d){var g=d.graphic,b=d.shapeArgs,f=b.d,h=w(c.dial,d.dial);g?(g.animate(b),b.d=f):(d.graphic=k[d.shapeType](b).attr({rotation:b.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group),d.graphic.attr({stroke:h.borderColor|| +"none","stroke-width":h.borderWidth||0,fill:h.backgroundColor||"#000000"}))});b?b.animate({translateX:d[0],translateY:d[1]}):(a.pivot=k.circle(0,0,m(l.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(d[0],d[1]).add(a.group),a.pivot.attr({"stroke-width":l.borderWidth||0,stroke:l.borderColor||"#cccccc",fill:l.backgroundColor||"#000000"}))},animate:function(a){var d=this;a||(r(d.points,function(a){var c=a.graphic;c&&(c.attr({rotation:180*d.yAxis.startAngleRad/Math.PI}),c.animate({rotation:a.shapeArgs.rotation}, +d.options.animation))}),d.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);e.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,d){e.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();m(d,!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(a){this.state=a}})})(x);(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.seriesType, +q=b.seriesTypes;m("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:["low","q1","median", +"q3","high"],toYData:function(b){return[b.low,b.q1,b.median,b.q3,b.high]},pointValKey:"high",pointAttribs:function(b){var a=this.options,d=b&&b.color||this.color;return{fill:b.fillColor||a.fillColor||d,stroke:a.lineColor||d,"stroke-width":a.lineWidth||0}},drawDataLabels:t,translate:function(){var b=this.yAxis,a=this.pointArrayMap;q.column.prototype.translate.apply(this);r(this.points,function(d){r(a,function(a){null!==d[a]&&(d[a+"Plot"]=b.translate(d[a],0,1,0,1))})})},drawPoints:function(){var b= +this,a=b.options,d=b.chart.renderer,f,h,u,c,l,k,p=0,g,n,m,q,v=!1!==b.doQuartiles,t,x=b.options.whiskerLength;r(b.points,function(e){var r=e.graphic,y=r?"animate":"attr",I=e.shapeArgs,z={},B={},G={},H=e.color||b.color;void 0!==e.plotY&&(g=I.width,n=Math.floor(I.x),m=n+g,q=Math.round(g/2),f=Math.floor(v?e.q1Plot:e.lowPlot),h=Math.floor(v?e.q3Plot:e.lowPlot),u=Math.floor(e.highPlot),c=Math.floor(e.lowPlot),r||(e.graphic=r=d.g("point").add(b.group),e.stem=d.path().addClass("highcharts-boxplot-stem").add(r), +x&&(e.whiskers=d.path().addClass("highcharts-boxplot-whisker").add(r)),v&&(e.box=d.path(void 0).addClass("highcharts-boxplot-box").add(r)),e.medianShape=d.path(void 0).addClass("highcharts-boxplot-median").add(r),z.stroke=e.stemColor||a.stemColor||H,z["stroke-width"]=w(e.stemWidth,a.stemWidth,a.lineWidth),z.dashstyle=e.stemDashStyle||a.stemDashStyle,e.stem.attr(z),x&&(B.stroke=e.whiskerColor||a.whiskerColor||H,B["stroke-width"]=w(e.whiskerWidth,a.whiskerWidth,a.lineWidth),e.whiskers.attr(B)),v&&(r= +b.pointAttribs(e),e.box.attr(r)),G.stroke=e.medianColor||a.medianColor||H,G["stroke-width"]=w(e.medianWidth,a.medianWidth,a.lineWidth),e.medianShape.attr(G)),k=e.stem.strokeWidth()%2/2,p=n+q+k,e.stem[y]({d:["M",p,h,"L",p,u,"M",p,f,"L",p,c]}),v&&(k=e.box.strokeWidth()%2/2,f=Math.floor(f)+k,h=Math.floor(h)+k,n+=k,m+=k,e.box[y]({d:["M",n,h,"L",n,f,"L",m,f,"L",m,h,"L",n,h,"z"]})),x&&(k=e.whiskers.strokeWidth()%2/2,u+=k,c+=k,t=/%$/.test(x)?q*parseFloat(x)/100:x/2,e.whiskers[y]({d:["M",p-t,u,"L",p+t,u, +"M",p-t,c,"L",p+t,c]})),l=Math.round(e.medianPlot),k=e.medianShape.strokeWidth()%2/2,l+=k,e.medianShape[y]({d:["M",n,l,"L",m,l]}))})},setStackedPoints:t})})(x);(function(b){var r=b.each,t=b.noop,w=b.seriesType,m=b.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},whiskerWidth:null},{type:"errorbar", +pointArrayMap:["low","high"],toYData:function(b){return[b.low,b.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:m.arearange?function(){var b=this.pointValKey;m.arearange.prototype.drawDataLabels.call(this);r(this.data,function(e){e.y=e[b]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||m.column.prototype.getColumnMetrics.call(this)}})})(x);(function(b){var r=b.correctFloat,t=b.isNumber,w=b.pick,m=b.Point,q=b.Series,e=b.seriesType,a=b.seriesTypes; +e("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",translate:function(){var d=this.options,b=this.yAxis,h,e,c,l,k,p,g,n,m,q=w(d.minPointLength,5),v=d.threshold,t=d.stacking;a.column.prototype.translate.apply(this);this.minPointLengthOffset=0;g=n=v;e=this.points;h=0;for(d=e.length;hl.height&&(l.y+=l.height,l.height*=-1),c.plotY=l.y=Math.round(l.y)- +this.borderWidth%2/2,l.height=Math.max(Math.round(l.height),.001),c.yBottom=l.y+l.height,l.height<=q&&(l.height=q,this.minPointLengthOffset+=q),l.y-=this.minPointLengthOffset,l=c.plotY+(c.negative?l.height:0)-this.minPointLengthOffset,this.chart.inverted?c.tooltipPos[0]=b.len-l:c.tooltipPos[1]=l},processData:function(a){var b=this.yData,d=this.options.data,e,c=b.length,l,k,p,g,n,m;k=l=p=g=this.options.threshold||0;for(m=0;ma[k-1].y&&(l[2]+=c.height,l[5]+=c.height),e=e.concat(l);return e},drawGraph:function(){q.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},getExtremes:b.noop},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum"); +return a},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(x);(function(b){var r=b.Series,t=b.seriesType,w=b.seriesTypes;t("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var b=r.prototype.getGraphPath.call(this),q=b.length+1;q--;)(q===b.length||"M"===b[q])&&0=this.minPxSize/2?(d.shapeType="circle",d.shapeArgs={x:d.plotX,y:d.plotY,r:c},d.dlBox={x:d.plotX-c,y:d.plotY-c,width:2*c,height:2*c}):d.shapeArgs=d.plotY=d.dlBox=void 0},drawLegendSymbol:function(a,b){var d=this.chart.renderer,c=d.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=d.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker= +!0},drawPoints:l.column.prototype.drawPoints,alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:a,applyZones:a},{haloPath:function(a){return h.prototype.haloPath.call(this,this.shapeArgs.r+a)},ttBelow:!1});w.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,h=0,l=b,u=this.isXAxis,m=u?"xData":"yData",w=this.min,x={},A=Math.min(c.plotWidth,c.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-w,z=b/E,F=[];q(this.series,function(b){var g=b.options;!b.bubblePadding|| +!b.visible&&c.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,F.push(b),u&&(q(["minSize","maxSize"],function(a){var b=g[a],d=/%$/.test(b),b=f(b);x[a]=d?A*b/100:b}),b.minPxSize=x.minSize,b.maxPxSize=Math.max(x.maxSize,x.minSize),b=b.zData,b.length&&(C=d(g.zMin,Math.min(C,Math.max(t(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=d(g.zMax,Math.max(D,r(b))))))});q(F,function(b){var d=b[m],c=d.length,f;u&&b.getRadii(C,D,b.minPxSize,b.maxPxSize);if(0f&&(f+=360),a.clientX=f):a.clientX=a.plotX};m.spline&&q(m.spline.prototype,"getPointSpline",function(a,b,f,h){var d,c,e,k,p,g,n;this.chart.polar?(d=f.plotX, +c=f.plotY,a=b[h-1],e=b[h+1],this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])),a&&e&&(k=a.plotX,p=a.plotY,b=e.plotX,g=e.plotY,k=(1.5*d+k)/2.5,p=(1.5*c+p)/2.5,e=(1.5*d+b)/2.5,n=(1.5*c+g)/2.5,b=Math.sqrt(Math.pow(k-d,2)+Math.pow(p-c,2)),g=Math.sqrt(Math.pow(e-d,2)+Math.pow(n-c,2)),k=Math.atan2(p-c,k-d),p=Math.atan2(n-c,e-d),n=Math.PI/2+(k+p)/2,Math.abs(k-n)>Math.PI/2&&(n-=Math.PI),k=d+Math.cos(n)*b,p=c+Math.sin(n)*b,e=d+Math.cos(Math.PI+n)*g,n=c+Math.sin(Math.PI+n)*g,f.rightContX=e,f.rightContY=n), +h?(f=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,k||d,p||c,d,c],a.rightContX=a.rightContY=null):f=["M",d,c]):f=a.call(this,b,f,h);return f});q(e,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});q(e,"getGraphPath",function(a,b){var d=this,e,m;if(this.chart.polar){b=b||this.points;for(e=0;eb.center[1]}),q(m,"alignDataLabel",function(a,b,f,h,m,c){this.chart.polar?(a=b.rectPlotX/Math.PI*180,null===h.align&&(h.align=20a?"left":200a?"right":"center"),null===h.verticalAlign&&(h.verticalAlign=45>a||315a?"top":"middle"),e.alignDataLabel.call(this,b,f,h,m,c)):a.call(this, +b,f,h,m,c)}));q(b,"getCoordinates",function(a,b){var d=this.chart,e={xAxis:[],yAxis:[]};d.polar?t(d.axes,function(a){var c=a.isXAxis,f=a.center,h=b.chartX-f[0]-d.plotLeft,f=b.chartY-f[1]-d.plotTop;e[c?"xAxis":"yAxis"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,f):Math.sqrt(Math.pow(h,2)+Math.pow(f,2)),!0)})}):e=a.call(this,b);return e})})(x)}); diff --git a/webapp/loadTests/10users/js/highstock.js b/webapp/loadTests/10users/js/highstock.js new file mode 100644 index 0000000..34a3f91 --- /dev/null +++ b/webapp/loadTests/10users/js/highstock.js @@ -0,0 +1,496 @@ +/* + Highstock JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(N,a){"object"===typeof module&&module.exports?module.exports=N.document?a(N):a:N.Highcharts=a(N)})("undefined"!==typeof window?window:this,function(N){N=function(){var a=window,D=a.document,B=a.navigator&&a.navigator.userAgent||"",G=D&&D.createElementNS&&!!D.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,H=/(edge|msie|trident)/i.test(B)&&!window.opera,p=!G,l=/Firefox/.test(B),r=l&&4>parseInt(B.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highstock", +version:"5.0.3",deg2rad:2*Math.PI/360,doc:D,hasBidiBug:r,hasTouch:D&&void 0!==D.documentElement.ontouchstart,isMS:H,isWebKit:/AppleWebKit/.test(B),isFirefox:l,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(B),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:p,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var D=[],B=a.charts,G=a.doc,H=a.win;a.error=function(a,l){a="Highcharts error #"+ +a+": www.highcharts.com/errors/"+a;if(l)throw Error(a);H.console&&console.log(a)};a.Fx=function(a,l,r){this.options=l;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],l=this.paths[1],r=[],w=this.now,t=a.length,k;if(1===w)r=this.toD;else if(t===l.length&&1>w)for(;t--;)k=parseFloat(a[t]),r[t]=isNaN(k)?a[t]:w*parseFloat(l[t]-k)+k;else r=l;this.elem.attr("d",r)},update:function(){var a=this.elem,l=this.prop,r=this.now,w=this.options.step;if(this[l+"Setter"])this[l+"Setter"](); +else a.attr?a.element&&a.attr(l,r):a.style[l]=r+this.unit;w&&w.call(a,r,this)},run:function(a,l,r){var p=this,t=function(a){return t.stopped?!1:p.step(a)},k;this.startTime=+new Date;this.start=a;this.end=l;this.unit=r;this.now=this.start;this.pos=0;t.elem=this.elem;t()&&1===D.push(t)&&(t.timerId=setInterval(function(){for(k=0;k=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=m[this.prop]=!0;for(e in m)!0!==m[e]&&(a=!1);a&&t&&t.call(p);p=!1}else this.pos=w.easing((l-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),p=!0;return p},initPath:function(p,l,r){function w(a){for(b=a.length;b--;)"M"!==a[b]&&"L"!==a[b]||a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function t(a,c){for(;a.lengthm?"AM":"PM",P:12>m?"am":"pm",S:q(t.getSeconds()),L:q(Math.round(l%1E3),3)},a.dateFormats);for(k in w)for(;-1!==p.indexOf("%"+k);)p= +p.replace("%"+k,"function"===typeof w[k]?w[k](l):w[k]);return r?p.substr(0,1).toUpperCase()+p.substr(1):p};a.formatSingle=function(p,l){var r=/\.([0-9])/,w=a.defaultOptions.lang;/f$/.test(p)?(r=(r=p.match(r))?r[1]:-1,null!==l&&(l=a.numberFormat(l,r,w.decimalPoint,-1=r&&(l=[1/r])));for(w=0;w=p||!t&&k<=(l[w]+(l[w+1]||l[w]))/ +2);w++);return m*r};a.stableSort=function(a,l){var r=a.length,p,t;for(t=0;tr&&(r=a[l]);return r};a.destroyObjectProperties=function(a,l){for(var r in a)a[r]&&a[r]!==l&&a[r].destroy&&a[r].destroy(),delete a[r]};a.discardElement=function(p){var l= +a.garbageBin;l||(l=a.createElement("div"));p&&l.appendChild(p);l.innerHTML=""};a.correctFloat=function(a,l){return parseFloat(a.toPrecision(l||14))};a.setAnimation=function(p,l){l.renderer.globalAnimation=a.pick(p,l.options.chart.animation,!0)};a.animObject=function(p){return a.isObject(p)?a.merge(p):{duration:p?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(p,l,r,w){p=+p||0;l=+l;var t=a.defaultOptions.lang, +k=(p.toString().split(".")[1]||"").length,m,e,g=Math.abs(p);-1===l?l=Math.min(k,20):a.isNumber(l)||(l=2);m=String(a.pInt(g.toFixed(l)));e=3p?"-":"")+(e?m.substr(0,e)+w:"");p+=m.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+w);l&&(w=Math.abs(g-m+Math.pow(10,-Math.max(l,k)-1)),p+=r+w.toFixed(l).slice(2));return p};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(p,l){return"width"===l?Math.min(p.offsetWidth, +p.scrollWidth)-a.getStyle(p,"padding-left")-a.getStyle(p,"padding-right"):"height"===l?Math.min(p.offsetHeight,p.scrollHeight)-a.getStyle(p,"padding-top")-a.getStyle(p,"padding-bottom"):(p=H.getComputedStyle(p,void 0))&&a.pInt(p.getPropertyValue(l))};a.inArray=function(a,l){return l.indexOf?l.indexOf(a):[].indexOf.call(l,a)};a.grep=function(a,l){return[].filter.call(a,l)};a.map=function(a,l){for(var r=[],p=0,t=a.length;pl;l++)w[l]+=p(255*a),0>w[l]&&(w[l]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width, +b=z.height,c&&L&&"11px"===L.fontSize&&"16.9"===b.toPrecision(3)&&(z.height=b=14),v&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(g&&0]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,c,v){"string"===typeof a?v.setAttribute(c, +a):a&&this.colorGradient(a,c,v)},visibilitySetter:function(a,c,v){"inherit"===a?v.removeAttribute(c):v.setAttribute(c,a)},zIndexSetter:function(a,c){var v=this.renderer,z=this.parentGroup,b=(z||v).element||v.box,d,n=this.element,f;d=this.added;var e;k(a)&&(n.zIndex=a,a=+a,this[c]===a&&(d=!1),this[c]=a);if(d){(a=this.zIndex)&&z&&(z.handleZ=!0);c=b.childNodes;for(e=0;ea||!k(a)&&k(d)||0>a&&!k(d)&&b!==v.box)&&(b.insertBefore(n,z),f=!0);f||b.appendChild(n)}return f}, +_defaultSetter:function(a,c,v){v.setAttribute(c,a)}};D.prototype.yGetter=D.prototype.xGetter;D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.rotationSetter=D.prototype.verticalAlignSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=function(a,c){this[c]=a;this.doTransform=!0};D.prototype["stroke-widthSetter"]=D.prototype.strokeSetter=function(a,c,v){this[c]=a;this.stroke&&this["stroke-width"]?(D.prototype.fillSetter.call(this,this.stroke,"stroke",v),v.setAttribute("stroke-width", +this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===a&&this.hasStroke&&(v.removeAttribute("stroke"),this.hasStroke=!1)};B=a.SVGRenderer=function(){this.init.apply(this,arguments)};B.prototype={Element:D,SVG_NS:K,init:function(a,c,v,b,d,n){var z;b=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(b));z=b.element;a.appendChild(z);-1===a.innerHTML.indexOf("xmlns")&&p(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=b;this.alignedObjects= +[];this.url=(E||A)&&g.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(g.createTextNode("Created with Highstock 5.0.3"));this.defs=this.createElement("defs").add();this.allowHTML=n;this.forExport=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,v,!1);var f;E&&a.getBoundingClientRect&&(c=function(){w(a,{left:0,top:0});f=a.getBoundingClientRect(); +w(a,{left:Math.ceil(f.left)-f.left+"px",top:Math.ceil(f.top)-f.top+"px"})},c(),this.unSubPixelFix=G(R,"resize",c))},getStyle:function(a){return this.style=C({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients= +null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var c=new this.Element;c.init(this,a);return c},draw:J,getRadialAttr:function(a,c){return{cx:a[0]-a[2]/2+c.cx*a[2],cy:a[1]-a[2]/2+c.cy*a[2],r:c.r*a[2]}},buildText:function(a){for(var c=a.element,z=this,b=z.forExport,n=y(a.textStr,"").toString(),f=-1!==n.indexOf("\x3c"),e=c.childNodes,q,F,x,A,I=p(c,"x"),m=a.styles,k=a.textWidth,C=m&&m.lineHeight,M=m&&m.textOutline,J=m&& +"ellipsis"===m.textOverflow,E=e.length,O=k&&!a.added&&this.box,t=function(a){var v;v=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:m&&m.fontSize||z.style.fontSize||12;return C?u(C):z.fontMetrics(v,a.getAttribute("style")?a:c).h};E--;)c.removeChild(e[E]);f||M||J||k||-1!==n.indexOf(" ")?(q=/<.*class="([^"]+)".*>/,F=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,O&&O.appendChild(c),n=f?n.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[n],n=d(n,function(a){return""!==a}),h(n,function(d,n){var f,e=0;d=d.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");f=d.split("|||");h(f,function(d){if(""!==d||1===f.length){var u={},y=g.createElementNS(z.SVG_NS,"tspan"),L,h;q.test(d)&&(L=d.match(q)[1],p(y,"class",L));F.test(d)&&(h=d.match(F)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),p(y,"style",h));x.test(d)&&!b&&(p(y, +"onclick",'location.href\x3d"'+d.match(x)[1]+'"'),w(y,{cursor:"pointer"}));d=(d.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==d){y.appendChild(g.createTextNode(d));e?u.dx=0:n&&null!==I&&(u.x=I);p(y,u);c.appendChild(y);!e&&n&&(!v&&b&&w(y,{display:"block"}),p(y,"dy",t(y)));if(k){u=d.replace(/([^\^])-/g,"$1- ").split(" ");L="nowrap"===m.whiteSpace;for(var C=1k,void 0===A&&(A=M),J&&A?(Q/=2,""===l||!M&&.5>Q?u=[]:(l=d.substring(0,l.length+(M?-1:1)*Math.ceil(Q)),u=[l+(3k&&(k=P)),u.length&&y.appendChild(g.createTextNode(u.join(" ").replace(/- /g, +"-")));a.rotation=R}e++}}})}),A&&a.attr("title",a.textStr),O&&O.removeChild(c),M&&a.applyTextOutline&&a.applyTextOutline(M)):c.appendChild(g.createTextNode(n.replace(/</g,"\x3c").replace(/>/g,"\x3e")))},getContrast:function(a){a=r(a).rgba;return 510v?d>c+f&&de?d>c+f&&db&&e>a+f&&ed&&e>a+f&&ea?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a, +c,v){var b=a;c&&v&&(b=Math.max(b*Math.cos(c*m),4));return{x:-a/3*Math.sin(c*m),y:b}},label:function(a,c,v,b,d,n,f,e,K){var q=this,u=q.g("button"!==K&&"label"),y=u.text=q.text("",0,0,f).attr({zIndex:1}),g,F,z=0,A=3,L=0,m,M,J,E,O,t={},l,R,r=/^url\((.*?)\)$/.test(b),p=r,P,w,Q,S;K&&u.addClass("highcharts-"+K);p=r;P=function(){return(l||0)%2/2};w=function(){var a=y.element.style,c={};F=(void 0===m||void 0===M||O)&&k(y.textStr)&&y.getBBox();u.width=(m||F.width||0)+2*A+L;u.height=(M||F.height||0)+2*A;R= +A+q.fontMetrics(a&&a.fontSize,y).b;p&&(g||(u.box=g=q.symbols[b]||r?q.symbol(b):q.rect(),g.addClass(("button"===K?"":"highcharts-label-box")+(K?" highcharts-"+K+"-box":"")),g.add(u),a=P(),c.x=a,c.y=(e?-R:0)+a),c.width=Math.round(u.width),c.height=Math.round(u.height),g.attr(C(c,t)),t={})};Q=function(){var a=L+A,c;c=e?0:R;k(m)&&F&&("center"===O||"right"===O)&&(a+={center:.5,right:1}[O]*(m-F.width));if(a!==y.x||c!==y.y)y.attr("x",a),void 0!==c&&y.attr("y",c);y.x=a;y.y=c};S=function(a,c){g?g.attr(a,c): +t[a]=c};u.onAdd=function(){y.add(u);u.attr({text:a||0===a?a:"",x:c,y:v});g&&k(d)&&u.attr({anchorX:d,anchorY:n})};u.widthSetter=function(a){m=a};u.heightSetter=function(a){M=a};u["text-alignSetter"]=function(a){O=a};u.paddingSetter=function(a){k(a)&&a!==A&&(A=u.padding=a,Q())};u.paddingLeftSetter=function(a){k(a)&&a!==L&&(L=a,Q())};u.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,F&&u.attr({x:J}))};u.textSetter=function(a){void 0!==a&&y.textSetter(a);w();Q()};u["stroke-widthSetter"]= +function(a,c){a&&(p=!0);l=this["stroke-width"]=a;S(c,a)};u.strokeSetter=u.fillSetter=u.rSetter=function(a,c){"fill"===c&&a&&(p=!0);S(c,a)};u.anchorXSetter=function(a,c){d=a;S(c,Math.round(a)-P()-J)};u.anchorYSetter=function(a,c){n=a;S(c,a-E)};u.xSetter=function(a){u.x=a;z&&(a-=z*((m||F.width)+2*A));J=Math.round(a);u.attr("translateX",J)};u.ySetter=function(a){E=u.y=Math.round(a);u.attr("translateY",E)};var T=u.css;return C(u,{css:function(a){if(a){var c={};a=x(a);h(u.textProps,function(v){void 0!== +a[v]&&(c[v]=a[v],delete a[v])});y.css(c)}return T.call(u,a)},getBBox:function(){return{width:F.width+2*A,height:F.height+2*A,x:F.x-A,y:F.y-A}},shadow:function(a){a&&(w(),g&&g.shadow(a));return u},destroy:function(){I(u.element,"mouseenter");I(u.element,"mouseleave");y&&(y=y.destroy());g&&(g=g.destroy());D.prototype.destroy.call(u);u=q=w=Q=S=null}})}};a.Renderer=B})(N);(function(a){var D=a.attr,B=a.createElement,G=a.css,H=a.defined,p=a.each,l=a.extend,r=a.isFirefox,w=a.isMS,t=a.isWebKit,k=a.pInt,m= +a.SVGRenderer,e=a.win,g=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var e=this.element;if(e=a&&"SPAN"===e.tagName&&a.width)delete a.width,this.textWidth=e,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a= +this.renderer,e=this.element,f=this.translateX||0,d=this.translateY||0,b=this.x||0,q=this.y||0,g=this.textAlign||"left",c={left:0,center:.5,right:1}[g],F=this.styles;G(e,{marginLeft:f,marginTop:d});this.shadows&&p(this.shadows,function(a){G(a,{marginLeft:f+1,marginTop:d+1})});this.inverted&&p(e.childNodes,function(c){a.invertChild(c,e)});if("SPAN"===e.tagName){var n=this.rotation,A=k(this.textWidth),x=F&&F.whiteSpace,m=[n,g,e.innerHTML,this.textWidth,this.textAlign].join();m!==this.cTT&&(F=a.fontMetrics(e.style.fontSize).b, +H(n)&&this.setSpanRotation(n,c,F),G(e,{width:"",whiteSpace:x||"nowrap"}),e.offsetWidth>A&&/[ \-]/.test(e.textContent||e.innerText)&&G(e,{width:A+"px",display:"block",whiteSpace:x||"normal"}),this.getSpanCorrection(e.offsetWidth,F,c,n,g));G(e,{left:b+(this.xCorr||0)+"px",top:q+(this.yCorr||0)+"px"});t&&(F=e.offsetHeight);this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,g,f){var d={},b=w?"-ms-transform":t?"-webkit-transform":r?"MozTransform":e.opera?"-o-transform":"";d[b]=d.transform= +"rotate("+a+"deg)";d[b+(r?"Origin":"-origin")]=d.transformOrigin=100*g+"% "+f+"px";G(this.element,d)},getSpanCorrection:function(a,e,f){this.xCorr=-a*f;this.yCorr=-e}});l(m.prototype,{html:function(a,e,f){var d=this.createElement("span"),b=d.element,q=d.renderer,h=q.isSVG,c=function(a,c){p(["opacity","visibility"],function(b){g(a,b+"Setter",function(a,b,d,n){a.call(this,b,d,n);c[d]=b})})};d.textSetter=function(a){a!==b.innerHTML&&delete this.bBox;b.innerHTML=this.textStr=a;d.htmlUpdateTransform()}; +h&&c(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,c){"align"===c&&(c="textAlign");d[c]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(e),y:Math.round(f)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});b.style.whiteSpace="nowrap";d.css=d.htmlCss;h&&(d.add=function(a){var n,f=q.box.parentNode,e=[];if(this.parentGroup=a){if(n=a.div,!n){for(;a;)e.push(a),a=a.parentGroup;p(e.reverse(),function(a){var b,d=D(a.element, +"class");d&&(d={className:d});n=a.div=a.div||B("div",d,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},n||f);b=n.style;l(a,{translateXSetter:function(c,d){b.left=c+"px";a[d]=c;a.doTransform=!0},translateYSetter:function(c,d){b.top=c+"px";a[d]=c;a.doTransform=!0}});c(a,b)})}}else n=f;n.appendChild(b);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d});return d}})})(N);(function(a){var D, +B,G=a.createElement,H=a.css,p=a.defined,l=a.deg2rad,r=a.discardElement,w=a.doc,t=a.each,k=a.erase,m=a.extend;D=a.extendClass;var e=a.isArray,g=a.isNumber,h=a.isObject,C=a.merge;B=a.noop;var f=a.pick,d=a.pInt,b=a.SVGElement,q=a.SVGRenderer,E=a.win;a.svg||(B={docMode8:w&&8===w.documentMode,init:function(a,b){var c=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],f="div"===b;("shape"===b||f)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",f?"hidden":"visible"); +c.push(' style\x3d"',d.join(""),'"/\x3e');b&&(c=f||"span"===b||"img"===b?c.join(""):a.prepVML(c),this.element=G(c));this.renderer=a},add:function(a){var c=this.renderer,b=this.element,d=c.box,f=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);f&&c.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},updateTransform:b.prototype.htmlUpdateTransform, +setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*l),d=Math.sin(a*l);H(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,e,q){var c=e?Math.cos(e*l):1,n=e?Math.sin(e*l):0,u=f(this.elemHeight,this.element.offsetHeight),g;this.xCorr=0>c&&-a;this.yCorr=0>n&&-u;g=0>c*n;this.xCorr+=n*b*(g?1-d:d);this.yCorr-=c*b*(e?g?d:1-d:1);q&&"left"!== +q&&(this.xCorr-=a*d*(0>c?-1:1),e&&(this.yCorr-=u*d*(0>n?-1:1)),H(this.element,{textAlign:q}))},pathToVML:function(a){for(var c=a.length,b=[];c--;)g(a[c])?b[c]=Math.round(10*a[c])-5:"Z"===a[c]?b[c]="x":(b[c]=a[c],!a.isArc||"wa"!==a[c]&&"at"!==a[c]||(b[c+5]===b[c+7]&&(b[c+7]+=a[c+7]>a[c+5]?1:-1),b[c+6]===b[c+8]&&(b[c+8]+=a[c+8]>a[c+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var c=this,b;a?(b=a.members,k(b,c),b.push(c),c.destroyClip=function(){k(b,c)},a=a.getCSS(c)):(c.destroyClip&&c.destroyClip(), +a={clip:c.docMode8?"inherit":"rect(auto)"});return c.css(a)},css:b.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&r(a)},destroy:function(){this.destroyClip&&this.destroyClip();return b.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c;a=a.split(/[ ,]/);c=a.length;if(9===c||11===c)a[c-4]=a[c-2]=d(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,e){var c=[],n,q=this.element, +g=this.renderer,u,I=q.style,F,v=q.path,K,h,m,z;v&&"string"!==typeof v.value&&(v="x");h=v;if(a){m=f(a.width,3);z=(a.opacity||.15)/m;for(n=1;3>=n;n++)K=2*m+1-2*n,e&&(h=this.cutOffPath(v.value,K+.5)),F=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',K,'" filled\x3d"false" path\x3d"',h,'" coordsize\x3d"10 10" style\x3d"',q.style.cssText,'" /\x3e'],u=G(g.prepVML(F),null,{left:d(I.left)+f(a.offsetX,1),top:d(I.top)+f(a.offsetY,1)}),e&&(u.cutOff=K+1),F=['\x3cstroke color\x3d"',a.color||"#000000",'" opacity\x3d"', +z*n,'"/\x3e'],G(g.prepVML(F),null,null,u),b?b.element.appendChild(u):q.parentNode.insertBefore(u,q),c.push(u);this.shadows=c}return this},updateShadows:B,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||G(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,b,d){var c=this.shadows; +a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(c)for(d=c.length;d--;)c[d].path=c[d].cutOff?this.cutOffPath(a,c[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var c=d.nodeName;"SPAN"===c?d.style.color=a:"IMG"!==c&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){G(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:B,rotationSetter:function(a,b,d){d= +d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*l)+1)+"px";d.top=Math.round(Math.cos(a*l))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;g(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&t(this.shadows,function(c){c.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===a?"-999em": +0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},B["stroke-opacitySetter"]=B["fill-opacitySetter"],a.VMLElement=B=D(b,B),B.prototype.ySetter=B.prototype.widthSetter=B.prototype.heightSetter=B.prototype.xSetter,B={Element:B,isIE8:-1l[0]&&c.push([1,l[1]]);t(c,function(c,b){q.test(c[1])?(n=a.color(c[1]),v=n.get("rgb"),K=n.get("a")):(v=c[1],K=1);r.push(100*c[0]+"% "+v);b?(m=K,k=v):(z=K,E=v)});if("fill"===d)if("gradient"===g)d=A.x1||A[0]||0,c=A.y1||A[1]||0,F=A.x2||A[2]||0,A=A.y2||A[3]||0,C='angle\x3d"'+(90-180*Math.atan((A-c)/(F-d))/Math.PI)+'"',p();else{var h=A.r,w=2*h,B=2*h,D=A.cx,H=A.cy,V=b.radialReference,U,h=function(){V&&(U=f.getBBox(),D+=(V[0]- +U.x)/U.width-.5,H+=(V[1]-U.y)/U.height-.5,w*=V[2]/U.width,B*=V[2]/U.height);C='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+w+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+D+","+H+'" color2\x3d"'+E+'" ';p()};f.added?h():f.onAdd=h;h=k}else h=v}else q.test(c)&&"IMG"!==b.tagName?(n=a.color(c),f[d+"-opacitySetter"](n.get("a"),d,b),h=n.get("rgb")):(h=b.getElementsByTagName(d),h.length&&(h[0].opacity=1,h[0].type="solid"),h=c);return h},prepVML:function(a){var c=this.isIE8;a=a.join(""); +c?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:q.prototype.html,path:function(a){var c={coordsize:"10 10"};e(a)?c.d=a:h(a)&&m(c,a);return this.createElement("shape").attr(c)},circle:function(a,b,d){var c=this.symbol("circle"); +h(a)&&(d=a.r,b=a.y,a=a.x);c.isCircle=!0;c.r=d;return c.attr({x:a,y:b})},g:function(a){var c;a&&(c={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(c)},image:function(a,b,d,f,e){var c=this.createElement("img").attr({src:a});1f&&m-d*bg&&(F=Math.round((e-m)/Math.cos(f*w)));else if(e=m+(1-d)*b,m-d*bg&&(E=g-a.x+E*d,c=-1),E=Math.min(q, +E),EE||k.autoRotation&&(C.styles||{}).width)F=E;F&&(n.width=F,(k.options.labels.style||{}).textOverflow||(n.textOverflow="ellipsis"),C.css(n))},getPosition:function(a,k,m,e){var g=this.axis,h=g.chart,l=e&&h.oldChartHeight||h.chartHeight;return{x:a?g.translate(k+m,null,null,e)+g.transB:g.left+g.offset+(g.opposite?(e&&h.oldChartWidth||h.chartWidth)-g.right-g.left:0),y:a?l-g.bottom+g.offset-(g.opposite?g.height:0):l-g.translate(k+m,null, +null,e)-g.transB}},getLabelPosition:function(a,k,m,e,g,h,l,f){var d=this.axis,b=d.transA,q=d.reversed,E=d.staggerLines,c=d.tickRotCorr||{x:0,y:0},F=g.y;B(F)||(F=0===d.side?m.rotation?-8:-m.getBBox().height:2===d.side?c.y+8:Math.cos(m.rotation*w)*(c.y-m.getBBox(!1,0).height/2));a=a+g.x+c.x-(h&&e?h*b*(q?-1:1):0);k=k+F-(h&&!e?h*b*(q?1:-1):0);E&&(m=l/(f||1)%E,d.opposite&&(m=E-m-1),k+=d.labelOffset/E*m);return{x:a,y:Math.round(k)}},getMarkPath:function(a,k,m,e,g,h){return h.crispLine(["M",a,k,"L",a+(g? +0:-m),k+(g?m:0)],e)},render:function(a,k,m){var e=this.axis,g=e.options,h=e.chart.renderer,C=e.horiz,f=this.type,d=this.label,b=this.pos,q=g.labels,E=this.gridLine,c=f?f+"Tick":"tick",F=e.tickSize(c),n=this.mark,A=!n,x=q.step,p={},y=!0,u=e.tickmarkOffset,I=this.getPosition(C,b,u,k),M=I.x,I=I.y,v=C&&M===e.pos+e.len||!C&&I===e.pos?-1:1,K=f?f+"Grid":"grid",O=g[K+"LineWidth"],R=g[K+"LineColor"],z=g[K+"LineDashStyle"],K=l(g[c+"Width"],!f&&e.isXAxis?1:0),c=g[c+"Color"];m=l(m,1);this.isActive=!0;E||(p.stroke= +R,p["stroke-width"]=O,z&&(p.dashstyle=z),f||(p.zIndex=1),k&&(p.opacity=0),this.gridLine=E=h.path().attr(p).addClass("highcharts-"+(f?f+"-":"")+"grid-line").add(e.gridGroup));if(!k&&E&&(b=e.getPlotLinePath(b+u,E.strokeWidth()*v,k,!0)))E[this.isNew?"attr":"animate"]({d:b,opacity:m});F&&(e.opposite&&(F[0]=-F[0]),A&&(this.mark=n=h.path().addClass("highcharts-"+(f?f+"-":"")+"tick").add(e.axisGroup),n.attr({stroke:c,"stroke-width":K})),n[A?"attr":"animate"]({d:this.getMarkPath(M,I,F[0],n.strokeWidth()* +v,C,h),opacity:m}));d&&H(M)&&(d.xy=I=this.getLabelPosition(M,I,d,C,q,u,a,x),this.isFirst&&!this.isLast&&!l(g.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(g.showLastLabel,1)?y=!1:!C||e.isRadial||q.step||q.rotation||k||0===m||this.handleOverflow(I),x&&a%x&&(y=!1),y&&H(I.y)?(I.opacity=m,d[this.isNew?"attr":"animate"](I)):(r(d),d.attr("y",-9999)),this.isNew=!1)},destroy:function(){G(this,this.axis)}}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.AxisPlotLineOrBandExtension, +l=a.color,r=a.correctFloat,w=a.defaultOptions,t=a.defined,k=a.deg2rad,m=a.destroyObjectProperties,e=a.each,g=a.error,h=a.extend,C=a.fireEvent,f=a.format,d=a.getMagnitude,b=a.grep,q=a.inArray,E=a.isArray,c=a.isNumber,F=a.isString,n=a.merge,A=a.normalizeTickInterval,x=a.pick,J=a.PlotLineOrBand,y=a.removeEvent,u=a.splat,I=a.syncTimeout,M=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M", +hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb", +lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15}, +title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var b=c.isX;this.chart=a;this.horiz=a.inverted?!b:b;this.isXAxis=b;this.coll=this.coll||(b?"xAxis":"yAxis");this.opposite=c.opposite;this.side=c.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,v=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter; +this.userOptions=c;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===v||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===v;this.isDatetimeAxis="datetime"===v;this.isLinked=t(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom; +this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=x(d.crosshair,u(a.options.tooltip.crosshairs)[b?0:1],!1);var f;c=this.options.events;-1===q(this,a.axes)&&(b?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&b&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in c)D(this,f,c[f]); +this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=n(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],n(w[this.coll],a))},defaultLabelFormatter:function(){var c=this.axis,b=this.value,d=c.categories,e=this.dateTimeLabelFormat,q=w.lang,u=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,n=u&&u.length,g,y=c.options.labels.format, +c=c.isLog?b:c.tickInterval;if(y)g=f(y,this);else if(d)g=b;else if(e)g=a.dateFormat(e,b);else if(n&&1E3<=c)for(;n--&&void 0===g;)d=Math.pow(q,n+1),c>=d&&0===10*b%d&&null!==u[n]&&0!==b&&(g=a.numberFormat(b/d,-1)+u[n]);void 0===g&&(g=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return g},getSeriesExtremes:function(){var a=this,d=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();e(a.series,function(v){if(v.visible|| +!d.options.chart.ignoreHiddenSeries){var f=v.options,e=f.threshold,q;a.hasVisibleSeries=!0;a.isLog&&0>=e&&(e=null);if(a.isXAxis)f=v.xData,f.length&&(v=H(f),c(v)||v instanceof Date||(f=b(f,function(a){return c(a)}),v=H(f)),a.dataMin=Math.min(x(a.dataMin,f[0]),v),a.dataMax=Math.max(x(a.dataMax,f[0]),G(f)));else if(v.getExtremes(),q=v.dataMax,v=v.dataMin,t(v)&&t(q)&&(a.dataMin=Math.min(x(a.dataMin,v),v),a.dataMax=Math.max(x(a.dataMax,q),q)),t(e)&&(a.threshold=e),!f.softThreshold||a.isLog)a.softThreshold= +!1}})},translate:function(a,b,d,f,e,q){var v=this.linkedParent||this,u=1,n=0,g=f?v.oldTransA:v.transA;f=f?v.oldMin:v.min;var K=v.minPixelPadding;e=(v.isOrdinal||v.isBroken||v.isLog&&e)&&v.lin2val;g||(g=v.transA);d&&(u*=-1,n=v.len);v.reversed&&(u*=-1,n-=u*(v.sector||v.len));b?(a=(a*u+n-K)/g+f,e&&(a=v.lin2val(a))):(e&&(a=v.val2lin(a)),a=u*(a-f)*g+n+u*K+(c(q)?g*q:0));return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a- +(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,f,e){var v=this.chart,q=this.left,u=this.top,n,g,K=d&&v.oldChartHeight||v.chartHeight,y=d&&v.oldChartWidth||v.chartWidth,z;n=this.transB;var h=function(a,c,b){if(ab)f?a=Math.min(Math.max(c,a),b):z=!0;return a};e=x(e,this.translate(a,null,null,d));a=d=Math.round(e+n);n=g=Math.round(K-e-n);c(e)?this.horiz?(n=u,g=K-this.bottom,a=d=h(a,q,q+this.width)):(a=q,d=y-this.right,n=g=h(n,u,u+this.height)):z=!0;return z&&!f?null:v.renderer.crispLine(["M", +a,n,"L",d,g],b||1)},getLinearTickPositions:function(a,b,d){var v,f=r(Math.floor(b/a)*a),e=r(Math.ceil(d/a)*a),q=[];if(b===d&&c(b))return[b];for(b=f;b<=e;){q.push(b);b=r(b+a);if(b===v)break;v=b}return q},getMinorTickPositions:function(){var a=this.options,c=this.tickPositions,b=this.minorTickInterval,d=[],f,e=this.pointRangePadding||0;f=this.min-e;var e=this.max+e,q=e-f;if(q&&q/b=this.minRange,q,u,n,g,y,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(t(a.min)||t(a.max)?this.minRange=null:(e(this.series,function(a){g=a.xData;for(u=y=a.xIncrement? +1:g.length-1;0=E?(p=E,m=0):b.dataMax<=E&&(J=E,I=0)),b.min=x(w,p,b.dataMin),b.max=x(B,J,b.dataMax));q&&(!a&&0>=Math.min(b.min, +x(b.dataMin,b.min))&&g(10,1),b.min=r(u(b.min),15),b.max=r(u(b.max),15));b.range&&t(b.max)&&(b.userMin=b.min=w=Math.max(b.min,b.minFromRange()),b.userMax=B=b.max,b.range=null);C(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(l||b.axisPointRange||b.usePercentage||h)&&t(b.min)&&t(b.max)&&(u=b.max-b.min)&&(!t(w)&&m&&(b.min-=u*m),!t(B)&&I&&(b.max+=u*I));c(f.floor)?b.min=Math.max(b.min,f.floor):c(f.softMin)&&(b.min=Math.min(b.min,f.softMin));c(f.ceiling)?b.max=Math.min(b.max, +f.ceiling):c(f.softMax)&&(b.max=Math.max(b.max,f.softMax));M&&t(b.dataMin)&&(E=E||0,!t(w)&&b.min=E?b.min=E:!t(B)&&b.max>E&&b.dataMax<=E&&(b.max=E));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:h&&!k&&F===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:x(k,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*F/Math.max(b.len,F));y&&!a&&e(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); +b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!k&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));a=x(f.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!k&&b.tickIntervalb.tickInterval&&1E3b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval= +b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,f=a.startOnTick,e=a.endOnTick,q;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), +this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.isLinked||(this.trimTicks(b,f,e),this.min===this.max&&t(this.min)&&!this.tickAmount&&(q=!0,this.min-=.5,this.max+=.5),this.single=q,c||d||this.adjustTickAmount())}, +trimTicks:function(a,b,c){var d=a[0],f=a[a.length-1],v=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-v>a[0];)a.shift();if(c)this.max=f;else for(;this.max+vb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,f=b&&b.length;if(fc&&(this.tickInterval*= +2,this.setTickPositions());if(t(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0=f&&(b=f)),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,f=x(b.width,a.plotWidth-c+(b.offsetRight||0)),e=x(b.height,a.plotHeight),q=x(b.top,a.plotTop),b=x(b.left,a.plotLeft+c),c=/%$/;c.test(e)&&(e=Math.round(parseFloat(e)/ +100*a.plotHeight));c.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight+a.plotTop));this.left=b;this.top=q;this.width=f;this.height=e;this.bottom=a.chartHeight-e-q;this.right=a.chartWidth-f-b;this.len=Math.max(d?f:e,0);this.pos=d?b:q},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?r(b(this.min)):this.min,max:a?r(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log, +d=b?c(this.min):this.min,b=b?c(this.max):this.max;null===a?a=d:d>a?a=d:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],d=x(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize, +this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,f=this.len/(((this.categories?1:0)+this.max-this.min)/c),q,u=a.rotation,n=this.labelMetrics(),g,y=Number.MAX_VALUE,h,I=function(a){a/=f||1;a=1=a)g=I(Math.abs(n.h/Math.sin(k*a))),b=g+Math.abs(a/360),b(c.step||0)&&!c.rotation&&(this.staggerLines||1)*a.plotWidth/d||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,f=this.options.labels,q=this.horiz,u=this.getSlotWidth(),g=Math.max(1, +Math.round(u-2*(f.padding||5))),y={},h=this.labelMetrics(),I=f.style&&f.style.textOverflow,A,x=0,m,k;F(f.rotation)||(y.rotation=f.rotation||0);e(c,function(a){(a=d[a])&&a.labelLength>x&&(x=a.labelLength)});this.maxLabelLength=x;if(this.autoRotation)x>g&&x>h.h?y.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(A={width:g+"px"},!I))for(A.textOverflow="clip",m=c.length;!q&&m--;)if(k=c[m],g=d[k].label)g.styles&&"ellipsis"===g.styles.textOverflow?g.css({textOverflow:"clip"}):d[k].labelLength> +u&&g.css({width:u+"px"}),g.getBBox().height>this.len/c.length-(h.h-h.f)&&(g.specCss={textOverflow:"ellipsis"});y.rotation&&(A={width:(x>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},I||(A.textOverflow="ellipsis"));if(this.labelAlign=f.align||this.autoLabelAlign(this.labelRotation))y.align=this.labelAlign;e(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(y),A&&b.css(n(A,b.specCss)),delete b.specCss,a.rotation=y.rotation)});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,0!==this.side)}, +hasData:function(){return this.hasVisibleSeries||t(this.min)&&t(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,f=a.tickPositions,q=a.ticks,u=a.horiz,n=a.side,g=b.inverted?[1,0,3,2][n]:n,y,h,I=0,A,m=0,k=d.title,F=d.labels,E=0,l=a.opposite,C=b.axisOffset,b=b.clipOffset,p=[-1,1,1,-1][n],r,J=d.className,w=a.axisParent,B=this.tickSize("tick");y=a.hasData();a.showAxis=h=y||x(d.showEmpty,!0);a.staggerLines=a.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(J||"")).add(w),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(J||"")).add(w),a.labelGroup=c.g("axis-labels").attr({zIndex:F.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(J||"")).add(w));if(y||a.isLinked)e(f,function(b){q[b]?q[b].addLabel():q[b]=new M(a,b)}),a.renderUnsquish(),!1===F.reserveSpace||0!==n&&2!==n&&{1:"left",3:"right"}[n]!== +a.labelAlign&&"center"!==a.labelAlign||e(f,function(a){E=Math.max(q[a].getLabelSize(),E)}),a.staggerLines&&(E*=a.staggerLines,a.labelOffset=E*(a.opposite?-1:1));else for(r in q)q[r].destroy(),delete q[r];k&&k.text&&!1!==k.enabled&&(a.axisTitle||((r=k.textAlign)||(r=(u?{low:"left",middle:"center",high:"right"}:{low:l?"right":"left",middle:"center",high:l?"left":"right"})[k.align]),a.axisTitle=c.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:r}).addClass("highcharts-axis-title").css(k.style).add(a.axisGroup), +a.axisTitle.isNew=!0),h&&(I=a.axisTitle.getBBox()[u?"height":"width"],A=k.offset,m=t(A)?0:x(k.margin,u?5:10)),a.axisTitle[h?"show":"hide"](!0));a.renderLine();a.offset=p*x(d.offset,C[n]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===n?-a.labelMetrics().h:2===n?a.tickRotCorr.y:0;m=Math.abs(E)+m;E&&(m=m-c+p*(u?x(F.y,a.tickRotCorr.y+8*p):F.x));a.axisTitleMargin=x(A,m);C[n]=Math.max(C[n],a.axisTitleMargin+I+p*a.offset,m,y&&f.length&&B?B[0]:0);d=d.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[g]= +Math.max(b[g],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,f=this.horiz,e=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:e,f?d:this.top,"L",f?b.chartWidth-this.right:e,f?d:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor, +"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,f=this.options.title,e=a?b:c,q=this.opposite,u=this.offset,n=f.x||0,g=f.y||0,y=this.chart.renderer.fontMetrics(f.style&&f.style.fontSize,this.axisTitle).f,d={low:e+(a?0:d),middle:e+d/2,high:e+(a?d:0)}[f.align],b=(a?c+this.height:b)+(a?1:-1)*(q?-1:1)*this.axisTitleMargin+(2===this.side?y:0);return{x:a?d+n:b+(q?this.width:0)+u+n,y:a?b+g-(q?this.height:0)+u:d+g}},render:function(){var a= +this,b=a.chart,d=b.renderer,f=a.options,q=a.isLog,u=a.lin2log,n=a.isLinked,g=a.tickPositions,y=a.axisTitle,h=a.ticks,A=a.minorTicks,x=a.alternateBands,m=f.stackLabels,k=f.alternateGridColor,F=a.tickmarkOffset,E=a.axisLine,l=b.hasRendered&&c(a.oldMin),C=a.showAxis,p=B(d.globalAnimation),r,t;a.labelEdge.length=0;a.overlap=!1;e([h,A,x],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||n)a.minorTickInterval&&!a.categories&&e(a.getMinorTickPositions(),function(b){A[b]||(A[b]=new M(a,b,"minor")); +l&&A[b].isNew&&A[b].render(null,!0);A[b].render(null,!1,1)}),g.length&&(e(g,function(b,c){if(!n||b>=a.min&&b<=a.max)h[b]||(h[b]=new M(a,b)),l&&h[b].isNew&&h[b].render(c,!0,.1),h[b].render(c)}),F&&(0===a.min||a.single)&&(h[-1]||(h[-1]=new M(a,-1,null,!0)),h[-1].render(-1))),k&&e(g,function(c,d){t=void 0!==g[d+1]?g[d+1]+F:a.max-F;0===d%2&&c=e.second?0:A*Math.floor(c.getMilliseconds()/A));if(n>=e.second)c[B.hcSetSeconds](n>=e.minute?0:A*Math.floor(c.getSeconds()/ +A));if(n>=e.minute)c[B.hcSetMinutes](n>=e.hour?0:A*Math.floor(c[B.hcGetMinutes]()/A));if(n>=e.hour)c[B.hcSetHours](n>=e.day?0:A*Math.floor(c[B.hcGetHours]()/A));if(n>=e.day)c[B.hcSetDate](n>=e.month?1:A*Math.floor(c[B.hcGetDate]()/A));n>=e.month&&(c[B.hcSetMonth](n>=e.year?0:A*Math.floor(c[B.hcGetMonth]()/A)),g=c[B.hcGetFullYear]());if(n>=e.year)c[B.hcSetFullYear](g-g%A);if(n===e.week)c[B.hcSetDate](c[B.hcGetDate]()-c[B.hcGetDay]()+m(f,1));g=c[B.hcGetFullYear]();f=c[B.hcGetMonth]();var C=c[B.hcGetDate](), +y=c[B.hcGetHours]();if(B.hcTimezoneOffset||B.hcGetTimezoneOffset)x=(!q||!!B.hcGetTimezoneOffset)&&(k-h>4*e.month||t(h)!==t(k)),c=c.getTime(),c=new B(c+t(c));q=c.getTime();for(h=1;qr&&(!t||b<=w)&&void 0!==b&&h.push(b),b>w&&(q=!0),b=d;else r=e(r),w= +e(w),a=k[t?"minorTickInterval":"tickInterval"],a=p("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(t?5:1)*(w-r)/((t?m/this.tickPositions.length:m)||1)),a=H(a,null,B(a)),h=G(this.getLinearTickPositions(a,r,w),g),t||(this._minorAutoInterval=a/5);t||(this.tickInterval=a);return h};D.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};D.prototype.lin2log=function(a){return Math.pow(10,a)}})(N);(function(a){var D=a.dateFormat,B=a.each,G=a.extend,H=a.format,p=a.isNumber,l=a.map,r= +a.merge,w=a.pick,t=a.splat,k=a.stop,m=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){B(this.chart.series,function(e){var g=e&&e.tt;g&&(!g.isActive||a?e.tt=g.destroy():g.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label|| +(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,r(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart, +!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,m,f){var d=this,b=d.now,q=!1!==d.options.animation&&!d.isHidden&&(1h-q?h:h-q);else if(v)b[a]=Math.max(g,e+q+f>c?e:e+q);else return!1},x=function(a,c,f,e){var q;ec-d?q=!1:b[a]=ec-f/2?c-f-2:e-f/2;return q},k=function(a){var b=c;c=h;h=b;g=a},y=function(){!1!==A.apply(0,c)?!1!==x.apply(0,h)||g||(k(!0),y()):g?b.x=b.y=0:(k(!0),y())};(f.inverted||1y&&(q=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=d.plotTop;f.push({target:e.isHeader?d.plotHeight+c:a,rank:e.isHeader?1:0,size:n.tt.getBBox().height+1,point:e,x:y,tt:A})});this.cleanSplit(); +a.distribute(f,d.plotHeight+c);B(f,function(a){var b=a.point;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:q||b.isHeader?a.x:b.plotX+d.plotLeft+w(m.distance,16),y:a.pos+d.plotTop,anchorX:b.plotX+d.plotLeft,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+d.plotTop})})},updatePosition:function(a){var e=this.chart,g=this.getLabel(),g=(this.options.positioner||this.getPosition).call(this,g.width,g.height,a);this.move(Math.round(g.x),Math.round(g.y||0),a.plotX+e.plotLeft,a.plotY+e.plotTop)}, +getXDateFormat:function(a,h,m){var f;h=h.dateTimeLabelFormats;var d=m&&m.closestPointRange,b,q={millisecond:15,second:12,minute:9,hour:6,day:3},g,c="millisecond";if(d){g=D("%m-%d %H:%M:%S.%L",a.x);for(b in e){if(d===e.week&&+D("%w",a.x)===m.options.startOfWeek&&"00:00:00.000"===g.substr(6)){b="week";break}if(e[b]>d){b=c;break}if(q[b]&&g.substr(q[b])!=="01-01 00:00:00.000".substr(q[b]))break;"week"!==b&&(c=b)}b&&(f=h[b])}else f=h.day;return f||h.year},tooltipFooterHeaderFormatter:function(a,e){var g= +e?"footer":"header";e=a.series;var f=e.tooltipOptions,d=f.xDateFormat,b=e.xAxis,q=b&&"datetime"===b.options.type&&p(a.key),g=f[g+"Format"];q&&!d&&(d=this.getXDateFormat(a,f,b));q&&d&&(g=g.replace("{point.key}","{point.key:"+d+"}"));return H(g,{point:a,series:e})},bodyFormatter:function(a){return l(a,function(a){var e=a.series.tooltipOptions;return(e.pointFormatter||a.point.tooltipFormatter).call(a.point,e.pointFormat)})}}})(N);(function(a){var D=a.addEvent,B=a.attr,G=a.charts,H=a.color,p=a.css,l= +a.defined,r=a.doc,w=a.each,t=a.extend,k=a.fireEvent,m=a.offset,e=a.pick,g=a.removeEvent,h=a.splat,C=a.Tooltip,f=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};C&&b.tooltip.enabled&&(a.tooltip=new C(a,b.tooltip),this.followTouchMove=e(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart, +f=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(f=e(d.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,b){var d,e;a=a||f.event;a.target||(a.target=a.srcElement);e=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));void 0===e.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=e.pageX-b.left,b=e.pageY-b.top);return t(a,{chartX:Math.round(d), +chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};w(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},runPointActions:function(d){var b=this.chart,f=b.series,g=b.tooltip,c=g?g.shared:!1,h=!0,n=b.hoverPoint,m=b.hoverSeries,x,k,y,u=[],I;if(!c&&!m)for(x=0;xb.series.index?-1:1}));if(c)for(x=u.length;x--;)(u[x].x!==u[0].x||u[x].series.noSharedTooltip)&&u.splice(x,1);if(u[0]&&(u[0]!==this.prevKDPoint||g&&g.isHidden)){if(c&& +!u[0].series.noSharedTooltip){for(x=0;xh+k&&(f=h+k),cm+y&&(c=m+y),this.hasDragged=Math.sqrt(Math.pow(l-f,2)+Math.pow(v-c,2)),10x.max&&(l=x.max-c,v=!0);v?(u-=.8*(u-g[f][0]),J||(M-=.8*(M-g[f][1])),p()):g[f]=[u,M];A||(e[f]=F-E,e[q]=c);e=A?1/n:n;m[q]=c;m[f]=l;k[A?a?"scaleY":"scaleX":"scale"+d]=n;k["translate"+d]=e* +E+(u-e*y)},pinch:function(a){var r=this,t=r.chart,k=r.pinchDown,m=a.touches,e=m.length,g=r.lastValidTouch,h=r.hasZoom,C=r.selectionMarker,f={},d=1===e&&(r.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||r.runChartClick),b={};1b-6&&n(u||d.chartWidth- +2*x-v-e.x)&&(this.itemX=v,this.itemY+=p+this.lastLineHeight+I,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,c);this.lastItemY=p+this.itemY+I;this.lastLineHeight=Math.max(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=p+g+I,this.lastLineHeight=g);this.offsetWidth=u||Math.max((f?this.itemX-v-l:c)+x,this.offsetWidth)},getAllItems:function(){var a=[];l(this.chart.series,function(d){var b=d&&d.options;d&&m(b.showInLegend,p(b.linkedTo)? +!1:void 0,!0)&&(a=a.concat(d.legendItems||("point"===b.legendType?d.data:d)))});return a},adjustMargins:function(a,d){var b=this.chart,e=this.options,f=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||l([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(c,g){c.test(f)&&!p(a[g])&&(b[t[g]]=Math.max(b[t[g]],b.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*e[g%2?"x":"y"]+m(e.margin,12)+d[g]))})},render:function(){var a=this,d=a.chart,b=d.renderer, +e=a.group,h,c,m,n,k=a.box,x=a.options,p=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=b.g("legend").attr({zIndex:7}).add(),a.contentGroup=b.g().attr({zIndex:1}).add(e),a.scrollGroup=b.g().add(a.contentGroup));a.renderTitle();h=a.getAllItems();g(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});x.reversed&&h.reverse();a.allItems=h;a.display=c=!!h.length;a.lastLineHeight=0;l(h,function(b){a.renderItem(b)}); +m=(x.width||a.offsetWidth)+p;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=p;k||(a.box=k=b.rect().addClass("highcharts-legend-box").attr({r:x.borderRadius}).add(e),k.isNew=!0);k.attr({stroke:x.borderColor,"stroke-width":x.borderWidth||0,fill:x.backgroundColor||"none"}).shadow(x.shadow);0b&&!1!==h.enabled?(this.clipHeight=g=Math.max(b-20-this.titleHeight-I,0),this.currentPage=m(this.currentPage,1),this.fullHeight=a,l(v,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var d=u.length;if(!d||c-u[d-1]>g&&(r||c)!==u[d-1])u.push(r||c),d++;b===v.length-1&&c+a-u[d-1]>g&&u.push(c);c!==r&&(r=c)}),n||(n=d.clipRect= +e.clipRect(0,I,9999,0),d.contentGroup.clip(n)),t(g),y||(this.nav=y=e.g().attr({zIndex:1}).add(this.group),this.up=e.symbol("triangle",0,0,p,p).on("click",function(){d.scroll(-1,k)}).add(y),this.pager=e.text("",15,10).addClass("highcharts-legend-navigation").css(h.style).add(y),this.down=e.symbol("triangle-down",0,0,p,p).on("click",function(){d.scroll(1,k)}).add(y)),d.scroll(0),a=b):y&&(t(),y.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,d){var b=this.pages, +f=b.length;a=this.currentPage+a;var g=this.clipHeight,c=this.options.navigation,h=this.pager,n=this.padding;a>f&&(a=f);0f&&(g=typeof a[0],"string"===g?e.name=a[0]:"number"===g&&(e.x=a[0]),d++);b=h.value;)h=e[++g];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),H(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this), +this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(g in this)this[g]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,g= +e.tooltipOptions,h=t(g.valueDecimals,""),k=g.valuePrefix||"",f=g.valueSuffix||"";B(e.pointArrayMap||["y"],function(d){d="{point."+d;if(k||f)a=a.replace(d+"}",k+d+"}"+f);a=a.replace(d+"}",d+":,."+h+"f}")});return l(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var h=this,k=this.series.options;(k.point.events[a]||h.options&&h.options.events&&h.options.events[a])&&this.importEvents();"click"===a&&k.allowPointSelect&&(g=function(a){h.select&&h.select(null,a.ctrlKey||a.metaKey||a.shiftKey)}); +p(this,a,e,g)},visible:!0}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.correctFloat,l=a.Date,r=a.defaultOptions,w=a.defaultPlotOptions,t=a.defined,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.fireEvent,C=a.grep,f=a.isArray,d=a.isNumber,b=a.isString,q=a.merge,E=a.pick,c=a.removeEvent,F=a.splat,n=a.stableSort,A=a.SVGElement,x=a.syncTimeout,J=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, +marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1, +marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var c=this,d,e,f=a.series,u,y=function(a,b){return E(a.options.index,a._i)-E(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();g(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0=== +b.selected});e=b.events;for(d in e)D(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();k(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(u=f[f.length-1]);c._i=E(u&&u._i,-1)+1;f.push(c);n(f,y);this.yAxis&&n(this.yAxis.series,y);k(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart, +d;k(a.axisTypes||[],function(f){k(c[f],function(c){d=c.options;if(b[f]===d.index||void 0!==b[f]&&b[f]===d.id||void 0===b[f]&&0===d.index)c.series.push(a),a[f]=c,c.isDirty=!0});a[f]||a.optionalAxis===f||e(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,e=arguments,f=d(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(e,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options, +b=this.xIncrement,c,d=a.pointIntervalUnit,b=E(b,a.pointStart,0);this.pointInterval=c=E(this.pointInterval,a.pointInterval,1);d&&(a=new l(b),"day"===d?a=+a[l.hcSetDate](a[l.hcGetDate]()+c):"month"===d?a=+a[l.hcSetMonth](a[l.hcGetMonth]()+c):"year"===d&&(a=+a[l.hcSetFullYear](a[l.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=q(e,c.series,a);this.tooltipOptions= +q(r.tooltip,r.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===e.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&t(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor}); +return c},getCyclic:function(a,b,c){var d,e=this.userOptions,f=a+"Index",g=a+"Counter",u=c?c.length:E(this.chart.options.chart[a+"Count"],this.chart[a+"Count"]);b||(d=E(e[f],e["_"+f]),t(d)||(e["_"+f]=d=this.chart[g]%u,this.chart[g]+=1),c&&(b=c[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||w[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol, +this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(a,c,g,n){var u=this,q=u.points,h=q&&q.length||0,y,m=u.options,x=u.chart,A=null,I=u.xAxis,l=m.turboThreshold,p=this.xData,r=this.yData,F=(y=u.pointArrayMap)&&y.length;a=a||[];y=a.length;c=E(c,!0);if(!1!==n&&y&&h===y&&!u.cropped&&!u.hasGroupedData&&u.visible)k(a,function(a,b){q[b].update&&a!==m.data[b]&&q[b].update(a,!1,null,!1)});else{u.xIncrement=null;u.colorCounter=0;k(this.parallelArrays,function(a){u[a+ +"Data"].length=0});if(l&&y>l){for(g=0;null===A&&gh||this.forceCrop))if(b[d-1]l)b=[],c=[];else if(b[0]l)f=this.cropData(this.xData,this.yData,A,l),b=f.xData,c=f.yData,f=f.start,g=!0;for(h=b.length||1;--h;)d=x?y(b[h])-y(b[h-1]):b[h]-b[h-1],0d&&this.requireSorting&&e(15);this.cropped=g;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=n},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,n=E(this.cropShoulder,1),u;for(u=0;u=c){f=Math.max(0,u- +n);break}for(c=u;cd){g=c+n;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,n=this.cropStart||0,q,h=this.hasGroupedData,k,m=[],x;b||h||(b=[],b.length=a.length,b=this.data=b);for(x=0;x=q&&(c[x-1]||k)<=h,y&&k)if(y=m.length)for(;y--;)null!==m[y]&&(g[n++]=m[y]);else g[n++]=m;this.dataMin=H(g);this.dataMax=G(g)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,e=c.categories,f=this.yAxis,g=this.points,n=g.length,q=!!this.modifyValue,h=a.pointPlacement,k="between"===h||d(h),m=a.threshold,x=a.startFromThreshold?m:0,A,l,r,F,J=Number.MAX_VALUE;"between"===h&&(h=.5);d(h)&&(h*=E(a.pointRange||c.pointRange)); +for(a=0;a=B&&(C.isNull=!0);C.plotX=A=p(Math.min(Math.max(-1E5,c.translate(w,0,0,0,1,h,"flags"===this.type)),1E5));b&&this.visible&&!C.isNull&&D&&D[w]&&(F=this.getStackIndicator(F,w,this.index),G=D[w],B=G.points[F.key],l=B[0],B=B[1],l===x&&F.key===D[w].base&&(l=E(m,f.min)),f.isLog&&0>=l&&(l=null),C.total=C.stackTotal=G.total,C.percentage=G.total&&C.y/G.total*100,C.stackY= +B,G.setOffset(this.pointXOffset||0,this.barW||0));C.yBottom=t(l)?f.translate(l,0,1,0,1):null;q&&(B=this.modifyValue(B,C));C.plotY=l="number"===typeof B&&Infinity!==B?Math.min(Math.max(-1E5,f.translate(B,0,1,0,1)),1E5):void 0;C.isInside=void 0!==l&&0<=l&&l<=f.len&&0<=A&&A<=c.len;C.clientX=k?p(c.translate(w,0,0,0,1,h)):A;C.negative=C.y<(m||0);C.category=e&&void 0!==e[C.x]?e[C.x]:C.x;C.isNull||(void 0!==r&&(J=Math.min(J,Math.abs(A-r))),r=A)}this.closestPointRangePx=J},getValidPoints:function(a,b){var c= +this.chart;return C(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,n=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(),q=b[n],h=b[n+"m"];q||(a&&(g.width=0,b[n+"m"]=h=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[n]=q=d.clipRect(g),q.count={length:0});a&&!q.count[this.index]&& +(q.count[this.index]=!0,q.count.length+=1);!1!==c.clip&&(this.group.clip(a||f?q:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=n);a||(q.count[this.index]&&(delete q.count[this.index],--q.count.length),0===q.count.length&&n&&b[n]&&(f||(b[n]=b[n].destroy()),b[n+"m"]&&(b[n+"m"]=b[n+"m"].destroy())))},animate:function(a){var b=this.chart,c=B(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+ +99},c),this.animate=null)},afterAnimate:function(){this.setClip();h(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,e,f,g,n=this.options.marker,q,h,k,m,x=this.markerGroup,A=E(n.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>2*n.radius);if(!1!==n.enabled||this._hasPointMarkers)for(e=a.length;e--;)f=a[e],c=f.plotY,g=f.graphic,q=f.marker||{},h=!!f.marker,k=A&&void 0===q.enabled||q.enabled,m=f.isInside,k&&d(c)&&null!==f.y?(c=E(q.symbol,this.symbol),f.hasImage= +0===c.indexOf("url"),k=this.markerAttribs(f,f.selected&&"select"),g?g[m?"show":"hide"](!0).animate(k):m&&(0e&&b.shadow));g&&(g.startX=c.xMap, +g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],n,q=this.graph,h=this.area,m=Math.max(b.chartWidth,b.chartHeight),x=this[(this.zoneAxis||"y")+"Axis"],A,l,p=b.inverted,r,F,C,t,J=!1;d.length&&(q||h)&&x&&void 0!==x.min&&(l=x.reversed,r=x.horiz,q&&q.hide(),h&&h.hide(),A=x.getExtremes(),k(d,function(d,u){e=l?r?b.plotWidth:0:r?0:x.toPixels(A.min);e=Math.min(Math.max(E(f,e),0),m);f=Math.min(Math.max(Math.round(x.toPixels(E(d.value,A.max), +!0)),0),m);J&&(e=f=x.toPixels(A.max));F=Math.abs(e-f);C=Math.min(e,f);t=Math.max(e,f);x.isXAxis?(n={x:p?t:C,y:0,width:F,height:m},r||(n.x=b.plotHeight-n.x)):(n={x:0,y:p?t:C,width:m,height:F},r&&(n.y=b.plotWidth-n.y));p&&c.isVML&&(n=x.isXAxis?{x:0,y:l?C:t,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});g[u]?g[u].animate(n):(g[u]=c.clipRect(n),q&&a["zone-graph-"+u].clip(g[u]),h&&a["zone-area-"+u].clip(g[u]));J=d.value>A.max}),this.clips= +g)},invertGroups:function(a){function b(){var b={width:c.yAxis.len,height:c.xAxis.len};k(["group","markerGroup"],function(d){c[d]&&c[d].attr(b).invert(a)})}var c=this,d;c.xAxis&&(d=D(c.chart,"resize",b),D(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(e),f.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className|| +"")));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=!!a.animate&&b.renderer.isSVG&&B(d.animation).duration,f=a.visible?"inherit":"hidden",g=d.zIndex,n=a.hasRendered,q=b.seriesGroup,h=b.inverted;c=a.plotGroup("group","series",f,g,q);a.markerGroup= +a.plotGroup("markerGroup","markers",f,g,q);e&&a.animate(!0);c.inverted=a.isCartesian?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);!1===d.clip||a.sharedClipKey||n||c.clip(b.clipRect);e&&a.animate();n||(a.animationTimeout=x(function(){a.afterAnimate()},e));a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty|| +this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:E(d&&d.left,a.plotLeft),translateY:E(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)}, +buildKDTree:function(){function a(c,d,e){var f,g;if(g=c&&c.length)return f=b.kdAxisArray[d%e],c.sort(function(a,b){return a[f]-b[f]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,e),right:a(c.slice(g+1),d+1,e)}}var b=this,c=b.kdDimensions;delete b.kdTree;x(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,n,q){var h=b.point,u=d.kdAxisArray[n%q],k,m,x=h;m=t(a[e])&&t(h[e])?Math.pow(a[e]-h[e],2):null;k=t(a[f])&& +t(h[f])?Math.pow(a[f]-h[f],2):null;k=(m||0)+(k||0);h.dist=t(k)?Math.sqrt(k):Number.MAX_VALUE;h.distX=t(m)?Math.sqrt(m):Number.MAX_VALUE;u=a[u]-h[u];k=0>u?"left":"right";m=0>u?"right":"left";b[k]&&(k=c(a,b[k],n+1,q),x=k[g]A;)l--;this.updateParallelArrays(h,"splice",l,0,0);this.updateParallelArrays(h,l);n&&h.name&&(n[A]=h.name);q.splice(l,0,a);m&&(this.data.splice(l,0,null),this.processData());"point"===c.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(h,"shift"),q.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(e)},removePoint:function(a, +b,d){var c=this,e=c.data,f=e[a],g=c.points,n=c.chart,h=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&n.redraw()};q(d,n);b=C(b,!0);f?f.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){e.destroy();f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();C(a,!0)&&f.redraw(b)}var e=this,f=e.chart;!1!==d?k(e,"remove",null,c):c()},update:function(a, +d){var c=this,e=this.chart,f=this.userOptions,g=this.type,q=a.type||f.type||e.options.chart.type,u=b[g].prototype,m=["group","markerGroup","dataLabelsGroup"],k;if(q&&q!==g||void 0!==a.zIndex)m.length=0;r(m,function(a){m[a]=c[a];delete c[a]});a=h(f,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1,null,!1);for(k in u)this[k]=void 0;t(this,b[q||g].prototype);r(m,function(a){c[a]=m[a]});this.init(e,a);e.linkSeries();C(d,!0)&&e.redraw(!1)}});t(G.prototype, +{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,t(a,{events:void 0}));c.isDirtyBox=!0;C(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);w(b.axes,this);w(b[c],this);b.options[c].splice(this.options.index,1);r(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;C(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a}, +b)},setCategories:function(a,b){this.update({categories:a},b)}})})(N);(function(a){var D=a.color,B=a.each,G=a.map,H=a.pick,p=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],l=[],p=this.xAxis,k=this.yAxis,m=k.stacks[this.stackKey],e={},g=this.points,h=this.index,C=k.series,f=C.length,d,b=H(k.options.reversedStacks,!0)?1:-1,q,E;if(this.options.stacking){for(q=0;qa&&t>l?(t=Math.max(a,l),m=2*l-t):tH&& +m>l?(m=Math.max(H,l),t=2*l-m):m=Math.abs(g)&&.5a.closestPointRange*a.xAxis.transA,k=a.borderWidth=r(h.borderWidth,k?0:1),f=a.yAxis,d=a.translatedThreshold=f.getThreshold(h.threshold),b=r(h.minPointLength,5),q=a.getColumnMetrics(),m=q.width,c=a.barW=Math.max(m,1+2*k),l=a.pointXOffset= +q.offset;g.inverted&&(d-=.5);h.pointPadding&&(c=Math.ceil(c));w.prototype.translate.apply(a);G(a.points,function(e){var n=r(e.yBottom,d),q=999+Math.abs(n),q=Math.min(Math.max(-q,e.plotY),f.len+q),h=e.plotX+l,k=c,u=Math.min(q,n),p,t=Math.max(q,n)-u;Math.abs(t)b?n-b:d-(p?b:0));e.barX=h;e.pointWidth=m;e.tooltipPos=g.inverted?[f.len+f.pos-g.plotLeft-q,a.xAxis.len-h-k/2,t]:[h+k/2,q+f.pos-g.plotTop,t];e.shapeType="rect";e.shapeArgs= +a.crispCol.apply(a,e.isNull?[e.plotX,f.len/2,0,0]:[h,u,k,t])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,g){var e=this.options,k=this.pointAttrToOptions||{},f=k.stroke||"borderColor",d=k["stroke-width"]||"borderWidth",b=a&&a.color||this.color,q=a[f]||e[f]||this.color||b,k=e.dashStyle,m;a&&this.zones.length&&(b=(b=a.getZone())&&b.color||a.options.color|| +this.color);g&&(g=e.states[g],m=g.brightness,b=g.color||void 0!==m&&B(b).brighten(g.brightness).get()||b,q=g[f]||q,k=g.dashStyle||k);a={fill:b,stroke:q,"stroke-width":a[d]||e[d]||this[d]||0};e.borderRadius&&(a.r=e.borderRadius);k&&(a.dashstyle=k);return a},drawPoints:function(){var a=this,g=this.chart,h=a.options,m=g.renderer,f=h.animationLimit||250,d;G(a.points,function(b){var e=b.graphic;p(b.plotY)&&null!==b.y?(d=b.shapeArgs,e?(k(e),e[g.pointCountt;++t)k=r[t],a=2>t||2===t&&/%$/.test(k),r[t]=B(k,[l,H,w,r[2]][t])+(a?p:0);r[3]>r[2]&&(r[3]=r[2]);return r}}})(N);(function(a){var D=a.addEvent,B=a.defined,G=a.each,H=a.extend,p=a.inArray,l=a.noop,r=a.pick,w=a.Point,t=a.Series,k=a.seriesType,m=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y? +void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,h=e.points,k=e.startAngleRad;a||(G(h,function(a){var d= +a.graphic,b=a.shapeArgs;d&&(d.attr({r:a.startR||e.center[3]/2,start:k,end:k}),d.animate({r:b.r,start:b.start,end:b.end},e.options.animation))}),e.animate=null)},updateTotals:function(){var a,g=0,h=this.points,k=h.length,f,d=this.options.ignoreHiddenPoint;for(a=0;af.y&&(f.y=null),g+=d&&!f.visible?0:f.y;this.total=g;for(a=0;a1.5*Math.PI?q-=2*Math.PI:q<-Math.PI/2&&(q+=2*Math.PI);t.slicedTranslation={translateX:Math.round(Math.cos(q)*k),translateY:Math.round(Math.sin(q)*k)};d=Math.cos(q)*a[2]/2;b=Math.sin(q)*a[2]/2;t.tooltipPos=[a[0]+.7*d,a[1]+.7*b];t.half=q<-Math.PI/2||q>Math.PI/2?1:0;t.angle=q;f=Math.min(f,n/5);t.labelPos=[a[0]+d+Math.cos(q)*n,a[1]+b+Math.sin(q)*n,a[0]+d+Math.cos(q)*f,a[1]+b+Math.sin(q)* +f,a[0]+d,a[1]+b,0>n?"center":t.half?"right":"left",q]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,h,k,f,d,b=a.options.shadow;b&&!a.shadowGroup&&(a.shadowGroup=g.g("shadow").add(a.group));G(a.points,function(e){if(null!==e.y){k=e.graphic;d=e.shapeArgs;h=e.sliced?e.slicedTranslation:{};var q=e.shadowGroup;b&&!q&&(q=e.shadowGroup=g.g("shadow").add(a.shadowGroup));q&&q.attr(h);f=a.pointAttribs(e,e.selected&&"select");k?k.setRadialReference(a.center).attr(f).animate(H(d,h)):(e.graphic= +k=g[e.shapeType](d).addClass(e.getClassName()).setRadialReference(a.center).attr(h).add(a.group),e.visible||k.attr({visibility:"hidden"}),k.attr(f).attr({"stroke-linejoin":"round"}).shadow(b,q))}})},searchPoint:l,sortByAngle:function(a,g){a.sort(function(a,e){return void 0!==a.angle&&(e.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:l},{init:function(){w.prototype.init.apply(this,arguments);var a=this,g;a.name=r(a.name,"Slice"); +g=function(e){a.slice("select"===e.type)};D(a,"select",g);D(a,"unselect",g);return a},setVisible:function(a,g){var e=this,k=e.series,f=k.chart,d=k.options.ignoreHiddenPoint;g=r(g,d);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,k.options.data[p(e,k.data)]=e.options,G(["graphic","dataLabel","connector","shadowGroup"],function(b){if(e[b])e[b][a?"show":"hide"](!0)}),e.legendItem&&f.legend.colorizeItem(e,a),a||"hover"!==e.state||e.setState(""),d&&(k.isDirty=!0),g&&f.redraw())}, +slice:function(a,g,h){var e=this.series;m(h,e.chart);r(g,!0);this.sliced=this.options.sliced=a=B(a)?a:!this.sliced;e.options.data[p(this,e.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(N);(function(a){var D= +a.addEvent,B=a.arrayMax,G=a.defined,H=a.each,p=a.extend,l=a.format,r=a.map,w=a.merge,t=a.noop,k=a.pick,m=a.relativeLength,e=a.Series,g=a.seriesTypes,h=a.stableSort,C=a.stop;a.distribute=function(a,d){function b(a,b){return a.target-b.target}var e,f=!0,c=a,g=[],n;n=0;for(e=a.length;e--;)n+=a[e].size;if(n>d){h(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(n=e=0;n<=d;)n+=a[e].size,e++;g=a.splice(e-1,a.length)}h(a,b);for(a=r(a,function(a){return{size:a.size,targets:[a.target]}});f;){for(e=a.length;e--;)f= +a[e],n=(Math.min.apply(0,f.targets)+Math.max.apply(0,f.targets))/2,f.pos=Math.min(Math.max(0,n-f.size/2),d-f.size);e=a.length;for(f=!1;e--;)0a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>d&&(a[e-1].pos=d-a[e-1].size),a.splice(e,1),f=!0)}e=0;H(a,function(a){var b=0;H(a.targets,function(){c[e].pos=a.pos+b;b+=c[e].size;e++})});c.push.apply(c,g);h(c,b)};e.prototype.drawDataLabels=function(){var a=this,d=a.options, +b=d.dataLabels,e=a.points,g,c,h=a.hasRendered||0,n,m,x=k(b.defer,!0),r=a.chart.renderer;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),m=a.plotGroup("dataLabelsGroup","data-labels",x&&!h?"hidden":"visible",b.zIndex||6),x&&(m.attr({opacity:+h}),h||D(a,"afterAnimate",function(){a.visible&&m.show(!0);m[d.animation?"animate":"attr"]({opacity:1},{duration:200})})),c=b,H(e,function(e){var f,q=e.dataLabel,h,x,A=e.connector,y=!0,t,z={};g=e.dlOptions||e.options&&e.options.dataLabels; +f=k(g&&g.enabled,c.enabled)&&null!==e.y;if(q&&!f)e.dataLabel=q.destroy();else if(f){b=w(c,g);t=b.style;f=b.rotation;h=e.getLabelConfig();n=b.format?l(b.format,h):b.formatter.call(h,b);t.color=k(b.color,t.color,a.color,"#000000");if(q)G(n)?(q.attr({text:n}),y=!1):(e.dataLabel=q=q.destroy(),A&&(e.connector=A.destroy()));else if(G(n)){q={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:f,padding:b.padding,zIndex:1};"contrast"===t.color&&(z.color=b.inside|| +0>b.distance||d.stacking?r.getContrast(e.color||a.color):"#000000");d.cursor&&(z.cursor=d.cursor);for(x in q)void 0===q[x]&&delete q[x];q=e.dataLabel=r[f?"text":"label"](n,0,-9999,b.shape,null,null,b.useHTML,null,"data-label").attr(q);q.addClass("highcharts-data-label-color-"+e.colorIndex+" "+(b.className||""));q.css(p(t,z));q.add(m);q.shadow(b.shadow)}q&&a.alignDataLabel(e,q,b,null,y)}})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,f=c.inverted,n=k(a.plotX,-9999),q=k(a.plotY, +-9999),h=d.getBBox(),m,l=b.rotation,u=b.align,r=this.visible&&(a.series.forceDL||c.isInsidePlot(n,Math.round(q),f)||e&&c.isInsidePlot(n,f?e.x+1:e.y+e.height-1,f)),t="justify"===k(b.overflow,"justify");r&&(m=b.style.fontSize,m=c.renderer.fontMetrics(m,d).b,e=p({x:f?c.plotWidth-q:n,y:Math.round(f?c.plotHeight-n:q),width:0,height:0},e),p(b,{width:h.width,height:h.height}),l?(t=!1,f=c.renderer.rotCorr(m,l),f={x:e.x+b.x+e.width/2+f.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g? +"attr":"animate"](f).attr({align:u}),n=(l+720)%360,n=180n,"left"===u?f.y-=n?h.height:0:"center"===u?(f.x-=h.width/2,f.y-=h.height/2):"right"===u&&(f.x-=h.width,f.y-=n?0:h.height)):(d.align(b,null,e),f=d.alignAttr),t?this.justifyDataLabel(d,b,f,h,e,g):k(b.crop,!0)&&(r=c.isInsidePlot(f.x,f.y)&&c.isInsidePlot(f.x+h.width,f.y+h.height)),b.shape&&!l&&d.attr({anchorX:a.plotX,anchorY:a.plotY}));r||(C(d),d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,c){var f=this.chart, +n=d.align,h=d.verticalAlign,q,k,m=a.box?0:a.padding||0;q=b.x+m;0>q&&("right"===n?d.align="left":d.x=-q,k=!0);q=b.x+e.width-m;q>f.plotWidth&&("left"===n?d.align="right":d.x=f.plotWidth-q,k=!0);q=b.y+m;0>q&&("bottom"===h?d.verticalAlign="top":d.y=-q,k=!0);q=b.y+e.height-m;q>f.plotHeight&&("top"===h?d.verticalAlign="bottom":d.y=f.plotHeight-q,k=!0);k&&(a.placed=!c,a.align(d,null,g))};g.pie&&(g.pie.prototype.drawDataLabels=function(){var f=this,d=f.data,b,g=f.chart,h=f.options.dataLabels,c=k(h.connectorPadding, +10),m=k(h.connectorWidth,1),n=g.plotWidth,l=g.plotHeight,x,p=h.distance,y=f.center,u=y[2]/2,t=y[1],w=0k-2?A:P,e),v._attr={visibility:S,align:D[6]},v._pos={x:L+h.x+({left:c,right:-c}[D[6]]||0),y:P+h.y-10},D.x=L,D.y=P,null===f.options.size&&(C=v.width,L-Cn-c&&(T[1]=Math.max(Math.round(L+ +C-n+c),T[1])),0>P-G/2?T[0]=Math.max(Math.round(-P+G/2),T[0]):P+G/2>l&&(T[2]=Math.max(Math.round(P+G/2-l),T[2])))}),0===B(T)||this.verifyDataLabelOverflow(T))&&(this.placeDataLabels(),w&&m&&H(this.points,function(a){var b;x=a.connector;if((v=a.dataLabel)&&v._pos&&a.visible){S=v._attr.visibility;if(b=!x)a.connector=x=g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(f.dataLabelsGroup),x.attr({"stroke-width":m,stroke:h.connectorColor||a.color||"#666666"}); +x[b?"attr":"animate"]({d:f.connectorPath(a.labelPos)});x.attr("visibility",S)}else x&&(a.connector=x.destroy())}))},g.pie.prototype.connectorPath=function(a){var d=a.x,b=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",d+("left"===a[6]?5:-5),b,"C",d,b,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",d+("left"===a[6]?5:-5),b,"L",a[2],a[3],"L",a[4],a[5]]},g.pie.prototype.placeDataLabels=function(){H(this.points,function(a){var d=a.dataLabel;d&&a.visible&&((a=d._pos)?(d.attr(d._attr), +d[d.moved?"animate":"attr"](a),d.moved=!0):d&&d.attr({y:-9999}))})},g.pie.prototype.alignDataLabel=t,g.pie.prototype.verifyDataLabelOverflow=function(a){var d=this.center,b=this.options,e=b.center,f=b.minSize||80,c,g;null!==e[0]?c=Math.max(d[2]-Math.max(a[1],a[3]),f):(c=Math.max(d[2]-a[1]-a[3],f),d[0]+=(a[3]-a[1])/2);null!==e[1]?c=Math.max(Math.min(c,d[2]-Math.max(a[0],a[2])),f):(c=Math.max(Math.min(c,d[2]-a[0]-a[2]),f),d[1]+=(a[0]-a[2])/2);ck(this.translatedThreshold,f.yAxis.len)),m=k(b.inside,!!this.options.stacking);n&&(g=w(n),0>g.y&&(g.height+=g.y,g.y=0),n=g.y+g.height-f.yAxis.len,0a+e||c+nb+f||g+hthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&r(d,function(a){a.setState()});r("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",g=c[d],n=(b.pointRange||0)/2,h=b.getExtremes(),q=b.toValue(g-f,!0)+n,n=b.toValue(g+b.len-f,!0)-n,g=g>f;b.series.length&&(g||q>Math.min(h.dataMin,h.min))&&(!g||n=p(k.minWidth,0)&&this.chartHeight>=p(k.minHeight,0)};void 0===l._id&&(l._id=a.uniqueKey());m=m.call(this);!r[l._id]&&m?l.chartOptions&&(r[l._id]=this.currentOptions(l.chartOptions),this.update(l.chartOptions,w)):r[l._id]&&!m&&(this.update(r[l._id],w),delete r[l._id])};D.prototype.currentOptions=function(a){function p(a,m,e){var g,h;for(g in a)if(-1< +G(g,["series","xAxis","yAxis"]))for(a[g]=l(a[g]),e[g]=[],h=0;hd.length||void 0===h)return a.call(this,g,h,k,f);x=d.length;for(c=0;ck;d[c]5*b||w){if(d[c]>u){for(r=a.call(this,g,d[e],d[c],f);r.length&&r[0]<=u;)r.shift();r.length&&(u=r[r.length-1]);y=y.concat(r)}e=c+1}if(w)break}a= +r.info;if(q&&a.unitRange<=m.hour){c=y.length-1;for(e=1;ek?a-1:a;for(M=void 0;q--;)e=c[q],k=M-e,M&&k<.8*C&&(null===t||k<.8*t)?(n[y[q]]&&!n[y[q+1]]?(k=q+1,M=e):k=q,y.splice(k,1)):M=e}return y});w(B.prototype,{beforeSetTickPositions:function(){var a, +g=[],h=!1,k,f=this.getExtremes(),d=f.min,b=f.max,q,m=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,c=this.chart.options.chart.ignoreHiddenSeries;if(f||m){r(this.series,function(b,d){if(!(c&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(g=g.concat(b.processedXData),a=g.length,g.sort(function(a,b){return a-b}),a))for(d=a-1;d--;)g[d]===g[d+1]&&g.splice(d,1)});a=g.length;if(2k||b-g[g.length- +1]>k)&&(h=!0)}h?(this.ordinalPositions=g,k=this.val2lin(Math.max(d,g[0]),!0),q=Math.max(this.val2lin(Math.min(b,g[g.length-1]),!0),1),this.ordinalSlope=b=(b-d)/(q-k),this.ordinalOffset=d-k*b):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=f&&h;this.groupIntervalFactor=null},val2lin:function(a,g){var e=this.ordinalPositions;if(e){var k=e.length,f,d;for(f=k;f--;)if(e[f]===a){d=f;break}for(f=k-1;f--;)if(a>e[f]||0===f){a=(a-e[f])/(e[f+1]-e[f]);d=f+a;break}g=g?d:this.ordinalSlope* +(d||0)+this.ordinalOffset}else g=a;return g},lin2val:function(a,g){var e=this.ordinalPositions;if(e){var k=this.ordinalSlope,f=this.ordinalOffset,d=e.length-1,b;if(g)0>a?a=e[0]:a>d?a=e[d]:(d=Math.floor(a),b=a-d);else for(;d--;)if(g=k*d+f,a>=g){k=k*(d+1)+f;b=(a-g)/(k-g);break}return void 0!==b&&void 0!==e[d]?e[d]+(b?b*(e[d+1]-e[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,g=this.series[0].currentDataGrouping,h=this.ordinalIndex,k=g?g.count+g.unitName:"raw",f=this.getExtremes(), +d,b;h||(h=this.ordinalIndex={});h[k]||(d={series:[],chart:a,getExtremes:function(){return{min:f.dataMin,max:f.dataMax}},options:{ordinal:!0},val2lin:B.prototype.val2lin},r(this.series,function(e){b={xAxis:d,xData:e.xData,chart:a,destroyGroupedData:t};b.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:"open",units:[[g.unitName,[g.count]]]}:{enabled:!1}};e.processData.apply(b);d.series.push(b)}),this.beforeSetTickPositions.apply(d),h[k]=d.ordinalPositions);return h[k]},getGroupIntervalFactor:function(a, +g,h){var e;h=h.processedXData;var f=h.length,d=[];e=this.groupIntervalFactor;if(!e){for(e=0;ed?(l=p,t=e.ordinalPositions?e:p):(l=e.ordinalPositions?e:p,t=p),p=t.ordinalPositions,q>p[p.length-1]&&p.push(q),this.fixedRange=c-m,d=e.toFixedRange(null,null,n.apply(l,[x.apply(l,[m,!0])+d,!0]),n.apply(t,[x.apply(t, +[c,!0])+d,!0])),d.min>=Math.min(b.dataMin,m)&&d.max<=Math.max(q,c)&&e.setExtremes(d.min,d.max,!0,!1,{trigger:"pan"}),this.mouseDownX=k,H(this.container,{cursor:"move"})):f=!0}else f=!0;f&&a.apply(this,Array.prototype.slice.call(arguments,1))});k.prototype.gappedPath=function(){var a=this.options.gapSize,g=this.points.slice(),h=g.length-1;if(a&&0this.closestPointRange*a&&g.splice(h+1,0,{isNull:!0});return this.getGraphPath(g)}})(N);(function(a){function D(){return Array.prototype.slice.call(arguments, +1)}function B(a){a.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,G(this.pointArrayMap,["y"]))}var G=a.pick,H=a.wrap,p=a.each,l=a.extend,r=a.fireEvent,w=a.Axis,t=a.Series;l(w.prototype,{isInBreak:function(a,m){var e=a.repeat||Infinity,g=a.from,h=a.to-a.from;m=m>=g?(m-g)%e:e-(g-m)%e;return a.inclusive?m<=h:m=a)break;else if(g.isInBreak(f,a)){e-=a-f.from;break}return e};this.lin2val=function(a){var e,f;for(f=0;f=a);f++)e.toh;)m-=b;for(;mb.to||l>b.from&&db.from&&db.from&&d>b.to&&d=c[0]);A++);for(A;A<=q;A++){for(;(void 0!==c[w+1]&&a[A]>=c[w+1]||A===q)&&(l=c[w],this.dataGroupInfo={start:p,length:t[0].length},p=d.apply(this,t),void 0!==p&&(g.push(l),h.push(p),m.push(this.dataGroupInfo)),p=A,t[0]=[],t[1]=[],t[2]=[],t[3]=[],w+=1,A!==q););if(A===q)break;if(x){l=this.cropStart+A;l=e&&e[l]|| +this.pointClass.prototype.applyOptions.apply({series:this},[f[l]]);var E,C;for(E=0;Ethis.chart.plotSizeX/d||b&&f.forced)&&(e=!0);return e?d:0};G.prototype.setDataGrouping=function(a,b){var c;b=e(b,!0);a||(a={forced:!1,units:null});if(this instanceof G)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else l(this.chart.options.series,function(b){b.dataGrouping=a},!1);b&&this.chart.redraw()}})(N);(function(a){var D=a.each,B=a.Point,G=a.seriesType,H=a.seriesTypes;G("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'}, +threshold:null,states:{hover:{lineWidth:3}}},{pointArrayMap:["open","high","low","close"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:"high",pointAttribs:function(a,l){l=H.column.prototype.pointAttribs.call(this,a,l);var p=this.options;delete l.fill;l["stroke-width"]=p.lineWidth;l.stroke=a.options.color||(a.openk)););B(g,function(a,b){var d;void 0===a.plotY&&(a.x>=c.min&&a.x<=c.max?a.plotY=e.chartHeight-p.bottom-(p.opposite?p.height:0)+p.offset-e.plotTop:a.shapeArgs={});a.plotX+=t;(f=g[b-1])&&f.plotX===a.plotX&&(void 0===f.stackIndex&&(f.stackIndex=0),d=f.stackIndex+1);a.stackIndex=d})},drawPoints:function(){var a=this.points,e=this.chart,g=e.renderer,k,l,f=this.options,d=f.y,b,q,p,c,r,n,t,x=this.yAxis;for(q=a.length;q--;)p=a[q],t=p.plotX>this.xAxis.len,k=p.plotX,c=p.stackIndex,b= +p.options.shape||f.shape,l=p.plotY,void 0!==l&&(l=p.plotY+d-(void 0!==c&&c*f.stackDistance)),r=c?void 0:p.plotX,n=c?void 0:p.plotY,c=p.graphic,void 0!==l&&0<=k&&!t?(c||(c=p.graphic=g.label("",null,null,b,null,null,f.useHTML).attr(this.pointAttribs(p)).css(G(f.style,p.style)).attr({align:"flag"===b?"left":"center",width:f.width,height:f.height,"text-align":f.textAlign}).addClass("highcharts-point").add(this.markerGroup),c.shadow(f.shadow)),0h&&(e-=Math.round((l-h)/2),h=l);e=k[a](e,g,h,l);d&&f&&e.push("M",d,g>f?g:g+l,"L",d,f);return e}});p===t&&B(["flag","circlepin","squarepin"],function(a){t.prototype.symbols[a]=k[a]})})(N);(function(a){function D(a,d,e){this.init(a,d,e)}var B=a.addEvent,G=a.Axis,H=a.correctFloat,p=a.defaultOptions, +l=a.defined,r=a.destroyObjectProperties,w=a.doc,t=a.each,k=a.fireEvent,m=a.hasTouch,e=a.isTouchDevice,g=a.merge,h=a.pick,C=a.removeEvent,f=a.wrap,d={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2", +trackBorderWidth:1};p.scrollbar=g(!0,d,p.scrollbar);D.prototype={init:function(a,e,f){this.scrollbarButtons=[];this.renderer=a;this.userOptions=e;this.options=g(d,e);this.chart=f;this.size=h(this.options.size,this.options.height);e.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,d=this.options,e=this.size,c;this.group=c=a.g("scrollbar").attr({zIndex:d.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0, +r:d.trackBorderRadius||0,height:e,width:e}).add(c);this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(this.swapXY(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L", +0,2*e/3,"M",3,e/4,"L",3,2*e/3],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth});this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a, +d,e,c){var b=this.options.vertical,f=0,g=this.rendered?"animate":"attr";this.x=a;this.y=d+this.trackBorderWidth;this.width=e;this.xOffset=this.height=c;this.yOffset=f;b?(this.width=this.yOffset=e=f=this.size,this.xOffset=d=0,this.barWidth=c-2*e,this.x=a+=this.options.margin):(this.height=this.xOffset=c=d=this.size,this.barWidth=e-2*c,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:e,height:c});this.scrollbarButtons[1].attr({translateX:b?0:e-d,translateY:b? +c-f:0})},drawScrollbarButton:function(a){var b=this.renderer,d=this.scrollbarButtons,c=this.options,e=this.size,f;f=b.g().add(this.group);d.push(f);f=b.rect().addClass("highcharts-scrollbar-button").add(f);f.attr({stroke:c.buttonBorderColor,"stroke-width":c.buttonBorderWidth,fill:c.buttonBackgroundColor});f.attr(f.crisp({x:-.5,y:-.5,width:e+1,height:e+1,r:c.buttonBorderRadius},f.strokeWidth()));f=b.path(this.swapXY(["M",e/2+(a?-1:1),e/2-3,"L",e/2+(a?-1:1),e/2+3,"L",e/2+(a?2:-2),e/2],c.vertical)).addClass("highcharts-scrollbar-arrow").add(d[a]); +f.attr({fill:c.buttonArrowColor})},swapXY:function(a,d){var b=a.length,c;if(d)for(d=0;d=k?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),c=a.options.vertical? +"chartY":"chartX",e=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][c]||(d=a.cursorToScrollbarPosition(d)[c],c=a[c],c=d-c,a.hasDragged=!0,a.updatePosition(e[0]+c,e[1]+c),a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b); +b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=H(a.to-a.from)*a.options.step;a.updatePosition(H(a.from-d),H(a.to-d));k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b), +c=a.to-a.from,e=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>e||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+c,a.to+c):a.updatePosition(a.from-c,a.to-c);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a, +d){1a&&(d=H(d-a),a=0);this.from=a;this.to=d},update:function(a){this.destroy();this.init(this.chart.renderer,g(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],d=this.scrollbarButtons,e=this.scrollbarGroup.element,c=this.mouseDownHandler,f=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[d[a[0]].element,"click",this.buttonToMinClick],[d[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e, +"mousedown",c],[w,"mousemove",f],[w,"mouseup",g]];m&&a.push([e,"touchstart",c],[w,"touchmove",f],[w,"touchend",g]);t(a,function(a){B.apply(null,a)});this._events=a},removeEvents:function(){t(this._events,function(a){C.apply(null,a)});this._events=void 0},destroy:function(){var a=this.chart.scroller;this.removeEvents();t(["track","scrollbarRifles","scrollbar","scrollbarGroup","group"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&(a.scrollbar=null,r(a.scrollbarButtons))}}; +f(G.prototype,"init",function(a){var b=this;a.apply(b,[].slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new D(b.chart.renderer,b.options.scrollbar,b.chart),B(b.scrollbar,"changed",function(a){var c=Math.min(h(b.options.min,b.min),b.min,b.dataMin),d=Math.max(h(b.options.max,b.max),b.max,b.dataMax)-c,e;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(e=c+d*this.to,c+=d*this.from):(e= +c+d*(1-this.from),c+=d*(1-this.to));b.setExtremes(c,e,!0,!1,a)}))});f(G.prototype,"render",function(a){var b=Math.min(h(this.options.min,this.min),this.min,this.dataMin),d=Math.max(h(this.options.max,this.max),this.max,this.dataMax),c=this.scrollbar,e;a.apply(this,[].slice.call(arguments,1));c&&(this.horiz?c.position(this.left,this.top+this.height+this.offset+2+(this.opposite?0:this.axisTitleMargin),this.width,this.height):c.position(this.left+this.width+2+this.offset+(this.opposite?this.axisTitleMargin: +0),this.top,this.width,this.height),isNaN(b)||isNaN(d)||!l(this.min)||!l(this.max)?c.setRange(0,0):(e=(this.min-b)/(d-b),b=(this.max-b)/(d-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(e,b):c.setRange(1-b,1-e)))});f(G.prototype,"getOffset",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,[].slice.call(arguments,1));d&&(this.chart.axisOffset[b]+=d.size+d.options.margin)});f(G.prototype,"destroy",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy()); +a.apply(this,[].slice.call(arguments,1))});a.Scrollbar=D})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.color,l=a.defaultOptions,r=a.defined,w=a.destroyObjectProperties,t=a.doc,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.grep,C=a.hasTouch,f=a.isNumber,d=a.isObject,b=a.isTouchDevice,q=a.merge,E=a.pick,c=a.removeEvent,F=a.Scrollbar,n=a.Series,A=a.seriesTypes,x=a.wrap,J=[].concat(a.defaultDataGroupingUnits),y=function(a){var b=h(arguments,f);if(b.length)return Math[a].apply(0, +b)};J[4]=["day",[1,2,3,4]];J[5]=["week",[1,2,3]];A=void 0===A.areaspline?"line":"areaspline";g(l,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:p("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",outlineWidth:1,series:{type:A,color:"#335cad",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:J},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series", +className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}}); +D.prototype={drawHandle:function(a,b){var c=this.chart.renderer,d=this.handles;this.rendered||(d[b]=c.path(["M",-4.5,.5,"L",3.5,.5,3.5,15.5,-4.5,15.5,-4.5,.5,"M",-1.5,4,"L",-1.5,12,"M",.5,4,"L",.5,12]).attr({zIndex:10-b}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][b]).add(),c=this.navigatorOptions.handles,d[b].attr({fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":1}).css({cursor:"ew-resize"}));d[b][this.rendered&&!this.hasDragged?"animate":"attr"]({translateX:Math.round(this.scrollerLeft+ +this.scrollbarHeight+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},update:function(a){this.destroy();q(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var e=this.chart,g=e.renderer,k,h,l,n;n=this.scrollbarHeight;var m=this.xAxis,p=this.navigatorOptions,u=p.maskInside,q=this.height,v=this.top,t=this.navigatorEnabled,x=this.outlineHeight,y;y=this.rendered;if(f(a)&&f(b)&&(!this.hasDragged||r(c))&&(this.navigatorLeft=k=E(m.left,e.plotLeft+ +n),this.navigatorWidth=h=E(m.len,e.plotWidth-2*n),this.scrollerLeft=l=k-n,this.scrollerWidth=n=n=h+2*n,c=E(c,m.translate(a)),d=E(d,m.translate(b)),f(c)&&Infinity!==Math.abs(c)||(c=0,d=n),!(m.translate(d,!0)-m.translate(c,!0)f&&tp+d-u&&rk&&re?e=0:e+v>=q&&(e=q-v,x=h.getUnionExtremes().dataMax),e!==d&&(h.fixedWidth=v,d=l.toFixedRange(e, +e+v,null,x),c.setExtremes(d.min,d.max,!0,null,{trigger:"navigator"}))))};h.mouseMoveHandler=function(b){var c=h.scrollbarHeight,d=h.navigatorLeft,e=h.navigatorWidth,f=h.scrollerLeft,g=h.scrollerWidth,k=h.range,l;b.touches&&0===b.touches[0].pageX||(b=a.pointer.normalize(b),l=b.chartX,lf+g-c&&(l=f+g-c),h.grabbedLeft?(h.hasDragged=!0,h.render(0,0,l-d,h.otherHandlePos)):h.grabbedRight?(h.hasDragged=!0,h.render(0,0,h.otherHandlePos,l-d)):h.grabbedCenter&&(h.hasDragged=!0,le+n-k&&(l=e+ +n-k),h.render(0,0,l-n,l-n+k)),h.hasDragged&&h.scrollbar&&h.scrollbar.options.liveRedraw&&(b.DOMType=b.type,setTimeout(function(){h.mouseUpHandler(b)},0)))};h.mouseUpHandler=function(b){var c,d,e=b.DOMEvent||b;if(h.hasDragged||"scrollbar"===b.trigger)h.zoomedMin===h.otherHandlePos?c=h.fixedExtreme:h.zoomedMax===h.otherHandlePos&&(d=h.fixedExtreme),h.zoomedMax===h.navigatorWidth&&(d=h.getUnionExtremes().dataMax),c=l.toFixedRange(h.zoomedMin,h.zoomedMax,c,d),r(c.min)&&a.xAxis[0].setExtremes(c.min,c.max, +!0,h.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:e});"mousemove"!==b.DOMType&&(h.grabbedLeft=h.grabbedRight=h.grabbedCenter=h.fixedWidth=h.fixedExtreme=h.otherHandlePos=h.hasDragged=n=null)};var c=a.xAxis.length,f=a.yAxis.length,m=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraBottomMargin=h.outlineHeight+d.margin;a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=l=new G(a,q({breaks:m.options.breaks,ordinal:m.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis", +isX:!0,type:"datetime",index:c,height:g,offset:0,offsetLeft:k,offsetRight:-k,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1})),h.yAxis=new G(a,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,height:g,offset:0,index:f,zoomEnabled:!1})),e||d.series.data?h.addBaseSeries():0===a.series.length&&x(a,"redraw",function(b,c){0=Math.round(a.navigatorWidth);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},destroy:function(){this.removeEvents();this.xAxis&&(m(this.chart.xAxis,this.xAxis),m(this.chart.axes,this.xAxis));this.yAxis&&(m(this.chart.yAxis,this.yAxis),m(this.chart.axes,this.yAxis));k(this.series||[],function(a){a.destroy&&a.destroy()});k("series xAxis yAxis leftShade rightShade outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" "), +function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);k([this.handles,this.elementsToDestroy],function(a){w(a)},this)}};a.Navigator=D;x(G.prototype,"zoom",function(a,b,c){var d=this.chart,e=d.options,f=e.chart.zoomType,g=e.navigator,e=e.rangeSelector,h;this.isXAxis&&(g&&g.enabled||e&&e.enabled)&&("x"===f?d.resetZoomButton="blocked":"y"===f?h=!1:"xy"===f&&(d=this.previousZoom,r(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!== +h?h:a.call(this,b,c)});x(H.prototype,"init",function(a,b,c){B(this,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});a.call(this,b,c)});x(H.prototype,"getMargins",function(a){var b=this.legend,c=b.options,d=this.scroller,e,f;a.apply(this,[].slice.call(arguments,1));d&&(e=d.xAxis,f=d.yAxis,d.top=d.navigatorOptions.top||this.chartHeight-d.height-d.scrollbarHeight-this.spacing[2]-("bottom"===c.verticalAlign&&c.enabled&& +!c.floating?b.legendHeight+E(c.margin,10):0),e&&f&&(e.options.top=f.options.top=d.top,e.setAxisSize(),f.setAxisSize()))});x(n.prototype,"addPoint",function(a,b,c,f,g){var h=this.options.turboThreshold;h&&this.xData.length>h&&d(b,!0)&&this.chart.scroller&&e(20,!0);a.call(this,b,c,f,g)});x(H.prototype,"addSeries",function(a,b,c,d){a=a.call(this,b,!1,d);this.scroller&&this.scroller.setBaseSeries();E(c,!0)&&this.redraw();return a});x(n.prototype,"update",function(a,b,c){a.call(this,b,!1);this.chart.scroller&& +this.chart.scroller.setBaseSeries();E(c,!0)&&this.chart.redraw()})})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.css,l=a.createElement,r=a.dateFormat,w=a.defaultOptions,t=w.global.useUTC,k=a.defined,m=a.destroyObjectProperties,e=a.discardElement,g=a.each,h=a.extend,C=a.fireEvent,f=a.Date,d=a.isNumber,b=a.merge,q=a.pick,E=a.pInt,c=a.splat,F=a.wrap;h(w,{rangeSelector:{buttonTheme:{"stroke-width":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:"right"}, +labelStyle:{color:"#666666"}}});w.lang=b(w.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(a,b){var e=this,f=e.chart,h=e.buttonOptions[a],k=f.xAxis[0],l=f.scroller&&f.scroller.getUnionExtremes()||k||{},n=l.dataMin,m=l.dataMax,p,r=k&&Math.round(Math.min(k.max,q(m,k.max))),w=h.type,z,l=h._range,A,C,D,E=h.dataGrouping;if(null!==n&&null!==m){f.fixedRange=l;E&&(this.forcedDataGrouping=!0,G.prototype.setDataGrouping.call(k||{chart:this.chart}, +E,!1));if("month"===w||"year"===w)k?(w={range:h,max:r,dataMin:n,dataMax:m},p=k.minFromRange.call(w),d(w.newMax)&&(r=w.newMax)):l=h;else if(l)p=Math.max(r-l,n),r=Math.min(p+l,m);else if("ytd"===w)if(k)void 0===m&&(n=Number.MAX_VALUE,m=Number.MIN_VALUE,g(f.series,function(a){a=a.xData;n=Math.min(a[0],n);m=Math.max(a[a.length-1],m)}),b=!1),r=e.getYTDExtremes(m,n,t),p=A=r.min,r=r.max;else{B(f,"beforeRender",function(){e.clickButton(a)});return}else"all"===w&&k&&(p=n,r=m);e.setSelected(a);k?k.setExtremes(p, +r,q(b,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:h}):(z=c(f.options.xAxis)[0],D=z.range,z.range=l,C=z.min,z.min=A,B(f,"load",function(){z.range=D;z.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons|| +[].concat(b.defaultButtons),e=c.selected,f=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&C(a,"blur");c&&c.blur&&C(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=B(a.container,"mousedown",f);this.unResize=B(a,"resize",f);g(d,b.computeButtonRange);void 0!==e&&d[e]&&this.clickButton(e,!1);B(a,"load",function(){B(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&& +b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,b=a.xAxis[0],c=Math.round(b.max-b.min),e=!b.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||b,f=a.dataMin,h=a.dataMax,a=this.getYTDExtremes(h,f,t),k=a.min,l=a.max,m=this.selected,p=d(m),q=this.options.allButtonsEnabled,r=this.buttons;g(this.buttonOptions,function(a,d){var g=a._range,n=a.type,u=a.count||1;a=r[d];var t=0;d=d===m;var v=g>h-f,x=g=864E5*{month:28,year:365}[n]*u&&c<=864E5*{month:31,year:366}[n]*u?g=!0:"ytd"===n?(g=l-k===c,y=!d):"all"===n&&(g=b.max-b.min>=h-f,w=!d&&p&&g);n=!q&&(v||x||w||e);g=d&&g||g&&!p&&!y;n?t=3:g&&(p=!0,t=2);a.state!==t&&a.setState(t)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if("month"===b||"year"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,b){var c= +this.chart.options.rangeSelector,d=this[a+"Input"];k(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=r(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:r(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];p(this[a+"Input"],{left:b.translateX+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){p(this[a+"Input"],{border:0,width:"1px",height:"1px"}); +this.setInputValue(a)},drawInput:function(a){function c(){var a=r.value,b=(m.inputDateParser||Date.parse)(a),c=f.xAxis[0],g=f.scroller&&f.scroller.xAxis?f.scroller.xAxis:c,h=g.dataMin,g=g.dataMax;b!==r.previousValue&&(r.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(E(b[0]),E(b[1])-1,E(b[2]))),d(b)&&(t||(b+=6E4*(new Date).getTimezoneOffset()),q?b>e.maxInput.HCTime?b=void 0:bg&&(b=g),void 0!==b&&c.setExtremes(q?b:c.min,q?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))} +var e=this,f=e.chart,g=f.renderer.style||{},k=f.renderer,m=f.options.rangeSelector,n=e.div,q="min"===a,r,B,C=this.inputGroup;this[a+"Label"]=B=k.label(w.lang[q?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(C);C.offset+=B.width+5;this[a+"DateBox"]=k=k.label("",C.offset).addClass("highcharts-range-input").attr({padding:2,width:m.inputBoxWidth||90,height:m.inputBoxHeight||17,stroke:m.inputBoxBorderColor||"#cccccc","stroke-width":1, +"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()}).add(C);C.offset+=k.width+(q?10:0);this[a+"Input"]=r=l("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:f.plotTop+"px"},n);B.css(b(g,m.labelStyle));k.css(b({color:"#333333"},g,m.inputStyle));p(r,h({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:g.fontSize,fontFamily:g.fontFamily,left:"-9em"},m.inputStyle));r.onfocus=function(){e.showInput(a)};r.onblur= +function(){e.hideInput(a)};r.onchange=c;r.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=q((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,b,c){var d=new f(a),e=d[f.hcGetFullYear]();c=c?f.UTC(e,0,1):+new f(e,0,1);b=Math.max(b||0,c);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(a,b){var c=this,d=c.chart,e=d.renderer,f=d.container,m=d.options, +n=m.exporting&&!1!==m.exporting.enabled&&m.navigation&&m.navigation.buttonOptions,p=m.rangeSelector,r=c.buttons,m=w.lang,t=c.div,t=c.inputGroup,A=p.buttonTheme,z=p.buttonPosition||{},B=p.inputEnabled,C=A&&A.states,D=d.plotLeft,E,G=this.getPosition(),F=c.group,H=c.rendered;!1!==p.enabled&&(H||(c.group=F=e.g("range-selector-buttons").add(),c.zoomText=e.text(m.rangeSelectorZoom,q(z.x,D),15).css(p.labelStyle).add(F),E=q(z.x,D)+c.zoomText.getBBox().width+5,g(c.buttonOptions,function(a,b){r[b]=e.button(a.text, +E,0,function(){c.clickButton(b);c.isActive=!0},A,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(F);E+=r[b].width+q(p.buttonSpacing,5)}),!1!==B&&(c.div=t=l("div",null,{position:"relative",height:0,zIndex:1}),f.parentNode.insertBefore(t,f),c.inputGroup=t=e.g("input-group").add(),t.offset=0,c.drawInput("min"),c.drawInput("max"))),c.updateButtonStates(),F[H?"animate":"attr"]({translateY:G.buttonTop}),!1!==B&&(t.align(h({y:G.inputTop,width:t.offset,x:n&&G.inputTop<(n.y||0)+n.height- +d.spacing[0]?-40:0},p.inputPosition),!0,d.spacingBox),k(B)||(d=F.getBBox(),t[t.alignAttr.translateXc&&(e?a=b-f:b=a+f);d(a)||(a=b=void 0);return{min:a,max:b}};G.prototype.minFromRange=function(){var a=this.range,b={month:"Month",year:"FullYear"}[a.type],c,e=this.max,f,g,h=function(a,c){var d=new Date(a);d["set"+b](d["get"+ +b]()+c);return d.getTime()-a};d(a)?(c=e-a,g=a):(c=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-c));f=q(this.dataMin,Number.MIN_VALUE);d(c)||(c=f);c<=f&&(c=f,void 0===g&&(g=h(c,a.count)),this.newMax=Math.min(c+g,this.dataMax));d(e)||(c=void 0);return c};F(H.prototype,"init",function(a,b,c){B(this,"init",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});a.call(this,b,c)});a.RangeSelector=D})(N);(function(a){var D=a.addEvent,B=a.isNumber;a.Chart.prototype.callbacks.push(function(a){function G(){p= +a.xAxis[0].getExtremes();B(p.min)&&r.render(p.min,p.max)}var p,l=a.scroller,r=a.rangeSelector,w,t;l&&(p=a.xAxis[0].getExtremes(),l.render(p.min,p.max));r&&(t=D(a.xAxis[0],"afterSetExtremes",function(a){r.render(a.min,a.max)}),w=D(a,"redraw",G),G());D(a,"destroy",function(){r&&(w(),t())})})})(N);(function(a){var D=a.arrayMax,B=a.arrayMin,G=a.Axis,H=a.Chart,p=a.defined,l=a.each,r=a.extend,w=a.format,t=a.inArray,k=a.isNumber,m=a.isString,e=a.map,g=a.merge,h=a.pick,C=a.Point,f=a.Renderer,d=a.Series,b= +a.splat,q=a.stop,E=a.SVGRenderer,c=a.VMLRenderer,F=a.wrap,n=d.prototype,A=n.init,x=n.processData,J=C.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,d,f){var k=m(c)||c.nodeName,l=arguments[k?1:0],n=l.series,p=a.getOptions(),q,r=h(l.navigator&&l.navigator.enabled,!0)?{startOnTick:!1,endOnTick:!1}:null,t={marker:{enabled:!1,radius:2}},u={shadow:!1,borderWidth:0};l.xAxis=e(b(l.xAxis||{}),function(a){return g({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"}, +showLastLabel:!0},p.xAxis,a,{type:"datetime",categories:null},r)});l.yAxis=e(b(l.yAxis||{}),function(a){q=h(a.opposite,!0);return g({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},p.yAxis,a)});l.series=null;l=g({chart:{panning:!0,pinchType:"x"},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null,style:{fontSize:"16px"}},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:t,spline:t,area:t,areaspline:t,arearange:t,areasplinerange:t, +column:u,columnrange:u,candlestick:u,ohlc:u}},l,{_stock:!0,chart:{inverted:!1}});l.series=n;return k?new H(c,l,f):new H(l,d)};F(G.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options._stock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=1,"right"):a.call(this,[].slice.call(arguments,1))});F(G.prototype,"getPlotLinePath",function(a, +b,c,d,f,g){var n=this,q=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=n.chart,u=r.renderer,v=n.left,w=n.top,y,x,A,B,C=[],D=[],E,F;if("colorAxis"===n.coll)return a.apply(this,[].slice.call(arguments,1));D=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=n.options[b];return k(a)?[r[b][a]]:m(a)?[r.get(a)]:e(q,function(a){return a[b]})}(n.coll);l(n.isXAxis?r.yAxis:r.xAxis,function(a){if(p(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=p(a.options[b])? +r[b][a.options[b]]:r[b][0];n===b&&D.push(a)}});E=D.length?[]:[n.isXAxis?r.yAxis[0]:r.xAxis[0]];l(D,function(a){-1===t(a,E)&&E.push(a)});F=h(g,n.translate(b,null,null,d));k(F)&&(n.horiz?l(E,function(a){var b;x=a.pos;B=x+a.len;y=A=Math.round(F+n.transB);if(yv+n.width)f?y=A=Math.min(Math.max(v,y),v+n.width):b=!0;b||C.push("M",y,x,"L",A,B)}):l(E,function(a){var b;y=a.pos;A=y+a.len;x=B=Math.round(w+n.height-F);if(xw+n.height)f?x=B=Math.min(Math.max(w,x),n.top+n.height):b=!0;b||C.push("M",y, +x,"L",A,B)}));return 0=e&&(x=-(l.translateX+b.width-e));l.attr({x:m+x,y:k,anchorX:g?m:this.opposite?0:a.chartWidth,anchorY:g?this.opposite?a.chartHeight:0:k+b.height/2})}});n.init=function(){A.apply(this,arguments);this.setCompare(this.options.compare)};n.setCompare=function(a){this.modifyValue= +"value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b=b/d*100-100,c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};n.processData=function(){var a,b=-1,c,d,e,f;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=t("close",this.pointArrayMap),-1===b&&(b=t(this.pointValKey||"y",this.pointArrayMap))),a=0;a< +e-1;a++)if(f=-1=this.xAxis.min&&0!==f){this.compareValue=f;break}};F(n,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=B(b),this.dataMax=D(b))});G.prototype.setCompare=function(a,b){this.isXAxis||(l(this.series,function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};C.prototype.tooltipFormatter=function(b){b=b.replace("{point.change}",(0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 '; + else + var expandButton = ''; + + return '' + expandButton + '' + ellipsedLabel({ name: item.name, parentClass: "nav-tooltip", childClass: "nav-label" }) + ''; +} + +function menuItemsForGroup(group, level, parent) { + var items = ''; + + if (level > 0) + items += menuItem(group, level - 1, parent, true); + + $.each(group.contents, function (contentName, content) { + if (content.type == 'GROUP') + items += menuItemsForGroup(content, level + 1, group.pathFormatted); + else if (content.type == 'REQUEST') + items += menuItem(content, level, group.pathFormatted); + }); + + return items; +} + +function setDetailsMenu(){ + $('.nav ul').append(menuItemsForGroup(stats, 0)); + $('.nav').expandable(); + $('.nav-tooltip').popover({trigger:'hover'}); +} + +function setGlobalMenu(){ + $('.nav ul') + .append('
  • Ranges
  • ') + .append('
  • Stats
  • ') + .append('
  • Active Users
  • ') + .append('
  • Requests / sec
  • ') + .append('
  • Responses / sec
  • '); +} + +function getLink(link){ + var a = link.split('/'); + return (a.length<=1)? link : a[a.length-1]; +} + +function expandUp(li) { + const parentId = li.attr("data-parent"); + if (parentId != "ROOT") { + const span = $('#' + parentId); + const parentLi = span.parents('li').first(); + span.expand(parentLi, false); + expandUp(parentLi); + } +} + +function setActiveMenu(){ + $('.nav a').each(function() { + const navA = $(this) + if(!navA.hasClass('expand-button') && navA.attr('href') == getLink(window.location.pathname)) { + const li = $(this).parents('li').first(); + li.addClass('on'); + expandUp(li); + return false; + } + }); +} diff --git a/webapp/loadTests/10users/js/stats.js b/webapp/loadTests/10users/js/stats.js new file mode 100644 index 0000000..d074614 --- /dev/null +++ b/webapp/loadTests/10users/js/stats.js @@ -0,0 +1,4065 @@ +var stats = { + type: "GROUP", +name: "All Requests", +path: "", +pathFormatted: "group_missing-name-b06d1", +stats: { + "name": "All Requests", + "numberOfRequests": { + "total": "461", + "ok": "395", + "ko": "66" + }, + "minResponseTime": { + "total": "8", + "ok": "8", + "ko": "538" + }, + "maxResponseTime": { + "total": "3234", + "ok": "3234", + "ko": "2798" + }, + "meanResponseTime": { + "total": "613", + "ok": "463", + "ko": "1506" + }, + "standardDeviation": { + "total": "814", + "ok": "681", + "ko": "965" + }, + "percentiles1": { + "total": "200", + "ok": "138", + "ko": "955" + }, + "percentiles2": { + "total": "806", + "ok": "583", + "ko": "2606" + }, + "percentiles3": { + "total": "2622", + "ok": "2373", + "ko": "2785" + }, + "percentiles4": { + "total": "2836", + "ok": "2894", + "ko": "2793" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 317, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 40, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 38, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 66, + "percentage": 14 +}, + "meanNumberOfRequestsPerSecond": { + "total": "12.459", + "ok": "10.676", + "ko": "1.784" + } +}, +contents: { +"req_request-0-684d2": { + type: "REQUEST", + name: "request_0", +path: "request_0", +pathFormatted: "req_request-0-684d2", +stats: { + "name": "request_0", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "maxResponseTime": { + "total": "67", + "ok": "67", + "ko": "-" + }, + "meanResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "standardDeviation": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles1": { + "total": "61", + "ok": "61", + "ko": "-" + }, + "percentiles2": { + "total": "65", + "ok": "65", + "ko": "-" + }, + "percentiles3": { + "total": "67", + "ok": "67", + "ko": "-" + }, + "percentiles4": { + "total": "67", + "ok": "67", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-1-46da4": { + type: "REQUEST", + name: "request_1", +path: "request_1", +pathFormatted: "req_request-1-46da4", +stats: { + "name": "request_1", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "maxResponseTime": { + "total": "85", + "ok": "85", + "ko": "-" + }, + "meanResponseTime": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "standardDeviation": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "percentiles1": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles2": { + "total": "69", + "ok": "69", + "ko": "-" + }, + "percentiles3": { + "total": "81", + "ok": "81", + "ko": "-" + }, + "percentiles4": { + "total": "84", + "ok": "84", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-2-93baf": { + type: "REQUEST", + name: "request_2", +path: "request_2", +pathFormatted: "req_request-2-93baf", +stats: { + "name": "request_2", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "472", + "ok": "472", + "ko": "-" + }, + "maxResponseTime": { + "total": "547", + "ok": "547", + "ko": "-" + }, + "meanResponseTime": { + "total": "504", + "ok": "504", + "ko": "-" + }, + "standardDeviation": { + "total": "25", + "ok": "25", + "ko": "-" + }, + "percentiles1": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "percentiles2": { + "total": "521", + "ok": "521", + "ko": "-" + }, + "percentiles3": { + "total": "543", + "ok": "543", + "ko": "-" + }, + "percentiles4": { + "total": "546", + "ok": "546", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-3-d0973": { + type: "REQUEST", + name: "request_3", +path: "request_3", +pathFormatted: "req_request-3-d0973", +stats: { + "name": "request_3", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "183", + "ok": "183", + "ko": "-" + }, + "maxResponseTime": { + "total": "202", + "ok": "202", + "ko": "-" + }, + "meanResponseTime": { + "total": "192", + "ok": "192", + "ko": "-" + }, + "standardDeviation": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles1": { + "total": "191", + "ok": "191", + "ko": "-" + }, + "percentiles2": { + "total": "197", + "ok": "197", + "ko": "-" + }, + "percentiles3": { + "total": "201", + "ok": "201", + "ko": "-" + }, + "percentiles4": { + "total": "202", + "ok": "202", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-4-e7d1b": { + type: "REQUEST", + name: "request_4", +path: "request_4", +pathFormatted: "req_request-4-e7d1b", +stats: { + "name": "request_4", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "477", + "ok": "477", + "ko": "-" + }, + "maxResponseTime": { + "total": "1229", + "ok": "1229", + "ko": "-" + }, + "meanResponseTime": { + "total": "938", + "ok": "938", + "ko": "-" + }, + "standardDeviation": { + "total": "223", + "ok": "223", + "ko": "-" + }, + "percentiles1": { + "total": "852", + "ok": "852", + "ko": "-" + }, + "percentiles2": { + "total": "1151", + "ok": "1151", + "ko": "-" + }, + "percentiles3": { + "total": "1210", + "ok": "1210", + "ko": "-" + }, + "percentiles4": { + "total": "1225", + "ok": "1225", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 10 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 80 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-5-48829": { + type: "REQUEST", + name: "request_5", +path: "request_5", +pathFormatted: "req_request-5-48829", +stats: { + "name": "request_5", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "409", + "ok": "409", + "ko": "-" + }, + "maxResponseTime": { + "total": "1100", + "ok": "1100", + "ko": "-" + }, + "meanResponseTime": { + "total": "743", + "ok": "743", + "ko": "-" + }, + "standardDeviation": { + "total": "244", + "ok": "244", + "ko": "-" + }, + "percentiles1": { + "total": "800", + "ok": "800", + "ko": "-" + }, + "percentiles2": { + "total": "808", + "ok": "808", + "ko": "-" + }, + "percentiles3": { + "total": "1097", + "ok": "1097", + "ko": "-" + }, + "percentiles4": { + "total": "1099", + "ok": "1099", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 5, + "percentage": 50 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 50 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-6-027a9": { + type: "REQUEST", + name: "request_6", +path: "request_6", +pathFormatted: "req_request-6-027a9", +stats: { + "name": "request_6", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "556", + "ok": "556", + "ko": "-" + }, + "maxResponseTime": { + "total": "1387", + "ok": "1387", + "ko": "-" + }, + "meanResponseTime": { + "total": "995", + "ok": "995", + "ko": "-" + }, + "standardDeviation": { + "total": "300", + "ok": "300", + "ko": "-" + }, + "percentiles1": { + "total": "998", + "ok": "998", + "ko": "-" + }, + "percentiles2": { + "total": "1277", + "ok": "1277", + "ko": "-" + }, + "percentiles3": { + "total": "1346", + "ok": "1346", + "ko": "-" + }, + "percentiles4": { + "total": "1379", + "ok": "1379", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 30 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-7-f222f": { + type: "REQUEST", + name: "request_7", +path: "request_7", +pathFormatted: "req_request-7-f222f", +stats: { + "name": "request_7", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "382", + "ok": "382", + "ko": "-" + }, + "maxResponseTime": { + "total": "1199", + "ok": "1199", + "ko": "-" + }, + "meanResponseTime": { + "total": "865", + "ok": "865", + "ko": "-" + }, + "standardDeviation": { + "total": "293", + "ok": "293", + "ko": "-" + }, + "percentiles1": { + "total": "814", + "ok": "814", + "ko": "-" + }, + "percentiles2": { + "total": "1167", + "ok": "1167", + "ko": "-" + }, + "percentiles3": { + "total": "1190", + "ok": "1190", + "ko": "-" + }, + "percentiles4": { + "total": "1197", + "ok": "1197", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 4, + "percentage": 40 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 60 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-5-redir-affb3": { + type: "REQUEST", + name: "request_5 Redirect 1", +path: "request_5 Redirect 1", +pathFormatted: "req_request-5-redir-affb3", +stats: { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "maxResponseTime": { + "total": "230", + "ok": "230", + "ko": "-" + }, + "meanResponseTime": { + "total": "156", + "ok": "156", + "ko": "-" + }, + "standardDeviation": { + "total": "47", + "ok": "47", + "ko": "-" + }, + "percentiles1": { + "total": "141", + "ok": "141", + "ko": "-" + }, + "percentiles2": { + "total": "202", + "ok": "202", + "ko": "-" + }, + "percentiles3": { + "total": "227", + "ok": "227", + "ko": "-" + }, + "percentiles4": { + "total": "229", + "ok": "229", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-8-ef0c8": { + type: "REQUEST", + name: "request_8", +path: "request_8", +pathFormatted: "req_request-8-ef0c8", +stats: { + "name": "request_8", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "460", + "ok": "460", + "ko": "-" + }, + "maxResponseTime": { + "total": "851", + "ok": "851", + "ko": "-" + }, + "meanResponseTime": { + "total": "643", + "ok": "643", + "ko": "-" + }, + "standardDeviation": { + "total": "154", + "ok": "154", + "ko": "-" + }, + "percentiles1": { + "total": "619", + "ok": "619", + "ko": "-" + }, + "percentiles2": { + "total": "812", + "ok": "812", + "ko": "-" + }, + "percentiles3": { + "total": "837", + "ok": "837", + "ko": "-" + }, + "percentiles4": { + "total": "848", + "ok": "848", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 7, + "percentage": 70 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 30 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-8-redir-98b2a": { + type: "REQUEST", + name: "request_8 Redirect 1", +path: "request_8 Redirect 1", +pathFormatted: "req_request-8-redir-98b2a", +stats: { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "375", + "ok": "375", + "ko": "-" + }, + "maxResponseTime": { + "total": "865", + "ok": "865", + "ko": "-" + }, + "meanResponseTime": { + "total": "545", + "ok": "545", + "ko": "-" + }, + "standardDeviation": { + "total": "175", + "ok": "175", + "ko": "-" + }, + "percentiles1": { + "total": "497", + "ok": "497", + "ko": "-" + }, + "percentiles2": { + "total": "673", + "ok": "673", + "ko": "-" + }, + "percentiles3": { + "total": "826", + "ok": "826", + "ko": "-" + }, + "percentiles4": { + "total": "857", + "ok": "857", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 90 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-8-redir-fc911": { + type: "REQUEST", + name: "request_8 Redirect 2", +path: "request_8 Redirect 2", +pathFormatted: "req_request-8-redir-fc911", +stats: { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "409", + "ok": "409", + "ko": "-" + }, + "maxResponseTime": { + "total": "882", + "ok": "882", + "ko": "-" + }, + "meanResponseTime": { + "total": "611", + "ok": "611", + "ko": "-" + }, + "standardDeviation": { + "total": "136", + "ok": "136", + "ko": "-" + }, + "percentiles1": { + "total": "653", + "ok": "653", + "ko": "-" + }, + "percentiles2": { + "total": "681", + "ok": "681", + "ko": "-" + }, + "percentiles3": { + "total": "799", + "ok": "799", + "ko": "-" + }, + "percentiles4": { + "total": "865", + "ok": "865", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 90 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-8-redir-e875c": { + type: "REQUEST", + name: "request_8 Redirect 3", +path: "request_8 Redirect 3", +pathFormatted: "req_request-8-redir-e875c", +stats: { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "maxResponseTime": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "meanResponseTime": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "standardDeviation": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "percentiles1": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles2": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "percentiles3": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles4": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-12-61da2": { + type: "REQUEST", + name: "request_12", +path: "request_12", +pathFormatted: "req_request-12-61da2", +stats: { + "name": "request_12", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "maxResponseTime": { + "total": "102", + "ok": "102", + "ko": "-" + }, + "meanResponseTime": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "standardDeviation": { + "total": "30", + "ok": "30", + "ko": "-" + }, + "percentiles1": { + "total": "49", + "ok": "49", + "ko": "-" + }, + "percentiles2": { + "total": "82", + "ok": "82", + "ko": "-" + }, + "percentiles3": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "percentiles4": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-14-a0e30": { + type: "REQUEST", + name: "request_14", +path: "request_14", +pathFormatted: "req_request-14-a0e30", +stats: { + "name": "request_14", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "18", + "ok": "18", + "ko": "-" + }, + "maxResponseTime": { + "total": "102", + "ok": "102", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "30", + "ok": "30", + "ko": "-" + }, + "percentiles1": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles2": { + "total": "84", + "ok": "84", + "ko": "-" + }, + "percentiles3": { + "total": "98", + "ok": "98", + "ko": "-" + }, + "percentiles4": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-22-8ecb1": { + type: "REQUEST", + name: "request_22", +path: "request_22", +pathFormatted: "req_request-22-8ecb1", +stats: { + "name": "request_22", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "60", + "ok": "60", + "ko": "-" + }, + "maxResponseTime": { + "total": "169", + "ok": "169", + "ko": "-" + }, + "meanResponseTime": { + "total": "106", + "ok": "106", + "ko": "-" + }, + "standardDeviation": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "percentiles1": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "percentiles2": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "percentiles3": { + "total": "166", + "ok": "166", + "ko": "-" + }, + "percentiles4": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-21-be4cb": { + type: "REQUEST", + name: "request_21", +path: "request_21", +pathFormatted: "req_request-21-be4cb", +stats: { + "name": "request_21", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "maxResponseTime": { + "total": "172", + "ok": "172", + "ko": "-" + }, + "meanResponseTime": { + "total": "104", + "ok": "104", + "ko": "-" + }, + "standardDeviation": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "percentiles1": { + "total": "84", + "ok": "84", + "ko": "-" + }, + "percentiles2": { + "total": "151", + "ok": "151", + "ko": "-" + }, + "percentiles3": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "percentiles4": { + "total": "171", + "ok": "171", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-24-dd0c9": { + type: "REQUEST", + name: "request_24", +path: "request_24", +pathFormatted: "req_request-24-dd0c9", +stats: { + "name": "request_24", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "maxResponseTime": { + "total": "170", + "ok": "170", + "ko": "-" + }, + "meanResponseTime": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "standardDeviation": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "percentiles1": { + "total": "89", + "ok": "89", + "ko": "-" + }, + "percentiles2": { + "total": "162", + "ok": "162", + "ko": "-" + }, + "percentiles3": { + "total": "169", + "ok": "169", + "ko": "-" + }, + "percentiles4": { + "total": "170", + "ok": "170", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-13-5cca6": { + type: "REQUEST", + name: "request_13", +path: "request_13", +pathFormatted: "req_request-13-5cca6", +stats: { + "name": "request_13", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "70", + "ok": "70", + "ko": "-" + }, + "maxResponseTime": { + "total": "126", + "ok": "126", + "ko": "-" + }, + "meanResponseTime": { + "total": "93", + "ok": "93", + "ko": "-" + }, + "standardDeviation": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles1": { + "total": "93", + "ok": "93", + "ko": "-" + }, + "percentiles2": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles3": { + "total": "117", + "ok": "117", + "ko": "-" + }, + "percentiles4": { + "total": "124", + "ok": "124", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-200-636fa": { + type: "REQUEST", + name: "request_200", +path: "request_200", +pathFormatted: "req_request-200-636fa", +stats: { + "name": "request_200", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "69", + "ok": "69", + "ko": "-" + }, + "maxResponseTime": { + "total": "171", + "ok": "171", + "ko": "-" + }, + "meanResponseTime": { + "total": "115", + "ok": "115", + "ko": "-" + }, + "standardDeviation": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "percentiles1": { + "total": "98", + "ok": "98", + "ko": "-" + }, + "percentiles2": { + "total": "162", + "ok": "162", + "ko": "-" + }, + "percentiles3": { + "total": "170", + "ok": "170", + "ko": "-" + }, + "percentiles4": { + "total": "171", + "ok": "171", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-16-24733": { + type: "REQUEST", + name: "request_16", +path: "request_16", +pathFormatted: "req_request-16-24733", +stats: { + "name": "request_16", + "numberOfRequests": { + "total": "10", + "ok": "7", + "ko": "3" + }, + "minResponseTime": { + "total": "572", + "ok": "622", + "ko": "572" + }, + "maxResponseTime": { + "total": "1961", + "ok": "1961", + "ko": "592" + }, + "meanResponseTime": { + "total": "995", + "ok": "1173", + "ko": "579" + }, + "standardDeviation": { + "total": "478", + "ok": "470", + "ko": "9" + }, + "percentiles1": { + "total": "812", + "ok": "973", + "ko": "573" + }, + "percentiles2": { + "total": "1271", + "ok": "1515", + "ko": "583" + }, + "percentiles3": { + "total": "1825", + "ok": "1870", + "ko": "590" + }, + "percentiles4": { + "total": "1934", + "ok": "1943", + "ko": "592" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 20 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 30 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 30 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.189", + "ko": "0.081" + } +} + },"req_request-15-56eac": { + type: "REQUEST", + name: "request_15", +path: "request_15", +pathFormatted: "req_request-15-56eac", +stats: { + "name": "request_15", + "numberOfRequests": { + "total": "10", + "ok": "5", + "ko": "5" + }, + "minResponseTime": { + "total": "545", + "ok": "652", + "ko": "545" + }, + "maxResponseTime": { + "total": "1648", + "ok": "1648", + "ko": "596" + }, + "meanResponseTime": { + "total": "838", + "ok": "1096", + "ko": "579" + }, + "standardDeviation": { + "total": "344", + "ok": "320", + "ko": "18" + }, + "percentiles1": { + "total": "624", + "ok": "1042", + "ko": "584" + }, + "percentiles2": { + "total": "1036", + "ok": "1122", + "ko": "592" + }, + "percentiles3": { + "total": "1411", + "ok": "1543", + "ko": "595" + }, + "percentiles4": { + "total": "1601", + "ok": "1627", + "ko": "596" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 10 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 30 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.135", + "ko": "0.135" + } +} + },"req_logo-png-c9c2b": { + type: "REQUEST", + name: "Logo.png", +path: "Logo.png", +pathFormatted: "req_logo-png-c9c2b", +stats: { + "name": "Logo.png", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "maxResponseTime": { + "total": "64", + "ok": "64", + "ko": "-" + }, + "meanResponseTime": { + "total": "26", + "ok": "26", + "ko": "-" + }, + "standardDeviation": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles1": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "percentiles2": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "percentiles3": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "percentiles4": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-18-f5b64": { + type: "REQUEST", + name: "request_18", +path: "request_18", +pathFormatted: "req_request-18-f5b64", +stats: { + "name": "request_18", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "203", + "ok": "203", + "ko": "-" + }, + "maxResponseTime": { + "total": "514", + "ok": "514", + "ko": "-" + }, + "meanResponseTime": { + "total": "365", + "ok": "365", + "ko": "-" + }, + "standardDeviation": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "percentiles1": { + "total": "376", + "ok": "376", + "ko": "-" + }, + "percentiles2": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "percentiles3": { + "total": "510", + "ok": "510", + "ko": "-" + }, + "percentiles4": { + "total": "513", + "ok": "513", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_bundle-js-0b837": { + type: "REQUEST", + name: "bundle.js", +path: "bundle.js", +pathFormatted: "req_bundle-js-0b837", +stats: { + "name": "bundle.js", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "25", + "ok": "25", + "ko": "-" + }, + "maxResponseTime": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "meanResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "standardDeviation": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles1": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "percentiles2": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "percentiles3": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "percentiles4": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-9-d127e": { + type: "REQUEST", + name: "request_9", +path: "request_9", +pathFormatted: "req_request-9-d127e", +stats: { + "name": "request_9", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "maxResponseTime": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "meanResponseTime": { + "total": "65", + "ok": "65", + "ko": "-" + }, + "standardDeviation": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "percentiles1": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "percentiles2": { + "total": "81", + "ok": "81", + "ko": "-" + }, + "percentiles3": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "percentiles4": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-10-1cfbe": { + type: "REQUEST", + name: "request_10", +path: "request_10", +pathFormatted: "req_request-10-1cfbe", +stats: { + "name": "request_10", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "maxResponseTime": { + "total": "102", + "ok": "102", + "ko": "-" + }, + "meanResponseTime": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "standardDeviation": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "percentiles1": { + "total": "61", + "ok": "61", + "ko": "-" + }, + "percentiles2": { + "total": "81", + "ok": "81", + "ko": "-" + }, + "percentiles3": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles4": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-11-f11e8": { + type: "REQUEST", + name: "request_11", +path: "request_11", +pathFormatted: "req_request-11-f11e8", +stats: { + "name": "request_11", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "80", + "ok": "80", + "ko": "-" + }, + "maxResponseTime": { + "total": "167", + "ok": "167", + "ko": "-" + }, + "meanResponseTime": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "standardDeviation": { + "total": "32", + "ok": "32", + "ko": "-" + }, + "percentiles1": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles2": { + "total": "140", + "ok": "140", + "ko": "-" + }, + "percentiles3": { + "total": "162", + "ok": "162", + "ko": "-" + }, + "percentiles4": { + "total": "166", + "ok": "166", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-242-d6d33": { + type: "REQUEST", + name: "request_242", +path: "request_242", +pathFormatted: "req_request-242-d6d33", +stats: { + "name": "request_242", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "maxResponseTime": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "meanResponseTime": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "standardDeviation": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "percentiles1": { + "total": "65", + "ok": "65", + "ko": "-" + }, + "percentiles2": { + "total": "82", + "ok": "82", + "ko": "-" + }, + "percentiles3": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "percentiles4": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_css2-family-rob-cf8a9": { + type: "REQUEST", + name: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +path: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +pathFormatted: "req_css2-family-rob-cf8a9", +stats: { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "maxResponseTime": { + "total": "178", + "ok": "178", + "ko": "-" + }, + "meanResponseTime": { + "total": "128", + "ok": "128", + "ko": "-" + }, + "standardDeviation": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "percentiles1": { + "total": "119", + "ok": "119", + "ko": "-" + }, + "percentiles2": { + "total": "136", + "ok": "136", + "ko": "-" + }, + "percentiles3": { + "total": "161", + "ok": "161", + "ko": "-" + }, + "percentiles4": { + "total": "175", + "ok": "175", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-19-10d85": { + type: "REQUEST", + name: "request_19", +path: "request_19", +pathFormatted: "req_request-19-10d85", +stats: { + "name": "request_19", + "numberOfRequests": { + "total": "10", + "ok": "6", + "ko": "4" + }, + "minResponseTime": { + "total": "556", + "ok": "1084", + "ko": "556" + }, + "maxResponseTime": { + "total": "3234", + "ok": "3234", + "ko": "579" + }, + "meanResponseTime": { + "total": "1515", + "ok": "2147", + "ko": "566" + }, + "standardDeviation": { + "total": "1006", + "ok": "829", + "ko": "9" + }, + "percentiles1": { + "total": "1112", + "ok": "2261", + "ko": "565" + }, + "percentiles2": { + "total": "2417", + "ok": "2823", + "ko": "572" + }, + "percentiles3": { + "total": "3086", + "ok": "3152", + "ko": "578" + }, + "percentiles4": { + "total": "3204", + "ok": "3218", + "ko": "579" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 4, + "percentage": 40 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.162", + "ko": "0.108" + } +} + },"req_request-20-6804b": { + type: "REQUEST", + name: "request_20", +path: "request_20", +pathFormatted: "req_request-20-6804b", +stats: { + "name": "request_20", + "numberOfRequests": { + "total": "10", + "ok": "3", + "ko": "7" + }, + "minResponseTime": { + "total": "540", + "ok": "585", + "ko": "540" + }, + "maxResponseTime": { + "total": "1883", + "ok": "1883", + "ko": "970" + }, + "meanResponseTime": { + "total": "749", + "ok": "1049", + "ko": "621" + }, + "standardDeviation": { + "total": "397", + "ok": "591", + "ko": "145" + }, + "percentiles1": { + "total": "580", + "ok": "678", + "ko": "555" + }, + "percentiles2": { + "total": "662", + "ok": "1281", + "ko": "595" + }, + "percentiles3": { + "total": "1472", + "ok": "1762", + "ko": "863" + }, + "percentiles4": { + "total": "1801", + "ok": "1859", + "ko": "949" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 20 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 70 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.081", + "ko": "0.189" + } +} + },"req_request-23-98f5d": { + type: "REQUEST", + name: "request_23", +path: "request_23", +pathFormatted: "req_request-23-98f5d", +stats: { + "name": "request_23", + "numberOfRequests": { + "total": "10", + "ok": "4", + "ko": "6" + }, + "minResponseTime": { + "total": "538", + "ok": "1066", + "ko": "538" + }, + "maxResponseTime": { + "total": "2790", + "ok": "2790", + "ko": "1192" + }, + "meanResponseTime": { + "total": "1218", + "ok": "1942", + "ko": "736" + }, + "standardDeviation": { + "total": "816", + "ok": "839", + "ko": "241" + }, + "percentiles1": { + "total": "995", + "ok": "1957", + "ko": "592" + }, + "percentiles2": { + "total": "1180", + "ok": "2776", + "ko": "842" + }, + "percentiles3": { + "total": "2781", + "ok": "2787", + "ko": "1125" + }, + "percentiles4": { + "total": "2788", + "ok": "2789", + "ko": "1179" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 20 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.108", + "ko": "0.162" + } +} + },"req_request-222-24864": { + type: "REQUEST", + name: "request_222", +path: "request_222", +pathFormatted: "req_request-222-24864", +stats: { + "name": "request_222", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "maxResponseTime": { + "total": "318", + "ok": "318", + "ko": "-" + }, + "meanResponseTime": { + "total": "157", + "ok": "157", + "ko": "-" + }, + "standardDeviation": { + "total": "128", + "ok": "128", + "ko": "-" + }, + "percentiles1": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "percentiles2": { + "total": "310", + "ok": "310", + "ko": "-" + }, + "percentiles3": { + "total": "316", + "ok": "316", + "ko": "-" + }, + "percentiles4": { + "total": "318", + "ok": "318", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-227-2507b": { + type: "REQUEST", + name: "request_227", +path: "request_227", +pathFormatted: "req_request-227-2507b", +stats: { + "name": "request_227", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "38", + "ok": "38", + "ko": "-" + }, + "maxResponseTime": { + "total": "323", + "ok": "323", + "ko": "-" + }, + "meanResponseTime": { + "total": "131", + "ok": "131", + "ko": "-" + }, + "standardDeviation": { + "total": "113", + "ok": "113", + "ko": "-" + }, + "percentiles1": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "percentiles2": { + "total": "237", + "ok": "237", + "ko": "-" + }, + "percentiles3": { + "total": "311", + "ok": "311", + "ko": "-" + }, + "percentiles4": { + "total": "321", + "ok": "321", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-240-e27d8": { + type: "REQUEST", + name: "request_240", +path: "request_240", +pathFormatted: "req_request-240-e27d8", +stats: { + "name": "request_240", + "numberOfRequests": { + "total": "10", + "ok": "4", + "ko": "6" + }, + "minResponseTime": { + "total": "666", + "ok": "1223", + "ko": "666" + }, + "maxResponseTime": { + "total": "3138", + "ok": "3138", + "ko": "2798" + }, + "meanResponseTime": { + "total": "2275", + "ok": "2491", + "ko": "2130" + }, + "standardDeviation": { + "total": "877", + "ok": "748", + "ko": "925" + }, + "percentiles1": { + "total": "2768", + "ok": "2802", + "ko": "2768" + }, + "percentiles2": { + "total": "2796", + "ok": "2954", + "ko": "2788" + }, + "percentiles3": { + "total": "3028", + "ok": "3101", + "ko": "2796" + }, + "percentiles4": { + "total": "3116", + "ok": "3131", + "ko": "2798" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.108", + "ko": "0.162" + } +} + },"req_request-241-2919b": { + type: "REQUEST", + name: "request_241", +path: "request_241", +pathFormatted: "req_request-241-2919b", +stats: { + "name": "request_241", + "numberOfRequests": { + "total": "10", + "ok": "4", + "ko": "6" + }, + "minResponseTime": { + "total": "688", + "ok": "1946", + "ko": "688" + }, + "maxResponseTime": { + "total": "3156", + "ok": "3156", + "ko": "2788" + }, + "meanResponseTime": { + "total": "2298", + "ok": "2493", + "ko": "2167" + }, + "standardDeviation": { + "total": "743", + "ok": "432", + "ko": "867" + }, + "percentiles1": { + "total": "2596", + "ok": "2436", + "ko": "2753" + }, + "percentiles2": { + "total": "2785", + "ok": "2641", + "ko": "2785" + }, + "percentiles3": { + "total": "2990", + "ok": "3053", + "ko": "2788" + }, + "percentiles4": { + "total": "3123", + "ok": "3135", + "ko": "2788" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.108", + "ko": "0.162" + } +} + },"req_request-243-b078b": { + type: "REQUEST", + name: "request_243", +path: "request_243", +pathFormatted: "req_request-243-b078b", +stats: { + "name": "request_243", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "maxResponseTime": { + "total": "237", + "ok": "237", + "ko": "-" + }, + "meanResponseTime": { + "total": "128", + "ok": "128", + "ko": "-" + }, + "standardDeviation": { + "total": "77", + "ok": "77", + "ko": "-" + }, + "percentiles1": { + "total": "94", + "ok": "94", + "ko": "-" + }, + "percentiles2": { + "total": "213", + "ok": "213", + "ko": "-" + }, + "percentiles3": { + "total": "232", + "ok": "232", + "ko": "-" + }, + "percentiles4": { + "total": "236", + "ok": "236", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-250-8cb1f": { + type: "REQUEST", + name: "request_250", +path: "request_250", +pathFormatted: "req_request-250-8cb1f", +stats: { + "name": "request_250", + "numberOfRequests": { + "total": "10", + "ok": "2", + "ko": "8" + }, + "minResponseTime": { + "total": "678", + "ok": "1096", + "ko": "678" + }, + "maxResponseTime": { + "total": "2753", + "ok": "2676", + "ko": "2753" + }, + "meanResponseTime": { + "total": "1764", + "ok": "1886", + "ko": "1734" + }, + "standardDeviation": { + "total": "895", + "ok": "790", + "ko": "917" + }, + "percentiles1": { + "total": "1850", + "ok": "1886", + "ko": "1785" + }, + "percentiles2": { + "total": "2614", + "ok": "2281", + "ko": "2611" + }, + "percentiles3": { + "total": "2718", + "ok": "2597", + "ko": "2705" + }, + "percentiles4": { + "total": "2746", + "ok": "2660", + "ko": "2743" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 8, + "percentage": 80 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.054", + "ko": "0.216" + } +} + },"req_request-252-38647": { + type: "REQUEST", + name: "request_252", +path: "request_252", +pathFormatted: "req_request-252-38647", +stats: { + "name": "request_252", + "numberOfRequests": { + "total": "10", + "ok": "4", + "ko": "6" + }, + "minResponseTime": { + "total": "669", + "ok": "1144", + "ko": "669" + }, + "maxResponseTime": { + "total": "2672", + "ok": "2672", + "ko": "2619" + }, + "meanResponseTime": { + "total": "1911", + "ok": "2168", + "ko": "1740" + }, + "standardDeviation": { + "total": "806", + "ok": "599", + "ko": "877" + }, + "percentiles1": { + "total": "2428", + "ok": "2428", + "ko": "1801" + }, + "percentiles2": { + "total": "2607", + "ok": "2494", + "ko": "2607" + }, + "percentiles3": { + "total": "2648", + "ok": "2636", + "ko": "2616" + }, + "percentiles4": { + "total": "2667", + "ok": "2665", + "ko": "2618" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 30 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.108", + "ko": "0.162" + } +} + },"req_request-260-43b5f": { + type: "REQUEST", + name: "request_260", +path: "request_260", +pathFormatted: "req_request-260-43b5f", +stats: { + "name": "request_260", + "numberOfRequests": { + "total": "10", + "ok": "5", + "ko": "5" + }, + "minResponseTime": { + "total": "907", + "ok": "1045", + "ko": "907" + }, + "maxResponseTime": { + "total": "2745", + "ok": "2745", + "ko": "2623" + }, + "meanResponseTime": { + "total": "2066", + "ok": "2206", + "ko": "1926" + }, + "standardDeviation": { + "total": "740", + "ok": "611", + "ko": "826" + }, + "percentiles1": { + "total": "2504", + "ok": "2438", + "ko": "2569" + }, + "percentiles2": { + "total": "2619", + "ok": "2622", + "ko": "2610" + }, + "percentiles3": { + "total": "2690", + "ok": "2720", + "ko": "2620" + }, + "percentiles4": { + "total": "2734", + "ok": "2740", + "ko": "2622" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.135", + "ko": "0.135" + } +} + },"req_request-265-cf160": { + type: "REQUEST", + name: "request_265", +path: "request_265", +pathFormatted: "req_request-265-cf160", +stats: { + "name": "request_265", + "numberOfRequests": { + "total": "10", + "ok": "5", + "ko": "5" + }, + "minResponseTime": { + "total": "884", + "ok": "1051", + "ko": "884" + }, + "maxResponseTime": { + "total": "2758", + "ok": "2758", + "ko": "2610" + }, + "meanResponseTime": { + "total": "2185", + "ok": "2121", + "ko": "2249" + }, + "standardDeviation": { + "total": "663", + "ok": "636", + "ko": "683" + }, + "percentiles1": { + "total": "2576", + "ok": "2360", + "ko": "2587" + }, + "percentiles2": { + "total": "2607", + "ok": "2664", + "ko": "2598" + }, + "percentiles3": { + "total": "2716", + "ok": "2739", + "ko": "2608" + }, + "percentiles4": { + "total": "2750", + "ok": "2754", + "ko": "2610" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.135", + "ko": "0.135" + } +} + },"req_request-244-416e5": { + type: "REQUEST", + name: "request_244", +path: "request_244", +pathFormatted: "req_request-244-416e5", +stats: { + "name": "request_244", + "numberOfRequests": { + "total": "9", + "ok": "9", + "ko": "0" + }, + "minResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "maxResponseTime": { + "total": "250", + "ok": "250", + "ko": "-" + }, + "meanResponseTime": { + "total": "141", + "ok": "141", + "ko": "-" + }, + "standardDeviation": { + "total": "84", + "ok": "84", + "ko": "-" + }, + "percentiles1": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "percentiles2": { + "total": "227", + "ok": "227", + "ko": "-" + }, + "percentiles3": { + "total": "243", + "ok": "243", + "ko": "-" + }, + "percentiles4": { + "total": "249", + "ok": "249", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.243", + "ok": "0.243", + "ko": "-" + } +} + },"req_request-273-0cd3c": { + type: "REQUEST", + name: "request_273", +path: "request_273", +pathFormatted: "req_request-273-0cd3c", +stats: { + "name": "request_273", + "numberOfRequests": { + "total": "7", + "ok": "4", + "ko": "3" + }, + "minResponseTime": { + "total": "344", + "ok": "344", + "ko": "2543" + }, + "maxResponseTime": { + "total": "2554", + "ok": "2353", + "ko": "2554" + }, + "meanResponseTime": { + "total": "1600", + "ok": "890", + "ko": "2547" + }, + "standardDeviation": { + "total": "1040", + "ok": "846", + "ko": "5" + }, + "percentiles1": { + "total": "2353", + "ok": "431", + "ko": "2544" + }, + "percentiles2": { + "total": "2544", + "ok": "949", + "ko": "2549" + }, + "percentiles3": { + "total": "2551", + "ok": "2072", + "ko": "2553" + }, + "percentiles4": { + "total": "2553", + "ok": "2297", + "ko": "2554" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 43 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 43 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.189", + "ok": "0.108", + "ko": "0.081" + } +} + },"req_request-270-e02a1": { + type: "REQUEST", + name: "request_270", +path: "request_270", +pathFormatted: "req_request-270-e02a1", +stats: { + "name": "request_270", + "numberOfRequests": { + "total": "3", + "ok": "2", + "ko": "1" + }, + "minResponseTime": { + "total": "449", + "ok": "449", + "ko": "2550" + }, + "maxResponseTime": { + "total": "2550", + "ok": "2083", + "ko": "2550" + }, + "meanResponseTime": { + "total": "1694", + "ok": "1266", + "ko": "2550" + }, + "standardDeviation": { + "total": "901", + "ok": "817", + "ko": "0" + }, + "percentiles1": { + "total": "2083", + "ok": "1266", + "ko": "2550" + }, + "percentiles2": { + "total": "2317", + "ok": "1675", + "ko": "2550" + }, + "percentiles3": { + "total": "2503", + "ok": "2001", + "ko": "2550" + }, + "percentiles4": { + "total": "2541", + "ok": "2067", + "ko": "2550" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 33 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 33 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 33 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.081", + "ok": "0.054", + "ko": "0.027" + } +} + },"req_request-277-d0ec5": { + type: "REQUEST", + name: "request_277", +path: "request_277", +pathFormatted: "req_request-277-d0ec5", +stats: { + "name": "request_277", + "numberOfRequests": { + "total": "2", + "ok": "1", + "ko": "1" + }, + "minResponseTime": { + "total": "484", + "ok": "484", + "ko": "2553" + }, + "maxResponseTime": { + "total": "2553", + "ok": "484", + "ko": "2553" + }, + "meanResponseTime": { + "total": "1519", + "ok": "484", + "ko": "2553" + }, + "standardDeviation": { + "total": "1035", + "ok": "0", + "ko": "0" + }, + "percentiles1": { + "total": "1519", + "ok": "484", + "ko": "2553" + }, + "percentiles2": { + "total": "2036", + "ok": "484", + "ko": "2553" + }, + "percentiles3": { + "total": "2450", + "ok": "484", + "ko": "2553" + }, + "percentiles4": { + "total": "2532", + "ok": "484", + "ko": "2553" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 50 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.054", + "ok": "0.027", + "ko": "0.027" + } +} + },"req_request-322-a2de9": { + type: "REQUEST", + name: "request_322", +path: "request_322", +pathFormatted: "req_request-322-a2de9", +stats: { + "name": "request_322", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "maxResponseTime": { + "total": "159", + "ok": "159", + "ko": "-" + }, + "meanResponseTime": { + "total": "65", + "ok": "65", + "ko": "-" + }, + "standardDeviation": { + "total": "32", + "ok": "32", + "ko": "-" + }, + "percentiles1": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "percentiles2": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "percentiles3": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "percentiles4": { + "total": "151", + "ok": "151", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + },"req_request-323-2fefc": { + type: "REQUEST", + name: "request_323", +path: "request_323", +pathFormatted: "req_request-323-2fefc", +stats: { + "name": "request_323", + "numberOfRequests": { + "total": "10", + "ok": "10", + "ko": "0" + }, + "minResponseTime": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "maxResponseTime": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "meanResponseTime": { + "total": "64", + "ok": "64", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "60", + "ok": "60", + "ko": "-" + }, + "percentiles2": { + "total": "70", + "ok": "70", + "ko": "-" + }, + "percentiles3": { + "total": "83", + "ok": "83", + "ko": "-" + }, + "percentiles4": { + "total": "89", + "ok": "89", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.27", + "ok": "0.27", + "ko": "-" + } +} + } +} + +} + +function fillStats(stat){ + $("#numberOfRequests").append(stat.numberOfRequests.total); + $("#numberOfRequestsOK").append(stat.numberOfRequests.ok); + $("#numberOfRequestsKO").append(stat.numberOfRequests.ko); + + $("#minResponseTime").append(stat.minResponseTime.total); + $("#minResponseTimeOK").append(stat.minResponseTime.ok); + $("#minResponseTimeKO").append(stat.minResponseTime.ko); + + $("#maxResponseTime").append(stat.maxResponseTime.total); + $("#maxResponseTimeOK").append(stat.maxResponseTime.ok); + $("#maxResponseTimeKO").append(stat.maxResponseTime.ko); + + $("#meanResponseTime").append(stat.meanResponseTime.total); + $("#meanResponseTimeOK").append(stat.meanResponseTime.ok); + $("#meanResponseTimeKO").append(stat.meanResponseTime.ko); + + $("#standardDeviation").append(stat.standardDeviation.total); + $("#standardDeviationOK").append(stat.standardDeviation.ok); + $("#standardDeviationKO").append(stat.standardDeviation.ko); + + $("#percentiles1").append(stat.percentiles1.total); + $("#percentiles1OK").append(stat.percentiles1.ok); + $("#percentiles1KO").append(stat.percentiles1.ko); + + $("#percentiles2").append(stat.percentiles2.total); + $("#percentiles2OK").append(stat.percentiles2.ok); + $("#percentiles2KO").append(stat.percentiles2.ko); + + $("#percentiles3").append(stat.percentiles3.total); + $("#percentiles3OK").append(stat.percentiles3.ok); + $("#percentiles3KO").append(stat.percentiles3.ko); + + $("#percentiles4").append(stat.percentiles4.total); + $("#percentiles4OK").append(stat.percentiles4.ok); + $("#percentiles4KO").append(stat.percentiles4.ko); + + $("#meanNumberOfRequestsPerSecond").append(stat.meanNumberOfRequestsPerSecond.total); + $("#meanNumberOfRequestsPerSecondOK").append(stat.meanNumberOfRequestsPerSecond.ok); + $("#meanNumberOfRequestsPerSecondKO").append(stat.meanNumberOfRequestsPerSecond.ko); +} diff --git a/webapp/loadTests/10users/js/stats.json b/webapp/loadTests/10users/js/stats.json new file mode 100644 index 0000000..be82a72 --- /dev/null +++ b/webapp/loadTests/10users/js/stats.json @@ -0,0 +1,4023 @@ +{ + "type": "GROUP", +"name": "All Requests", +"path": "", +"pathFormatted": "group_missing-name-b06d1", +"stats": { + "name": "All Requests", + "numberOfRequests": { + "total": 461, + "ok": 395, + "ko": 66 + }, + "minResponseTime": { + "total": 8, + "ok": 8, + "ko": 538 + }, + "maxResponseTime": { + "total": 3234, + "ok": 3234, + "ko": 2798 + }, + "meanResponseTime": { + "total": 613, + "ok": 463, + "ko": 1506 + }, + "standardDeviation": { + "total": 814, + "ok": 681, + "ko": 965 + }, + "percentiles1": { + "total": 200, + "ok": 138, + "ko": 955 + }, + "percentiles2": { + "total": 806, + "ok": 583, + "ko": 2606 + }, + "percentiles3": { + "total": 2622, + "ok": 2373, + "ko": 2785 + }, + "percentiles4": { + "total": 2836, + "ok": 2894, + "ko": 2793 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 317, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 40, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 38, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 66, + "percentage": 14 +}, + "meanNumberOfRequestsPerSecond": { + "total": 12.45945945945946, + "ok": 10.675675675675675, + "ko": 1.7837837837837838 + } +}, +"contents": { +"req_request-0-684d2": { + "type": "REQUEST", + "name": "request_0", +"path": "request_0", +"pathFormatted": "req_request-0-684d2", +"stats": { + "name": "request_0", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "maxResponseTime": { + "total": 67, + "ok": 67, + "ko": 0 + }, + "meanResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "standardDeviation": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles1": { + "total": 61, + "ok": 61, + "ko": 0 + }, + "percentiles2": { + "total": 65, + "ok": 65, + "ko": 0 + }, + "percentiles3": { + "total": 67, + "ok": 67, + "ko": 0 + }, + "percentiles4": { + "total": 67, + "ok": 67, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-1-46da4": { + "type": "REQUEST", + "name": "request_1", +"path": "request_1", +"pathFormatted": "req_request-1-46da4", +"stats": { + "name": "request_1", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "maxResponseTime": { + "total": 85, + "ok": 85, + "ko": 0 + }, + "meanResponseTime": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "standardDeviation": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "percentiles1": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles2": { + "total": 69, + "ok": 69, + "ko": 0 + }, + "percentiles3": { + "total": 81, + "ok": 81, + "ko": 0 + }, + "percentiles4": { + "total": 84, + "ok": 84, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-2-93baf": { + "type": "REQUEST", + "name": "request_2", +"path": "request_2", +"pathFormatted": "req_request-2-93baf", +"stats": { + "name": "request_2", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 472, + "ok": 472, + "ko": 0 + }, + "maxResponseTime": { + "total": 547, + "ok": 547, + "ko": 0 + }, + "meanResponseTime": { + "total": 504, + "ok": 504, + "ko": 0 + }, + "standardDeviation": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "percentiles1": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "percentiles2": { + "total": 521, + "ok": 521, + "ko": 0 + }, + "percentiles3": { + "total": 543, + "ok": 543, + "ko": 0 + }, + "percentiles4": { + "total": 546, + "ok": 546, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-3-d0973": { + "type": "REQUEST", + "name": "request_3", +"path": "request_3", +"pathFormatted": "req_request-3-d0973", +"stats": { + "name": "request_3", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 183, + "ok": 183, + "ko": 0 + }, + "maxResponseTime": { + "total": 202, + "ok": 202, + "ko": 0 + }, + "meanResponseTime": { + "total": 192, + "ok": 192, + "ko": 0 + }, + "standardDeviation": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles1": { + "total": 191, + "ok": 191, + "ko": 0 + }, + "percentiles2": { + "total": 197, + "ok": 197, + "ko": 0 + }, + "percentiles3": { + "total": 201, + "ok": 201, + "ko": 0 + }, + "percentiles4": { + "total": 202, + "ok": 202, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-4-e7d1b": { + "type": "REQUEST", + "name": "request_4", +"path": "request_4", +"pathFormatted": "req_request-4-e7d1b", +"stats": { + "name": "request_4", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 477, + "ok": 477, + "ko": 0 + }, + "maxResponseTime": { + "total": 1229, + "ok": 1229, + "ko": 0 + }, + "meanResponseTime": { + "total": 938, + "ok": 938, + "ko": 0 + }, + "standardDeviation": { + "total": 223, + "ok": 223, + "ko": 0 + }, + "percentiles1": { + "total": 852, + "ok": 852, + "ko": 0 + }, + "percentiles2": { + "total": 1151, + "ok": 1151, + "ko": 0 + }, + "percentiles3": { + "total": 1210, + "ok": 1210, + "ko": 0 + }, + "percentiles4": { + "total": 1225, + "ok": 1225, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 10 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 80 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-5-48829": { + "type": "REQUEST", + "name": "request_5", +"path": "request_5", +"pathFormatted": "req_request-5-48829", +"stats": { + "name": "request_5", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 409, + "ok": 409, + "ko": 0 + }, + "maxResponseTime": { + "total": 1100, + "ok": 1100, + "ko": 0 + }, + "meanResponseTime": { + "total": 743, + "ok": 743, + "ko": 0 + }, + "standardDeviation": { + "total": 244, + "ok": 244, + "ko": 0 + }, + "percentiles1": { + "total": 800, + "ok": 800, + "ko": 0 + }, + "percentiles2": { + "total": 808, + "ok": 808, + "ko": 0 + }, + "percentiles3": { + "total": 1097, + "ok": 1097, + "ko": 0 + }, + "percentiles4": { + "total": 1099, + "ok": 1099, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 5, + "percentage": 50 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 50 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-6-027a9": { + "type": "REQUEST", + "name": "request_6", +"path": "request_6", +"pathFormatted": "req_request-6-027a9", +"stats": { + "name": "request_6", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 556, + "ok": 556, + "ko": 0 + }, + "maxResponseTime": { + "total": 1387, + "ok": 1387, + "ko": 0 + }, + "meanResponseTime": { + "total": 995, + "ok": 995, + "ko": 0 + }, + "standardDeviation": { + "total": 300, + "ok": 300, + "ko": 0 + }, + "percentiles1": { + "total": 998, + "ok": 998, + "ko": 0 + }, + "percentiles2": { + "total": 1277, + "ok": 1277, + "ko": 0 + }, + "percentiles3": { + "total": 1346, + "ok": 1346, + "ko": 0 + }, + "percentiles4": { + "total": 1379, + "ok": 1379, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 30 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-7-f222f": { + "type": "REQUEST", + "name": "request_7", +"path": "request_7", +"pathFormatted": "req_request-7-f222f", +"stats": { + "name": "request_7", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 382, + "ok": 382, + "ko": 0 + }, + "maxResponseTime": { + "total": 1199, + "ok": 1199, + "ko": 0 + }, + "meanResponseTime": { + "total": 865, + "ok": 865, + "ko": 0 + }, + "standardDeviation": { + "total": 293, + "ok": 293, + "ko": 0 + }, + "percentiles1": { + "total": 814, + "ok": 814, + "ko": 0 + }, + "percentiles2": { + "total": 1167, + "ok": 1167, + "ko": 0 + }, + "percentiles3": { + "total": 1190, + "ok": 1190, + "ko": 0 + }, + "percentiles4": { + "total": 1197, + "ok": 1197, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 4, + "percentage": 40 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 60 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-5-redir-affb3": { + "type": "REQUEST", + "name": "request_5 Redirect 1", +"path": "request_5 Redirect 1", +"pathFormatted": "req_request-5-redir-affb3", +"stats": { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "maxResponseTime": { + "total": 230, + "ok": 230, + "ko": 0 + }, + "meanResponseTime": { + "total": 156, + "ok": 156, + "ko": 0 + }, + "standardDeviation": { + "total": 47, + "ok": 47, + "ko": 0 + }, + "percentiles1": { + "total": 141, + "ok": 141, + "ko": 0 + }, + "percentiles2": { + "total": 202, + "ok": 202, + "ko": 0 + }, + "percentiles3": { + "total": 227, + "ok": 227, + "ko": 0 + }, + "percentiles4": { + "total": 229, + "ok": 229, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-8-ef0c8": { + "type": "REQUEST", + "name": "request_8", +"path": "request_8", +"pathFormatted": "req_request-8-ef0c8", +"stats": { + "name": "request_8", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 460, + "ok": 460, + "ko": 0 + }, + "maxResponseTime": { + "total": 851, + "ok": 851, + "ko": 0 + }, + "meanResponseTime": { + "total": 643, + "ok": 643, + "ko": 0 + }, + "standardDeviation": { + "total": 154, + "ok": 154, + "ko": 0 + }, + "percentiles1": { + "total": 619, + "ok": 619, + "ko": 0 + }, + "percentiles2": { + "total": 812, + "ok": 812, + "ko": 0 + }, + "percentiles3": { + "total": 837, + "ok": 837, + "ko": 0 + }, + "percentiles4": { + "total": 848, + "ok": 848, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 7, + "percentage": 70 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 30 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-8-redir-98b2a": { + "type": "REQUEST", + "name": "request_8 Redirect 1", +"path": "request_8 Redirect 1", +"pathFormatted": "req_request-8-redir-98b2a", +"stats": { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 375, + "ok": 375, + "ko": 0 + }, + "maxResponseTime": { + "total": 865, + "ok": 865, + "ko": 0 + }, + "meanResponseTime": { + "total": 545, + "ok": 545, + "ko": 0 + }, + "standardDeviation": { + "total": 175, + "ok": 175, + "ko": 0 + }, + "percentiles1": { + "total": 497, + "ok": 497, + "ko": 0 + }, + "percentiles2": { + "total": 673, + "ok": 673, + "ko": 0 + }, + "percentiles3": { + "total": 826, + "ok": 826, + "ko": 0 + }, + "percentiles4": { + "total": 857, + "ok": 857, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 90 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-8-redir-fc911": { + "type": "REQUEST", + "name": "request_8 Redirect 2", +"path": "request_8 Redirect 2", +"pathFormatted": "req_request-8-redir-fc911", +"stats": { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 409, + "ok": 409, + "ko": 0 + }, + "maxResponseTime": { + "total": 882, + "ok": 882, + "ko": 0 + }, + "meanResponseTime": { + "total": 611, + "ok": 611, + "ko": 0 + }, + "standardDeviation": { + "total": 136, + "ok": 136, + "ko": 0 + }, + "percentiles1": { + "total": 653, + "ok": 653, + "ko": 0 + }, + "percentiles2": { + "total": 681, + "ok": 681, + "ko": 0 + }, + "percentiles3": { + "total": 799, + "ok": 799, + "ko": 0 + }, + "percentiles4": { + "total": 865, + "ok": 865, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 90 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-8-redir-e875c": { + "type": "REQUEST", + "name": "request_8 Redirect 3", +"path": "request_8 Redirect 3", +"pathFormatted": "req_request-8-redir-e875c", +"stats": { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "maxResponseTime": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "meanResponseTime": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "standardDeviation": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "percentiles1": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles2": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "percentiles3": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles4": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-12-61da2": { + "type": "REQUEST", + "name": "request_12", +"path": "request_12", +"pathFormatted": "req_request-12-61da2", +"stats": { + "name": "request_12", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "maxResponseTime": { + "total": 102, + "ok": 102, + "ko": 0 + }, + "meanResponseTime": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "standardDeviation": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "percentiles1": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "percentiles2": { + "total": 82, + "ok": 82, + "ko": 0 + }, + "percentiles3": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "percentiles4": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-14-a0e30": { + "type": "REQUEST", + "name": "request_14", +"path": "request_14", +"pathFormatted": "req_request-14-a0e30", +"stats": { + "name": "request_14", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 18, + "ok": 18, + "ko": 0 + }, + "maxResponseTime": { + "total": 102, + "ok": 102, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "percentiles1": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles2": { + "total": 84, + "ok": 84, + "ko": 0 + }, + "percentiles3": { + "total": 98, + "ok": 98, + "ko": 0 + }, + "percentiles4": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-22-8ecb1": { + "type": "REQUEST", + "name": "request_22", +"path": "request_22", +"pathFormatted": "req_request-22-8ecb1", +"stats": { + "name": "request_22", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 60, + "ok": 60, + "ko": 0 + }, + "maxResponseTime": { + "total": 169, + "ok": 169, + "ko": 0 + }, + "meanResponseTime": { + "total": 106, + "ok": 106, + "ko": 0 + }, + "standardDeviation": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "percentiles1": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "percentiles2": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "percentiles3": { + "total": 166, + "ok": 166, + "ko": 0 + }, + "percentiles4": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-21-be4cb": { + "type": "REQUEST", + "name": "request_21", +"path": "request_21", +"pathFormatted": "req_request-21-be4cb", +"stats": { + "name": "request_21", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "maxResponseTime": { + "total": 172, + "ok": 172, + "ko": 0 + }, + "meanResponseTime": { + "total": 104, + "ok": 104, + "ko": 0 + }, + "standardDeviation": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "percentiles1": { + "total": 84, + "ok": 84, + "ko": 0 + }, + "percentiles2": { + "total": 151, + "ok": 151, + "ko": 0 + }, + "percentiles3": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "percentiles4": { + "total": 171, + "ok": 171, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-24-dd0c9": { + "type": "REQUEST", + "name": "request_24", +"path": "request_24", +"pathFormatted": "req_request-24-dd0c9", +"stats": { + "name": "request_24", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "maxResponseTime": { + "total": 170, + "ok": 170, + "ko": 0 + }, + "meanResponseTime": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "standardDeviation": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "percentiles1": { + "total": 89, + "ok": 89, + "ko": 0 + }, + "percentiles2": { + "total": 162, + "ok": 162, + "ko": 0 + }, + "percentiles3": { + "total": 169, + "ok": 169, + "ko": 0 + }, + "percentiles4": { + "total": 170, + "ok": 170, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-13-5cca6": { + "type": "REQUEST", + "name": "request_13", +"path": "request_13", +"pathFormatted": "req_request-13-5cca6", +"stats": { + "name": "request_13", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 70, + "ok": 70, + "ko": 0 + }, + "maxResponseTime": { + "total": 126, + "ok": 126, + "ko": 0 + }, + "meanResponseTime": { + "total": 93, + "ok": 93, + "ko": 0 + }, + "standardDeviation": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles1": { + "total": 93, + "ok": 93, + "ko": 0 + }, + "percentiles2": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles3": { + "total": 117, + "ok": 117, + "ko": 0 + }, + "percentiles4": { + "total": 124, + "ok": 124, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-200-636fa": { + "type": "REQUEST", + "name": "request_200", +"path": "request_200", +"pathFormatted": "req_request-200-636fa", +"stats": { + "name": "request_200", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 69, + "ok": 69, + "ko": 0 + }, + "maxResponseTime": { + "total": 171, + "ok": 171, + "ko": 0 + }, + "meanResponseTime": { + "total": 115, + "ok": 115, + "ko": 0 + }, + "standardDeviation": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "percentiles1": { + "total": 98, + "ok": 98, + "ko": 0 + }, + "percentiles2": { + "total": 162, + "ok": 162, + "ko": 0 + }, + "percentiles3": { + "total": 170, + "ok": 170, + "ko": 0 + }, + "percentiles4": { + "total": 171, + "ok": 171, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-16-24733": { + "type": "REQUEST", + "name": "request_16", +"path": "request_16", +"pathFormatted": "req_request-16-24733", +"stats": { + "name": "request_16", + "numberOfRequests": { + "total": 10, + "ok": 7, + "ko": 3 + }, + "minResponseTime": { + "total": 572, + "ok": 622, + "ko": 572 + }, + "maxResponseTime": { + "total": 1961, + "ok": 1961, + "ko": 592 + }, + "meanResponseTime": { + "total": 995, + "ok": 1173, + "ko": 579 + }, + "standardDeviation": { + "total": 478, + "ok": 470, + "ko": 9 + }, + "percentiles1": { + "total": 812, + "ok": 973, + "ko": 573 + }, + "percentiles2": { + "total": 1271, + "ok": 1515, + "ko": 583 + }, + "percentiles3": { + "total": 1825, + "ok": 1870, + "ko": 590 + }, + "percentiles4": { + "total": 1934, + "ok": 1943, + "ko": 592 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 20 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 30 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 30 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.1891891891891892, + "ko": 0.08108108108108109 + } +} + },"req_request-15-56eac": { + "type": "REQUEST", + "name": "request_15", +"path": "request_15", +"pathFormatted": "req_request-15-56eac", +"stats": { + "name": "request_15", + "numberOfRequests": { + "total": 10, + "ok": 5, + "ko": 5 + }, + "minResponseTime": { + "total": 545, + "ok": 652, + "ko": 545 + }, + "maxResponseTime": { + "total": 1648, + "ok": 1648, + "ko": 596 + }, + "meanResponseTime": { + "total": 838, + "ok": 1096, + "ko": 579 + }, + "standardDeviation": { + "total": 344, + "ok": 320, + "ko": 18 + }, + "percentiles1": { + "total": 624, + "ok": 1042, + "ko": 584 + }, + "percentiles2": { + "total": 1036, + "ok": 1122, + "ko": 592 + }, + "percentiles3": { + "total": 1411, + "ok": 1543, + "ko": 595 + }, + "percentiles4": { + "total": 1601, + "ok": 1627, + "ko": 596 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 10 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 30 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.13513513513513514, + "ko": 0.13513513513513514 + } +} + },"req_logo-png-c9c2b": { + "type": "REQUEST", + "name": "Logo.png", +"path": "Logo.png", +"pathFormatted": "req_logo-png-c9c2b", +"stats": { + "name": "Logo.png", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "maxResponseTime": { + "total": 64, + "ok": 64, + "ko": 0 + }, + "meanResponseTime": { + "total": 26, + "ok": 26, + "ko": 0 + }, + "standardDeviation": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles1": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "percentiles2": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "percentiles3": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "percentiles4": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-18-f5b64": { + "type": "REQUEST", + "name": "request_18", +"path": "request_18", +"pathFormatted": "req_request-18-f5b64", +"stats": { + "name": "request_18", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 203, + "ok": 203, + "ko": 0 + }, + "maxResponseTime": { + "total": 514, + "ok": 514, + "ko": 0 + }, + "meanResponseTime": { + "total": 365, + "ok": 365, + "ko": 0 + }, + "standardDeviation": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "percentiles1": { + "total": 376, + "ok": 376, + "ko": 0 + }, + "percentiles2": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "percentiles3": { + "total": 510, + "ok": 510, + "ko": 0 + }, + "percentiles4": { + "total": 513, + "ok": 513, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_bundle-js-0b837": { + "type": "REQUEST", + "name": "bundle.js", +"path": "bundle.js", +"pathFormatted": "req_bundle-js-0b837", +"stats": { + "name": "bundle.js", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "maxResponseTime": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "meanResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "standardDeviation": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles1": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "percentiles2": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "percentiles3": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "percentiles4": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-9-d127e": { + "type": "REQUEST", + "name": "request_9", +"path": "request_9", +"pathFormatted": "req_request-9-d127e", +"stats": { + "name": "request_9", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "maxResponseTime": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "meanResponseTime": { + "total": 65, + "ok": 65, + "ko": 0 + }, + "standardDeviation": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "percentiles1": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "percentiles2": { + "total": 81, + "ok": 81, + "ko": 0 + }, + "percentiles3": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "percentiles4": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-10-1cfbe": { + "type": "REQUEST", + "name": "request_10", +"path": "request_10", +"pathFormatted": "req_request-10-1cfbe", +"stats": { + "name": "request_10", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "maxResponseTime": { + "total": 102, + "ok": 102, + "ko": 0 + }, + "meanResponseTime": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "standardDeviation": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "percentiles1": { + "total": 61, + "ok": 61, + "ko": 0 + }, + "percentiles2": { + "total": 81, + "ok": 81, + "ko": 0 + }, + "percentiles3": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles4": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-11-f11e8": { + "type": "REQUEST", + "name": "request_11", +"path": "request_11", +"pathFormatted": "req_request-11-f11e8", +"stats": { + "name": "request_11", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 80, + "ok": 80, + "ko": 0 + }, + "maxResponseTime": { + "total": 167, + "ok": 167, + "ko": 0 + }, + "meanResponseTime": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "standardDeviation": { + "total": 32, + "ok": 32, + "ko": 0 + }, + "percentiles1": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles2": { + "total": 140, + "ok": 140, + "ko": 0 + }, + "percentiles3": { + "total": 162, + "ok": 162, + "ko": 0 + }, + "percentiles4": { + "total": 166, + "ok": 166, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-242-d6d33": { + "type": "REQUEST", + "name": "request_242", +"path": "request_242", +"pathFormatted": "req_request-242-d6d33", +"stats": { + "name": "request_242", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "maxResponseTime": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "meanResponseTime": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "standardDeviation": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "percentiles1": { + "total": 65, + "ok": 65, + "ko": 0 + }, + "percentiles2": { + "total": 82, + "ok": 82, + "ko": 0 + }, + "percentiles3": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "percentiles4": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_css2-family-rob-cf8a9": { + "type": "REQUEST", + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"path": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"pathFormatted": "req_css2-family-rob-cf8a9", +"stats": { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "maxResponseTime": { + "total": 178, + "ok": 178, + "ko": 0 + }, + "meanResponseTime": { + "total": 128, + "ok": 128, + "ko": 0 + }, + "standardDeviation": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "percentiles1": { + "total": 119, + "ok": 119, + "ko": 0 + }, + "percentiles2": { + "total": 136, + "ok": 136, + "ko": 0 + }, + "percentiles3": { + "total": 161, + "ok": 161, + "ko": 0 + }, + "percentiles4": { + "total": 175, + "ok": 175, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-19-10d85": { + "type": "REQUEST", + "name": "request_19", +"path": "request_19", +"pathFormatted": "req_request-19-10d85", +"stats": { + "name": "request_19", + "numberOfRequests": { + "total": 10, + "ok": 6, + "ko": 4 + }, + "minResponseTime": { + "total": 556, + "ok": 1084, + "ko": 556 + }, + "maxResponseTime": { + "total": 3234, + "ok": 3234, + "ko": 579 + }, + "meanResponseTime": { + "total": 1515, + "ok": 2147, + "ko": 566 + }, + "standardDeviation": { + "total": 1006, + "ok": 829, + "ko": 9 + }, + "percentiles1": { + "total": 1112, + "ok": 2261, + "ko": 565 + }, + "percentiles2": { + "total": 2417, + "ok": 2823, + "ko": 572 + }, + "percentiles3": { + "total": 3086, + "ok": 3152, + "ko": 578 + }, + "percentiles4": { + "total": 3204, + "ok": 3218, + "ko": 579 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 4, + "percentage": 40 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.16216216216216217, + "ko": 0.10810810810810811 + } +} + },"req_request-20-6804b": { + "type": "REQUEST", + "name": "request_20", +"path": "request_20", +"pathFormatted": "req_request-20-6804b", +"stats": { + "name": "request_20", + "numberOfRequests": { + "total": 10, + "ok": 3, + "ko": 7 + }, + "minResponseTime": { + "total": 540, + "ok": 585, + "ko": 540 + }, + "maxResponseTime": { + "total": 1883, + "ok": 1883, + "ko": 970 + }, + "meanResponseTime": { + "total": 749, + "ok": 1049, + "ko": 621 + }, + "standardDeviation": { + "total": 397, + "ok": 591, + "ko": 145 + }, + "percentiles1": { + "total": 580, + "ok": 678, + "ko": 555 + }, + "percentiles2": { + "total": 662, + "ok": 1281, + "ko": 595 + }, + "percentiles3": { + "total": 1472, + "ok": 1762, + "ko": 863 + }, + "percentiles4": { + "total": 1801, + "ok": 1859, + "ko": 949 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 20 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 70 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.08108108108108109, + "ko": 0.1891891891891892 + } +} + },"req_request-23-98f5d": { + "type": "REQUEST", + "name": "request_23", +"path": "request_23", +"pathFormatted": "req_request-23-98f5d", +"stats": { + "name": "request_23", + "numberOfRequests": { + "total": 10, + "ok": 4, + "ko": 6 + }, + "minResponseTime": { + "total": 538, + "ok": 1066, + "ko": 538 + }, + "maxResponseTime": { + "total": 2790, + "ok": 2790, + "ko": 1192 + }, + "meanResponseTime": { + "total": 1218, + "ok": 1942, + "ko": 736 + }, + "standardDeviation": { + "total": 816, + "ok": 839, + "ko": 241 + }, + "percentiles1": { + "total": 995, + "ok": 1957, + "ko": 592 + }, + "percentiles2": { + "total": 1180, + "ok": 2776, + "ko": 842 + }, + "percentiles3": { + "total": 2781, + "ok": 2787, + "ko": 1125 + }, + "percentiles4": { + "total": 2788, + "ok": 2789, + "ko": 1179 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 20 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.10810810810810811, + "ko": 0.16216216216216217 + } +} + },"req_request-222-24864": { + "type": "REQUEST", + "name": "request_222", +"path": "request_222", +"pathFormatted": "req_request-222-24864", +"stats": { + "name": "request_222", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "maxResponseTime": { + "total": 318, + "ok": 318, + "ko": 0 + }, + "meanResponseTime": { + "total": 157, + "ok": 157, + "ko": 0 + }, + "standardDeviation": { + "total": 128, + "ok": 128, + "ko": 0 + }, + "percentiles1": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "percentiles2": { + "total": 310, + "ok": 310, + "ko": 0 + }, + "percentiles3": { + "total": 316, + "ok": 316, + "ko": 0 + }, + "percentiles4": { + "total": 318, + "ok": 318, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-227-2507b": { + "type": "REQUEST", + "name": "request_227", +"path": "request_227", +"pathFormatted": "req_request-227-2507b", +"stats": { + "name": "request_227", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "maxResponseTime": { + "total": 323, + "ok": 323, + "ko": 0 + }, + "meanResponseTime": { + "total": 131, + "ok": 131, + "ko": 0 + }, + "standardDeviation": { + "total": 113, + "ok": 113, + "ko": 0 + }, + "percentiles1": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "percentiles2": { + "total": 237, + "ok": 237, + "ko": 0 + }, + "percentiles3": { + "total": 311, + "ok": 311, + "ko": 0 + }, + "percentiles4": { + "total": 321, + "ok": 321, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-240-e27d8": { + "type": "REQUEST", + "name": "request_240", +"path": "request_240", +"pathFormatted": "req_request-240-e27d8", +"stats": { + "name": "request_240", + "numberOfRequests": { + "total": 10, + "ok": 4, + "ko": 6 + }, + "minResponseTime": { + "total": 666, + "ok": 1223, + "ko": 666 + }, + "maxResponseTime": { + "total": 3138, + "ok": 3138, + "ko": 2798 + }, + "meanResponseTime": { + "total": 2275, + "ok": 2491, + "ko": 2130 + }, + "standardDeviation": { + "total": 877, + "ok": 748, + "ko": 925 + }, + "percentiles1": { + "total": 2768, + "ok": 2802, + "ko": 2768 + }, + "percentiles2": { + "total": 2796, + "ok": 2954, + "ko": 2788 + }, + "percentiles3": { + "total": 3028, + "ok": 3101, + "ko": 2796 + }, + "percentiles4": { + "total": 3116, + "ok": 3131, + "ko": 2798 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.10810810810810811, + "ko": 0.16216216216216217 + } +} + },"req_request-241-2919b": { + "type": "REQUEST", + "name": "request_241", +"path": "request_241", +"pathFormatted": "req_request-241-2919b", +"stats": { + "name": "request_241", + "numberOfRequests": { + "total": 10, + "ok": 4, + "ko": 6 + }, + "minResponseTime": { + "total": 688, + "ok": 1946, + "ko": 688 + }, + "maxResponseTime": { + "total": 3156, + "ok": 3156, + "ko": 2788 + }, + "meanResponseTime": { + "total": 2298, + "ok": 2493, + "ko": 2167 + }, + "standardDeviation": { + "total": 743, + "ok": 432, + "ko": 867 + }, + "percentiles1": { + "total": 2596, + "ok": 2436, + "ko": 2753 + }, + "percentiles2": { + "total": 2785, + "ok": 2641, + "ko": 2785 + }, + "percentiles3": { + "total": 2990, + "ok": 3053, + "ko": 2788 + }, + "percentiles4": { + "total": 3123, + "ok": 3135, + "ko": 2788 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.10810810810810811, + "ko": 0.16216216216216217 + } +} + },"req_request-243-b078b": { + "type": "REQUEST", + "name": "request_243", +"path": "request_243", +"pathFormatted": "req_request-243-b078b", +"stats": { + "name": "request_243", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "maxResponseTime": { + "total": 237, + "ok": 237, + "ko": 0 + }, + "meanResponseTime": { + "total": 128, + "ok": 128, + "ko": 0 + }, + "standardDeviation": { + "total": 77, + "ok": 77, + "ko": 0 + }, + "percentiles1": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "percentiles2": { + "total": 213, + "ok": 213, + "ko": 0 + }, + "percentiles3": { + "total": 232, + "ok": 232, + "ko": 0 + }, + "percentiles4": { + "total": 236, + "ok": 236, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-250-8cb1f": { + "type": "REQUEST", + "name": "request_250", +"path": "request_250", +"pathFormatted": "req_request-250-8cb1f", +"stats": { + "name": "request_250", + "numberOfRequests": { + "total": 10, + "ok": 2, + "ko": 8 + }, + "minResponseTime": { + "total": 678, + "ok": 1096, + "ko": 678 + }, + "maxResponseTime": { + "total": 2753, + "ok": 2676, + "ko": 2753 + }, + "meanResponseTime": { + "total": 1764, + "ok": 1886, + "ko": 1734 + }, + "standardDeviation": { + "total": 895, + "ok": 790, + "ko": 917 + }, + "percentiles1": { + "total": 1850, + "ok": 1886, + "ko": 1785 + }, + "percentiles2": { + "total": 2614, + "ok": 2281, + "ko": 2611 + }, + "percentiles3": { + "total": 2718, + "ok": 2597, + "ko": 2705 + }, + "percentiles4": { + "total": 2746, + "ok": 2660, + "ko": 2743 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 8, + "percentage": 80 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.05405405405405406, + "ko": 0.21621621621621623 + } +} + },"req_request-252-38647": { + "type": "REQUEST", + "name": "request_252", +"path": "request_252", +"pathFormatted": "req_request-252-38647", +"stats": { + "name": "request_252", + "numberOfRequests": { + "total": 10, + "ok": 4, + "ko": 6 + }, + "minResponseTime": { + "total": 669, + "ok": 1144, + "ko": 669 + }, + "maxResponseTime": { + "total": 2672, + "ok": 2672, + "ko": 2619 + }, + "meanResponseTime": { + "total": 1911, + "ok": 2168, + "ko": 1740 + }, + "standardDeviation": { + "total": 806, + "ok": 599, + "ko": 877 + }, + "percentiles1": { + "total": 2428, + "ok": 2428, + "ko": 1801 + }, + "percentiles2": { + "total": 2607, + "ok": 2494, + "ko": 2607 + }, + "percentiles3": { + "total": 2648, + "ok": 2636, + "ko": 2616 + }, + "percentiles4": { + "total": 2667, + "ok": 2665, + "ko": 2618 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 30 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 60 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.10810810810810811, + "ko": 0.16216216216216217 + } +} + },"req_request-260-43b5f": { + "type": "REQUEST", + "name": "request_260", +"path": "request_260", +"pathFormatted": "req_request-260-43b5f", +"stats": { + "name": "request_260", + "numberOfRequests": { + "total": 10, + "ok": 5, + "ko": 5 + }, + "minResponseTime": { + "total": 907, + "ok": 1045, + "ko": 907 + }, + "maxResponseTime": { + "total": 2745, + "ok": 2745, + "ko": 2623 + }, + "meanResponseTime": { + "total": 2066, + "ok": 2206, + "ko": 1926 + }, + "standardDeviation": { + "total": 740, + "ok": 611, + "ko": 826 + }, + "percentiles1": { + "total": 2504, + "ok": 2438, + "ko": 2569 + }, + "percentiles2": { + "total": 2619, + "ok": 2622, + "ko": 2610 + }, + "percentiles3": { + "total": 2690, + "ok": 2720, + "ko": 2620 + }, + "percentiles4": { + "total": 2734, + "ok": 2740, + "ko": 2622 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.13513513513513514, + "ko": 0.13513513513513514 + } +} + },"req_request-265-cf160": { + "type": "REQUEST", + "name": "request_265", +"path": "request_265", +"pathFormatted": "req_request-265-cf160", +"stats": { + "name": "request_265", + "numberOfRequests": { + "total": 10, + "ok": 5, + "ko": 5 + }, + "minResponseTime": { + "total": 884, + "ok": 1051, + "ko": 884 + }, + "maxResponseTime": { + "total": 2758, + "ok": 2758, + "ko": 2610 + }, + "meanResponseTime": { + "total": 2185, + "ok": 2121, + "ko": 2249 + }, + "standardDeviation": { + "total": 663, + "ok": 636, + "ko": 683 + }, + "percentiles1": { + "total": 2576, + "ok": 2360, + "ko": 2587 + }, + "percentiles2": { + "total": 2607, + "ok": 2664, + "ko": 2598 + }, + "percentiles3": { + "total": 2716, + "ok": 2739, + "ko": 2608 + }, + "percentiles4": { + "total": 2750, + "ok": 2754, + "ko": 2610 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 40 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.13513513513513514, + "ko": 0.13513513513513514 + } +} + },"req_request-244-416e5": { + "type": "REQUEST", + "name": "request_244", +"path": "request_244", +"pathFormatted": "req_request-244-416e5", +"stats": { + "name": "request_244", + "numberOfRequests": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "minResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "maxResponseTime": { + "total": 250, + "ok": 250, + "ko": 0 + }, + "meanResponseTime": { + "total": 141, + "ok": 141, + "ko": 0 + }, + "standardDeviation": { + "total": 84, + "ok": 84, + "ko": 0 + }, + "percentiles1": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "percentiles2": { + "total": 227, + "ok": 227, + "ko": 0 + }, + "percentiles3": { + "total": 243, + "ok": 243, + "ko": 0 + }, + "percentiles4": { + "total": 249, + "ok": 249, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.24324324324324326, + "ok": 0.24324324324324326, + "ko": 0 + } +} + },"req_request-273-0cd3c": { + "type": "REQUEST", + "name": "request_273", +"path": "request_273", +"pathFormatted": "req_request-273-0cd3c", +"stats": { + "name": "request_273", + "numberOfRequests": { + "total": 7, + "ok": 4, + "ko": 3 + }, + "minResponseTime": { + "total": 344, + "ok": 344, + "ko": 2543 + }, + "maxResponseTime": { + "total": 2554, + "ok": 2353, + "ko": 2554 + }, + "meanResponseTime": { + "total": 1600, + "ok": 890, + "ko": 2547 + }, + "standardDeviation": { + "total": 1040, + "ok": 846, + "ko": 5 + }, + "percentiles1": { + "total": 2353, + "ok": 431, + "ko": 2544 + }, + "percentiles2": { + "total": 2544, + "ok": 949, + "ko": 2549 + }, + "percentiles3": { + "total": 2551, + "ok": 2072, + "ko": 2553 + }, + "percentiles4": { + "total": 2553, + "ok": 2297, + "ko": 2554 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 43 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 43 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.1891891891891892, + "ok": 0.10810810810810811, + "ko": 0.08108108108108109 + } +} + },"req_request-270-e02a1": { + "type": "REQUEST", + "name": "request_270", +"path": "request_270", +"pathFormatted": "req_request-270-e02a1", +"stats": { + "name": "request_270", + "numberOfRequests": { + "total": 3, + "ok": 2, + "ko": 1 + }, + "minResponseTime": { + "total": 449, + "ok": 449, + "ko": 2550 + }, + "maxResponseTime": { + "total": 2550, + "ok": 2083, + "ko": 2550 + }, + "meanResponseTime": { + "total": 1694, + "ok": 1266, + "ko": 2550 + }, + "standardDeviation": { + "total": 901, + "ok": 817, + "ko": 0 + }, + "percentiles1": { + "total": 2083, + "ok": 1266, + "ko": 2550 + }, + "percentiles2": { + "total": 2317, + "ok": 1675, + "ko": 2550 + }, + "percentiles3": { + "total": 2503, + "ok": 2001, + "ko": 2550 + }, + "percentiles4": { + "total": 2541, + "ok": 2067, + "ko": 2550 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 33 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 33 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 33 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.08108108108108109, + "ok": 0.05405405405405406, + "ko": 0.02702702702702703 + } +} + },"req_request-277-d0ec5": { + "type": "REQUEST", + "name": "request_277", +"path": "request_277", +"pathFormatted": "req_request-277-d0ec5", +"stats": { + "name": "request_277", + "numberOfRequests": { + "total": 2, + "ok": 1, + "ko": 1 + }, + "minResponseTime": { + "total": 484, + "ok": 484, + "ko": 2553 + }, + "maxResponseTime": { + "total": 2553, + "ok": 484, + "ko": 2553 + }, + "meanResponseTime": { + "total": 1519, + "ok": 484, + "ko": 2553 + }, + "standardDeviation": { + "total": 1035, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 1519, + "ok": 484, + "ko": 2553 + }, + "percentiles2": { + "total": 2036, + "ok": 484, + "ko": 2553 + }, + "percentiles3": { + "total": 2450, + "ok": 484, + "ko": 2553 + }, + "percentiles4": { + "total": 2532, + "ok": 484, + "ko": 2553 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 50 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.05405405405405406, + "ok": 0.02702702702702703, + "ko": 0.02702702702702703 + } +} + },"req_request-322-a2de9": { + "type": "REQUEST", + "name": "request_322", +"path": "request_322", +"pathFormatted": "req_request-322-a2de9", +"stats": { + "name": "request_322", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "maxResponseTime": { + "total": 159, + "ok": 159, + "ko": 0 + }, + "meanResponseTime": { + "total": 65, + "ok": 65, + "ko": 0 + }, + "standardDeviation": { + "total": 32, + "ok": 32, + "ko": 0 + }, + "percentiles1": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "percentiles2": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "percentiles3": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "percentiles4": { + "total": 151, + "ok": 151, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + },"req_request-323-2fefc": { + "type": "REQUEST", + "name": "request_323", +"path": "request_323", +"pathFormatted": "req_request-323-2fefc", +"stats": { + "name": "request_323", + "numberOfRequests": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "minResponseTime": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "maxResponseTime": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "meanResponseTime": { + "total": 64, + "ok": 64, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 60, + "ok": 60, + "ko": 0 + }, + "percentiles2": { + "total": 70, + "ok": 70, + "ko": 0 + }, + "percentiles3": { + "total": 83, + "ok": 83, + "ko": 0 + }, + "percentiles4": { + "total": 89, + "ok": 89, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2702702702702703, + "ok": 0.2702702702702703, + "ko": 0 + } +} + } +} + +} \ No newline at end of file diff --git a/webapp/loadTests/10users/js/theme.js b/webapp/loadTests/10users/js/theme.js new file mode 100644 index 0000000..b95a7b3 --- /dev/null +++ b/webapp/loadTests/10users/js/theme.js @@ -0,0 +1,127 @@ +/* + * Copyright 2011-2022 Gatling Corp + * + * Licensed under the Gatling Highcharts License + */ +Highcharts.theme = { + chart: { + backgroundColor: '#f7f7f7', + borderWidth: 0, + borderRadius: 8, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#666', + tickColor: '#666', + labels: { + style: { + color: '#666' + } + }, + title: { + style: { + color: '#666' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: '#999', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#666', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#666', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + + rangeSelector: { + buttonTheme: { + fill: '#cfc9c6', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#b2b2a9' + }, + states: { + hover: { + fill: '#92918C', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#8b897d' + } + }, + select: { + fill: '#E37400', + stroke: '#000000', + style: { + color: '#FFF' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: '#8b897d' + } + }, + + navigator: { + handles: { + backgroundColor: '#f7f7f7', + borderColor: '#92918C' + }, + outlineColor: '#92918C', + outlineWidth: 1, + maskFill: 'rgba(146, 145, 140, 0.5)', + series: { + color: '#5E7BE2', + lineColor: '#5E7BE2' + } + }, + + scrollbar: { + buttonBackgroundColor: '#f7f7f7', + buttonBorderWidth: 1, + buttonBorderColor: '#92918C', + buttonArrowColor: '#92918C', + buttonBorderRadius: 2, + + barBorderWidth: 1, + barBorderRadius: 0, + barBackgroundColor: '#92918C', + barBorderColor: '#92918C', + + rifleColor: '#92918C', + + trackBackgroundColor: '#b0b0a8', + trackBorderWidth: 1, + trackBorderColor: '#b0b0a8' + } +}; + +Highcharts.setOptions(Highcharts.theme); diff --git a/webapp/loadTests/10users/js/unpack.js b/webapp/loadTests/10users/js/unpack.js new file mode 100644 index 0000000..883c33e --- /dev/null +++ b/webapp/loadTests/10users/js/unpack.js @@ -0,0 +1,38 @@ +'use strict'; + +var unpack = function (array) { + var findNbSeries = function (array) { + var currentPlotPack; + var length = array.length; + + for (var i = 0; i < length; i++) { + currentPlotPack = array[i][1]; + if(currentPlotPack !== null) { + return currentPlotPack.length; + } + } + return 0; + }; + + var i, j; + var nbPlots = array.length; + var nbSeries = findNbSeries(array); + + // Prepare unpacked array + var unpackedArray = new Array(nbSeries); + + for (i = 0; i < nbSeries; i++) { + unpackedArray[i] = new Array(nbPlots); + } + + // Unpack the array + for (i = 0; i < nbPlots; i++) { + var timestamp = array[i][0]; + var values = array[i][1]; + for (j = 0; j < nbSeries; j++) { + unpackedArray[j][i] = [timestamp * 1000, values === null ? null : values[j]]; + } + } + + return unpackedArray; +}; diff --git a/webapp/loadTests/10users/style/arrow_down.png b/webapp/loadTests/10users/style/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdbc86e36d0d025402710734046405455ba300 GIT binary patch literal 983 zcmaJ=U2D@&7>;fZDHd;a3La7~Hn92V+O!GFMw@i5vXs(R?8T6!$!Qz9_ z=Rer5@K(VKz41c*2SY&wuf1>zUd=aM+wH=7NOI13d7tNf-jBSfRqrPg%L#^Il9g?} z4*PX@6IU1DyZip+6KpqWxkVeKLkDJnnW9bF7*$-ei|g35hfhA>b%t5E>oi-mW$Y*x zaXB;g;Ud=uG{dZKM!sqFF-2|Mbv%{*@#Zay99v}{(6Mta8f2H7$2EFFLFYh($vu~ z{_pC#Gw+br@wwiA5{J#9kNG+d$w6R2<2tE0l&@$3HYo|3gzQhNSnCl=!XELF){xMO zVOowC8&<~%!%!+-NKMbe6nl*YcI5V zYJ&NRkF&vr%WU+q2lF1lU?-O^-GZNDskYNBpN`kV!(aPgxlHTT#wqjtmGA&=s};T2 zjE>uT`ju-(hf9m^K6dqQrIXa_+Rv}MM}GwF^TyKc-wTU3m^&*>@7eL=F92dH<*NR& HwDFdgVhf9Ks!(i$ny>OtAWQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyvFlc$Sgh{pM)L8rMG3^=@Q{{O$p`t7BNW1mD+?G!w^;tkj$ z(itxFDR3sIr)^#L`so{%PjmYM-riK)$MRAsEYzTK67RjU>c3}HyQct6WAJqKb6Mw< G&;$UsBSU@w literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/arrow_right.png b/webapp/loadTests/10users/style/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a609f80fe17e6f185e1b6373f668fc1f28baae2c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu@pObhHwBu4M$1`knic~;uxYa zvG@EzE(Qe-<_o&N{>R5n@3?e|Q?{o)*sCe{Y!G9XUG*c;{fmVEy{&lgYDVka)lZ$Q rCit0rf5s|lpJ$-R@IrLOqF~-LT3j-WcUP(c4Q23j^>bP0l+XkKUN$bz literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/arrow_right_black.png b/webapp/loadTests/10users/style/arrow_right_black.png new file mode 100644 index 0000000000000000000000000000000000000000..651bd5d27675d9e92ac8d477f2db9efa89c2b355 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`!T#~#}T5FGAlLHD#mbgZgIOpf)rskC}I2WZRmZYXA zlxLP?D7bt2281{Ai31gRdb&7a_JLSF1VWMQKse&#dLi5wlM1_0 z{FM;Ti|sk&y~DuuWXc=~!vbOZMy|V())CrJpY;0L8wi!QM>m&zYv9kY5B?3u;2c!O zs6ZM%Cwv?}ZUCR5a}lC&3CiHSi?f8KBR+xu!araKY=q^sqfcTxa>ExJ5kHFbN8w@G zFbUZkx(k2U9zdM>;c2eb9<@Vt5POLKHVlK|b%E|Ae7gwwDx3hf9oZ^{qwoRjg6;52 zcpeJLI}f_J>rdS@R>r_B=yd$%s`3!zFD&bhZdZTkLaK?cPhvA2 zKl><4eGxC4a;Mdo*PR{+mo_KQ0&Hlk7(2(YeOGR{yx#iw!sRK{pC^Z_`%&gZIOHn( z0A)|bA46eyt%M^3$D@Q6QTcTUVt9h#E14pioqpnJ5Fv4vueCTp(_y(W_1RLr&f2 zqI)=IL-U*F1Lco^e7uSJ_DHlro5zyo?tjgxFM|B=QxDdXXQn?~UhTf54G*EKdD-|u zWftJKwuxmXUXwQ)-H%*()s8zUXDUnsXPpUz?CyzqH4f0-=E{2#{o&G^u_}`4MWPK| zGcOFrhQ_|B|0!d~OW(w?ZnYrKW>-GtKStgfYlX>^DA8Z$%3n^K?&qG-Jk_EOS}M&~ zSmyKt;kMY&T4m~Q6TU}wa>8Y`&PSBh4?T@@lTT9pxFoTjwOyl|2O4L_#y<(a2I`l( z_!a5jhgQ_TIdUr)8=4RH#^M$;j#_w?Px@py3nrhDhiKc)UU?GZD0>?D-D{Dt(GYo> z{mz&`fvtJyWsiEu#tG^&D6w2!Q}%77YrgU->oD<47@K|3>re}AiN6y)?PZJ&g*E?a zKTsDRQLmTaI&A1ZdIO9NN$rJnU;Z3Adexu2ePcTAeC}{L>Br!2@E6#XfZ{#`%~>X& z=AN$5tsc5kzOxRXr#W;#7#o`Z7J&8>o@2-Hf7Kkm!IjVCzgl^TIpI5AzN#yZ@~41% z3?8H2{p-qO(%6fPB=3LfX@mT$KG1!s`_Axt!dfRxdvzbLVLaRm@%_FltoUKGf*0d+ ziZ5(8A*2esb2%T!qR?L?zjmkbm{QqUbpo+5Y;bl<5@UZ>vksWYd= z)qkY5f?t3sS9McgxSvZB!y4B+m=m1+1HSLY^_yU9NU9HI=MZCKZ1qyBuJVc^sZe8I z76_F!A|Lxc=ickgKD?!mwk6ugVUJ6j9zaj^F=hXOxLKez+Y7DZig(sV+HgH#tq*Fq zv9Xu9c`>~afx=SHJ#wJXPWJ`Nn9dG0~%k(XL|0)b(fP9EKlYB(7M_h zTG8GN*3cg0nE{&5KXv6lO?Vx8{oFR{3;PP4=f?@yR=;-h)v?bYy(tW%oae#4-W?$S z^qDI!&nGH(RS)ppgpSgYFay zfX-0*!FbR*qP1P)#q_s)rf1k8c`Iw)A8G^pRqYAB!v3HiWsHnrp7XVCwx{i$<6HT! z!K7 zY1Mc-Co%a;dLZe6FN_B`E73b>oe7VIDLfDA+(FWyvn4$zdST9EFRHo+DTeofqdI0t$jFNyI9 zQfKTs`+N&tf;p7QOzXUtYC?Dr<*UBkb@qhhywuir2b~Ddgzcd7&O_93j-H`?=(!=j z1?gFE7pUGk$EX0k7tBH43ZtM8*X?+Z>zw&fPHW1kb9TfwXB^HsjQpVUhS`Cj-I%lA zbT_kuk;YD&cxR8!i=aB3BLDon2E1oRHx)XraG zuGLrVtNJ!Ffw11ONMCIBde24Mnv(V`$X}}Klc4h|z4z9q$?+f8KLXj(dr-YU?E^Z0 zGQ{8Gs4Vn;7t=q592Ga@3J|ZeqBAi)wOyY%d;Un91$yUG28$_o1dMi}Gre)7_45VK zryy5>>KlQFNV}f)#`{%;5Wgg*WBl|S?^s%SRRBHNHg(lKdBFpfrT*&$ZriH&9>{dt z=K2vZWlO4UTS4!rZwE8~e1o`0L1ju$=aV`&d?kU6To*82GLSz2>FVD36XXNCt;;{I zvq57=dTunvROdvbqqtd@t<(%LcAKMP`u}6Xp5IFF4xtHY8gr_nyL?^04*8(5sJZc9 zARYN=GpqrfH;SLYgDO|GA*^v_+NFDBKJ!ks?+Q$<858o=!|*N~fnD$zzIX1Wn7u*7 z6@$uGA84*U@1m5j@-ffb9g)8U>8c&l+e%yG?+W#PgfseheRwyb@!A&nt}D_mr@)TC z7vWw~{3ejS!{A3}400?;YTQfqhMu4?q5D~5@d?s2ZnI2#jih|Og|gfGYdK?%wYv*> z*MY{vX>83k`B@9}9YF@Dekyw*>;aXndM*a1KTICC^cUJ%e}<>k`j> z&a;&EIBlRiq{Dc44?=J^+zYuNTOWY-tv!wV36BKrC$tVvQathjI1A5#_IcXhYR{#5 zXuolbqsM-i@OsdmWd=IVH#3CQ?&I(>JPALBr7#E1fa3Ihz4E^RQPBQp13Uv-XFmt6 znG0h~jmgiD_k;5e7^$+h!$Eiow7$Ixs{d=C=Tfb)^3OIn3Ad{L_>Vn;-IVKA(2@G+ z8!hM&P7LH*?Hb7SjjFRsUd%6%NRz+7xKmOnt_Vj9eV__wnvUqALE y@<9iX-XLgKmGb5P*V(C?vZI{Ap0ljoe9iI#Pp2!ETh`m`k}sX$tTjPb`Thqd2I;E+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/little_arrow_right.png b/webapp/loadTests/10users/style/little_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..252abe66d3a92aced2cff2df88e8a23d91459251 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd;O^<-7$PB=oN$2m z-(ru2pAv$OC-6w{28nSzPFOlManYH8W7Z01d5`Q)6p~NiIh8RX*um{#37-cePkG{I i?kCneiZ^N=&|+f{`pw(F`1}WPkkOv5elF{r5}E)*4>EfI literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/logo-enterprise.svg b/webapp/loadTests/10users/style/logo-enterprise.svg new file mode 100644 index 0000000..4a6e1de --- /dev/null +++ b/webapp/loadTests/10users/style/logo-enterprise.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/webapp/loadTests/10users/style/logo.svg b/webapp/loadTests/10users/style/logo.svg new file mode 100644 index 0000000..f519eef --- /dev/null +++ b/webapp/loadTests/10users/style/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/webapp/loadTests/10users/style/sortable.png b/webapp/loadTests/10users/style/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb54f9acddb8848e68b640d416bf959cb18b6a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd5b5dS7$PCr+ka7z zL4e13=24exMiQ@YG*qwKncdI-GfUZ1Rki=vCY#SQRzF`R>17u7PVwr=D?vVeZ+UA{ zG@h@BI20Mdp}F2&UODjiSKfWA%2W&v$1X_F*vS}sO7fVb_47iIWuC5nF6*2Ung9-k BJ)r;q literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/sorted-down.png b/webapp/loadTests/10users/style/sorted-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5100cc8efd490cf534a6186f163143bc59de3036 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVDIVT7$PB=oN$2m z-{GYajXDDFEn-;Il?7IbEN2SgoY1K-S+LB}QlU75b4p`dJwwurrwV2sJj^AGt`0LQ Z7#M<{@}@-BSMLEC>FMg{vd$@?2>{QlDr5iv literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/sorted-up.png b/webapp/loadTests/10users/style/sorted-up.png new file mode 100644 index 0000000000000000000000000000000000000000..340a5f0370f1a74439459179e9c4cf1610de75d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVD0JR7$PB=oN$2m z-(rtihEG!hT@vQ#Ni?%SDB=JB literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/stat-fleche-bas.png b/webapp/loadTests/10users/style/stat-fleche-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b501a37f521fa56ce790b5279b204cf16f275 GIT binary patch literal 625 zcmV-%0*?KOP)X1^@s6HR9gx0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6G=otRCwBaRk3XYF$@$1uayA|xJs2O zh6iw!${V;%XBun$AzDJ_5hsobnt%D0lR{6AC-TZ=qQYNSE%4fZr(r%*U%{3#@fMV-wZ|U32I`2RVTet9ov9a1><;a zc490LC;}x<)W9HSa|@E2D5Q~wPER)4Hd~) z7a}hi*bPEZ3E##6tEpfWilBDoTvc z!^R~Z;5%h77OwQK2sCp1=!WSe*z2u-)=XU8l4MF00000 LNkvXXu0mjfMhXuu literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/stat-l-roue.png b/webapp/loadTests/10users/style/stat-l-roue.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a3aae0169d62a079278f0a6737f3376f1b45ae GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!N$PAIIE<7Cy>LE?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2hb1*QrXELw=S&Tp|1;h*tObeLcA_5DT;cR}8^0f~MUKVSdnX!bNbd8LT)Sw-%(F%_zr0N|UagV3xWgqvH;8K?&n0oOR41jMpR4np z@3~veKIhln&vTy7`M&S_y+s{K$4a+%SBakr4tulXXK%nlnMZA<7fW86CAV}Io#FMZ zJKEZlXuR&E=;dFVn4ON?-myI9m-fc)cdfl=xStxmHlE_%*ZyqH3w8e^yf4K+{I{K9 z7w&AxcaMk7ySZ|)QCy;@Qg`etYuie0o>bqd-!G^vY&6qP5x86+IYoDN%G}3H>wNMj zPL^13>44!EmANYvNU$)%J@GUM4J8`33?}zp?$qRpGv)z8kkP`CHe&Oqvvu;}m~M yv&%5+ugjcD{r&Hid!>2~a6b9iXUJ`u|A%4w{h$p3k*sGyq3h}D=d#Wzp$Py=EVp6+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/stat-l-temps.png b/webapp/loadTests/10users/style/stat-l-temps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce268037f94ef73f56cd658d392ef393d562db3 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^{2w#$-&vQnwtC-_ zkh{O~uCAT`QnSlTzs$^@t=jDWl)1cj-p;w{budGVRji^Z`nX^5u3Kw&?Kk^Y?fZDw zg5!e%<_ApQ}k@w$|KtRPs~#LkYapu zf%*GA`~|UpRDQGRR`SL_+3?i5Es{UA^j&xb|x=ujSRd8$p5V>FVdQ&MBb@04c<~BLDyZ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/10users/style/style.css b/webapp/loadTests/10users/style/style.css new file mode 100644 index 0000000..7f50e1b --- /dev/null +++ b/webapp/loadTests/10users/style/style.css @@ -0,0 +1,988 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --gatling-background-color: #f2f2f2; + --gatling-background-light-color: #f7f7f7; + --gatling-border-color: #dddddd; + --gatling-blue-color: #4a9fe5; + --gatling-dark-blue-color: #24275e; + --gatling-danger-color: #f15b4f; + --gatling-danger-light-color: #f5d1ce; + --gatling-enterprise-color: #6161d6; + --gatling-enterprise-light-color: #c4c4ed; + --gatling-gray-medium-color: #bbb; + --gatling-hover-color: #e6e6e6; + --gatling-light-color: #ffffff; + --gatling-orange-color: #f78557; + --gatling-success-color: #68b65c; + --gatling-text-color: #1f2024; + --gatling-total-color: #ffa900; + + --gatling-border-radius: 2px; + --gatling-spacing-small: 5px; + --gatling-spacing: 10px; + --gatling-spacing-layout: 20px; + + --gatling-font-weight-normal: 400; + --gatling-font-weight-medium: 500; + --gatling-font-weight-bold: 700; + --gatling-font-size-secondary: 12px; + --gatling-font-size-default: 14px; + --gatling-font-size-heading: 16px; + --gatling-font-size-section: 22px; + --gatling-font-size-header: 34px; + + --gatling-media-desktop-large: 1920px; +} + +* { + min-height: 0; + min-width: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + color: var(--gatling-text-color); + font-family: arial; + font-size: var(--gatling-font-size-secondary); + margin: 0; +} + +.app-container { + display: flex; + flex-direction: column; + + height: 100%; + width: 100%; +} + +.head { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + + flex: 1; + + background-color: var(--gatling-light-color); + border-bottom: 1px solid var(--gatling-border-color); + min-height: 69px; + padding: 0 var(--gatling-spacing-layout); +} + +.gatling-open-source { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + gap: var(--gatling-spacing-layout); +} + +.gatling-documentation { + display: flex; + align-items: center; + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-orange-color); + border: 1px solid var(--gatling-orange-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 23px; +} + +.gatling-documentation:hover { + background-color: var(--gatling-orange-color); + color: var(--gatling-light-color); +} + +.gatling-logo { + height: 35px; +} + +.gatling-logo img { + height: 100%; +} + +.container { + display: flex; + align-items: stretch; + height: 100%; +} + +.nav { + min-width: 210px; + width: 210px; + max-height: calc(100vh - var(--gatling-spacing-layout) - var(--gatling-spacing-layout)); + background: var(--gatling-light-color); + border-right: 1px solid var(--gatling-border-color); + overflow-y: auto; +} + +@media print { + .nav { + display: none; + } +} + +@media screen and (min-width: 1920px) { + .nav { + min-width: 310px; + width: 310px; + } +} + +.nav ul { + display: flex; + flex-direction: column; + + padding: 0; + margin: 0; +} + +.nav li { + display: flex; + list-style: none; + width: 100%; + padding: 0; +} + +.nav .item { + display: inline-flex; + align-items: center; + margin: 0 auto; + white-space: nowrap; + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + margin: 0; + width: 100%; +} + +.nav .item .nav-label { + padding: var(--gatling-spacing) var(--gatling-spacing-layout); +} + +.nav .item:hover { + background-color: var(--gatling-hover-color); +} + +.nav .on .item { + background-color: var(--gatling-orange-color); +} + +.nav .on .item span { + color: var(--gatling-light-color); +} + +.cadre { + width: 100%; + height: 100%; + overflow-y: scroll; + scroll-behavior: smooth; +} + +@media print { + .cadre { + overflow-y: unset; + } +} + +.frise { + position: absolute; + top: 60px; + z-index: -1; + + background-color: var(--gatling-background-color); + height: 530px; +} + +.global { + height: 650px +} + +a { + text-decoration: none; +} + +a:hover { + color: var(--gatling-hover-color); +} + +img { + border: 0; +} + +h1 { + color: var(--gatling-dark-blue-color); + font-size: var(--gatling-font-size-section); + font-weight: var(--gatling-font-weight-medium); + text-align: center; + margin: 0; +} + +h1 span { + color: var(--gatling-hover-color); +} + +.enterprise { + display: flex; + align-items: center; + justify-content: center; + gap: var(--gatling-spacing-small); + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-enterprise-color); + color: var(--gatling-enterprise-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 25px; +} + +.enterprise:hover { + background-color: var(--gatling-enterprise-light-color); + color: var(--gatling-enterprise-color); +} + +.enterprise img { + display: block; + width: 160px; +} + +.simulation-card { + display: flex; + flex-direction: column; + align-self: stretch; + flex: 1; + gap: var(--gatling-spacing-layout); + max-height: 375px; +} + +#simulation-information { + flex: 1; +} + +.simulation-version-information { + display: flex; + flex-direction: column; + + gap: var(--gatling-spacing); + font-size: var(--gatling-font-size-default); + + background-color: var(--gatling-background-color); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing); +} + +.simulation-information-container { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing); +} + +.withTooltip .popover-title { + display: none; +} + +.popover-content p { + margin: 0; +} + +.ellipsed-name { + display: block; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.simulation-information-item { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--gatling-spacing-small); +} + +.simulation-information-item.description { + flex-direction: column; +} + +.simulation-information-label { + display: inline-block; + font-weight: var(--gatling-font-weight-bold); + min-width: fit-content; +} + +.simulation-information-title { + display: block; + text-align: center; + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + width: 100%; +} + +.simulation-tooltip span { + display: inline-block; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; +} + +.content { + display: flex; + flex-direction: column; +} + +.content-in { + width: 100%; + height: 100%; + + overflow-x: scroll; +} + +@media print { + .content-in { + overflow-x: unset; + } +} + +.container-article { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + min-width: 1050px; + width: 1050px; + margin: 0 auto; + padding: var(--gatling-spacing-layout); + box-sizing: border-box; +} + +@media screen and (min-width: 1920px) { + .container-article { + min-width: 1350px; + width: 1350px; + } + + #responses * .highcharts-tracker { + transform: translate(400px, 70px); + } +} + +.content-header { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + background-color: var(--gatling-background-light-color); + border-bottom: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-layout) var(--gatling-spacing-layout) 0; +} + +.onglet { + font-size: var(--gatling-font-size-header); + font-weight: var(--gatling-font-weight-medium); + text-align: center; +} + +.sous-menu { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.sous-menu-spacer { + display: flex; + align-items: center; + flex-direction: row; +} + +.sous-menu .item { + margin-bottom: -1px; +} + +.sous-menu a { + display: block; + + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-normal); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border-bottom: 2px solid transparent; + color: var(--gatling-text-color); + text-align: center; + width: 100px; +} + +.sous-menu a:hover { + border-bottom-color: var(--gatling-text-color); +} + +.sous-menu .ouvert a { + border-bottom-color: var(--gatling-orange-color); + font-weight: var(--gatling-font-weight-bold); +} + +.article { + position: relative; + + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); +} + +.infos { + width: 340px; + color: var(--gatling-light-color); +} + +.infos-title { + background-color: var(--gatling-background-light-color); + border: 1px solid var(--gatling-border-color); + border-bottom: 0; + border-top-left-radius: var(--gatling-border-radius); + border-top-right-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.info { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + height: 100%; + margin: 0; +} + +.info table { + margin: auto; + padding-right: 15px; +} + +.alert-danger { + background-color: var(--gatling-danger-light-color); + border: 1px solid var(--gatling-danger-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + padding: var(--gatling-spacing-layout); + font-weight: var(--gatling-font-weight-bold); +} + +.repli { + position: absolute; + bottom: 0; + right: 0; + + background: url('stat-fleche-bas.png') no-repeat top left; + height: 25px; + width: 22px; +} + +.infos h2 { + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + height: 19px; + margin: 0; + padding: 3.5px 0 0 35px; +} + +.infos .first { + background: url('stat-l-roue.png') no-repeat 15px 5px; +} + +.infos .second { + background: url('stat-l-temps.png') no-repeat 15px 3px; + border-top: 1px solid var(--gatling-border-color); +} + +.infos th { + text-align: center; +} + +.infos td { + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing-small); + -webkit-border-radius: var(--gatling-border-radius); + -moz-border-radius: var(--gatling-border-radius); + -ms-border-radius: var(--gatling-border-radius); + -o-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + text-align: right; + width: 50px; +} + +.infos .title { + width: 120px; +} + +.infos .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); +} + +.infos .total { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); +} + +.infos .ko { + background-color: var(--gatling-danger-color); + -webkit-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); +} + +.schema-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--gatling-spacing-layout); +} + +.schema { + background: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); +} + +.ranges { + height: 375px; + width: 500px; +} + +.ranges-large { + height: 375px; + width: 530px; +} + +.geant { + height: 362px; +} + +.extensible-geant { + width: 100%; +} + +.polar { + height: 375px; + width: 230px; +} + +.chart_title { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + padding: 2px var(--gatling-spacing); +} + +.statistics { + display: flex; + flex-direction: column; + + background-color: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border-collapse: collapse; + color: var(--gatling-text-color); + max-height: 100%; +} + +.statistics .title { + display: flex; + text-align: center; + justify-content: space-between; + + min-height: 49.5px; + box-sizing: border-box; + + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing); +} + +.title_base { + display: flex; + align-items: center; + text-align: left; + user-select: none; +} + +.title_base_stats { + color: var(--gatling-text-color); + margin-right: 20px; +} + +.toggle-table { + position: relative; + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: 25px; + width: 40px; + height: 20px; + margin: 0 var(--gatling-spacing-small); +} + +.toggle-table::before { + position: absolute; + top: calc(50% - 9px); + left: 1px; + content: ""; + width: 50%; + height: 18px; + border-radius: 50%; + background-color: var(--gatling-text-color); +} + +.toggle-table.off::before { + left: unset; + right: 1px; +} + +.title_expanded { + cursor: pointer; + color: var(--gatling-text-color); +} + +.expand-table, +.collapse-table { + font-size: var(--gatling-font-size-secondary); + font-weight: var(--gatling-font-weight-normal); +} + +.title_expanded span.expand-table { + color: var(--gatling-gray-medium-color); +} + +.title_collapsed { + cursor: pointer; + color: var(--gatling-text-color); +} + +.title_collapsed span.collapse-table { + color: var(--gatling-gray-medium-color); +} + +#container_statistics_head { + position: sticky; + top: -1px; + + background: var(--gatling-background-light-color); + margin-top: -1px; + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); +} + +#container_statistics_body { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + margin-top: -1px; + padding: 0px var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small); +} + +#container_errors { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); + margin-top: -1px; +} + +#container_assertions { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small); + margin-top: -1px; +} + +.statistics-in { + border-spacing: var(--gatling-spacing-small); + border-collapse: collapse; + margin: 0; +} + +.statistics .scrollable { + max-height: 100%; + overflow-y: auto; +} + +#statistics_table_container .statistics .scrollable { + max-height: 785px; +} + +.statistics-in a { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .header { + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small); +} + +.sortable { + cursor: pointer; +} + +.sortable span { + background: url('sortable.png') no-repeat right 3px; + padding-right: 10px; +} + +.sorted-up span { + background-image: url('sorted-up.png'); +} + +.sorted-down span { + background-image: url('sorted-down.png'); +} + +.executions { + background: url('stat-l-roue.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.response-time { + background: url('stat-l-temps.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.statistics-in td { + background-color: var(--gatling-light-color); + border: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-small); + min-width: 50px; +} + +.statistics-in .col-1 { + width: 175px; + max-width: 175px; +} +@media screen and (min-width: 1200px) { + .statistics-in .col-1 { + width: 50%; + } +} + +.expandable-container { + display: flex; + flex-direction: row; + box-sizing: border-box; + max-width: 100%; +} + +.statistics-in .value { + text-align: right; + width: 50px; +} + +.statistics-in .total { + color: var(--gatling-text-color); +} + +.statistics-in .col-2 { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .error-col-1 { + background-color: var(--gatling-light-color); + color: var(--gatling-text-color); +} + +.statistics-in .error-col-2 { + text-align: center; +} + +.statistics-in .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .ko { + background-color: var(--gatling-danger-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .expand-button { + padding-left: var(--gatling-spacing); + cursor: pointer; +} + +.expand-button.hidden { + background: none; + cursor: default; +} + +.statistics-button { + background-color: var(--gatling-light-color); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); +} + +.statistics-button:hover:not(:disabled) { + cursor: pointer; + background-color: var(--gatling-hover-color); +} + +.statistics-in .expand-button.expand { + background: url('little_arrow_right.png') no-repeat 3px 3px; +} + +.statistics-in .expand-button.collapse { + background: url('sorted-down.png') no-repeat 3px 3px; +} + +.nav .expand-button { + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.nav .expand-button.expand { + background: url('arrow_right_black.png') no-repeat 5px 10px; + cursor: pointer; +} + +.nav .expand-button.collapse { + background: url('arrow_down_black.png') no-repeat 3px 12px; + cursor: pointer; +} + +.nav .on .expand-button.expand { + background-image: url('arrow_right_black.png'); +} + +.nav .on .expand-button.collapse { + background-image: url('arrow_down_black.png'); +} + +.right { + display: flex; + align-items: center; + gap: var(--gatling-spacing); + float: right; + font-size: var(--gatling-font-size-default); +} + +.withTooltip { + outline: none; +} + +.withTooltip:hover { + text-decoration: none; +} + +.withTooltip .tooltipContent { + position: absolute; + z-index: 10; + display: none; + + background: var(--gatling-orange-color); + -webkit-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + -moz-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); + margin-top: -5px; + padding: var(--gatling-spacing-small); +} + +.withTooltip:hover .tooltipContent { + display: inline; +} + +.statistics-table-modal { + height: calc(100% - 60px); + width: calc(100% - 60px); + border-radius: var(--gatling-border-radius); +} + +.statistics-table-modal::backdrop { + position: fixed; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + + background-color: rgba(100, 100, 100, 0.9); +} + +.statistics-table-modal-container { + display: flex; + flex-direction: column; + + width: 100%; + height: calc(100% - 35px); + overflow-x: auto; +} + +.button-modal { + cursor: pointer; + + height: 25px; + width: 25px; + + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); +} + +.button-modal:hover { + background-color: var(--gatling-background-color); +} + +.statistics-table-modal-header { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-bottom: var(--gatling-spacing); +} + +.statistics-table-modal-content { + flex: 1; + overflow-y: auto; + min-width: 1050px; +} + +.statistics-table-modal-footer { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-top: var(--gatling-spacing); +} diff --git a/webapp/loadTests/150UsersIn1Min.html b/webapp/loadTests/150users1minute/150UsersIn1Min.html similarity index 100% rename from webapp/loadTests/150UsersIn1Min.html rename to webapp/loadTests/150users1minute/150UsersIn1Min.html diff --git a/webapp/loadTests/150users1minute/js/all_sessions.js b/webapp/loadTests/150users1minute/js/all_sessions.js new file mode 100644 index 0000000..b98cd86 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/all_sessions.js @@ -0,0 +1,11 @@ +allUsersData = { + +color: '#FFA900', +name: 'Active Users', +data: [ + [1682848881000,4],[1682848882000,6],[1682848883000,9],[1682848884000,11],[1682848885000,14],[1682848886000,16],[1682848887000,19],[1682848888000,21],[1682848889000,24],[1682848890000,26],[1682848891000,29],[1682848892000,31],[1682848893000,34],[1682848894000,36],[1682848895000,39],[1682848896000,41],[1682848897000,44],[1682848898000,46],[1682848899000,49],[1682848900000,51],[1682848901000,54],[1682848902000,56],[1682848903000,59],[1682848904000,61],[1682848905000,64],[1682848906000,66],[1682848907000,69],[1682848908000,71],[1682848909000,74],[1682848910000,76],[1682848911000,79],[1682848912000,81],[1682848913000,83],[1682848914000,85],[1682848915000,83],[1682848916000,84],[1682848917000,84],[1682848918000,86],[1682848919000,88],[1682848920000,86],[1682848921000,84],[1682848922000,84],[1682848923000,83],[1682848924000,85],[1682848925000,88],[1682848926000,88],[1682848927000,88],[1682848928000,83],[1682848929000,84],[1682848930000,85],[1682848931000,87],[1682848932000,86],[1682848933000,85],[1682848934000,87],[1682848935000,86],[1682848936000,86],[1682848937000,86],[1682848938000,86],[1682848939000,88],[1682848940000,88],[1682848941000,85],[1682848942000,80],[1682848943000,74],[1682848944000,72],[1682848945000,70],[1682848946000,69],[1682848947000,68],[1682848948000,64],[1682848949000,60],[1682848950000,57],[1682848951000,56],[1682848952000,56],[1682848953000,54],[1682848954000,53],[1682848955000,52],[1682848956000,46],[1682848957000,42],[1682848958000,38],[1682848959000,36],[1682848960000,36],[1682848961000,35],[1682848962000,33],[1682848963000,29],[1682848964000,28],[1682848965000,24],[1682848966000,23],[1682848967000,23],[1682848968000,19],[1682848969000,16],[1682848970000,12],[1682848971000,8],[1682848972000,8],[1682848973000,5],[1682848974000,5],[1682848975000,3],[1682848976000,3] +], +tooltip: { yDecimals: 0, ySuffix: '', valueDecimals: 0 } + , zIndex: 20 + , yAxis: 1 +}; \ No newline at end of file diff --git a/webapp/loadTests/150users1minute/js/assertions.json b/webapp/loadTests/150users1minute/js/assertions.json new file mode 100644 index 0000000..2f0526f --- /dev/null +++ b/webapp/loadTests/150users1minute/js/assertions.json @@ -0,0 +1,10 @@ +{ + "simulation": "RecordedSimulation", + "simulationId": "recordedsimulation-20230430100120804", + "start": 1682848881458, + "description": "", + "scenarios": ["RecordedSimulation"], + "assertions": [ + + ] +} \ No newline at end of file diff --git a/webapp/loadTests/150users1minute/js/assertions.xml b/webapp/loadTests/150users1minute/js/assertions.xml new file mode 100644 index 0000000..5e4dbe9 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/assertions.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/webapp/loadTests/150users1minute/js/bootstrap.min.js b/webapp/loadTests/150users1minute/js/bootstrap.min.js new file mode 100644 index 0000000..ea41042 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-tooltip.js, bootstrap-popover.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery) \ No newline at end of file diff --git a/webapp/loadTests/150users1minute/js/ellipsis.js b/webapp/loadTests/150users1minute/js/ellipsis.js new file mode 100644 index 0000000..781d0de --- /dev/null +++ b/webapp/loadTests/150users1minute/js/ellipsis.js @@ -0,0 +1,26 @@ +function parentId(name) { + return "parent-" + name; +} + +function isEllipsed(name) { + const child = document.getElementById(name); + const parent = document.getElementById(parentId(name)); + const emptyData = parent.getAttribute("data-content") === ""; + const hasOverflow = child.clientWidth < child.scrollWidth; + + if (hasOverflow) { + if (emptyData) { + parent.setAttribute("data-content", name); + } + } else { + if (!emptyData) { + parent.setAttribute("data-content", ""); + } + } +} + +function ellipsedLabel ({ name, parentClass = "", childClass = "" }) { + const child = "" + name + ""; + + return "" + child + ""; +} diff --git a/webapp/loadTests/150users1minute/js/gatling.js b/webapp/loadTests/150users1minute/js/gatling.js new file mode 100644 index 0000000..0208f82 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/gatling.js @@ -0,0 +1,137 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function ($) { + $.fn.expandable = function () { + var scope = this; + + this.find('.expand-button:not([class*=hidden])').addClass('collapse').on('click', function () { + var $this = $(this); + + if ($this.hasClass('expand')) + $this.expand(scope); + else + $this.collapse(scope); + }); + + this.find('.expand-all-button').on('click', function () { + $(this).expandAll(scope); + }); + + this.find('.collapse-all-button').on('click', function () { + $(this).collapseAll(scope); + }); + + this.collapseAll(this); + + return this; + }; + + $.fn.expand = function (scope, recursive) { + return this.each(function () { + var $this = $(this); + + if (recursive) { + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + } + + if ($this.hasClass('expand')) { + $('*[data-parent=' + $this.attr('id') + ']').toggle(true); + $this.toggleClass('expand').toggleClass('collapse'); + } + }); + }; + + $.fn.expandAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.expand').expand(scope, true); + $('*[data-parent=ROOT]').find('.expand-button.collapse').expand(scope, true); + }; + + $.fn.collapse = function (scope) { + return this.each(function () { + var $this = $(this); + + scope.find('*[data-parent=' + $this.attr('id') + '] .expand-button.collapse').collapse(scope); + scope.find('*[data-parent=' + $this.attr('id') + ']').toggle(false); + $this.toggleClass('expand').toggleClass('collapse'); + }); + }; + + $.fn.collapseAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.collapse').collapse(scope); + }; + + $.fn.sortable = function (target) { + var table = this; + + this.find('thead .sortable').on('click', function () { + var $this = $(this); + + if ($this.hasClass('sorted-down')) { + var desc = false; + var style = 'sorted-up'; + } + else { + var desc = true; + var style = 'sorted-down'; + } + + $(target).sortTable($this.attr('id'), desc); + + table.find('thead .sortable').removeClass('sorted-up sorted-down'); + $this.addClass(style); + + return false; + }); + + return this; + }; + + $.fn.sortTable = function (col, desc) { + function getValue(line) { + var cell = $(line).find('.' + col); + + if (cell.hasClass('value')) + var value = cell.text(); + else + var value = cell.find('.value').text(); + + return parseFloat(value); + } + + function sortLines (lines, group) { + var notErrorTable = col.search("error") == -1; + var linesToSort = notErrorTable ? lines.filter('*[data-parent=' + group + ']') : lines; + + var sortedLines = linesToSort.sort(function (a, b) { + return desc ? getValue(b) - getValue(a): getValue(a) - getValue(b); + }).toArray(); + + var result = []; + $.each(sortedLines, function (i, line) { + result.push(line); + if (notErrorTable) + result = result.concat(sortLines(lines, $(line).attr('id'))); + }); + + return result; + } + + this.find('tbody').append(sortLines(this.find('tbody tr').detach(), 'ROOT')); + + return this; + }; +})(jQuery); diff --git a/webapp/loadTests/150users1minute/js/global_stats.json b/webapp/loadTests/150users1minute/js/global_stats.json new file mode 100644 index 0000000..c184d6f --- /dev/null +++ b/webapp/loadTests/150users1minute/js/global_stats.json @@ -0,0 +1,77 @@ +{ + "name": "All Requests", + "numberOfRequests": { + "total": 4184, + "ok": 3638, + "ko": 546 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 179 + }, + "maxResponseTime": { + "total": 3544, + "ok": 3544, + "ko": 2696 + }, + "meanResponseTime": { + "total": 415, + "ok": 369, + "ko": 717 + }, + "standardDeviation": { + "total": 569, + "ok": 527, + "ko": 723 + }, + "percentiles1": { + "total": 120, + "ok": 80, + "ko": 212 + }, + "percentiles2": { + "total": 627, + "ok": 567, + "ko": 857 + }, + "percentiles3": { + "total": 1591, + "ok": 1467, + "ko": 2534 + }, + "percentiles4": { + "total": 2573, + "ok": 2376, + "ko": 2647 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3034, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 312, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 292, + "percentage": 7 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 546, + "percentage": 13 +}, + "meanNumberOfRequestsPerSecond": { + "total": 43.583333333333336, + "ok": 37.895833333333336, + "ko": 5.6875 + } +} \ No newline at end of file diff --git a/webapp/loadTests/150users1minute/js/highcharts-more.js b/webapp/loadTests/150users1minute/js/highcharts-more.js new file mode 100644 index 0000000..2d78893 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/highcharts-more.js @@ -0,0 +1,60 @@ +/* + Highcharts JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(x){"object"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(b){function r(b,a,d){this.init(b,a,d)}var t=b.each,w=b.extend,m=b.merge,q=b.splat;w(r.prototype,{init:function(b,a,d){var f=this,h=f.defaultOptions;f.chart=a;f.options=b=m(h,a.angular?{background:{}}:void 0,b);(b=b.background)&&t([].concat(q(b)).reverse(),function(a){var c,h=d.userOptions;c=m(f.defaultBackgroundOptions,a);a.backgroundColor&&(c.backgroundColor=a.backgroundColor);c.color=c.backgroundColor; +d.options.plotBands.unshift(c);h.plotBands=h.plotBands||[];h.plotBands!==d.options.plotBands&&h.plotBands.unshift(c)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{className:"highcharts-pane",shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});b.Pane=r})(x);(function(b){var r=b.CenteredSeriesMixin, +t=b.each,w=b.extend,m=b.map,q=b.merge,e=b.noop,a=b.Pane,d=b.pick,f=b.pInt,h=b.splat,u=b.wrap,c,l,k=b.Axis.prototype;b=b.Tick.prototype;c={getOffset:e,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:e,setCategories:e,setTitle:e};l={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2}, +defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);a.plotBands||(a.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= +r.getCenter.call(this.pane)},getLinePath:function(a,g){a=this.center;var c=this.chart,f=d(g,a[2]/2-this.offset);this.isCircular||void 0!==g?g=this.chart.renderer.symbols.arc(this.left+a[0],this.top+a[1],f,f,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(g=this.postTranslate(this.angleRad,f),g=["M",a[0]+c.plotLeft,a[1]+c.plotTop,"L",g.x,g.y]);return g},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/ +(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===d(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.center=this.pane.center=r.getCenter.call(this.pane),this.isCircular&& +(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*d(this.sector,1)/2)},getPosition:function(a,g){return this.postTranslate(this.isCircular?this.translate(a):this.angleRad,d(this.isCircular?g:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,g){var d=this.chart,c=this.center;a=this.startAngleRad+a;return{x:d.plotLeft+c[0]+Math.cos(a)*g,y:d.plotTop+c[1]+Math.sin(a)*g}},getPlotBandPath:function(a,g,c){var h=this.center,p=this.startAngleRad, +k=h[2]/2,n=[d(c.outerRadius,"100%"),c.innerRadius,d(c.thickness,10)],b=Math.min(this.offset,0),l=/%$/,u,e=this.isCircular;"polygon"===this.options.gridLineInterpolation?h=this.getPlotLinePath(a).concat(this.getPlotLinePath(g,!0)):(a=Math.max(a,this.min),g=Math.min(g,this.max),e||(n[0]=this.translate(a),n[1]=this.translate(g)),n=m(n,function(a){l.test(a)&&(a=f(a,10)*k/100);return a}),"circle"!==c.shape&&e?(a=p+this.translate(a),g=p+this.translate(g)):(a=-Math.PI/2,g=1.5*Math.PI,u=!0),n[0]-=b,n[2]-= +b,h=this.chart.renderer.symbols.arc(this.left+h[0],this.top+h[1],n[0],n[0],{start:Math.min(a,g),end:Math.max(a,g),innerR:d(n[1],n[0]-n[2]),open:u}));return h},getPlotLinePath:function(a,g){var d=this,c=d.center,f=d.chart,h=d.getPosition(a),k,b,p;d.isCircular?p=["M",c[0]+f.plotLeft,c[1]+f.plotTop,"L",h.x,h.y]:"circle"===d.options.gridLineInterpolation?(a=d.translate(a))&&(p=d.getLinePath(0,a)):(t(f.xAxis,function(a){a.pane===d.pane&&(k=a)}),p=[],a=d.translate(a),c=k.tickPositions,k.autoConnect&&(c= +c.concat([c[0]])),g&&(c=[].concat(c).reverse()),t(c,function(g,d){b=k.getPosition(g,a);p.push(d?"L":"M",b.x,b.y)}));return p},getTitlePosition:function(){var a=this.center,g=this.chart,d=this.options.title;return{x:g.plotLeft+a[0]+(d.x||0),y:g.plotTop+a[1]-{high:.5,middle:.25,low:0}[d.align]*a[2]+(d.y||0)}}};u(k,"init",function(f,g,k){var b=g.angular,p=g.polar,n=k.isX,u=b&&n,e,A=g.options,m=k.pane||0;if(b){if(w(this,u?c:l),e=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(w(this, +l),this.defaultRadialOptions=(e=n)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions));b||p?(this.isRadial=!0,g.inverted=!1,A.chart.zoomType=null):this.isRadial=!1;f.call(this,g,k);u||!b&&!p||(f=this.options,g.panes||(g.panes=[]),this.pane=g=g.panes[m]=g.panes[m]||new a(h(A.pane)[m],g,this),g=g.options,this.angleRad=(f.angle||0)*Math.PI/180,this.startAngleRad=(g.startAngle-90)*Math.PI/180,this.endAngleRad=(d(g.endAngle,g.startAngle+360)-90)*Math.PI/180,this.offset=f.offset|| +0,this.isCircular=e)});u(k,"autoLabelAlign",function(a){if(!this.isRadial)return a.apply(this,[].slice.call(arguments,1))});u(b,"getPosition",function(a,d,c,f,h){var g=this.axis;return g.getPosition?g.getPosition(c):a.call(this,d,c,f,h)});u(b,"getLabelPosition",function(a,g,c,f,h,k,b,l,u){var n=this.axis,p=k.y,e=20,y=k.align,v=(n.translate(this.pos)+n.startAngleRad+Math.PI/2)/Math.PI*180%360;n.isRadial?(a=n.getPosition(this.pos,n.center[2]/2+d(k.distance,-25)),"auto"===k.rotation?f.attr({rotation:v}): +null===p&&(p=n.chart.renderer.fontMetrics(f.styles.fontSize).b-f.getBBox().height/2),null===y&&(n.isCircular?(this.label.getBBox().width>n.len*n.tickInterval/(n.max-n.min)&&(e=0),y=v>e&&v<180-e?"left":v>180+e&&v<360-e?"right":"center"):y="center",f.attr({align:y})),a.x+=k.x,a.y+=p):a=a.call(this,g,c,f,h,k,b,l,u);return a});u(b,"getMarkPath",function(a,d,c,f,h,k,b){var g=this.axis;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+f),d=["M",d,c,"L",a.x,a.y]):d=a.call(this,d,c,f,h,k,b);return d})})(x); +(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.Series,q=b.seriesType,e=b.seriesTypes;q("arearange","area",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:["low","high"],dataLabelCollections:["dataLabel", +"dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var d=this.chart,f=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=f.x-d.plotLeft;a.plotHigh=f.y-d.plotTop},translate:function(){var a=this,d=a.yAxis,f=!!a.modifyValue;e.area.prototype.translate.apply(a);r(a.points,function(h){var b=h.low,c=h.high,l=h.plotY;null===c||null===b?h.isNull=!0:(h.plotLow=l,h.plotHigh=d.translate(f?a.modifyValue(c,h):c,0,1, +0,1),f&&(h.yBottom=h.plotHigh))});this.chart.polar&&r(this.points,function(d){a.highToXY(d)})},getGraphPath:function(a){var d=[],f=[],h,b=e.area.prototype.getGraphPath,c,l,k;k=this.options;var p=k.step;a=a||this.points;for(h=a.length;h--;)c=a[h],c.isNull||k.connectEnds||a[h+1]&&!a[h+1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),l={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,yBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},f.push(l),d.push(l),c.isNull|| +k.connectEnds||a[h-1]&&!a[h-1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=b.call(this,a);p&&(!0===p&&(p="left"),k.step={left:"right",center:"center",right:"left"}[p]);d=b.call(this,d);f=b.call(this,f);k.step=p;k=[].concat(a,d);this.chart.polar||"M"!==f[0]||(f[0]="L");this.graphPath=k;this.areaPath=this.areaPath.concat(a,f);k.isArea=!0;k.xMap=a.xMap;this.areaPath.xMap=a.xMap;return k},drawDataLabels:function(){var a=this.data,d=a.length,f,h=[],b=m.prototype,c=this.options.dataLabels, +l=c.align,k=c.verticalAlign,p=c.inside,g,n,e=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,h[f]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=n,e?l||(c.align=n?"right":"left"):k||(c.verticalAlign=n?"top":"bottom"),c.x=c.xHigh,c.y=c.yHigh;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.dataLabelUpper= +g.dataLabel,g.dataLabel=h[f],g.y=g.low,g.plotY=g._plotY,g.below=!n,e?l||(c.align=n?"left":"right"):k||(c.verticalAlign=n?"bottom":"top"),c.x=c.xLow,c.y=c.yLow;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}c.align=l;c.verticalAlign=k},alignDataLabel:function(){e.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(x);(function(b){var r=b.seriesType;r("areasplinerange","arearange",null,{getPointSpline:b.seriesTypes.spline.prototype.getPointSpline})})(x); +(function(b){var r=b.defaultPlotOptions,t=b.each,w=b.merge,m=b.noop,q=b.pick,e=b.seriesType,a=b.seriesTypes.column.prototype;e("columnrange","arearange",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var d=this,f=d.yAxis,b=d.xAxis,u=b.startAngleRad,c,l=d.chart,k=d.xAxis.isRadial,p;a.translate.apply(d);t(d.points,function(a){var g=a.shapeArgs,h=d.options.minPointLength,e,v;a.plotHigh=p=f.translate(a.high,0,1,0,1);a.plotLow=a.plotY;v=p;e=q(a.rectPlotY,a.plotY)-p;Math.abs(e)< +h?(h-=e,e+=h,v-=h/2):0>e&&(e*=-1,v-=e);k?(c=a.barX+u,a.shapeType="path",a.shapeArgs={d:d.polarArc(v+e,v,c,c+a.pointWidth)}):(g.height=e,g.y=v,a.tooltipPos=l.inverted?[f.len+f.pos-l.plotLeft-v-e/2,b.len+b.pos-l.plotTop-g.x-g.width/2,e]:[b.left-l.plotLeft+g.x+g.width/2,f.pos-l.plotTop+v+e/2,e])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:m,crispCol:a.crispCol,drawPoints:a.drawPoints,drawTracker:a.drawTracker,getColumnMetrics:a.getColumnMetrics,animate:function(){return a.animate.apply(this, +arguments)},polarArc:function(){return a.polarArc.apply(this,arguments)},pointAttribs:a.pointAttribs})})(x);(function(b){var r=b.each,t=b.isNumber,w=b.merge,m=b.pick,q=b.pInt,e=b.Series,a=b.seriesType,d=b.TrackerMixin;a("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:b.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,d=this.options,b=a.center;this.generatePoints();r(this.points,function(c){var f=w(d.dial,c.dial),k=q(m(f.radius,80))*b[2]/200,h=q(m(f.baseLength,70))*k/100,g=q(m(f.rearLength,10))*k/100,n=f.baseWidth||3,u=f.topWidth||1,e=d.overshoot,v=a.startAngleRad+a.translate(c.y,null,null,null,!0);t(e)?(e=e/180*Math.PI,v=Math.max(a.startAngleRad-e,Math.min(a.endAngleRad+e,v))):!1===d.wrap&&(v=Math.max(a.startAngleRad,Math.min(a.endAngleRad, +v)));v=180*v/Math.PI;c.shapeType="path";c.shapeArgs={d:f.path||["M",-g,-n/2,"L",h,-n/2,k,-u/2,k,u/2,h,n/2,-g,n/2,"z"],translateX:b[0],translateY:b[1],rotation:v};c.plotX=b[0];c.plotY=b[1]})},drawPoints:function(){var a=this,d=a.yAxis.center,b=a.pivot,c=a.options,l=c.pivot,k=a.chart.renderer;r(a.points,function(d){var g=d.graphic,b=d.shapeArgs,f=b.d,h=w(c.dial,d.dial);g?(g.animate(b),b.d=f):(d.graphic=k[d.shapeType](b).attr({rotation:b.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group),d.graphic.attr({stroke:h.borderColor|| +"none","stroke-width":h.borderWidth||0,fill:h.backgroundColor||"#000000"}))});b?b.animate({translateX:d[0],translateY:d[1]}):(a.pivot=k.circle(0,0,m(l.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(d[0],d[1]).add(a.group),a.pivot.attr({"stroke-width":l.borderWidth||0,stroke:l.borderColor||"#cccccc",fill:l.backgroundColor||"#000000"}))},animate:function(a){var d=this;a||(r(d.points,function(a){var c=a.graphic;c&&(c.attr({rotation:180*d.yAxis.startAngleRad/Math.PI}),c.animate({rotation:a.shapeArgs.rotation}, +d.options.animation))}),d.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);e.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,d){e.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();m(d,!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(a){this.state=a}})})(x);(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.seriesType, +q=b.seriesTypes;m("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:["low","q1","median", +"q3","high"],toYData:function(b){return[b.low,b.q1,b.median,b.q3,b.high]},pointValKey:"high",pointAttribs:function(b){var a=this.options,d=b&&b.color||this.color;return{fill:b.fillColor||a.fillColor||d,stroke:a.lineColor||d,"stroke-width":a.lineWidth||0}},drawDataLabels:t,translate:function(){var b=this.yAxis,a=this.pointArrayMap;q.column.prototype.translate.apply(this);r(this.points,function(d){r(a,function(a){null!==d[a]&&(d[a+"Plot"]=b.translate(d[a],0,1,0,1))})})},drawPoints:function(){var b= +this,a=b.options,d=b.chart.renderer,f,h,u,c,l,k,p=0,g,n,m,q,v=!1!==b.doQuartiles,t,x=b.options.whiskerLength;r(b.points,function(e){var r=e.graphic,y=r?"animate":"attr",I=e.shapeArgs,z={},B={},G={},H=e.color||b.color;void 0!==e.plotY&&(g=I.width,n=Math.floor(I.x),m=n+g,q=Math.round(g/2),f=Math.floor(v?e.q1Plot:e.lowPlot),h=Math.floor(v?e.q3Plot:e.lowPlot),u=Math.floor(e.highPlot),c=Math.floor(e.lowPlot),r||(e.graphic=r=d.g("point").add(b.group),e.stem=d.path().addClass("highcharts-boxplot-stem").add(r), +x&&(e.whiskers=d.path().addClass("highcharts-boxplot-whisker").add(r)),v&&(e.box=d.path(void 0).addClass("highcharts-boxplot-box").add(r)),e.medianShape=d.path(void 0).addClass("highcharts-boxplot-median").add(r),z.stroke=e.stemColor||a.stemColor||H,z["stroke-width"]=w(e.stemWidth,a.stemWidth,a.lineWidth),z.dashstyle=e.stemDashStyle||a.stemDashStyle,e.stem.attr(z),x&&(B.stroke=e.whiskerColor||a.whiskerColor||H,B["stroke-width"]=w(e.whiskerWidth,a.whiskerWidth,a.lineWidth),e.whiskers.attr(B)),v&&(r= +b.pointAttribs(e),e.box.attr(r)),G.stroke=e.medianColor||a.medianColor||H,G["stroke-width"]=w(e.medianWidth,a.medianWidth,a.lineWidth),e.medianShape.attr(G)),k=e.stem.strokeWidth()%2/2,p=n+q+k,e.stem[y]({d:["M",p,h,"L",p,u,"M",p,f,"L",p,c]}),v&&(k=e.box.strokeWidth()%2/2,f=Math.floor(f)+k,h=Math.floor(h)+k,n+=k,m+=k,e.box[y]({d:["M",n,h,"L",n,f,"L",m,f,"L",m,h,"L",n,h,"z"]})),x&&(k=e.whiskers.strokeWidth()%2/2,u+=k,c+=k,t=/%$/.test(x)?q*parseFloat(x)/100:x/2,e.whiskers[y]({d:["M",p-t,u,"L",p+t,u, +"M",p-t,c,"L",p+t,c]})),l=Math.round(e.medianPlot),k=e.medianShape.strokeWidth()%2/2,l+=k,e.medianShape[y]({d:["M",n,l,"L",m,l]}))})},setStackedPoints:t})})(x);(function(b){var r=b.each,t=b.noop,w=b.seriesType,m=b.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},whiskerWidth:null},{type:"errorbar", +pointArrayMap:["low","high"],toYData:function(b){return[b.low,b.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:m.arearange?function(){var b=this.pointValKey;m.arearange.prototype.drawDataLabels.call(this);r(this.data,function(e){e.y=e[b]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||m.column.prototype.getColumnMetrics.call(this)}})})(x);(function(b){var r=b.correctFloat,t=b.isNumber,w=b.pick,m=b.Point,q=b.Series,e=b.seriesType,a=b.seriesTypes; +e("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",translate:function(){var d=this.options,b=this.yAxis,h,e,c,l,k,p,g,n,m,q=w(d.minPointLength,5),v=d.threshold,t=d.stacking;a.column.prototype.translate.apply(this);this.minPointLengthOffset=0;g=n=v;e=this.points;h=0;for(d=e.length;hl.height&&(l.y+=l.height,l.height*=-1),c.plotY=l.y=Math.round(l.y)- +this.borderWidth%2/2,l.height=Math.max(Math.round(l.height),.001),c.yBottom=l.y+l.height,l.height<=q&&(l.height=q,this.minPointLengthOffset+=q),l.y-=this.minPointLengthOffset,l=c.plotY+(c.negative?l.height:0)-this.minPointLengthOffset,this.chart.inverted?c.tooltipPos[0]=b.len-l:c.tooltipPos[1]=l},processData:function(a){var b=this.yData,d=this.options.data,e,c=b.length,l,k,p,g,n,m;k=l=p=g=this.options.threshold||0;for(m=0;ma[k-1].y&&(l[2]+=c.height,l[5]+=c.height),e=e.concat(l);return e},drawGraph:function(){q.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},getExtremes:b.noop},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum"); +return a},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(x);(function(b){var r=b.Series,t=b.seriesType,w=b.seriesTypes;t("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var b=r.prototype.getGraphPath.call(this),q=b.length+1;q--;)(q===b.length||"M"===b[q])&&0=this.minPxSize/2?(d.shapeType="circle",d.shapeArgs={x:d.plotX,y:d.plotY,r:c},d.dlBox={x:d.plotX-c,y:d.plotY-c,width:2*c,height:2*c}):d.shapeArgs=d.plotY=d.dlBox=void 0},drawLegendSymbol:function(a,b){var d=this.chart.renderer,c=d.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=d.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker= +!0},drawPoints:l.column.prototype.drawPoints,alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:a,applyZones:a},{haloPath:function(a){return h.prototype.haloPath.call(this,this.shapeArgs.r+a)},ttBelow:!1});w.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,h=0,l=b,u=this.isXAxis,m=u?"xData":"yData",w=this.min,x={},A=Math.min(c.plotWidth,c.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-w,z=b/E,F=[];q(this.series,function(b){var g=b.options;!b.bubblePadding|| +!b.visible&&c.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,F.push(b),u&&(q(["minSize","maxSize"],function(a){var b=g[a],d=/%$/.test(b),b=f(b);x[a]=d?A*b/100:b}),b.minPxSize=x.minSize,b.maxPxSize=Math.max(x.maxSize,x.minSize),b=b.zData,b.length&&(C=d(g.zMin,Math.min(C,Math.max(t(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=d(g.zMax,Math.max(D,r(b))))))});q(F,function(b){var d=b[m],c=d.length,f;u&&b.getRadii(C,D,b.minPxSize,b.maxPxSize);if(0f&&(f+=360),a.clientX=f):a.clientX=a.plotX};m.spline&&q(m.spline.prototype,"getPointSpline",function(a,b,f,h){var d,c,e,k,p,g,n;this.chart.polar?(d=f.plotX, +c=f.plotY,a=b[h-1],e=b[h+1],this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])),a&&e&&(k=a.plotX,p=a.plotY,b=e.plotX,g=e.plotY,k=(1.5*d+k)/2.5,p=(1.5*c+p)/2.5,e=(1.5*d+b)/2.5,n=(1.5*c+g)/2.5,b=Math.sqrt(Math.pow(k-d,2)+Math.pow(p-c,2)),g=Math.sqrt(Math.pow(e-d,2)+Math.pow(n-c,2)),k=Math.atan2(p-c,k-d),p=Math.atan2(n-c,e-d),n=Math.PI/2+(k+p)/2,Math.abs(k-n)>Math.PI/2&&(n-=Math.PI),k=d+Math.cos(n)*b,p=c+Math.sin(n)*b,e=d+Math.cos(Math.PI+n)*g,n=c+Math.sin(Math.PI+n)*g,f.rightContX=e,f.rightContY=n), +h?(f=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,k||d,p||c,d,c],a.rightContX=a.rightContY=null):f=["M",d,c]):f=a.call(this,b,f,h);return f});q(e,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});q(e,"getGraphPath",function(a,b){var d=this,e,m;if(this.chart.polar){b=b||this.points;for(e=0;eb.center[1]}),q(m,"alignDataLabel",function(a,b,f,h,m,c){this.chart.polar?(a=b.rectPlotX/Math.PI*180,null===h.align&&(h.align=20a?"left":200a?"right":"center"),null===h.verticalAlign&&(h.verticalAlign=45>a||315a?"top":"middle"),e.alignDataLabel.call(this,b,f,h,m,c)):a.call(this, +b,f,h,m,c)}));q(b,"getCoordinates",function(a,b){var d=this.chart,e={xAxis:[],yAxis:[]};d.polar?t(d.axes,function(a){var c=a.isXAxis,f=a.center,h=b.chartX-f[0]-d.plotLeft,f=b.chartY-f[1]-d.plotTop;e[c?"xAxis":"yAxis"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,f):Math.sqrt(Math.pow(h,2)+Math.pow(f,2)),!0)})}):e=a.call(this,b);return e})})(x)}); diff --git a/webapp/loadTests/150users1minute/js/highstock.js b/webapp/loadTests/150users1minute/js/highstock.js new file mode 100644 index 0000000..34a3f91 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/highstock.js @@ -0,0 +1,496 @@ +/* + Highstock JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(N,a){"object"===typeof module&&module.exports?module.exports=N.document?a(N):a:N.Highcharts=a(N)})("undefined"!==typeof window?window:this,function(N){N=function(){var a=window,D=a.document,B=a.navigator&&a.navigator.userAgent||"",G=D&&D.createElementNS&&!!D.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,H=/(edge|msie|trident)/i.test(B)&&!window.opera,p=!G,l=/Firefox/.test(B),r=l&&4>parseInt(B.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highstock", +version:"5.0.3",deg2rad:2*Math.PI/360,doc:D,hasBidiBug:r,hasTouch:D&&void 0!==D.documentElement.ontouchstart,isMS:H,isWebKit:/AppleWebKit/.test(B),isFirefox:l,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(B),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:p,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var D=[],B=a.charts,G=a.doc,H=a.win;a.error=function(a,l){a="Highcharts error #"+ +a+": www.highcharts.com/errors/"+a;if(l)throw Error(a);H.console&&console.log(a)};a.Fx=function(a,l,r){this.options=l;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],l=this.paths[1],r=[],w=this.now,t=a.length,k;if(1===w)r=this.toD;else if(t===l.length&&1>w)for(;t--;)k=parseFloat(a[t]),r[t]=isNaN(k)?a[t]:w*parseFloat(l[t]-k)+k;else r=l;this.elem.attr("d",r)},update:function(){var a=this.elem,l=this.prop,r=this.now,w=this.options.step;if(this[l+"Setter"])this[l+"Setter"](); +else a.attr?a.element&&a.attr(l,r):a.style[l]=r+this.unit;w&&w.call(a,r,this)},run:function(a,l,r){var p=this,t=function(a){return t.stopped?!1:p.step(a)},k;this.startTime=+new Date;this.start=a;this.end=l;this.unit=r;this.now=this.start;this.pos=0;t.elem=this.elem;t()&&1===D.push(t)&&(t.timerId=setInterval(function(){for(k=0;k=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=m[this.prop]=!0;for(e in m)!0!==m[e]&&(a=!1);a&&t&&t.call(p);p=!1}else this.pos=w.easing((l-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),p=!0;return p},initPath:function(p,l,r){function w(a){for(b=a.length;b--;)"M"!==a[b]&&"L"!==a[b]||a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function t(a,c){for(;a.lengthm?"AM":"PM",P:12>m?"am":"pm",S:q(t.getSeconds()),L:q(Math.round(l%1E3),3)},a.dateFormats);for(k in w)for(;-1!==p.indexOf("%"+k);)p= +p.replace("%"+k,"function"===typeof w[k]?w[k](l):w[k]);return r?p.substr(0,1).toUpperCase()+p.substr(1):p};a.formatSingle=function(p,l){var r=/\.([0-9])/,w=a.defaultOptions.lang;/f$/.test(p)?(r=(r=p.match(r))?r[1]:-1,null!==l&&(l=a.numberFormat(l,r,w.decimalPoint,-1=r&&(l=[1/r])));for(w=0;w=p||!t&&k<=(l[w]+(l[w+1]||l[w]))/ +2);w++);return m*r};a.stableSort=function(a,l){var r=a.length,p,t;for(t=0;tr&&(r=a[l]);return r};a.destroyObjectProperties=function(a,l){for(var r in a)a[r]&&a[r]!==l&&a[r].destroy&&a[r].destroy(),delete a[r]};a.discardElement=function(p){var l= +a.garbageBin;l||(l=a.createElement("div"));p&&l.appendChild(p);l.innerHTML=""};a.correctFloat=function(a,l){return parseFloat(a.toPrecision(l||14))};a.setAnimation=function(p,l){l.renderer.globalAnimation=a.pick(p,l.options.chart.animation,!0)};a.animObject=function(p){return a.isObject(p)?a.merge(p):{duration:p?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(p,l,r,w){p=+p||0;l=+l;var t=a.defaultOptions.lang, +k=(p.toString().split(".")[1]||"").length,m,e,g=Math.abs(p);-1===l?l=Math.min(k,20):a.isNumber(l)||(l=2);m=String(a.pInt(g.toFixed(l)));e=3p?"-":"")+(e?m.substr(0,e)+w:"");p+=m.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+w);l&&(w=Math.abs(g-m+Math.pow(10,-Math.max(l,k)-1)),p+=r+w.toFixed(l).slice(2));return p};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(p,l){return"width"===l?Math.min(p.offsetWidth, +p.scrollWidth)-a.getStyle(p,"padding-left")-a.getStyle(p,"padding-right"):"height"===l?Math.min(p.offsetHeight,p.scrollHeight)-a.getStyle(p,"padding-top")-a.getStyle(p,"padding-bottom"):(p=H.getComputedStyle(p,void 0))&&a.pInt(p.getPropertyValue(l))};a.inArray=function(a,l){return l.indexOf?l.indexOf(a):[].indexOf.call(l,a)};a.grep=function(a,l){return[].filter.call(a,l)};a.map=function(a,l){for(var r=[],p=0,t=a.length;pl;l++)w[l]+=p(255*a),0>w[l]&&(w[l]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width, +b=z.height,c&&L&&"11px"===L.fontSize&&"16.9"===b.toPrecision(3)&&(z.height=b=14),v&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(g&&0]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,c,v){"string"===typeof a?v.setAttribute(c, +a):a&&this.colorGradient(a,c,v)},visibilitySetter:function(a,c,v){"inherit"===a?v.removeAttribute(c):v.setAttribute(c,a)},zIndexSetter:function(a,c){var v=this.renderer,z=this.parentGroup,b=(z||v).element||v.box,d,n=this.element,f;d=this.added;var e;k(a)&&(n.zIndex=a,a=+a,this[c]===a&&(d=!1),this[c]=a);if(d){(a=this.zIndex)&&z&&(z.handleZ=!0);c=b.childNodes;for(e=0;ea||!k(a)&&k(d)||0>a&&!k(d)&&b!==v.box)&&(b.insertBefore(n,z),f=!0);f||b.appendChild(n)}return f}, +_defaultSetter:function(a,c,v){v.setAttribute(c,a)}};D.prototype.yGetter=D.prototype.xGetter;D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.rotationSetter=D.prototype.verticalAlignSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=function(a,c){this[c]=a;this.doTransform=!0};D.prototype["stroke-widthSetter"]=D.prototype.strokeSetter=function(a,c,v){this[c]=a;this.stroke&&this["stroke-width"]?(D.prototype.fillSetter.call(this,this.stroke,"stroke",v),v.setAttribute("stroke-width", +this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===a&&this.hasStroke&&(v.removeAttribute("stroke"),this.hasStroke=!1)};B=a.SVGRenderer=function(){this.init.apply(this,arguments)};B.prototype={Element:D,SVG_NS:K,init:function(a,c,v,b,d,n){var z;b=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(b));z=b.element;a.appendChild(z);-1===a.innerHTML.indexOf("xmlns")&&p(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=b;this.alignedObjects= +[];this.url=(E||A)&&g.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(g.createTextNode("Created with Highstock 5.0.3"));this.defs=this.createElement("defs").add();this.allowHTML=n;this.forExport=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,v,!1);var f;E&&a.getBoundingClientRect&&(c=function(){w(a,{left:0,top:0});f=a.getBoundingClientRect(); +w(a,{left:Math.ceil(f.left)-f.left+"px",top:Math.ceil(f.top)-f.top+"px"})},c(),this.unSubPixelFix=G(R,"resize",c))},getStyle:function(a){return this.style=C({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients= +null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var c=new this.Element;c.init(this,a);return c},draw:J,getRadialAttr:function(a,c){return{cx:a[0]-a[2]/2+c.cx*a[2],cy:a[1]-a[2]/2+c.cy*a[2],r:c.r*a[2]}},buildText:function(a){for(var c=a.element,z=this,b=z.forExport,n=y(a.textStr,"").toString(),f=-1!==n.indexOf("\x3c"),e=c.childNodes,q,F,x,A,I=p(c,"x"),m=a.styles,k=a.textWidth,C=m&&m.lineHeight,M=m&&m.textOutline,J=m&& +"ellipsis"===m.textOverflow,E=e.length,O=k&&!a.added&&this.box,t=function(a){var v;v=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:m&&m.fontSize||z.style.fontSize||12;return C?u(C):z.fontMetrics(v,a.getAttribute("style")?a:c).h};E--;)c.removeChild(e[E]);f||M||J||k||-1!==n.indexOf(" ")?(q=/<.*class="([^"]+)".*>/,F=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,O&&O.appendChild(c),n=f?n.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[n],n=d(n,function(a){return""!==a}),h(n,function(d,n){var f,e=0;d=d.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");f=d.split("|||");h(f,function(d){if(""!==d||1===f.length){var u={},y=g.createElementNS(z.SVG_NS,"tspan"),L,h;q.test(d)&&(L=d.match(q)[1],p(y,"class",L));F.test(d)&&(h=d.match(F)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),p(y,"style",h));x.test(d)&&!b&&(p(y, +"onclick",'location.href\x3d"'+d.match(x)[1]+'"'),w(y,{cursor:"pointer"}));d=(d.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==d){y.appendChild(g.createTextNode(d));e?u.dx=0:n&&null!==I&&(u.x=I);p(y,u);c.appendChild(y);!e&&n&&(!v&&b&&w(y,{display:"block"}),p(y,"dy",t(y)));if(k){u=d.replace(/([^\^])-/g,"$1- ").split(" ");L="nowrap"===m.whiteSpace;for(var C=1k,void 0===A&&(A=M),J&&A?(Q/=2,""===l||!M&&.5>Q?u=[]:(l=d.substring(0,l.length+(M?-1:1)*Math.ceil(Q)),u=[l+(3k&&(k=P)),u.length&&y.appendChild(g.createTextNode(u.join(" ").replace(/- /g, +"-")));a.rotation=R}e++}}})}),A&&a.attr("title",a.textStr),O&&O.removeChild(c),M&&a.applyTextOutline&&a.applyTextOutline(M)):c.appendChild(g.createTextNode(n.replace(/</g,"\x3c").replace(/>/g,"\x3e")))},getContrast:function(a){a=r(a).rgba;return 510v?d>c+f&&de?d>c+f&&db&&e>a+f&&ed&&e>a+f&&ea?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a, +c,v){var b=a;c&&v&&(b=Math.max(b*Math.cos(c*m),4));return{x:-a/3*Math.sin(c*m),y:b}},label:function(a,c,v,b,d,n,f,e,K){var q=this,u=q.g("button"!==K&&"label"),y=u.text=q.text("",0,0,f).attr({zIndex:1}),g,F,z=0,A=3,L=0,m,M,J,E,O,t={},l,R,r=/^url\((.*?)\)$/.test(b),p=r,P,w,Q,S;K&&u.addClass("highcharts-"+K);p=r;P=function(){return(l||0)%2/2};w=function(){var a=y.element.style,c={};F=(void 0===m||void 0===M||O)&&k(y.textStr)&&y.getBBox();u.width=(m||F.width||0)+2*A+L;u.height=(M||F.height||0)+2*A;R= +A+q.fontMetrics(a&&a.fontSize,y).b;p&&(g||(u.box=g=q.symbols[b]||r?q.symbol(b):q.rect(),g.addClass(("button"===K?"":"highcharts-label-box")+(K?" highcharts-"+K+"-box":"")),g.add(u),a=P(),c.x=a,c.y=(e?-R:0)+a),c.width=Math.round(u.width),c.height=Math.round(u.height),g.attr(C(c,t)),t={})};Q=function(){var a=L+A,c;c=e?0:R;k(m)&&F&&("center"===O||"right"===O)&&(a+={center:.5,right:1}[O]*(m-F.width));if(a!==y.x||c!==y.y)y.attr("x",a),void 0!==c&&y.attr("y",c);y.x=a;y.y=c};S=function(a,c){g?g.attr(a,c): +t[a]=c};u.onAdd=function(){y.add(u);u.attr({text:a||0===a?a:"",x:c,y:v});g&&k(d)&&u.attr({anchorX:d,anchorY:n})};u.widthSetter=function(a){m=a};u.heightSetter=function(a){M=a};u["text-alignSetter"]=function(a){O=a};u.paddingSetter=function(a){k(a)&&a!==A&&(A=u.padding=a,Q())};u.paddingLeftSetter=function(a){k(a)&&a!==L&&(L=a,Q())};u.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,F&&u.attr({x:J}))};u.textSetter=function(a){void 0!==a&&y.textSetter(a);w();Q()};u["stroke-widthSetter"]= +function(a,c){a&&(p=!0);l=this["stroke-width"]=a;S(c,a)};u.strokeSetter=u.fillSetter=u.rSetter=function(a,c){"fill"===c&&a&&(p=!0);S(c,a)};u.anchorXSetter=function(a,c){d=a;S(c,Math.round(a)-P()-J)};u.anchorYSetter=function(a,c){n=a;S(c,a-E)};u.xSetter=function(a){u.x=a;z&&(a-=z*((m||F.width)+2*A));J=Math.round(a);u.attr("translateX",J)};u.ySetter=function(a){E=u.y=Math.round(a);u.attr("translateY",E)};var T=u.css;return C(u,{css:function(a){if(a){var c={};a=x(a);h(u.textProps,function(v){void 0!== +a[v]&&(c[v]=a[v],delete a[v])});y.css(c)}return T.call(u,a)},getBBox:function(){return{width:F.width+2*A,height:F.height+2*A,x:F.x-A,y:F.y-A}},shadow:function(a){a&&(w(),g&&g.shadow(a));return u},destroy:function(){I(u.element,"mouseenter");I(u.element,"mouseleave");y&&(y=y.destroy());g&&(g=g.destroy());D.prototype.destroy.call(u);u=q=w=Q=S=null}})}};a.Renderer=B})(N);(function(a){var D=a.attr,B=a.createElement,G=a.css,H=a.defined,p=a.each,l=a.extend,r=a.isFirefox,w=a.isMS,t=a.isWebKit,k=a.pInt,m= +a.SVGRenderer,e=a.win,g=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var e=this.element;if(e=a&&"SPAN"===e.tagName&&a.width)delete a.width,this.textWidth=e,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a= +this.renderer,e=this.element,f=this.translateX||0,d=this.translateY||0,b=this.x||0,q=this.y||0,g=this.textAlign||"left",c={left:0,center:.5,right:1}[g],F=this.styles;G(e,{marginLeft:f,marginTop:d});this.shadows&&p(this.shadows,function(a){G(a,{marginLeft:f+1,marginTop:d+1})});this.inverted&&p(e.childNodes,function(c){a.invertChild(c,e)});if("SPAN"===e.tagName){var n=this.rotation,A=k(this.textWidth),x=F&&F.whiteSpace,m=[n,g,e.innerHTML,this.textWidth,this.textAlign].join();m!==this.cTT&&(F=a.fontMetrics(e.style.fontSize).b, +H(n)&&this.setSpanRotation(n,c,F),G(e,{width:"",whiteSpace:x||"nowrap"}),e.offsetWidth>A&&/[ \-]/.test(e.textContent||e.innerText)&&G(e,{width:A+"px",display:"block",whiteSpace:x||"normal"}),this.getSpanCorrection(e.offsetWidth,F,c,n,g));G(e,{left:b+(this.xCorr||0)+"px",top:q+(this.yCorr||0)+"px"});t&&(F=e.offsetHeight);this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,g,f){var d={},b=w?"-ms-transform":t?"-webkit-transform":r?"MozTransform":e.opera?"-o-transform":"";d[b]=d.transform= +"rotate("+a+"deg)";d[b+(r?"Origin":"-origin")]=d.transformOrigin=100*g+"% "+f+"px";G(this.element,d)},getSpanCorrection:function(a,e,f){this.xCorr=-a*f;this.yCorr=-e}});l(m.prototype,{html:function(a,e,f){var d=this.createElement("span"),b=d.element,q=d.renderer,h=q.isSVG,c=function(a,c){p(["opacity","visibility"],function(b){g(a,b+"Setter",function(a,b,d,n){a.call(this,b,d,n);c[d]=b})})};d.textSetter=function(a){a!==b.innerHTML&&delete this.bBox;b.innerHTML=this.textStr=a;d.htmlUpdateTransform()}; +h&&c(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,c){"align"===c&&(c="textAlign");d[c]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(e),y:Math.round(f)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});b.style.whiteSpace="nowrap";d.css=d.htmlCss;h&&(d.add=function(a){var n,f=q.box.parentNode,e=[];if(this.parentGroup=a){if(n=a.div,!n){for(;a;)e.push(a),a=a.parentGroup;p(e.reverse(),function(a){var b,d=D(a.element, +"class");d&&(d={className:d});n=a.div=a.div||B("div",d,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},n||f);b=n.style;l(a,{translateXSetter:function(c,d){b.left=c+"px";a[d]=c;a.doTransform=!0},translateYSetter:function(c,d){b.top=c+"px";a[d]=c;a.doTransform=!0}});c(a,b)})}}else n=f;n.appendChild(b);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d});return d}})})(N);(function(a){var D, +B,G=a.createElement,H=a.css,p=a.defined,l=a.deg2rad,r=a.discardElement,w=a.doc,t=a.each,k=a.erase,m=a.extend;D=a.extendClass;var e=a.isArray,g=a.isNumber,h=a.isObject,C=a.merge;B=a.noop;var f=a.pick,d=a.pInt,b=a.SVGElement,q=a.SVGRenderer,E=a.win;a.svg||(B={docMode8:w&&8===w.documentMode,init:function(a,b){var c=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],f="div"===b;("shape"===b||f)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",f?"hidden":"visible"); +c.push(' style\x3d"',d.join(""),'"/\x3e');b&&(c=f||"span"===b||"img"===b?c.join(""):a.prepVML(c),this.element=G(c));this.renderer=a},add:function(a){var c=this.renderer,b=this.element,d=c.box,f=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);f&&c.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},updateTransform:b.prototype.htmlUpdateTransform, +setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*l),d=Math.sin(a*l);H(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,e,q){var c=e?Math.cos(e*l):1,n=e?Math.sin(e*l):0,u=f(this.elemHeight,this.element.offsetHeight),g;this.xCorr=0>c&&-a;this.yCorr=0>n&&-u;g=0>c*n;this.xCorr+=n*b*(g?1-d:d);this.yCorr-=c*b*(e?g?d:1-d:1);q&&"left"!== +q&&(this.xCorr-=a*d*(0>c?-1:1),e&&(this.yCorr-=u*d*(0>n?-1:1)),H(this.element,{textAlign:q}))},pathToVML:function(a){for(var c=a.length,b=[];c--;)g(a[c])?b[c]=Math.round(10*a[c])-5:"Z"===a[c]?b[c]="x":(b[c]=a[c],!a.isArc||"wa"!==a[c]&&"at"!==a[c]||(b[c+5]===b[c+7]&&(b[c+7]+=a[c+7]>a[c+5]?1:-1),b[c+6]===b[c+8]&&(b[c+8]+=a[c+8]>a[c+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var c=this,b;a?(b=a.members,k(b,c),b.push(c),c.destroyClip=function(){k(b,c)},a=a.getCSS(c)):(c.destroyClip&&c.destroyClip(), +a={clip:c.docMode8?"inherit":"rect(auto)"});return c.css(a)},css:b.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&r(a)},destroy:function(){this.destroyClip&&this.destroyClip();return b.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c;a=a.split(/[ ,]/);c=a.length;if(9===c||11===c)a[c-4]=a[c-2]=d(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,e){var c=[],n,q=this.element, +g=this.renderer,u,I=q.style,F,v=q.path,K,h,m,z;v&&"string"!==typeof v.value&&(v="x");h=v;if(a){m=f(a.width,3);z=(a.opacity||.15)/m;for(n=1;3>=n;n++)K=2*m+1-2*n,e&&(h=this.cutOffPath(v.value,K+.5)),F=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',K,'" filled\x3d"false" path\x3d"',h,'" coordsize\x3d"10 10" style\x3d"',q.style.cssText,'" /\x3e'],u=G(g.prepVML(F),null,{left:d(I.left)+f(a.offsetX,1),top:d(I.top)+f(a.offsetY,1)}),e&&(u.cutOff=K+1),F=['\x3cstroke color\x3d"',a.color||"#000000",'" opacity\x3d"', +z*n,'"/\x3e'],G(g.prepVML(F),null,null,u),b?b.element.appendChild(u):q.parentNode.insertBefore(u,q),c.push(u);this.shadows=c}return this},updateShadows:B,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||G(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,b,d){var c=this.shadows; +a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(c)for(d=c.length;d--;)c[d].path=c[d].cutOff?this.cutOffPath(a,c[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var c=d.nodeName;"SPAN"===c?d.style.color=a:"IMG"!==c&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){G(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:B,rotationSetter:function(a,b,d){d= +d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*l)+1)+"px";d.top=Math.round(Math.cos(a*l))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;g(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&t(this.shadows,function(c){c.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===a?"-999em": +0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},B["stroke-opacitySetter"]=B["fill-opacitySetter"],a.VMLElement=B=D(b,B),B.prototype.ySetter=B.prototype.widthSetter=B.prototype.heightSetter=B.prototype.xSetter,B={Element:B,isIE8:-1l[0]&&c.push([1,l[1]]);t(c,function(c,b){q.test(c[1])?(n=a.color(c[1]),v=n.get("rgb"),K=n.get("a")):(v=c[1],K=1);r.push(100*c[0]+"% "+v);b?(m=K,k=v):(z=K,E=v)});if("fill"===d)if("gradient"===g)d=A.x1||A[0]||0,c=A.y1||A[1]||0,F=A.x2||A[2]||0,A=A.y2||A[3]||0,C='angle\x3d"'+(90-180*Math.atan((A-c)/(F-d))/Math.PI)+'"',p();else{var h=A.r,w=2*h,B=2*h,D=A.cx,H=A.cy,V=b.radialReference,U,h=function(){V&&(U=f.getBBox(),D+=(V[0]- +U.x)/U.width-.5,H+=(V[1]-U.y)/U.height-.5,w*=V[2]/U.width,B*=V[2]/U.height);C='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+w+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+D+","+H+'" color2\x3d"'+E+'" ';p()};f.added?h():f.onAdd=h;h=k}else h=v}else q.test(c)&&"IMG"!==b.tagName?(n=a.color(c),f[d+"-opacitySetter"](n.get("a"),d,b),h=n.get("rgb")):(h=b.getElementsByTagName(d),h.length&&(h[0].opacity=1,h[0].type="solid"),h=c);return h},prepVML:function(a){var c=this.isIE8;a=a.join(""); +c?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:q.prototype.html,path:function(a){var c={coordsize:"10 10"};e(a)?c.d=a:h(a)&&m(c,a);return this.createElement("shape").attr(c)},circle:function(a,b,d){var c=this.symbol("circle"); +h(a)&&(d=a.r,b=a.y,a=a.x);c.isCircle=!0;c.r=d;return c.attr({x:a,y:b})},g:function(a){var c;a&&(c={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(c)},image:function(a,b,d,f,e){var c=this.createElement("img").attr({src:a});1f&&m-d*bg&&(F=Math.round((e-m)/Math.cos(f*w)));else if(e=m+(1-d)*b,m-d*bg&&(E=g-a.x+E*d,c=-1),E=Math.min(q, +E),EE||k.autoRotation&&(C.styles||{}).width)F=E;F&&(n.width=F,(k.options.labels.style||{}).textOverflow||(n.textOverflow="ellipsis"),C.css(n))},getPosition:function(a,k,m,e){var g=this.axis,h=g.chart,l=e&&h.oldChartHeight||h.chartHeight;return{x:a?g.translate(k+m,null,null,e)+g.transB:g.left+g.offset+(g.opposite?(e&&h.oldChartWidth||h.chartWidth)-g.right-g.left:0),y:a?l-g.bottom+g.offset-(g.opposite?g.height:0):l-g.translate(k+m,null, +null,e)-g.transB}},getLabelPosition:function(a,k,m,e,g,h,l,f){var d=this.axis,b=d.transA,q=d.reversed,E=d.staggerLines,c=d.tickRotCorr||{x:0,y:0},F=g.y;B(F)||(F=0===d.side?m.rotation?-8:-m.getBBox().height:2===d.side?c.y+8:Math.cos(m.rotation*w)*(c.y-m.getBBox(!1,0).height/2));a=a+g.x+c.x-(h&&e?h*b*(q?-1:1):0);k=k+F-(h&&!e?h*b*(q?1:-1):0);E&&(m=l/(f||1)%E,d.opposite&&(m=E-m-1),k+=d.labelOffset/E*m);return{x:a,y:Math.round(k)}},getMarkPath:function(a,k,m,e,g,h){return h.crispLine(["M",a,k,"L",a+(g? +0:-m),k+(g?m:0)],e)},render:function(a,k,m){var e=this.axis,g=e.options,h=e.chart.renderer,C=e.horiz,f=this.type,d=this.label,b=this.pos,q=g.labels,E=this.gridLine,c=f?f+"Tick":"tick",F=e.tickSize(c),n=this.mark,A=!n,x=q.step,p={},y=!0,u=e.tickmarkOffset,I=this.getPosition(C,b,u,k),M=I.x,I=I.y,v=C&&M===e.pos+e.len||!C&&I===e.pos?-1:1,K=f?f+"Grid":"grid",O=g[K+"LineWidth"],R=g[K+"LineColor"],z=g[K+"LineDashStyle"],K=l(g[c+"Width"],!f&&e.isXAxis?1:0),c=g[c+"Color"];m=l(m,1);this.isActive=!0;E||(p.stroke= +R,p["stroke-width"]=O,z&&(p.dashstyle=z),f||(p.zIndex=1),k&&(p.opacity=0),this.gridLine=E=h.path().attr(p).addClass("highcharts-"+(f?f+"-":"")+"grid-line").add(e.gridGroup));if(!k&&E&&(b=e.getPlotLinePath(b+u,E.strokeWidth()*v,k,!0)))E[this.isNew?"attr":"animate"]({d:b,opacity:m});F&&(e.opposite&&(F[0]=-F[0]),A&&(this.mark=n=h.path().addClass("highcharts-"+(f?f+"-":"")+"tick").add(e.axisGroup),n.attr({stroke:c,"stroke-width":K})),n[A?"attr":"animate"]({d:this.getMarkPath(M,I,F[0],n.strokeWidth()* +v,C,h),opacity:m}));d&&H(M)&&(d.xy=I=this.getLabelPosition(M,I,d,C,q,u,a,x),this.isFirst&&!this.isLast&&!l(g.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(g.showLastLabel,1)?y=!1:!C||e.isRadial||q.step||q.rotation||k||0===m||this.handleOverflow(I),x&&a%x&&(y=!1),y&&H(I.y)?(I.opacity=m,d[this.isNew?"attr":"animate"](I)):(r(d),d.attr("y",-9999)),this.isNew=!1)},destroy:function(){G(this,this.axis)}}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.AxisPlotLineOrBandExtension, +l=a.color,r=a.correctFloat,w=a.defaultOptions,t=a.defined,k=a.deg2rad,m=a.destroyObjectProperties,e=a.each,g=a.error,h=a.extend,C=a.fireEvent,f=a.format,d=a.getMagnitude,b=a.grep,q=a.inArray,E=a.isArray,c=a.isNumber,F=a.isString,n=a.merge,A=a.normalizeTickInterval,x=a.pick,J=a.PlotLineOrBand,y=a.removeEvent,u=a.splat,I=a.syncTimeout,M=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M", +hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb", +lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15}, +title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var b=c.isX;this.chart=a;this.horiz=a.inverted?!b:b;this.isXAxis=b;this.coll=this.coll||(b?"xAxis":"yAxis");this.opposite=c.opposite;this.side=c.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,v=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter; +this.userOptions=c;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===v||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===v;this.isDatetimeAxis="datetime"===v;this.isLinked=t(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom; +this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=x(d.crosshair,u(a.options.tooltip.crosshairs)[b?0:1],!1);var f;c=this.options.events;-1===q(this,a.axes)&&(b?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&b&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in c)D(this,f,c[f]); +this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=n(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],n(w[this.coll],a))},defaultLabelFormatter:function(){var c=this.axis,b=this.value,d=c.categories,e=this.dateTimeLabelFormat,q=w.lang,u=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,n=u&&u.length,g,y=c.options.labels.format, +c=c.isLog?b:c.tickInterval;if(y)g=f(y,this);else if(d)g=b;else if(e)g=a.dateFormat(e,b);else if(n&&1E3<=c)for(;n--&&void 0===g;)d=Math.pow(q,n+1),c>=d&&0===10*b%d&&null!==u[n]&&0!==b&&(g=a.numberFormat(b/d,-1)+u[n]);void 0===g&&(g=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return g},getSeriesExtremes:function(){var a=this,d=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();e(a.series,function(v){if(v.visible|| +!d.options.chart.ignoreHiddenSeries){var f=v.options,e=f.threshold,q;a.hasVisibleSeries=!0;a.isLog&&0>=e&&(e=null);if(a.isXAxis)f=v.xData,f.length&&(v=H(f),c(v)||v instanceof Date||(f=b(f,function(a){return c(a)}),v=H(f)),a.dataMin=Math.min(x(a.dataMin,f[0]),v),a.dataMax=Math.max(x(a.dataMax,f[0]),G(f)));else if(v.getExtremes(),q=v.dataMax,v=v.dataMin,t(v)&&t(q)&&(a.dataMin=Math.min(x(a.dataMin,v),v),a.dataMax=Math.max(x(a.dataMax,q),q)),t(e)&&(a.threshold=e),!f.softThreshold||a.isLog)a.softThreshold= +!1}})},translate:function(a,b,d,f,e,q){var v=this.linkedParent||this,u=1,n=0,g=f?v.oldTransA:v.transA;f=f?v.oldMin:v.min;var K=v.minPixelPadding;e=(v.isOrdinal||v.isBroken||v.isLog&&e)&&v.lin2val;g||(g=v.transA);d&&(u*=-1,n=v.len);v.reversed&&(u*=-1,n-=u*(v.sector||v.len));b?(a=(a*u+n-K)/g+f,e&&(a=v.lin2val(a))):(e&&(a=v.val2lin(a)),a=u*(a-f)*g+n+u*K+(c(q)?g*q:0));return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a- +(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,f,e){var v=this.chart,q=this.left,u=this.top,n,g,K=d&&v.oldChartHeight||v.chartHeight,y=d&&v.oldChartWidth||v.chartWidth,z;n=this.transB;var h=function(a,c,b){if(ab)f?a=Math.min(Math.max(c,a),b):z=!0;return a};e=x(e,this.translate(a,null,null,d));a=d=Math.round(e+n);n=g=Math.round(K-e-n);c(e)?this.horiz?(n=u,g=K-this.bottom,a=d=h(a,q,q+this.width)):(a=q,d=y-this.right,n=g=h(n,u,u+this.height)):z=!0;return z&&!f?null:v.renderer.crispLine(["M", +a,n,"L",d,g],b||1)},getLinearTickPositions:function(a,b,d){var v,f=r(Math.floor(b/a)*a),e=r(Math.ceil(d/a)*a),q=[];if(b===d&&c(b))return[b];for(b=f;b<=e;){q.push(b);b=r(b+a);if(b===v)break;v=b}return q},getMinorTickPositions:function(){var a=this.options,c=this.tickPositions,b=this.minorTickInterval,d=[],f,e=this.pointRangePadding||0;f=this.min-e;var e=this.max+e,q=e-f;if(q&&q/b=this.minRange,q,u,n,g,y,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(t(a.min)||t(a.max)?this.minRange=null:(e(this.series,function(a){g=a.xData;for(u=y=a.xIncrement? +1:g.length-1;0=E?(p=E,m=0):b.dataMax<=E&&(J=E,I=0)),b.min=x(w,p,b.dataMin),b.max=x(B,J,b.dataMax));q&&(!a&&0>=Math.min(b.min, +x(b.dataMin,b.min))&&g(10,1),b.min=r(u(b.min),15),b.max=r(u(b.max),15));b.range&&t(b.max)&&(b.userMin=b.min=w=Math.max(b.min,b.minFromRange()),b.userMax=B=b.max,b.range=null);C(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(l||b.axisPointRange||b.usePercentage||h)&&t(b.min)&&t(b.max)&&(u=b.max-b.min)&&(!t(w)&&m&&(b.min-=u*m),!t(B)&&I&&(b.max+=u*I));c(f.floor)?b.min=Math.max(b.min,f.floor):c(f.softMin)&&(b.min=Math.min(b.min,f.softMin));c(f.ceiling)?b.max=Math.min(b.max, +f.ceiling):c(f.softMax)&&(b.max=Math.max(b.max,f.softMax));M&&t(b.dataMin)&&(E=E||0,!t(w)&&b.min=E?b.min=E:!t(B)&&b.max>E&&b.dataMax<=E&&(b.max=E));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:h&&!k&&F===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:x(k,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*F/Math.max(b.len,F));y&&!a&&e(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); +b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!k&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));a=x(f.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!k&&b.tickIntervalb.tickInterval&&1E3b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval= +b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,f=a.startOnTick,e=a.endOnTick,q;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), +this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.isLinked||(this.trimTicks(b,f,e),this.min===this.max&&t(this.min)&&!this.tickAmount&&(q=!0,this.min-=.5,this.max+=.5),this.single=q,c||d||this.adjustTickAmount())}, +trimTicks:function(a,b,c){var d=a[0],f=a[a.length-1],v=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-v>a[0];)a.shift();if(c)this.max=f;else for(;this.max+vb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,f=b&&b.length;if(fc&&(this.tickInterval*= +2,this.setTickPositions());if(t(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0=f&&(b=f)),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,f=x(b.width,a.plotWidth-c+(b.offsetRight||0)),e=x(b.height,a.plotHeight),q=x(b.top,a.plotTop),b=x(b.left,a.plotLeft+c),c=/%$/;c.test(e)&&(e=Math.round(parseFloat(e)/ +100*a.plotHeight));c.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight+a.plotTop));this.left=b;this.top=q;this.width=f;this.height=e;this.bottom=a.chartHeight-e-q;this.right=a.chartWidth-f-b;this.len=Math.max(d?f:e,0);this.pos=d?b:q},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?r(b(this.min)):this.min,max:a?r(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log, +d=b?c(this.min):this.min,b=b?c(this.max):this.max;null===a?a=d:d>a?a=d:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],d=x(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize, +this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,f=this.len/(((this.categories?1:0)+this.max-this.min)/c),q,u=a.rotation,n=this.labelMetrics(),g,y=Number.MAX_VALUE,h,I=function(a){a/=f||1;a=1=a)g=I(Math.abs(n.h/Math.sin(k*a))),b=g+Math.abs(a/360),b(c.step||0)&&!c.rotation&&(this.staggerLines||1)*a.plotWidth/d||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,f=this.options.labels,q=this.horiz,u=this.getSlotWidth(),g=Math.max(1, +Math.round(u-2*(f.padding||5))),y={},h=this.labelMetrics(),I=f.style&&f.style.textOverflow,A,x=0,m,k;F(f.rotation)||(y.rotation=f.rotation||0);e(c,function(a){(a=d[a])&&a.labelLength>x&&(x=a.labelLength)});this.maxLabelLength=x;if(this.autoRotation)x>g&&x>h.h?y.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(A={width:g+"px"},!I))for(A.textOverflow="clip",m=c.length;!q&&m--;)if(k=c[m],g=d[k].label)g.styles&&"ellipsis"===g.styles.textOverflow?g.css({textOverflow:"clip"}):d[k].labelLength> +u&&g.css({width:u+"px"}),g.getBBox().height>this.len/c.length-(h.h-h.f)&&(g.specCss={textOverflow:"ellipsis"});y.rotation&&(A={width:(x>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},I||(A.textOverflow="ellipsis"));if(this.labelAlign=f.align||this.autoLabelAlign(this.labelRotation))y.align=this.labelAlign;e(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(y),A&&b.css(n(A,b.specCss)),delete b.specCss,a.rotation=y.rotation)});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,0!==this.side)}, +hasData:function(){return this.hasVisibleSeries||t(this.min)&&t(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,f=a.tickPositions,q=a.ticks,u=a.horiz,n=a.side,g=b.inverted?[1,0,3,2][n]:n,y,h,I=0,A,m=0,k=d.title,F=d.labels,E=0,l=a.opposite,C=b.axisOffset,b=b.clipOffset,p=[-1,1,1,-1][n],r,J=d.className,w=a.axisParent,B=this.tickSize("tick");y=a.hasData();a.showAxis=h=y||x(d.showEmpty,!0);a.staggerLines=a.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(J||"")).add(w),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(J||"")).add(w),a.labelGroup=c.g("axis-labels").attr({zIndex:F.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(J||"")).add(w));if(y||a.isLinked)e(f,function(b){q[b]?q[b].addLabel():q[b]=new M(a,b)}),a.renderUnsquish(),!1===F.reserveSpace||0!==n&&2!==n&&{1:"left",3:"right"}[n]!== +a.labelAlign&&"center"!==a.labelAlign||e(f,function(a){E=Math.max(q[a].getLabelSize(),E)}),a.staggerLines&&(E*=a.staggerLines,a.labelOffset=E*(a.opposite?-1:1));else for(r in q)q[r].destroy(),delete q[r];k&&k.text&&!1!==k.enabled&&(a.axisTitle||((r=k.textAlign)||(r=(u?{low:"left",middle:"center",high:"right"}:{low:l?"right":"left",middle:"center",high:l?"left":"right"})[k.align]),a.axisTitle=c.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:r}).addClass("highcharts-axis-title").css(k.style).add(a.axisGroup), +a.axisTitle.isNew=!0),h&&(I=a.axisTitle.getBBox()[u?"height":"width"],A=k.offset,m=t(A)?0:x(k.margin,u?5:10)),a.axisTitle[h?"show":"hide"](!0));a.renderLine();a.offset=p*x(d.offset,C[n]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===n?-a.labelMetrics().h:2===n?a.tickRotCorr.y:0;m=Math.abs(E)+m;E&&(m=m-c+p*(u?x(F.y,a.tickRotCorr.y+8*p):F.x));a.axisTitleMargin=x(A,m);C[n]=Math.max(C[n],a.axisTitleMargin+I+p*a.offset,m,y&&f.length&&B?B[0]:0);d=d.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[g]= +Math.max(b[g],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,f=this.horiz,e=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:e,f?d:this.top,"L",f?b.chartWidth-this.right:e,f?d:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor, +"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,f=this.options.title,e=a?b:c,q=this.opposite,u=this.offset,n=f.x||0,g=f.y||0,y=this.chart.renderer.fontMetrics(f.style&&f.style.fontSize,this.axisTitle).f,d={low:e+(a?0:d),middle:e+d/2,high:e+(a?d:0)}[f.align],b=(a?c+this.height:b)+(a?1:-1)*(q?-1:1)*this.axisTitleMargin+(2===this.side?y:0);return{x:a?d+n:b+(q?this.width:0)+u+n,y:a?b+g-(q?this.height:0)+u:d+g}},render:function(){var a= +this,b=a.chart,d=b.renderer,f=a.options,q=a.isLog,u=a.lin2log,n=a.isLinked,g=a.tickPositions,y=a.axisTitle,h=a.ticks,A=a.minorTicks,x=a.alternateBands,m=f.stackLabels,k=f.alternateGridColor,F=a.tickmarkOffset,E=a.axisLine,l=b.hasRendered&&c(a.oldMin),C=a.showAxis,p=B(d.globalAnimation),r,t;a.labelEdge.length=0;a.overlap=!1;e([h,A,x],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||n)a.minorTickInterval&&!a.categories&&e(a.getMinorTickPositions(),function(b){A[b]||(A[b]=new M(a,b,"minor")); +l&&A[b].isNew&&A[b].render(null,!0);A[b].render(null,!1,1)}),g.length&&(e(g,function(b,c){if(!n||b>=a.min&&b<=a.max)h[b]||(h[b]=new M(a,b)),l&&h[b].isNew&&h[b].render(c,!0,.1),h[b].render(c)}),F&&(0===a.min||a.single)&&(h[-1]||(h[-1]=new M(a,-1,null,!0)),h[-1].render(-1))),k&&e(g,function(c,d){t=void 0!==g[d+1]?g[d+1]+F:a.max-F;0===d%2&&c=e.second?0:A*Math.floor(c.getMilliseconds()/A));if(n>=e.second)c[B.hcSetSeconds](n>=e.minute?0:A*Math.floor(c.getSeconds()/ +A));if(n>=e.minute)c[B.hcSetMinutes](n>=e.hour?0:A*Math.floor(c[B.hcGetMinutes]()/A));if(n>=e.hour)c[B.hcSetHours](n>=e.day?0:A*Math.floor(c[B.hcGetHours]()/A));if(n>=e.day)c[B.hcSetDate](n>=e.month?1:A*Math.floor(c[B.hcGetDate]()/A));n>=e.month&&(c[B.hcSetMonth](n>=e.year?0:A*Math.floor(c[B.hcGetMonth]()/A)),g=c[B.hcGetFullYear]());if(n>=e.year)c[B.hcSetFullYear](g-g%A);if(n===e.week)c[B.hcSetDate](c[B.hcGetDate]()-c[B.hcGetDay]()+m(f,1));g=c[B.hcGetFullYear]();f=c[B.hcGetMonth]();var C=c[B.hcGetDate](), +y=c[B.hcGetHours]();if(B.hcTimezoneOffset||B.hcGetTimezoneOffset)x=(!q||!!B.hcGetTimezoneOffset)&&(k-h>4*e.month||t(h)!==t(k)),c=c.getTime(),c=new B(c+t(c));q=c.getTime();for(h=1;qr&&(!t||b<=w)&&void 0!==b&&h.push(b),b>w&&(q=!0),b=d;else r=e(r),w= +e(w),a=k[t?"minorTickInterval":"tickInterval"],a=p("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(t?5:1)*(w-r)/((t?m/this.tickPositions.length:m)||1)),a=H(a,null,B(a)),h=G(this.getLinearTickPositions(a,r,w),g),t||(this._minorAutoInterval=a/5);t||(this.tickInterval=a);return h};D.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};D.prototype.lin2log=function(a){return Math.pow(10,a)}})(N);(function(a){var D=a.dateFormat,B=a.each,G=a.extend,H=a.format,p=a.isNumber,l=a.map,r= +a.merge,w=a.pick,t=a.splat,k=a.stop,m=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){B(this.chart.series,function(e){var g=e&&e.tt;g&&(!g.isActive||a?e.tt=g.destroy():g.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label|| +(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,r(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart, +!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,m,f){var d=this,b=d.now,q=!1!==d.options.animation&&!d.isHidden&&(1h-q?h:h-q);else if(v)b[a]=Math.max(g,e+q+f>c?e:e+q);else return!1},x=function(a,c,f,e){var q;ec-d?q=!1:b[a]=ec-f/2?c-f-2:e-f/2;return q},k=function(a){var b=c;c=h;h=b;g=a},y=function(){!1!==A.apply(0,c)?!1!==x.apply(0,h)||g||(k(!0),y()):g?b.x=b.y=0:(k(!0),y())};(f.inverted||1y&&(q=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=d.plotTop;f.push({target:e.isHeader?d.plotHeight+c:a,rank:e.isHeader?1:0,size:n.tt.getBBox().height+1,point:e,x:y,tt:A})});this.cleanSplit(); +a.distribute(f,d.plotHeight+c);B(f,function(a){var b=a.point;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:q||b.isHeader?a.x:b.plotX+d.plotLeft+w(m.distance,16),y:a.pos+d.plotTop,anchorX:b.plotX+d.plotLeft,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+d.plotTop})})},updatePosition:function(a){var e=this.chart,g=this.getLabel(),g=(this.options.positioner||this.getPosition).call(this,g.width,g.height,a);this.move(Math.round(g.x),Math.round(g.y||0),a.plotX+e.plotLeft,a.plotY+e.plotTop)}, +getXDateFormat:function(a,h,m){var f;h=h.dateTimeLabelFormats;var d=m&&m.closestPointRange,b,q={millisecond:15,second:12,minute:9,hour:6,day:3},g,c="millisecond";if(d){g=D("%m-%d %H:%M:%S.%L",a.x);for(b in e){if(d===e.week&&+D("%w",a.x)===m.options.startOfWeek&&"00:00:00.000"===g.substr(6)){b="week";break}if(e[b]>d){b=c;break}if(q[b]&&g.substr(q[b])!=="01-01 00:00:00.000".substr(q[b]))break;"week"!==b&&(c=b)}b&&(f=h[b])}else f=h.day;return f||h.year},tooltipFooterHeaderFormatter:function(a,e){var g= +e?"footer":"header";e=a.series;var f=e.tooltipOptions,d=f.xDateFormat,b=e.xAxis,q=b&&"datetime"===b.options.type&&p(a.key),g=f[g+"Format"];q&&!d&&(d=this.getXDateFormat(a,f,b));q&&d&&(g=g.replace("{point.key}","{point.key:"+d+"}"));return H(g,{point:a,series:e})},bodyFormatter:function(a){return l(a,function(a){var e=a.series.tooltipOptions;return(e.pointFormatter||a.point.tooltipFormatter).call(a.point,e.pointFormat)})}}})(N);(function(a){var D=a.addEvent,B=a.attr,G=a.charts,H=a.color,p=a.css,l= +a.defined,r=a.doc,w=a.each,t=a.extend,k=a.fireEvent,m=a.offset,e=a.pick,g=a.removeEvent,h=a.splat,C=a.Tooltip,f=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};C&&b.tooltip.enabled&&(a.tooltip=new C(a,b.tooltip),this.followTouchMove=e(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart, +f=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(f=e(d.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,b){var d,e;a=a||f.event;a.target||(a.target=a.srcElement);e=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));void 0===e.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=e.pageX-b.left,b=e.pageY-b.top);return t(a,{chartX:Math.round(d), +chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};w(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},runPointActions:function(d){var b=this.chart,f=b.series,g=b.tooltip,c=g?g.shared:!1,h=!0,n=b.hoverPoint,m=b.hoverSeries,x,k,y,u=[],I;if(!c&&!m)for(x=0;xb.series.index?-1:1}));if(c)for(x=u.length;x--;)(u[x].x!==u[0].x||u[x].series.noSharedTooltip)&&u.splice(x,1);if(u[0]&&(u[0]!==this.prevKDPoint||g&&g.isHidden)){if(c&& +!u[0].series.noSharedTooltip){for(x=0;xh+k&&(f=h+k),cm+y&&(c=m+y),this.hasDragged=Math.sqrt(Math.pow(l-f,2)+Math.pow(v-c,2)),10x.max&&(l=x.max-c,v=!0);v?(u-=.8*(u-g[f][0]),J||(M-=.8*(M-g[f][1])),p()):g[f]=[u,M];A||(e[f]=F-E,e[q]=c);e=A?1/n:n;m[q]=c;m[f]=l;k[A?a?"scaleY":"scaleX":"scale"+d]=n;k["translate"+d]=e* +E+(u-e*y)},pinch:function(a){var r=this,t=r.chart,k=r.pinchDown,m=a.touches,e=m.length,g=r.lastValidTouch,h=r.hasZoom,C=r.selectionMarker,f={},d=1===e&&(r.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||r.runChartClick),b={};1b-6&&n(u||d.chartWidth- +2*x-v-e.x)&&(this.itemX=v,this.itemY+=p+this.lastLineHeight+I,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,c);this.lastItemY=p+this.itemY+I;this.lastLineHeight=Math.max(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=p+g+I,this.lastLineHeight=g);this.offsetWidth=u||Math.max((f?this.itemX-v-l:c)+x,this.offsetWidth)},getAllItems:function(){var a=[];l(this.chart.series,function(d){var b=d&&d.options;d&&m(b.showInLegend,p(b.linkedTo)? +!1:void 0,!0)&&(a=a.concat(d.legendItems||("point"===b.legendType?d.data:d)))});return a},adjustMargins:function(a,d){var b=this.chart,e=this.options,f=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||l([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(c,g){c.test(f)&&!p(a[g])&&(b[t[g]]=Math.max(b[t[g]],b.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*e[g%2?"x":"y"]+m(e.margin,12)+d[g]))})},render:function(){var a=this,d=a.chart,b=d.renderer, +e=a.group,h,c,m,n,k=a.box,x=a.options,p=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=b.g("legend").attr({zIndex:7}).add(),a.contentGroup=b.g().attr({zIndex:1}).add(e),a.scrollGroup=b.g().add(a.contentGroup));a.renderTitle();h=a.getAllItems();g(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});x.reversed&&h.reverse();a.allItems=h;a.display=c=!!h.length;a.lastLineHeight=0;l(h,function(b){a.renderItem(b)}); +m=(x.width||a.offsetWidth)+p;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=p;k||(a.box=k=b.rect().addClass("highcharts-legend-box").attr({r:x.borderRadius}).add(e),k.isNew=!0);k.attr({stroke:x.borderColor,"stroke-width":x.borderWidth||0,fill:x.backgroundColor||"none"}).shadow(x.shadow);0b&&!1!==h.enabled?(this.clipHeight=g=Math.max(b-20-this.titleHeight-I,0),this.currentPage=m(this.currentPage,1),this.fullHeight=a,l(v,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var d=u.length;if(!d||c-u[d-1]>g&&(r||c)!==u[d-1])u.push(r||c),d++;b===v.length-1&&c+a-u[d-1]>g&&u.push(c);c!==r&&(r=c)}),n||(n=d.clipRect= +e.clipRect(0,I,9999,0),d.contentGroup.clip(n)),t(g),y||(this.nav=y=e.g().attr({zIndex:1}).add(this.group),this.up=e.symbol("triangle",0,0,p,p).on("click",function(){d.scroll(-1,k)}).add(y),this.pager=e.text("",15,10).addClass("highcharts-legend-navigation").css(h.style).add(y),this.down=e.symbol("triangle-down",0,0,p,p).on("click",function(){d.scroll(1,k)}).add(y)),d.scroll(0),a=b):y&&(t(),y.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,d){var b=this.pages, +f=b.length;a=this.currentPage+a;var g=this.clipHeight,c=this.options.navigation,h=this.pager,n=this.padding;a>f&&(a=f);0f&&(g=typeof a[0],"string"===g?e.name=a[0]:"number"===g&&(e.x=a[0]),d++);b=h.value;)h=e[++g];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),H(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this), +this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(g in this)this[g]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,g= +e.tooltipOptions,h=t(g.valueDecimals,""),k=g.valuePrefix||"",f=g.valueSuffix||"";B(e.pointArrayMap||["y"],function(d){d="{point."+d;if(k||f)a=a.replace(d+"}",k+d+"}"+f);a=a.replace(d+"}",d+":,."+h+"f}")});return l(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var h=this,k=this.series.options;(k.point.events[a]||h.options&&h.options.events&&h.options.events[a])&&this.importEvents();"click"===a&&k.allowPointSelect&&(g=function(a){h.select&&h.select(null,a.ctrlKey||a.metaKey||a.shiftKey)}); +p(this,a,e,g)},visible:!0}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.correctFloat,l=a.Date,r=a.defaultOptions,w=a.defaultPlotOptions,t=a.defined,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.fireEvent,C=a.grep,f=a.isArray,d=a.isNumber,b=a.isString,q=a.merge,E=a.pick,c=a.removeEvent,F=a.splat,n=a.stableSort,A=a.SVGElement,x=a.syncTimeout,J=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, +marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1, +marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var c=this,d,e,f=a.series,u,y=function(a,b){return E(a.options.index,a._i)-E(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();g(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0=== +b.selected});e=b.events;for(d in e)D(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();k(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(u=f[f.length-1]);c._i=E(u&&u._i,-1)+1;f.push(c);n(f,y);this.yAxis&&n(this.yAxis.series,y);k(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart, +d;k(a.axisTypes||[],function(f){k(c[f],function(c){d=c.options;if(b[f]===d.index||void 0!==b[f]&&b[f]===d.id||void 0===b[f]&&0===d.index)c.series.push(a),a[f]=c,c.isDirty=!0});a[f]||a.optionalAxis===f||e(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,e=arguments,f=d(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(e,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options, +b=this.xIncrement,c,d=a.pointIntervalUnit,b=E(b,a.pointStart,0);this.pointInterval=c=E(this.pointInterval,a.pointInterval,1);d&&(a=new l(b),"day"===d?a=+a[l.hcSetDate](a[l.hcGetDate]()+c):"month"===d?a=+a[l.hcSetMonth](a[l.hcGetMonth]()+c):"year"===d&&(a=+a[l.hcSetFullYear](a[l.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=q(e,c.series,a);this.tooltipOptions= +q(r.tooltip,r.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===e.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&t(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor}); +return c},getCyclic:function(a,b,c){var d,e=this.userOptions,f=a+"Index",g=a+"Counter",u=c?c.length:E(this.chart.options.chart[a+"Count"],this.chart[a+"Count"]);b||(d=E(e[f],e["_"+f]),t(d)||(e["_"+f]=d=this.chart[g]%u,this.chart[g]+=1),c&&(b=c[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||w[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol, +this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(a,c,g,n){var u=this,q=u.points,h=q&&q.length||0,y,m=u.options,x=u.chart,A=null,I=u.xAxis,l=m.turboThreshold,p=this.xData,r=this.yData,F=(y=u.pointArrayMap)&&y.length;a=a||[];y=a.length;c=E(c,!0);if(!1!==n&&y&&h===y&&!u.cropped&&!u.hasGroupedData&&u.visible)k(a,function(a,b){q[b].update&&a!==m.data[b]&&q[b].update(a,!1,null,!1)});else{u.xIncrement=null;u.colorCounter=0;k(this.parallelArrays,function(a){u[a+ +"Data"].length=0});if(l&&y>l){for(g=0;null===A&&gh||this.forceCrop))if(b[d-1]l)b=[],c=[];else if(b[0]l)f=this.cropData(this.xData,this.yData,A,l),b=f.xData,c=f.yData,f=f.start,g=!0;for(h=b.length||1;--h;)d=x?y(b[h])-y(b[h-1]):b[h]-b[h-1],0d&&this.requireSorting&&e(15);this.cropped=g;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=n},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,n=E(this.cropShoulder,1),u;for(u=0;u=c){f=Math.max(0,u- +n);break}for(c=u;cd){g=c+n;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,n=this.cropStart||0,q,h=this.hasGroupedData,k,m=[],x;b||h||(b=[],b.length=a.length,b=this.data=b);for(x=0;x=q&&(c[x-1]||k)<=h,y&&k)if(y=m.length)for(;y--;)null!==m[y]&&(g[n++]=m[y]);else g[n++]=m;this.dataMin=H(g);this.dataMax=G(g)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,e=c.categories,f=this.yAxis,g=this.points,n=g.length,q=!!this.modifyValue,h=a.pointPlacement,k="between"===h||d(h),m=a.threshold,x=a.startFromThreshold?m:0,A,l,r,F,J=Number.MAX_VALUE;"between"===h&&(h=.5);d(h)&&(h*=E(a.pointRange||c.pointRange)); +for(a=0;a=B&&(C.isNull=!0);C.plotX=A=p(Math.min(Math.max(-1E5,c.translate(w,0,0,0,1,h,"flags"===this.type)),1E5));b&&this.visible&&!C.isNull&&D&&D[w]&&(F=this.getStackIndicator(F,w,this.index),G=D[w],B=G.points[F.key],l=B[0],B=B[1],l===x&&F.key===D[w].base&&(l=E(m,f.min)),f.isLog&&0>=l&&(l=null),C.total=C.stackTotal=G.total,C.percentage=G.total&&C.y/G.total*100,C.stackY= +B,G.setOffset(this.pointXOffset||0,this.barW||0));C.yBottom=t(l)?f.translate(l,0,1,0,1):null;q&&(B=this.modifyValue(B,C));C.plotY=l="number"===typeof B&&Infinity!==B?Math.min(Math.max(-1E5,f.translate(B,0,1,0,1)),1E5):void 0;C.isInside=void 0!==l&&0<=l&&l<=f.len&&0<=A&&A<=c.len;C.clientX=k?p(c.translate(w,0,0,0,1,h)):A;C.negative=C.y<(m||0);C.category=e&&void 0!==e[C.x]?e[C.x]:C.x;C.isNull||(void 0!==r&&(J=Math.min(J,Math.abs(A-r))),r=A)}this.closestPointRangePx=J},getValidPoints:function(a,b){var c= +this.chart;return C(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,n=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(),q=b[n],h=b[n+"m"];q||(a&&(g.width=0,b[n+"m"]=h=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[n]=q=d.clipRect(g),q.count={length:0});a&&!q.count[this.index]&& +(q.count[this.index]=!0,q.count.length+=1);!1!==c.clip&&(this.group.clip(a||f?q:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=n);a||(q.count[this.index]&&(delete q.count[this.index],--q.count.length),0===q.count.length&&n&&b[n]&&(f||(b[n]=b[n].destroy()),b[n+"m"]&&(b[n+"m"]=b[n+"m"].destroy())))},animate:function(a){var b=this.chart,c=B(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+ +99},c),this.animate=null)},afterAnimate:function(){this.setClip();h(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,e,f,g,n=this.options.marker,q,h,k,m,x=this.markerGroup,A=E(n.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>2*n.radius);if(!1!==n.enabled||this._hasPointMarkers)for(e=a.length;e--;)f=a[e],c=f.plotY,g=f.graphic,q=f.marker||{},h=!!f.marker,k=A&&void 0===q.enabled||q.enabled,m=f.isInside,k&&d(c)&&null!==f.y?(c=E(q.symbol,this.symbol),f.hasImage= +0===c.indexOf("url"),k=this.markerAttribs(f,f.selected&&"select"),g?g[m?"show":"hide"](!0).animate(k):m&&(0e&&b.shadow));g&&(g.startX=c.xMap, +g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],n,q=this.graph,h=this.area,m=Math.max(b.chartWidth,b.chartHeight),x=this[(this.zoneAxis||"y")+"Axis"],A,l,p=b.inverted,r,F,C,t,J=!1;d.length&&(q||h)&&x&&void 0!==x.min&&(l=x.reversed,r=x.horiz,q&&q.hide(),h&&h.hide(),A=x.getExtremes(),k(d,function(d,u){e=l?r?b.plotWidth:0:r?0:x.toPixels(A.min);e=Math.min(Math.max(E(f,e),0),m);f=Math.min(Math.max(Math.round(x.toPixels(E(d.value,A.max), +!0)),0),m);J&&(e=f=x.toPixels(A.max));F=Math.abs(e-f);C=Math.min(e,f);t=Math.max(e,f);x.isXAxis?(n={x:p?t:C,y:0,width:F,height:m},r||(n.x=b.plotHeight-n.x)):(n={x:0,y:p?t:C,width:m,height:F},r&&(n.y=b.plotWidth-n.y));p&&c.isVML&&(n=x.isXAxis?{x:0,y:l?C:t,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});g[u]?g[u].animate(n):(g[u]=c.clipRect(n),q&&a["zone-graph-"+u].clip(g[u]),h&&a["zone-area-"+u].clip(g[u]));J=d.value>A.max}),this.clips= +g)},invertGroups:function(a){function b(){var b={width:c.yAxis.len,height:c.xAxis.len};k(["group","markerGroup"],function(d){c[d]&&c[d].attr(b).invert(a)})}var c=this,d;c.xAxis&&(d=D(c.chart,"resize",b),D(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(e),f.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className|| +"")));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=!!a.animate&&b.renderer.isSVG&&B(d.animation).duration,f=a.visible?"inherit":"hidden",g=d.zIndex,n=a.hasRendered,q=b.seriesGroup,h=b.inverted;c=a.plotGroup("group","series",f,g,q);a.markerGroup= +a.plotGroup("markerGroup","markers",f,g,q);e&&a.animate(!0);c.inverted=a.isCartesian?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);!1===d.clip||a.sharedClipKey||n||c.clip(b.clipRect);e&&a.animate();n||(a.animationTimeout=x(function(){a.afterAnimate()},e));a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty|| +this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:E(d&&d.left,a.plotLeft),translateY:E(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)}, +buildKDTree:function(){function a(c,d,e){var f,g;if(g=c&&c.length)return f=b.kdAxisArray[d%e],c.sort(function(a,b){return a[f]-b[f]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,e),right:a(c.slice(g+1),d+1,e)}}var b=this,c=b.kdDimensions;delete b.kdTree;x(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,n,q){var h=b.point,u=d.kdAxisArray[n%q],k,m,x=h;m=t(a[e])&&t(h[e])?Math.pow(a[e]-h[e],2):null;k=t(a[f])&& +t(h[f])?Math.pow(a[f]-h[f],2):null;k=(m||0)+(k||0);h.dist=t(k)?Math.sqrt(k):Number.MAX_VALUE;h.distX=t(m)?Math.sqrt(m):Number.MAX_VALUE;u=a[u]-h[u];k=0>u?"left":"right";m=0>u?"right":"left";b[k]&&(k=c(a,b[k],n+1,q),x=k[g]A;)l--;this.updateParallelArrays(h,"splice",l,0,0);this.updateParallelArrays(h,l);n&&h.name&&(n[A]=h.name);q.splice(l,0,a);m&&(this.data.splice(l,0,null),this.processData());"point"===c.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(h,"shift"),q.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(e)},removePoint:function(a, +b,d){var c=this,e=c.data,f=e[a],g=c.points,n=c.chart,h=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&n.redraw()};q(d,n);b=C(b,!0);f?f.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){e.destroy();f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();C(a,!0)&&f.redraw(b)}var e=this,f=e.chart;!1!==d?k(e,"remove",null,c):c()},update:function(a, +d){var c=this,e=this.chart,f=this.userOptions,g=this.type,q=a.type||f.type||e.options.chart.type,u=b[g].prototype,m=["group","markerGroup","dataLabelsGroup"],k;if(q&&q!==g||void 0!==a.zIndex)m.length=0;r(m,function(a){m[a]=c[a];delete c[a]});a=h(f,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1,null,!1);for(k in u)this[k]=void 0;t(this,b[q||g].prototype);r(m,function(a){c[a]=m[a]});this.init(e,a);e.linkSeries();C(d,!0)&&e.redraw(!1)}});t(G.prototype, +{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,t(a,{events:void 0}));c.isDirtyBox=!0;C(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);w(b.axes,this);w(b[c],this);b.options[c].splice(this.options.index,1);r(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;C(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a}, +b)},setCategories:function(a,b){this.update({categories:a},b)}})})(N);(function(a){var D=a.color,B=a.each,G=a.map,H=a.pick,p=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],l=[],p=this.xAxis,k=this.yAxis,m=k.stacks[this.stackKey],e={},g=this.points,h=this.index,C=k.series,f=C.length,d,b=H(k.options.reversedStacks,!0)?1:-1,q,E;if(this.options.stacking){for(q=0;qa&&t>l?(t=Math.max(a,l),m=2*l-t):tH&& +m>l?(m=Math.max(H,l),t=2*l-m):m=Math.abs(g)&&.5a.closestPointRange*a.xAxis.transA,k=a.borderWidth=r(h.borderWidth,k?0:1),f=a.yAxis,d=a.translatedThreshold=f.getThreshold(h.threshold),b=r(h.minPointLength,5),q=a.getColumnMetrics(),m=q.width,c=a.barW=Math.max(m,1+2*k),l=a.pointXOffset= +q.offset;g.inverted&&(d-=.5);h.pointPadding&&(c=Math.ceil(c));w.prototype.translate.apply(a);G(a.points,function(e){var n=r(e.yBottom,d),q=999+Math.abs(n),q=Math.min(Math.max(-q,e.plotY),f.len+q),h=e.plotX+l,k=c,u=Math.min(q,n),p,t=Math.max(q,n)-u;Math.abs(t)b?n-b:d-(p?b:0));e.barX=h;e.pointWidth=m;e.tooltipPos=g.inverted?[f.len+f.pos-g.plotLeft-q,a.xAxis.len-h-k/2,t]:[h+k/2,q+f.pos-g.plotTop,t];e.shapeType="rect";e.shapeArgs= +a.crispCol.apply(a,e.isNull?[e.plotX,f.len/2,0,0]:[h,u,k,t])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,g){var e=this.options,k=this.pointAttrToOptions||{},f=k.stroke||"borderColor",d=k["stroke-width"]||"borderWidth",b=a&&a.color||this.color,q=a[f]||e[f]||this.color||b,k=e.dashStyle,m;a&&this.zones.length&&(b=(b=a.getZone())&&b.color||a.options.color|| +this.color);g&&(g=e.states[g],m=g.brightness,b=g.color||void 0!==m&&B(b).brighten(g.brightness).get()||b,q=g[f]||q,k=g.dashStyle||k);a={fill:b,stroke:q,"stroke-width":a[d]||e[d]||this[d]||0};e.borderRadius&&(a.r=e.borderRadius);k&&(a.dashstyle=k);return a},drawPoints:function(){var a=this,g=this.chart,h=a.options,m=g.renderer,f=h.animationLimit||250,d;G(a.points,function(b){var e=b.graphic;p(b.plotY)&&null!==b.y?(d=b.shapeArgs,e?(k(e),e[g.pointCountt;++t)k=r[t],a=2>t||2===t&&/%$/.test(k),r[t]=B(k,[l,H,w,r[2]][t])+(a?p:0);r[3]>r[2]&&(r[3]=r[2]);return r}}})(N);(function(a){var D=a.addEvent,B=a.defined,G=a.each,H=a.extend,p=a.inArray,l=a.noop,r=a.pick,w=a.Point,t=a.Series,k=a.seriesType,m=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y? +void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,h=e.points,k=e.startAngleRad;a||(G(h,function(a){var d= +a.graphic,b=a.shapeArgs;d&&(d.attr({r:a.startR||e.center[3]/2,start:k,end:k}),d.animate({r:b.r,start:b.start,end:b.end},e.options.animation))}),e.animate=null)},updateTotals:function(){var a,g=0,h=this.points,k=h.length,f,d=this.options.ignoreHiddenPoint;for(a=0;af.y&&(f.y=null),g+=d&&!f.visible?0:f.y;this.total=g;for(a=0;a1.5*Math.PI?q-=2*Math.PI:q<-Math.PI/2&&(q+=2*Math.PI);t.slicedTranslation={translateX:Math.round(Math.cos(q)*k),translateY:Math.round(Math.sin(q)*k)};d=Math.cos(q)*a[2]/2;b=Math.sin(q)*a[2]/2;t.tooltipPos=[a[0]+.7*d,a[1]+.7*b];t.half=q<-Math.PI/2||q>Math.PI/2?1:0;t.angle=q;f=Math.min(f,n/5);t.labelPos=[a[0]+d+Math.cos(q)*n,a[1]+b+Math.sin(q)*n,a[0]+d+Math.cos(q)*f,a[1]+b+Math.sin(q)* +f,a[0]+d,a[1]+b,0>n?"center":t.half?"right":"left",q]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,h,k,f,d,b=a.options.shadow;b&&!a.shadowGroup&&(a.shadowGroup=g.g("shadow").add(a.group));G(a.points,function(e){if(null!==e.y){k=e.graphic;d=e.shapeArgs;h=e.sliced?e.slicedTranslation:{};var q=e.shadowGroup;b&&!q&&(q=e.shadowGroup=g.g("shadow").add(a.shadowGroup));q&&q.attr(h);f=a.pointAttribs(e,e.selected&&"select");k?k.setRadialReference(a.center).attr(f).animate(H(d,h)):(e.graphic= +k=g[e.shapeType](d).addClass(e.getClassName()).setRadialReference(a.center).attr(h).add(a.group),e.visible||k.attr({visibility:"hidden"}),k.attr(f).attr({"stroke-linejoin":"round"}).shadow(b,q))}})},searchPoint:l,sortByAngle:function(a,g){a.sort(function(a,e){return void 0!==a.angle&&(e.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:l},{init:function(){w.prototype.init.apply(this,arguments);var a=this,g;a.name=r(a.name,"Slice"); +g=function(e){a.slice("select"===e.type)};D(a,"select",g);D(a,"unselect",g);return a},setVisible:function(a,g){var e=this,k=e.series,f=k.chart,d=k.options.ignoreHiddenPoint;g=r(g,d);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,k.options.data[p(e,k.data)]=e.options,G(["graphic","dataLabel","connector","shadowGroup"],function(b){if(e[b])e[b][a?"show":"hide"](!0)}),e.legendItem&&f.legend.colorizeItem(e,a),a||"hover"!==e.state||e.setState(""),d&&(k.isDirty=!0),g&&f.redraw())}, +slice:function(a,g,h){var e=this.series;m(h,e.chart);r(g,!0);this.sliced=this.options.sliced=a=B(a)?a:!this.sliced;e.options.data[p(this,e.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(N);(function(a){var D= +a.addEvent,B=a.arrayMax,G=a.defined,H=a.each,p=a.extend,l=a.format,r=a.map,w=a.merge,t=a.noop,k=a.pick,m=a.relativeLength,e=a.Series,g=a.seriesTypes,h=a.stableSort,C=a.stop;a.distribute=function(a,d){function b(a,b){return a.target-b.target}var e,f=!0,c=a,g=[],n;n=0;for(e=a.length;e--;)n+=a[e].size;if(n>d){h(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(n=e=0;n<=d;)n+=a[e].size,e++;g=a.splice(e-1,a.length)}h(a,b);for(a=r(a,function(a){return{size:a.size,targets:[a.target]}});f;){for(e=a.length;e--;)f= +a[e],n=(Math.min.apply(0,f.targets)+Math.max.apply(0,f.targets))/2,f.pos=Math.min(Math.max(0,n-f.size/2),d-f.size);e=a.length;for(f=!1;e--;)0a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>d&&(a[e-1].pos=d-a[e-1].size),a.splice(e,1),f=!0)}e=0;H(a,function(a){var b=0;H(a.targets,function(){c[e].pos=a.pos+b;b+=c[e].size;e++})});c.push.apply(c,g);h(c,b)};e.prototype.drawDataLabels=function(){var a=this,d=a.options, +b=d.dataLabels,e=a.points,g,c,h=a.hasRendered||0,n,m,x=k(b.defer,!0),r=a.chart.renderer;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),m=a.plotGroup("dataLabelsGroup","data-labels",x&&!h?"hidden":"visible",b.zIndex||6),x&&(m.attr({opacity:+h}),h||D(a,"afterAnimate",function(){a.visible&&m.show(!0);m[d.animation?"animate":"attr"]({opacity:1},{duration:200})})),c=b,H(e,function(e){var f,q=e.dataLabel,h,x,A=e.connector,y=!0,t,z={};g=e.dlOptions||e.options&&e.options.dataLabels; +f=k(g&&g.enabled,c.enabled)&&null!==e.y;if(q&&!f)e.dataLabel=q.destroy();else if(f){b=w(c,g);t=b.style;f=b.rotation;h=e.getLabelConfig();n=b.format?l(b.format,h):b.formatter.call(h,b);t.color=k(b.color,t.color,a.color,"#000000");if(q)G(n)?(q.attr({text:n}),y=!1):(e.dataLabel=q=q.destroy(),A&&(e.connector=A.destroy()));else if(G(n)){q={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:f,padding:b.padding,zIndex:1};"contrast"===t.color&&(z.color=b.inside|| +0>b.distance||d.stacking?r.getContrast(e.color||a.color):"#000000");d.cursor&&(z.cursor=d.cursor);for(x in q)void 0===q[x]&&delete q[x];q=e.dataLabel=r[f?"text":"label"](n,0,-9999,b.shape,null,null,b.useHTML,null,"data-label").attr(q);q.addClass("highcharts-data-label-color-"+e.colorIndex+" "+(b.className||""));q.css(p(t,z));q.add(m);q.shadow(b.shadow)}q&&a.alignDataLabel(e,q,b,null,y)}})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,f=c.inverted,n=k(a.plotX,-9999),q=k(a.plotY, +-9999),h=d.getBBox(),m,l=b.rotation,u=b.align,r=this.visible&&(a.series.forceDL||c.isInsidePlot(n,Math.round(q),f)||e&&c.isInsidePlot(n,f?e.x+1:e.y+e.height-1,f)),t="justify"===k(b.overflow,"justify");r&&(m=b.style.fontSize,m=c.renderer.fontMetrics(m,d).b,e=p({x:f?c.plotWidth-q:n,y:Math.round(f?c.plotHeight-n:q),width:0,height:0},e),p(b,{width:h.width,height:h.height}),l?(t=!1,f=c.renderer.rotCorr(m,l),f={x:e.x+b.x+e.width/2+f.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g? +"attr":"animate"](f).attr({align:u}),n=(l+720)%360,n=180n,"left"===u?f.y-=n?h.height:0:"center"===u?(f.x-=h.width/2,f.y-=h.height/2):"right"===u&&(f.x-=h.width,f.y-=n?0:h.height)):(d.align(b,null,e),f=d.alignAttr),t?this.justifyDataLabel(d,b,f,h,e,g):k(b.crop,!0)&&(r=c.isInsidePlot(f.x,f.y)&&c.isInsidePlot(f.x+h.width,f.y+h.height)),b.shape&&!l&&d.attr({anchorX:a.plotX,anchorY:a.plotY}));r||(C(d),d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,c){var f=this.chart, +n=d.align,h=d.verticalAlign,q,k,m=a.box?0:a.padding||0;q=b.x+m;0>q&&("right"===n?d.align="left":d.x=-q,k=!0);q=b.x+e.width-m;q>f.plotWidth&&("left"===n?d.align="right":d.x=f.plotWidth-q,k=!0);q=b.y+m;0>q&&("bottom"===h?d.verticalAlign="top":d.y=-q,k=!0);q=b.y+e.height-m;q>f.plotHeight&&("top"===h?d.verticalAlign="bottom":d.y=f.plotHeight-q,k=!0);k&&(a.placed=!c,a.align(d,null,g))};g.pie&&(g.pie.prototype.drawDataLabels=function(){var f=this,d=f.data,b,g=f.chart,h=f.options.dataLabels,c=k(h.connectorPadding, +10),m=k(h.connectorWidth,1),n=g.plotWidth,l=g.plotHeight,x,p=h.distance,y=f.center,u=y[2]/2,t=y[1],w=0k-2?A:P,e),v._attr={visibility:S,align:D[6]},v._pos={x:L+h.x+({left:c,right:-c}[D[6]]||0),y:P+h.y-10},D.x=L,D.y=P,null===f.options.size&&(C=v.width,L-Cn-c&&(T[1]=Math.max(Math.round(L+ +C-n+c),T[1])),0>P-G/2?T[0]=Math.max(Math.round(-P+G/2),T[0]):P+G/2>l&&(T[2]=Math.max(Math.round(P+G/2-l),T[2])))}),0===B(T)||this.verifyDataLabelOverflow(T))&&(this.placeDataLabels(),w&&m&&H(this.points,function(a){var b;x=a.connector;if((v=a.dataLabel)&&v._pos&&a.visible){S=v._attr.visibility;if(b=!x)a.connector=x=g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(f.dataLabelsGroup),x.attr({"stroke-width":m,stroke:h.connectorColor||a.color||"#666666"}); +x[b?"attr":"animate"]({d:f.connectorPath(a.labelPos)});x.attr("visibility",S)}else x&&(a.connector=x.destroy())}))},g.pie.prototype.connectorPath=function(a){var d=a.x,b=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",d+("left"===a[6]?5:-5),b,"C",d,b,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",d+("left"===a[6]?5:-5),b,"L",a[2],a[3],"L",a[4],a[5]]},g.pie.prototype.placeDataLabels=function(){H(this.points,function(a){var d=a.dataLabel;d&&a.visible&&((a=d._pos)?(d.attr(d._attr), +d[d.moved?"animate":"attr"](a),d.moved=!0):d&&d.attr({y:-9999}))})},g.pie.prototype.alignDataLabel=t,g.pie.prototype.verifyDataLabelOverflow=function(a){var d=this.center,b=this.options,e=b.center,f=b.minSize||80,c,g;null!==e[0]?c=Math.max(d[2]-Math.max(a[1],a[3]),f):(c=Math.max(d[2]-a[1]-a[3],f),d[0]+=(a[3]-a[1])/2);null!==e[1]?c=Math.max(Math.min(c,d[2]-Math.max(a[0],a[2])),f):(c=Math.max(Math.min(c,d[2]-a[0]-a[2]),f),d[1]+=(a[0]-a[2])/2);ck(this.translatedThreshold,f.yAxis.len)),m=k(b.inside,!!this.options.stacking);n&&(g=w(n),0>g.y&&(g.height+=g.y,g.y=0),n=g.y+g.height-f.yAxis.len,0a+e||c+nb+f||g+hthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&r(d,function(a){a.setState()});r("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",g=c[d],n=(b.pointRange||0)/2,h=b.getExtremes(),q=b.toValue(g-f,!0)+n,n=b.toValue(g+b.len-f,!0)-n,g=g>f;b.series.length&&(g||q>Math.min(h.dataMin,h.min))&&(!g||n=p(k.minWidth,0)&&this.chartHeight>=p(k.minHeight,0)};void 0===l._id&&(l._id=a.uniqueKey());m=m.call(this);!r[l._id]&&m?l.chartOptions&&(r[l._id]=this.currentOptions(l.chartOptions),this.update(l.chartOptions,w)):r[l._id]&&!m&&(this.update(r[l._id],w),delete r[l._id])};D.prototype.currentOptions=function(a){function p(a,m,e){var g,h;for(g in a)if(-1< +G(g,["series","xAxis","yAxis"]))for(a[g]=l(a[g]),e[g]=[],h=0;hd.length||void 0===h)return a.call(this,g,h,k,f);x=d.length;for(c=0;ck;d[c]5*b||w){if(d[c]>u){for(r=a.call(this,g,d[e],d[c],f);r.length&&r[0]<=u;)r.shift();r.length&&(u=r[r.length-1]);y=y.concat(r)}e=c+1}if(w)break}a= +r.info;if(q&&a.unitRange<=m.hour){c=y.length-1;for(e=1;ek?a-1:a;for(M=void 0;q--;)e=c[q],k=M-e,M&&k<.8*C&&(null===t||k<.8*t)?(n[y[q]]&&!n[y[q+1]]?(k=q+1,M=e):k=q,y.splice(k,1)):M=e}return y});w(B.prototype,{beforeSetTickPositions:function(){var a, +g=[],h=!1,k,f=this.getExtremes(),d=f.min,b=f.max,q,m=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,c=this.chart.options.chart.ignoreHiddenSeries;if(f||m){r(this.series,function(b,d){if(!(c&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(g=g.concat(b.processedXData),a=g.length,g.sort(function(a,b){return a-b}),a))for(d=a-1;d--;)g[d]===g[d+1]&&g.splice(d,1)});a=g.length;if(2k||b-g[g.length- +1]>k)&&(h=!0)}h?(this.ordinalPositions=g,k=this.val2lin(Math.max(d,g[0]),!0),q=Math.max(this.val2lin(Math.min(b,g[g.length-1]),!0),1),this.ordinalSlope=b=(b-d)/(q-k),this.ordinalOffset=d-k*b):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=f&&h;this.groupIntervalFactor=null},val2lin:function(a,g){var e=this.ordinalPositions;if(e){var k=e.length,f,d;for(f=k;f--;)if(e[f]===a){d=f;break}for(f=k-1;f--;)if(a>e[f]||0===f){a=(a-e[f])/(e[f+1]-e[f]);d=f+a;break}g=g?d:this.ordinalSlope* +(d||0)+this.ordinalOffset}else g=a;return g},lin2val:function(a,g){var e=this.ordinalPositions;if(e){var k=this.ordinalSlope,f=this.ordinalOffset,d=e.length-1,b;if(g)0>a?a=e[0]:a>d?a=e[d]:(d=Math.floor(a),b=a-d);else for(;d--;)if(g=k*d+f,a>=g){k=k*(d+1)+f;b=(a-g)/(k-g);break}return void 0!==b&&void 0!==e[d]?e[d]+(b?b*(e[d+1]-e[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,g=this.series[0].currentDataGrouping,h=this.ordinalIndex,k=g?g.count+g.unitName:"raw",f=this.getExtremes(), +d,b;h||(h=this.ordinalIndex={});h[k]||(d={series:[],chart:a,getExtremes:function(){return{min:f.dataMin,max:f.dataMax}},options:{ordinal:!0},val2lin:B.prototype.val2lin},r(this.series,function(e){b={xAxis:d,xData:e.xData,chart:a,destroyGroupedData:t};b.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:"open",units:[[g.unitName,[g.count]]]}:{enabled:!1}};e.processData.apply(b);d.series.push(b)}),this.beforeSetTickPositions.apply(d),h[k]=d.ordinalPositions);return h[k]},getGroupIntervalFactor:function(a, +g,h){var e;h=h.processedXData;var f=h.length,d=[];e=this.groupIntervalFactor;if(!e){for(e=0;ed?(l=p,t=e.ordinalPositions?e:p):(l=e.ordinalPositions?e:p,t=p),p=t.ordinalPositions,q>p[p.length-1]&&p.push(q),this.fixedRange=c-m,d=e.toFixedRange(null,null,n.apply(l,[x.apply(l,[m,!0])+d,!0]),n.apply(t,[x.apply(t, +[c,!0])+d,!0])),d.min>=Math.min(b.dataMin,m)&&d.max<=Math.max(q,c)&&e.setExtremes(d.min,d.max,!0,!1,{trigger:"pan"}),this.mouseDownX=k,H(this.container,{cursor:"move"})):f=!0}else f=!0;f&&a.apply(this,Array.prototype.slice.call(arguments,1))});k.prototype.gappedPath=function(){var a=this.options.gapSize,g=this.points.slice(),h=g.length-1;if(a&&0this.closestPointRange*a&&g.splice(h+1,0,{isNull:!0});return this.getGraphPath(g)}})(N);(function(a){function D(){return Array.prototype.slice.call(arguments, +1)}function B(a){a.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,G(this.pointArrayMap,["y"]))}var G=a.pick,H=a.wrap,p=a.each,l=a.extend,r=a.fireEvent,w=a.Axis,t=a.Series;l(w.prototype,{isInBreak:function(a,m){var e=a.repeat||Infinity,g=a.from,h=a.to-a.from;m=m>=g?(m-g)%e:e-(g-m)%e;return a.inclusive?m<=h:m=a)break;else if(g.isInBreak(f,a)){e-=a-f.from;break}return e};this.lin2val=function(a){var e,f;for(f=0;f=a);f++)e.toh;)m-=b;for(;mb.to||l>b.from&&db.from&&db.from&&d>b.to&&d=c[0]);A++);for(A;A<=q;A++){for(;(void 0!==c[w+1]&&a[A]>=c[w+1]||A===q)&&(l=c[w],this.dataGroupInfo={start:p,length:t[0].length},p=d.apply(this,t),void 0!==p&&(g.push(l),h.push(p),m.push(this.dataGroupInfo)),p=A,t[0]=[],t[1]=[],t[2]=[],t[3]=[],w+=1,A!==q););if(A===q)break;if(x){l=this.cropStart+A;l=e&&e[l]|| +this.pointClass.prototype.applyOptions.apply({series:this},[f[l]]);var E,C;for(E=0;Ethis.chart.plotSizeX/d||b&&f.forced)&&(e=!0);return e?d:0};G.prototype.setDataGrouping=function(a,b){var c;b=e(b,!0);a||(a={forced:!1,units:null});if(this instanceof G)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else l(this.chart.options.series,function(b){b.dataGrouping=a},!1);b&&this.chart.redraw()}})(N);(function(a){var D=a.each,B=a.Point,G=a.seriesType,H=a.seriesTypes;G("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'}, +threshold:null,states:{hover:{lineWidth:3}}},{pointArrayMap:["open","high","low","close"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:"high",pointAttribs:function(a,l){l=H.column.prototype.pointAttribs.call(this,a,l);var p=this.options;delete l.fill;l["stroke-width"]=p.lineWidth;l.stroke=a.options.color||(a.openk)););B(g,function(a,b){var d;void 0===a.plotY&&(a.x>=c.min&&a.x<=c.max?a.plotY=e.chartHeight-p.bottom-(p.opposite?p.height:0)+p.offset-e.plotTop:a.shapeArgs={});a.plotX+=t;(f=g[b-1])&&f.plotX===a.plotX&&(void 0===f.stackIndex&&(f.stackIndex=0),d=f.stackIndex+1);a.stackIndex=d})},drawPoints:function(){var a=this.points,e=this.chart,g=e.renderer,k,l,f=this.options,d=f.y,b,q,p,c,r,n,t,x=this.yAxis;for(q=a.length;q--;)p=a[q],t=p.plotX>this.xAxis.len,k=p.plotX,c=p.stackIndex,b= +p.options.shape||f.shape,l=p.plotY,void 0!==l&&(l=p.plotY+d-(void 0!==c&&c*f.stackDistance)),r=c?void 0:p.plotX,n=c?void 0:p.plotY,c=p.graphic,void 0!==l&&0<=k&&!t?(c||(c=p.graphic=g.label("",null,null,b,null,null,f.useHTML).attr(this.pointAttribs(p)).css(G(f.style,p.style)).attr({align:"flag"===b?"left":"center",width:f.width,height:f.height,"text-align":f.textAlign}).addClass("highcharts-point").add(this.markerGroup),c.shadow(f.shadow)),0h&&(e-=Math.round((l-h)/2),h=l);e=k[a](e,g,h,l);d&&f&&e.push("M",d,g>f?g:g+l,"L",d,f);return e}});p===t&&B(["flag","circlepin","squarepin"],function(a){t.prototype.symbols[a]=k[a]})})(N);(function(a){function D(a,d,e){this.init(a,d,e)}var B=a.addEvent,G=a.Axis,H=a.correctFloat,p=a.defaultOptions, +l=a.defined,r=a.destroyObjectProperties,w=a.doc,t=a.each,k=a.fireEvent,m=a.hasTouch,e=a.isTouchDevice,g=a.merge,h=a.pick,C=a.removeEvent,f=a.wrap,d={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2", +trackBorderWidth:1};p.scrollbar=g(!0,d,p.scrollbar);D.prototype={init:function(a,e,f){this.scrollbarButtons=[];this.renderer=a;this.userOptions=e;this.options=g(d,e);this.chart=f;this.size=h(this.options.size,this.options.height);e.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,d=this.options,e=this.size,c;this.group=c=a.g("scrollbar").attr({zIndex:d.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0, +r:d.trackBorderRadius||0,height:e,width:e}).add(c);this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(this.swapXY(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L", +0,2*e/3,"M",3,e/4,"L",3,2*e/3],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth});this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a, +d,e,c){var b=this.options.vertical,f=0,g=this.rendered?"animate":"attr";this.x=a;this.y=d+this.trackBorderWidth;this.width=e;this.xOffset=this.height=c;this.yOffset=f;b?(this.width=this.yOffset=e=f=this.size,this.xOffset=d=0,this.barWidth=c-2*e,this.x=a+=this.options.margin):(this.height=this.xOffset=c=d=this.size,this.barWidth=e-2*c,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:e,height:c});this.scrollbarButtons[1].attr({translateX:b?0:e-d,translateY:b? +c-f:0})},drawScrollbarButton:function(a){var b=this.renderer,d=this.scrollbarButtons,c=this.options,e=this.size,f;f=b.g().add(this.group);d.push(f);f=b.rect().addClass("highcharts-scrollbar-button").add(f);f.attr({stroke:c.buttonBorderColor,"stroke-width":c.buttonBorderWidth,fill:c.buttonBackgroundColor});f.attr(f.crisp({x:-.5,y:-.5,width:e+1,height:e+1,r:c.buttonBorderRadius},f.strokeWidth()));f=b.path(this.swapXY(["M",e/2+(a?-1:1),e/2-3,"L",e/2+(a?-1:1),e/2+3,"L",e/2+(a?2:-2),e/2],c.vertical)).addClass("highcharts-scrollbar-arrow").add(d[a]); +f.attr({fill:c.buttonArrowColor})},swapXY:function(a,d){var b=a.length,c;if(d)for(d=0;d=k?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),c=a.options.vertical? +"chartY":"chartX",e=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][c]||(d=a.cursorToScrollbarPosition(d)[c],c=a[c],c=d-c,a.hasDragged=!0,a.updatePosition(e[0]+c,e[1]+c),a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b); +b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=H(a.to-a.from)*a.options.step;a.updatePosition(H(a.from-d),H(a.to-d));k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b), +c=a.to-a.from,e=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>e||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+c,a.to+c):a.updatePosition(a.from-c,a.to-c);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a, +d){1a&&(d=H(d-a),a=0);this.from=a;this.to=d},update:function(a){this.destroy();this.init(this.chart.renderer,g(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],d=this.scrollbarButtons,e=this.scrollbarGroup.element,c=this.mouseDownHandler,f=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[d[a[0]].element,"click",this.buttonToMinClick],[d[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e, +"mousedown",c],[w,"mousemove",f],[w,"mouseup",g]];m&&a.push([e,"touchstart",c],[w,"touchmove",f],[w,"touchend",g]);t(a,function(a){B.apply(null,a)});this._events=a},removeEvents:function(){t(this._events,function(a){C.apply(null,a)});this._events=void 0},destroy:function(){var a=this.chart.scroller;this.removeEvents();t(["track","scrollbarRifles","scrollbar","scrollbarGroup","group"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&(a.scrollbar=null,r(a.scrollbarButtons))}}; +f(G.prototype,"init",function(a){var b=this;a.apply(b,[].slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new D(b.chart.renderer,b.options.scrollbar,b.chart),B(b.scrollbar,"changed",function(a){var c=Math.min(h(b.options.min,b.min),b.min,b.dataMin),d=Math.max(h(b.options.max,b.max),b.max,b.dataMax)-c,e;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(e=c+d*this.to,c+=d*this.from):(e= +c+d*(1-this.from),c+=d*(1-this.to));b.setExtremes(c,e,!0,!1,a)}))});f(G.prototype,"render",function(a){var b=Math.min(h(this.options.min,this.min),this.min,this.dataMin),d=Math.max(h(this.options.max,this.max),this.max,this.dataMax),c=this.scrollbar,e;a.apply(this,[].slice.call(arguments,1));c&&(this.horiz?c.position(this.left,this.top+this.height+this.offset+2+(this.opposite?0:this.axisTitleMargin),this.width,this.height):c.position(this.left+this.width+2+this.offset+(this.opposite?this.axisTitleMargin: +0),this.top,this.width,this.height),isNaN(b)||isNaN(d)||!l(this.min)||!l(this.max)?c.setRange(0,0):(e=(this.min-b)/(d-b),b=(this.max-b)/(d-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(e,b):c.setRange(1-b,1-e)))});f(G.prototype,"getOffset",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,[].slice.call(arguments,1));d&&(this.chart.axisOffset[b]+=d.size+d.options.margin)});f(G.prototype,"destroy",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy()); +a.apply(this,[].slice.call(arguments,1))});a.Scrollbar=D})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.color,l=a.defaultOptions,r=a.defined,w=a.destroyObjectProperties,t=a.doc,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.grep,C=a.hasTouch,f=a.isNumber,d=a.isObject,b=a.isTouchDevice,q=a.merge,E=a.pick,c=a.removeEvent,F=a.Scrollbar,n=a.Series,A=a.seriesTypes,x=a.wrap,J=[].concat(a.defaultDataGroupingUnits),y=function(a){var b=h(arguments,f);if(b.length)return Math[a].apply(0, +b)};J[4]=["day",[1,2,3,4]];J[5]=["week",[1,2,3]];A=void 0===A.areaspline?"line":"areaspline";g(l,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:p("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",outlineWidth:1,series:{type:A,color:"#335cad",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:J},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series", +className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}}); +D.prototype={drawHandle:function(a,b){var c=this.chart.renderer,d=this.handles;this.rendered||(d[b]=c.path(["M",-4.5,.5,"L",3.5,.5,3.5,15.5,-4.5,15.5,-4.5,.5,"M",-1.5,4,"L",-1.5,12,"M",.5,4,"L",.5,12]).attr({zIndex:10-b}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][b]).add(),c=this.navigatorOptions.handles,d[b].attr({fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":1}).css({cursor:"ew-resize"}));d[b][this.rendered&&!this.hasDragged?"animate":"attr"]({translateX:Math.round(this.scrollerLeft+ +this.scrollbarHeight+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},update:function(a){this.destroy();q(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var e=this.chart,g=e.renderer,k,h,l,n;n=this.scrollbarHeight;var m=this.xAxis,p=this.navigatorOptions,u=p.maskInside,q=this.height,v=this.top,t=this.navigatorEnabled,x=this.outlineHeight,y;y=this.rendered;if(f(a)&&f(b)&&(!this.hasDragged||r(c))&&(this.navigatorLeft=k=E(m.left,e.plotLeft+ +n),this.navigatorWidth=h=E(m.len,e.plotWidth-2*n),this.scrollerLeft=l=k-n,this.scrollerWidth=n=n=h+2*n,c=E(c,m.translate(a)),d=E(d,m.translate(b)),f(c)&&Infinity!==Math.abs(c)||(c=0,d=n),!(m.translate(d,!0)-m.translate(c,!0)f&&tp+d-u&&rk&&re?e=0:e+v>=q&&(e=q-v,x=h.getUnionExtremes().dataMax),e!==d&&(h.fixedWidth=v,d=l.toFixedRange(e, +e+v,null,x),c.setExtremes(d.min,d.max,!0,null,{trigger:"navigator"}))))};h.mouseMoveHandler=function(b){var c=h.scrollbarHeight,d=h.navigatorLeft,e=h.navigatorWidth,f=h.scrollerLeft,g=h.scrollerWidth,k=h.range,l;b.touches&&0===b.touches[0].pageX||(b=a.pointer.normalize(b),l=b.chartX,lf+g-c&&(l=f+g-c),h.grabbedLeft?(h.hasDragged=!0,h.render(0,0,l-d,h.otherHandlePos)):h.grabbedRight?(h.hasDragged=!0,h.render(0,0,h.otherHandlePos,l-d)):h.grabbedCenter&&(h.hasDragged=!0,le+n-k&&(l=e+ +n-k),h.render(0,0,l-n,l-n+k)),h.hasDragged&&h.scrollbar&&h.scrollbar.options.liveRedraw&&(b.DOMType=b.type,setTimeout(function(){h.mouseUpHandler(b)},0)))};h.mouseUpHandler=function(b){var c,d,e=b.DOMEvent||b;if(h.hasDragged||"scrollbar"===b.trigger)h.zoomedMin===h.otherHandlePos?c=h.fixedExtreme:h.zoomedMax===h.otherHandlePos&&(d=h.fixedExtreme),h.zoomedMax===h.navigatorWidth&&(d=h.getUnionExtremes().dataMax),c=l.toFixedRange(h.zoomedMin,h.zoomedMax,c,d),r(c.min)&&a.xAxis[0].setExtremes(c.min,c.max, +!0,h.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:e});"mousemove"!==b.DOMType&&(h.grabbedLeft=h.grabbedRight=h.grabbedCenter=h.fixedWidth=h.fixedExtreme=h.otherHandlePos=h.hasDragged=n=null)};var c=a.xAxis.length,f=a.yAxis.length,m=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraBottomMargin=h.outlineHeight+d.margin;a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=l=new G(a,q({breaks:m.options.breaks,ordinal:m.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis", +isX:!0,type:"datetime",index:c,height:g,offset:0,offsetLeft:k,offsetRight:-k,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1})),h.yAxis=new G(a,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,height:g,offset:0,index:f,zoomEnabled:!1})),e||d.series.data?h.addBaseSeries():0===a.series.length&&x(a,"redraw",function(b,c){0=Math.round(a.navigatorWidth);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},destroy:function(){this.removeEvents();this.xAxis&&(m(this.chart.xAxis,this.xAxis),m(this.chart.axes,this.xAxis));this.yAxis&&(m(this.chart.yAxis,this.yAxis),m(this.chart.axes,this.yAxis));k(this.series||[],function(a){a.destroy&&a.destroy()});k("series xAxis yAxis leftShade rightShade outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" "), +function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);k([this.handles,this.elementsToDestroy],function(a){w(a)},this)}};a.Navigator=D;x(G.prototype,"zoom",function(a,b,c){var d=this.chart,e=d.options,f=e.chart.zoomType,g=e.navigator,e=e.rangeSelector,h;this.isXAxis&&(g&&g.enabled||e&&e.enabled)&&("x"===f?d.resetZoomButton="blocked":"y"===f?h=!1:"xy"===f&&(d=this.previousZoom,r(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!== +h?h:a.call(this,b,c)});x(H.prototype,"init",function(a,b,c){B(this,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});a.call(this,b,c)});x(H.prototype,"getMargins",function(a){var b=this.legend,c=b.options,d=this.scroller,e,f;a.apply(this,[].slice.call(arguments,1));d&&(e=d.xAxis,f=d.yAxis,d.top=d.navigatorOptions.top||this.chartHeight-d.height-d.scrollbarHeight-this.spacing[2]-("bottom"===c.verticalAlign&&c.enabled&& +!c.floating?b.legendHeight+E(c.margin,10):0),e&&f&&(e.options.top=f.options.top=d.top,e.setAxisSize(),f.setAxisSize()))});x(n.prototype,"addPoint",function(a,b,c,f,g){var h=this.options.turboThreshold;h&&this.xData.length>h&&d(b,!0)&&this.chart.scroller&&e(20,!0);a.call(this,b,c,f,g)});x(H.prototype,"addSeries",function(a,b,c,d){a=a.call(this,b,!1,d);this.scroller&&this.scroller.setBaseSeries();E(c,!0)&&this.redraw();return a});x(n.prototype,"update",function(a,b,c){a.call(this,b,!1);this.chart.scroller&& +this.chart.scroller.setBaseSeries();E(c,!0)&&this.chart.redraw()})})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.css,l=a.createElement,r=a.dateFormat,w=a.defaultOptions,t=w.global.useUTC,k=a.defined,m=a.destroyObjectProperties,e=a.discardElement,g=a.each,h=a.extend,C=a.fireEvent,f=a.Date,d=a.isNumber,b=a.merge,q=a.pick,E=a.pInt,c=a.splat,F=a.wrap;h(w,{rangeSelector:{buttonTheme:{"stroke-width":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:"right"}, +labelStyle:{color:"#666666"}}});w.lang=b(w.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(a,b){var e=this,f=e.chart,h=e.buttonOptions[a],k=f.xAxis[0],l=f.scroller&&f.scroller.getUnionExtremes()||k||{},n=l.dataMin,m=l.dataMax,p,r=k&&Math.round(Math.min(k.max,q(m,k.max))),w=h.type,z,l=h._range,A,C,D,E=h.dataGrouping;if(null!==n&&null!==m){f.fixedRange=l;E&&(this.forcedDataGrouping=!0,G.prototype.setDataGrouping.call(k||{chart:this.chart}, +E,!1));if("month"===w||"year"===w)k?(w={range:h,max:r,dataMin:n,dataMax:m},p=k.minFromRange.call(w),d(w.newMax)&&(r=w.newMax)):l=h;else if(l)p=Math.max(r-l,n),r=Math.min(p+l,m);else if("ytd"===w)if(k)void 0===m&&(n=Number.MAX_VALUE,m=Number.MIN_VALUE,g(f.series,function(a){a=a.xData;n=Math.min(a[0],n);m=Math.max(a[a.length-1],m)}),b=!1),r=e.getYTDExtremes(m,n,t),p=A=r.min,r=r.max;else{B(f,"beforeRender",function(){e.clickButton(a)});return}else"all"===w&&k&&(p=n,r=m);e.setSelected(a);k?k.setExtremes(p, +r,q(b,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:h}):(z=c(f.options.xAxis)[0],D=z.range,z.range=l,C=z.min,z.min=A,B(f,"load",function(){z.range=D;z.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons|| +[].concat(b.defaultButtons),e=c.selected,f=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&C(a,"blur");c&&c.blur&&C(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=B(a.container,"mousedown",f);this.unResize=B(a,"resize",f);g(d,b.computeButtonRange);void 0!==e&&d[e]&&this.clickButton(e,!1);B(a,"load",function(){B(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&& +b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,b=a.xAxis[0],c=Math.round(b.max-b.min),e=!b.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||b,f=a.dataMin,h=a.dataMax,a=this.getYTDExtremes(h,f,t),k=a.min,l=a.max,m=this.selected,p=d(m),q=this.options.allButtonsEnabled,r=this.buttons;g(this.buttonOptions,function(a,d){var g=a._range,n=a.type,u=a.count||1;a=r[d];var t=0;d=d===m;var v=g>h-f,x=g=864E5*{month:28,year:365}[n]*u&&c<=864E5*{month:31,year:366}[n]*u?g=!0:"ytd"===n?(g=l-k===c,y=!d):"all"===n&&(g=b.max-b.min>=h-f,w=!d&&p&&g);n=!q&&(v||x||w||e);g=d&&g||g&&!p&&!y;n?t=3:g&&(p=!0,t=2);a.state!==t&&a.setState(t)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if("month"===b||"year"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,b){var c= +this.chart.options.rangeSelector,d=this[a+"Input"];k(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=r(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:r(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];p(this[a+"Input"],{left:b.translateX+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){p(this[a+"Input"],{border:0,width:"1px",height:"1px"}); +this.setInputValue(a)},drawInput:function(a){function c(){var a=r.value,b=(m.inputDateParser||Date.parse)(a),c=f.xAxis[0],g=f.scroller&&f.scroller.xAxis?f.scroller.xAxis:c,h=g.dataMin,g=g.dataMax;b!==r.previousValue&&(r.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(E(b[0]),E(b[1])-1,E(b[2]))),d(b)&&(t||(b+=6E4*(new Date).getTimezoneOffset()),q?b>e.maxInput.HCTime?b=void 0:bg&&(b=g),void 0!==b&&c.setExtremes(q?b:c.min,q?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))} +var e=this,f=e.chart,g=f.renderer.style||{},k=f.renderer,m=f.options.rangeSelector,n=e.div,q="min"===a,r,B,C=this.inputGroup;this[a+"Label"]=B=k.label(w.lang[q?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(C);C.offset+=B.width+5;this[a+"DateBox"]=k=k.label("",C.offset).addClass("highcharts-range-input").attr({padding:2,width:m.inputBoxWidth||90,height:m.inputBoxHeight||17,stroke:m.inputBoxBorderColor||"#cccccc","stroke-width":1, +"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()}).add(C);C.offset+=k.width+(q?10:0);this[a+"Input"]=r=l("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:f.plotTop+"px"},n);B.css(b(g,m.labelStyle));k.css(b({color:"#333333"},g,m.inputStyle));p(r,h({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:g.fontSize,fontFamily:g.fontFamily,left:"-9em"},m.inputStyle));r.onfocus=function(){e.showInput(a)};r.onblur= +function(){e.hideInput(a)};r.onchange=c;r.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=q((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,b,c){var d=new f(a),e=d[f.hcGetFullYear]();c=c?f.UTC(e,0,1):+new f(e,0,1);b=Math.max(b||0,c);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(a,b){var c=this,d=c.chart,e=d.renderer,f=d.container,m=d.options, +n=m.exporting&&!1!==m.exporting.enabled&&m.navigation&&m.navigation.buttonOptions,p=m.rangeSelector,r=c.buttons,m=w.lang,t=c.div,t=c.inputGroup,A=p.buttonTheme,z=p.buttonPosition||{},B=p.inputEnabled,C=A&&A.states,D=d.plotLeft,E,G=this.getPosition(),F=c.group,H=c.rendered;!1!==p.enabled&&(H||(c.group=F=e.g("range-selector-buttons").add(),c.zoomText=e.text(m.rangeSelectorZoom,q(z.x,D),15).css(p.labelStyle).add(F),E=q(z.x,D)+c.zoomText.getBBox().width+5,g(c.buttonOptions,function(a,b){r[b]=e.button(a.text, +E,0,function(){c.clickButton(b);c.isActive=!0},A,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(F);E+=r[b].width+q(p.buttonSpacing,5)}),!1!==B&&(c.div=t=l("div",null,{position:"relative",height:0,zIndex:1}),f.parentNode.insertBefore(t,f),c.inputGroup=t=e.g("input-group").add(),t.offset=0,c.drawInput("min"),c.drawInput("max"))),c.updateButtonStates(),F[H?"animate":"attr"]({translateY:G.buttonTop}),!1!==B&&(t.align(h({y:G.inputTop,width:t.offset,x:n&&G.inputTop<(n.y||0)+n.height- +d.spacing[0]?-40:0},p.inputPosition),!0,d.spacingBox),k(B)||(d=F.getBBox(),t[t.alignAttr.translateXc&&(e?a=b-f:b=a+f);d(a)||(a=b=void 0);return{min:a,max:b}};G.prototype.minFromRange=function(){var a=this.range,b={month:"Month",year:"FullYear"}[a.type],c,e=this.max,f,g,h=function(a,c){var d=new Date(a);d["set"+b](d["get"+ +b]()+c);return d.getTime()-a};d(a)?(c=e-a,g=a):(c=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-c));f=q(this.dataMin,Number.MIN_VALUE);d(c)||(c=f);c<=f&&(c=f,void 0===g&&(g=h(c,a.count)),this.newMax=Math.min(c+g,this.dataMax));d(e)||(c=void 0);return c};F(H.prototype,"init",function(a,b,c){B(this,"init",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});a.call(this,b,c)});a.RangeSelector=D})(N);(function(a){var D=a.addEvent,B=a.isNumber;a.Chart.prototype.callbacks.push(function(a){function G(){p= +a.xAxis[0].getExtremes();B(p.min)&&r.render(p.min,p.max)}var p,l=a.scroller,r=a.rangeSelector,w,t;l&&(p=a.xAxis[0].getExtremes(),l.render(p.min,p.max));r&&(t=D(a.xAxis[0],"afterSetExtremes",function(a){r.render(a.min,a.max)}),w=D(a,"redraw",G),G());D(a,"destroy",function(){r&&(w(),t())})})})(N);(function(a){var D=a.arrayMax,B=a.arrayMin,G=a.Axis,H=a.Chart,p=a.defined,l=a.each,r=a.extend,w=a.format,t=a.inArray,k=a.isNumber,m=a.isString,e=a.map,g=a.merge,h=a.pick,C=a.Point,f=a.Renderer,d=a.Series,b= +a.splat,q=a.stop,E=a.SVGRenderer,c=a.VMLRenderer,F=a.wrap,n=d.prototype,A=n.init,x=n.processData,J=C.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,d,f){var k=m(c)||c.nodeName,l=arguments[k?1:0],n=l.series,p=a.getOptions(),q,r=h(l.navigator&&l.navigator.enabled,!0)?{startOnTick:!1,endOnTick:!1}:null,t={marker:{enabled:!1,radius:2}},u={shadow:!1,borderWidth:0};l.xAxis=e(b(l.xAxis||{}),function(a){return g({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"}, +showLastLabel:!0},p.xAxis,a,{type:"datetime",categories:null},r)});l.yAxis=e(b(l.yAxis||{}),function(a){q=h(a.opposite,!0);return g({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},p.yAxis,a)});l.series=null;l=g({chart:{panning:!0,pinchType:"x"},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null,style:{fontSize:"16px"}},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:t,spline:t,area:t,areaspline:t,arearange:t,areasplinerange:t, +column:u,columnrange:u,candlestick:u,ohlc:u}},l,{_stock:!0,chart:{inverted:!1}});l.series=n;return k?new H(c,l,f):new H(l,d)};F(G.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options._stock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=1,"right"):a.call(this,[].slice.call(arguments,1))});F(G.prototype,"getPlotLinePath",function(a, +b,c,d,f,g){var n=this,q=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=n.chart,u=r.renderer,v=n.left,w=n.top,y,x,A,B,C=[],D=[],E,F;if("colorAxis"===n.coll)return a.apply(this,[].slice.call(arguments,1));D=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=n.options[b];return k(a)?[r[b][a]]:m(a)?[r.get(a)]:e(q,function(a){return a[b]})}(n.coll);l(n.isXAxis?r.yAxis:r.xAxis,function(a){if(p(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=p(a.options[b])? +r[b][a.options[b]]:r[b][0];n===b&&D.push(a)}});E=D.length?[]:[n.isXAxis?r.yAxis[0]:r.xAxis[0]];l(D,function(a){-1===t(a,E)&&E.push(a)});F=h(g,n.translate(b,null,null,d));k(F)&&(n.horiz?l(E,function(a){var b;x=a.pos;B=x+a.len;y=A=Math.round(F+n.transB);if(yv+n.width)f?y=A=Math.min(Math.max(v,y),v+n.width):b=!0;b||C.push("M",y,x,"L",A,B)}):l(E,function(a){var b;y=a.pos;A=y+a.len;x=B=Math.round(w+n.height-F);if(xw+n.height)f?x=B=Math.min(Math.max(w,x),n.top+n.height):b=!0;b||C.push("M",y, +x,"L",A,B)}));return 0=e&&(x=-(l.translateX+b.width-e));l.attr({x:m+x,y:k,anchorX:g?m:this.opposite?0:a.chartWidth,anchorY:g?this.opposite?a.chartHeight:0:k+b.height/2})}});n.init=function(){A.apply(this,arguments);this.setCompare(this.options.compare)};n.setCompare=function(a){this.modifyValue= +"value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b=b/d*100-100,c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};n.processData=function(){var a,b=-1,c,d,e,f;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=t("close",this.pointArrayMap),-1===b&&(b=t(this.pointValKey||"y",this.pointArrayMap))),a=0;a< +e-1;a++)if(f=-1=this.xAxis.min&&0!==f){this.compareValue=f;break}};F(n,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=B(b),this.dataMax=D(b))});G.prototype.setCompare=function(a,b){this.isXAxis||(l(this.series,function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};C.prototype.tooltipFormatter=function(b){b=b.replace("{point.change}",(0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 '; + else + var expandButton = ''; + + return '' + expandButton + '' + ellipsedLabel({ name: item.name, parentClass: "nav-tooltip", childClass: "nav-label" }) + ''; +} + +function menuItemsForGroup(group, level, parent) { + var items = ''; + + if (level > 0) + items += menuItem(group, level - 1, parent, true); + + $.each(group.contents, function (contentName, content) { + if (content.type == 'GROUP') + items += menuItemsForGroup(content, level + 1, group.pathFormatted); + else if (content.type == 'REQUEST') + items += menuItem(content, level, group.pathFormatted); + }); + + return items; +} + +function setDetailsMenu(){ + $('.nav ul').append(menuItemsForGroup(stats, 0)); + $('.nav').expandable(); + $('.nav-tooltip').popover({trigger:'hover'}); +} + +function setGlobalMenu(){ + $('.nav ul') + .append('
  • Ranges
  • ') + .append('
  • Stats
  • ') + .append('
  • Active Users
  • ') + .append('
  • Requests / sec
  • ') + .append('
  • Responses / sec
  • '); +} + +function getLink(link){ + var a = link.split('/'); + return (a.length<=1)? link : a[a.length-1]; +} + +function expandUp(li) { + const parentId = li.attr("data-parent"); + if (parentId != "ROOT") { + const span = $('#' + parentId); + const parentLi = span.parents('li').first(); + span.expand(parentLi, false); + expandUp(parentLi); + } +} + +function setActiveMenu(){ + $('.nav a').each(function() { + const navA = $(this) + if(!navA.hasClass('expand-button') && navA.attr('href') == getLink(window.location.pathname)) { + const li = $(this).parents('li').first(); + li.addClass('on'); + expandUp(li); + return false; + } + }); +} diff --git a/webapp/loadTests/150users1minute/js/stats.js b/webapp/loadTests/150users1minute/js/stats.js new file mode 100644 index 0000000..d75ebf8 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/stats.js @@ -0,0 +1,4065 @@ +var stats = { + type: "GROUP", +name: "All Requests", +path: "", +pathFormatted: "group_missing-name-b06d1", +stats: { + "name": "All Requests", + "numberOfRequests": { + "total": "4184", + "ok": "3638", + "ko": "546" + }, + "minResponseTime": { + "total": "1", + "ok": "1", + "ko": "179" + }, + "maxResponseTime": { + "total": "3544", + "ok": "3544", + "ko": "2696" + }, + "meanResponseTime": { + "total": "415", + "ok": "369", + "ko": "717" + }, + "standardDeviation": { + "total": "569", + "ok": "527", + "ko": "723" + }, + "percentiles1": { + "total": "120", + "ok": "80", + "ko": "212" + }, + "percentiles2": { + "total": "627", + "ok": "567", + "ko": "857" + }, + "percentiles3": { + "total": "1591", + "ok": "1467", + "ko": "2534" + }, + "percentiles4": { + "total": "2573", + "ok": "2376", + "ko": "2647" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3034, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 312, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 292, + "percentage": 7 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 546, + "percentage": 13 +}, + "meanNumberOfRequestsPerSecond": { + "total": "43.583", + "ok": "37.896", + "ko": "5.688" + } +}, +contents: { +"req_request-0-684d2": { + type: "REQUEST", + name: "request_0", +path: "request_0", +pathFormatted: "req_request-0-684d2", +stats: { + "name": "request_0", + "numberOfRequests": { + "total": "150", + "ok": "150", + "ko": "0" + }, + "minResponseTime": { + "total": "1", + "ok": "1", + "ko": "-" + }, + "maxResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "meanResponseTime": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "standardDeviation": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles1": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "percentiles2": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles3": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles4": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.562", + "ok": "1.562", + "ko": "-" + } +} + },"req_request-1-46da4": { + type: "REQUEST", + name: "request_1", +path: "request_1", +pathFormatted: "req_request-1-46da4", +stats: { + "name": "request_1", + "numberOfRequests": { + "total": "150", + "ok": "150", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "meanResponseTime": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "standardDeviation": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles3": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles4": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.562", + "ok": "1.562", + "ko": "-" + } +} + },"req_request-2-93baf": { + type: "REQUEST", + name: "request_2", +path: "request_2", +pathFormatted: "req_request-2-93baf", +stats: { + "name": "request_2", + "numberOfRequests": { + "total": "150", + "ok": "120", + "ko": "30" + }, + "minResponseTime": { + "total": "184", + "ok": "412", + "ko": "184" + }, + "maxResponseTime": { + "total": "2909", + "ok": "2909", + "ko": "2489" + }, + "meanResponseTime": { + "total": "753", + "ok": "759", + "ko": "731" + }, + "standardDeviation": { + "total": "542", + "ok": "522", + "ko": "616" + }, + "percentiles1": { + "total": "520", + "ok": "505", + "ko": "790" + }, + "percentiles2": { + "total": "811", + "ok": "755", + "ko": "813" + }, + "percentiles3": { + "total": "1988", + "ok": "1876", + "ko": "1988" + }, + "percentiles4": { + "total": "2505", + "ok": "2510", + "ko": "2349" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 91, + "percentage": 61 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 16, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 30, + "percentage": 20 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.562", + "ok": "1.25", + "ko": "0.312" + } +} + },"req_request-3-d0973": { + type: "REQUEST", + name: "request_3", +path: "request_3", +pathFormatted: "req_request-3-d0973", +stats: { + "name": "request_3", + "numberOfRequests": { + "total": "120", + "ok": "120", + "ko": "0" + }, + "minResponseTime": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "maxResponseTime": { + "total": "549", + "ok": "549", + "ko": "-" + }, + "meanResponseTime": { + "total": "162", + "ok": "162", + "ko": "-" + }, + "standardDeviation": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "percentiles1": { + "total": "103", + "ok": "103", + "ko": "-" + }, + "percentiles2": { + "total": "205", + "ok": "205", + "ko": "-" + }, + "percentiles3": { + "total": "392", + "ok": "392", + "ko": "-" + }, + "percentiles4": { + "total": "479", + "ok": "479", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 120, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.25", + "ok": "1.25", + "ko": "-" + } +} + },"req_request-5-48829": { + type: "REQUEST", + name: "request_5", +path: "request_5", +pathFormatted: "req_request-5-48829", +stats: { + "name": "request_5", + "numberOfRequests": { + "total": "120", + "ok": "82", + "ko": "38" + }, + "minResponseTime": { + "total": "179", + "ok": "367", + "ko": "179" + }, + "maxResponseTime": { + "total": "2850", + "ok": "2850", + "ko": "2645" + }, + "meanResponseTime": { + "total": "658", + "ok": "674", + "ko": "622" + }, + "standardDeviation": { + "total": "564", + "ok": "450", + "ko": "753" + }, + "percentiles1": { + "total": "425", + "ok": "460", + "ko": "201" + }, + "percentiles2": { + "total": "795", + "ok": "736", + "ko": "796" + }, + "percentiles3": { + "total": "1730", + "ok": "1639", + "ko": "2614" + }, + "percentiles4": { + "total": "2643", + "ok": "2059", + "ko": "2642" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 63, + "percentage": 53 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 9, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 10, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 38, + "percentage": 32 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.25", + "ok": "0.854", + "ko": "0.396" + } +} + },"req_request-6-027a9": { + type: "REQUEST", + name: "request_6", +path: "request_6", +pathFormatted: "req_request-6-027a9", +stats: { + "name": "request_6", + "numberOfRequests": { + "total": "120", + "ok": "76", + "ko": "44" + }, + "minResponseTime": { + "total": "179", + "ok": "544", + "ko": "179" + }, + "maxResponseTime": { + "total": "2645", + "ok": "2239", + "ko": "2645" + }, + "meanResponseTime": { + "total": "777", + "ok": "881", + "ko": "597" + }, + "standardDeviation": { + "total": "601", + "ok": "424", + "ko": "788" + }, + "percentiles1": { + "total": "605", + "ok": "648", + "ko": "200" + }, + "percentiles2": { + "total": "925", + "ok": "1191", + "ko": "612" + }, + "percentiles3": { + "total": "2056", + "ok": "1763", + "ko": "2578" + }, + "percentiles4": { + "total": "2594", + "ok": "2094", + "ko": "2624" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 41 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 19, + "percentage": 16 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 44, + "percentage": 37 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.25", + "ok": "0.792", + "ko": "0.458" + } +} + },"req_request-4-e7d1b": { + type: "REQUEST", + name: "request_4", +path: "request_4", +pathFormatted: "req_request-4-e7d1b", +stats: { + "name": "request_4", + "numberOfRequests": { + "total": "120", + "ok": "76", + "ko": "44" + }, + "minResponseTime": { + "total": "179", + "ok": "406", + "ko": "179" + }, + "maxResponseTime": { + "total": "2647", + "ok": "1723", + "ko": "2647" + }, + "meanResponseTime": { + "total": "629", + "ok": "672", + "ko": "555" + }, + "standardDeviation": { + "total": "503", + "ok": "376", + "ko": "660" + }, + "percentiles1": { + "total": "458", + "ok": "472", + "ko": "200" + }, + "percentiles2": { + "total": "791", + "ok": "729", + "ko": "796" + }, + "percentiles3": { + "total": "1663", + "ok": "1625", + "ko": "2398" + }, + "percentiles4": { + "total": "2604", + "ok": "1703", + "ko": "2632" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 58, + "percentage": 48 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 11, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 44, + "percentage": 37 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.25", + "ok": "0.792", + "ko": "0.458" + } +} + },"req_request-7-f222f": { + type: "REQUEST", + name: "request_7", +path: "request_7", +pathFormatted: "req_request-7-f222f", +stats: { + "name": "request_7", + "numberOfRequests": { + "total": "120", + "ok": "74", + "ko": "46" + }, + "minResponseTime": { + "total": "179", + "ok": "365", + "ko": "179" + }, + "maxResponseTime": { + "total": "2647", + "ok": "1871", + "ko": "2647" + }, + "meanResponseTime": { + "total": "616", + "ok": "634", + "ko": "587" + }, + "standardDeviation": { + "total": "523", + "ok": "361", + "ko": "709" + }, + "percentiles1": { + "total": "421", + "ok": "458", + "ko": "200" + }, + "percentiles2": { + "total": "776", + "ok": "694", + "ko": "793" + }, + "percentiles3": { + "total": "1639", + "ok": "1418", + "ko": "2564" + }, + "percentiles4": { + "total": "2627", + "ok": "1729", + "ko": "2642" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 57, + "percentage": 48 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 6, + "percentage": 5 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 46, + "percentage": 38 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.25", + "ok": "0.771", + "ko": "0.479" + } +} + },"req_request-5-redir-affb3": { + type: "REQUEST", + name: "request_5 Redirect 1", +path: "request_5 Redirect 1", +pathFormatted: "req_request-5-redir-affb3", +stats: { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": "82", + "ok": "82", + "ko": "0" + }, + "minResponseTime": { + "total": "95", + "ok": "95", + "ko": "-" + }, + "maxResponseTime": { + "total": "922", + "ok": "922", + "ko": "-" + }, + "meanResponseTime": { + "total": "213", + "ok": "213", + "ko": "-" + }, + "standardDeviation": { + "total": "209", + "ok": "209", + "ko": "-" + }, + "percentiles1": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "percentiles2": { + "total": "179", + "ok": "179", + "ko": "-" + }, + "percentiles3": { + "total": "740", + "ok": "740", + "ko": "-" + }, + "percentiles4": { + "total": "845", + "ok": "845", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 78, + "percentage": 95 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 5 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.854", + "ok": "0.854", + "ko": "-" + } +} + },"req_request-8-ef0c8": { + type: "REQUEST", + name: "request_8", +path: "request_8", +pathFormatted: "req_request-8-ef0c8", +stats: { + "name": "request_8", + "numberOfRequests": { + "total": "150", + "ok": "100", + "ko": "50" + }, + "minResponseTime": { + "total": "179", + "ok": "409", + "ko": "179" + }, + "maxResponseTime": { + "total": "3421", + "ok": "3421", + "ko": "2538" + }, + "meanResponseTime": { + "total": "906", + "ok": "1042", + "ko": "636" + }, + "standardDeviation": { + "total": "647", + "ok": "608", + "ko": "639" + }, + "percentiles1": { + "total": "797", + "ok": "955", + "ko": "200" + }, + "percentiles2": { + "total": "1219", + "ok": "1220", + "ko": "821" + }, + "percentiles3": { + "total": "2319", + "ok": "2397", + "ko": "1747" + }, + "percentiles4": { + "total": "2902", + "ok": "2928", + "ko": "2519" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 41, + "percentage": 27 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 30, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 29, + "percentage": 19 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 50, + "percentage": 33 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.562", + "ok": "1.042", + "ko": "0.521" + } +} + },"req_request-8-redir-98b2a": { + type: "REQUEST", + name: "request_8 Redirect 1", +path: "request_8 Redirect 1", +pathFormatted: "req_request-8-redir-98b2a", +stats: { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": "100", + "ok": "85", + "ko": "15" + }, + "minResponseTime": { + "total": "179", + "ok": "184", + "ko": "179" + }, + "maxResponseTime": { + "total": "2540", + "ok": "2271", + "ko": "2540" + }, + "meanResponseTime": { + "total": "706", + "ok": "706", + "ko": "709" + }, + "standardDeviation": { + "total": "520", + "ok": "454", + "ko": "797" + }, + "percentiles1": { + "total": "523", + "ok": "529", + "ko": "209" + }, + "percentiles2": { + "total": "961", + "ok": "987", + "ko": "796" + }, + "percentiles3": { + "total": "1799", + "ok": "1665", + "ko": "2527" + }, + "percentiles4": { + "total": "2521", + "ok": "2094", + "ko": "2537" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 60, + "percentage": 60 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 12, + "percentage": 12 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 15, + "percentage": 15 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.042", + "ok": "0.885", + "ko": "0.156" + } +} + },"req_request-8-redir-fc911": { + type: "REQUEST", + name: "request_8 Redirect 2", +path: "request_8 Redirect 2", +pathFormatted: "req_request-8-redir-fc911", +stats: { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": "85", + "ok": "76", + "ko": "9" + }, + "minResponseTime": { + "total": "190", + "ok": "227", + "ko": "190" + }, + "maxResponseTime": { + "total": "2913", + "ok": "2913", + "ko": "1398" + }, + "meanResponseTime": { + "total": "682", + "ok": "715", + "ko": "404" + }, + "standardDeviation": { + "total": "557", + "ok": "564", + "ko": "398" + }, + "percentiles1": { + "total": "468", + "ok": "482", + "ko": "209" + }, + "percentiles2": { + "total": "940", + "ok": "950", + "ko": "223" + }, + "percentiles3": { + "total": "1807", + "ok": "1820", + "ko": "1160" + }, + "percentiles4": { + "total": "2431", + "ok": "2483", + "ko": "1350" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 55, + "percentage": 65 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 9, + "percentage": 11 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 12, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 11 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.885", + "ok": "0.792", + "ko": "0.094" + } +} + },"req_request-8-redir-e875c": { + type: "REQUEST", + name: "request_8 Redirect 3", +path: "request_8 Redirect 3", +pathFormatted: "req_request-8-redir-e875c", +stats: { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "maxResponseTime": { + "total": "38", + "ok": "38", + "ko": "-" + }, + "meanResponseTime": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "standardDeviation": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles1": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "percentiles2": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles3": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "percentiles4": { + "total": "31", + "ok": "31", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-12-61da2": { + type: "REQUEST", + name: "request_12", +path: "request_12", +pathFormatted: "req_request-12-61da2", +stats: { + "name": "request_12", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "83", + "ok": "83", + "ko": "-" + }, + "meanResponseTime": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles3": { + "total": "31", + "ok": "31", + "ko": "-" + }, + "percentiles4": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-14-a0e30": { + type: "REQUEST", + name: "request_14", +path: "request_14", +pathFormatted: "req_request-14-a0e30", +stats: { + "name": "request_14", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "maxResponseTime": { + "total": "89", + "ok": "89", + "ko": "-" + }, + "meanResponseTime": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles2": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles3": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "percentiles4": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-22-8ecb1": { + type: "REQUEST", + name: "request_22", +path: "request_22", +pathFormatted: "req_request-22-8ecb1", +stats: { + "name": "request_22", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "maxResponseTime": { + "total": "144", + "ok": "144", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "percentiles1": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles2": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "percentiles3": { + "total": "80", + "ok": "80", + "ko": "-" + }, + "percentiles4": { + "total": "127", + "ok": "127", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-21-be4cb": { + type: "REQUEST", + name: "request_21", +path: "request_21", +pathFormatted: "req_request-21-be4cb", +stats: { + "name": "request_21", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "maxResponseTime": { + "total": "144", + "ok": "144", + "ko": "-" + }, + "meanResponseTime": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "standardDeviation": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles1": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "percentiles2": { + "total": "57", + "ok": "57", + "ko": "-" + }, + "percentiles3": { + "total": "76", + "ok": "76", + "ko": "-" + }, + "percentiles4": { + "total": "107", + "ok": "107", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-24-dd0c9": { + type: "REQUEST", + name: "request_24", +path: "request_24", +pathFormatted: "req_request-24-dd0c9", +stats: { + "name": "request_24", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "maxResponseTime": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "meanResponseTime": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "standardDeviation": { + "total": "18", + "ok": "18", + "ko": "-" + }, + "percentiles1": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles2": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles3": { + "total": "81", + "ok": "81", + "ko": "-" + }, + "percentiles4": { + "total": "137", + "ok": "137", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-200-636fa": { + type: "REQUEST", + name: "request_200", +path: "request_200", +pathFormatted: "req_request-200-636fa", +stats: { + "name": "request_200", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "maxResponseTime": { + "total": "155", + "ok": "155", + "ko": "-" + }, + "meanResponseTime": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "standardDeviation": { + "total": "18", + "ok": "18", + "ko": "-" + }, + "percentiles1": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "percentiles2": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles3": { + "total": "85", + "ok": "85", + "ko": "-" + }, + "percentiles4": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-13-5cca6": { + type: "REQUEST", + name: "request_13", +path: "request_13", +pathFormatted: "req_request-13-5cca6", +stats: { + "name": "request_13", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "maxResponseTime": { + "total": "171", + "ok": "171", + "ko": "-" + }, + "meanResponseTime": { + "total": "85", + "ok": "85", + "ko": "-" + }, + "standardDeviation": { + "total": "24", + "ok": "24", + "ko": "-" + }, + "percentiles1": { + "total": "79", + "ok": "79", + "ko": "-" + }, + "percentiles2": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles3": { + "total": "143", + "ok": "143", + "ko": "-" + }, + "percentiles4": { + "total": "161", + "ok": "161", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-16-24733": { + type: "REQUEST", + name: "request_16", +path: "request_16", +pathFormatted: "req_request-16-24733", +stats: { + "name": "request_16", + "numberOfRequests": { + "total": "76", + "ok": "42", + "ko": "34" + }, + "minResponseTime": { + "total": "89", + "ok": "89", + "ko": "183" + }, + "maxResponseTime": { + "total": "2573", + "ok": "2494", + "ko": "2573" + }, + "meanResponseTime": { + "total": "659", + "ok": "646", + "ko": "674" + }, + "standardDeviation": { + "total": "657", + "ok": "534", + "ko": "783" + }, + "percentiles1": { + "total": "469", + "ok": "581", + "ko": "211" + }, + "percentiles2": { + "total": "812", + "ok": "871", + "ko": "803" + }, + "percentiles3": { + "total": "2507", + "ok": "1792", + "ko": "2566" + }, + "percentiles4": { + "total": "2569", + "ok": "2260", + "ko": "2571" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 31, + "percentage": 41 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 5 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 34, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.438", + "ko": "0.354" + } +} + },"req_request-15-56eac": { + type: "REQUEST", + name: "request_15", +path: "request_15", +pathFormatted: "req_request-15-56eac", +stats: { + "name": "request_15", + "numberOfRequests": { + "total": "76", + "ok": "63", + "ko": "13" + }, + "minResponseTime": { + "total": "89", + "ok": "89", + "ko": "185" + }, + "maxResponseTime": { + "total": "2545", + "ok": "1992", + "ko": "2545" + }, + "meanResponseTime": { + "total": "520", + "ok": "447", + "ko": "875" + }, + "standardDeviation": { + "total": "603", + "ok": "465", + "ko": "963" + }, + "percentiles1": { + "total": "205", + "ok": "200", + "ko": "205" + }, + "percentiles2": { + "total": "765", + "ok": "725", + "ko": "1404" + }, + "percentiles3": { + "total": "1859", + "ok": "1263", + "ko": "2522" + }, + "percentiles4": { + "total": "2517", + "ok": "1882", + "ko": "2540" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 51, + "percentage": 67 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 7 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 13, + "percentage": 17 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.656", + "ko": "0.135" + } +} + },"req_logo-png-c9c2b": { + type: "REQUEST", + name: "Logo.png", +path: "Logo.png", +pathFormatted: "req_logo-png-c9c2b", +stats: { + "name": "Logo.png", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "maxResponseTime": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "meanResponseTime": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles2": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles3": { + "total": "37", + "ok": "37", + "ko": "-" + }, + "percentiles4": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-18-f5b64": { + type: "REQUEST", + name: "request_18", +path: "request_18", +pathFormatted: "req_request-18-f5b64", +stats: { + "name": "request_18", + "numberOfRequests": { + "total": "76", + "ok": "54", + "ko": "22" + }, + "minResponseTime": { + "total": "180", + "ok": "180", + "ko": "181" + }, + "maxResponseTime": { + "total": "2594", + "ok": "2594", + "ko": "1407" + }, + "meanResponseTime": { + "total": "503", + "ok": "528", + "ko": "441" + }, + "standardDeviation": { + "total": "488", + "ok": "507", + "ko": "430" + }, + "percentiles1": { + "total": "255", + "ok": "310", + "ko": "202" + }, + "percentiles2": { + "total": "699", + "ok": "684", + "ko": "645" + }, + "percentiles3": { + "total": "1389", + "ok": "1303", + "ko": "1383" + }, + "percentiles4": { + "total": "2575", + "ok": "2581", + "ko": "1402" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 45, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 22, + "percentage": 29 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.562", + "ko": "0.229" + } +} + },"req_bundle-js-0b837": { + type: "REQUEST", + name: "bundle.js", +path: "bundle.js", +pathFormatted: "req_bundle-js-0b837", +stats: { + "name": "bundle.js", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "maxResponseTime": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "meanResponseTime": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "standardDeviation": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles1": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "percentiles2": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles3": { + "total": "29", + "ok": "29", + "ko": "-" + }, + "percentiles4": { + "total": "38", + "ok": "38", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-9-d127e": { + type: "REQUEST", + name: "request_9", +path: "request_9", +pathFormatted: "req_request-9-d127e", +stats: { + "name": "request_9", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "maxResponseTime": { + "total": "68", + "ok": "68", + "ko": "-" + }, + "meanResponseTime": { + "total": "24", + "ok": "24", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "percentiles2": { + "total": "27", + "ok": "27", + "ko": "-" + }, + "percentiles3": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "percentiles4": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-242-d6d33": { + type: "REQUEST", + name: "request_242", +path: "request_242", +pathFormatted: "req_request-242-d6d33", +stats: { + "name": "request_242", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "maxResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "meanResponseTime": { + "total": "25", + "ok": "25", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "percentiles2": { + "total": "30", + "ok": "30", + "ko": "-" + }, + "percentiles3": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles4": { + "total": "61", + "ok": "61", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-10-1cfbe": { + type: "REQUEST", + name: "request_10", +path: "request_10", +pathFormatted: "req_request-10-1cfbe", +stats: { + "name": "request_10", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "maxResponseTime": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "meanResponseTime": { + "total": "25", + "ok": "25", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "percentiles2": { + "total": "30", + "ok": "30", + "ko": "-" + }, + "percentiles3": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles4": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-11-f11e8": { + type: "REQUEST", + name: "request_11", +path: "request_11", +pathFormatted: "req_request-11-f11e8", +stats: { + "name": "request_11", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "maxResponseTime": { + "total": "165", + "ok": "165", + "ko": "-" + }, + "meanResponseTime": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "standardDeviation": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "percentiles1": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "percentiles2": { + "total": "69", + "ok": "69", + "ko": "-" + }, + "percentiles3": { + "total": "131", + "ok": "131", + "ko": "-" + }, + "percentiles4": { + "total": "161", + "ok": "161", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_css2-family-rob-cf8a9": { + type: "REQUEST", + name: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +path: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +pathFormatted: "req_css2-family-rob-cf8a9", +stats: { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "maxResponseTime": { + "total": "206", + "ok": "206", + "ko": "-" + }, + "meanResponseTime": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "standardDeviation": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "percentiles1": { + "total": "114", + "ok": "114", + "ko": "-" + }, + "percentiles2": { + "total": "132", + "ok": "132", + "ko": "-" + }, + "percentiles3": { + "total": "167", + "ok": "167", + "ko": "-" + }, + "percentiles4": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-19-10d85": { + type: "REQUEST", + name: "request_19", +path: "request_19", +pathFormatted: "req_request-19-10d85", +stats: { + "name": "request_19", + "numberOfRequests": { + "total": "76", + "ok": "34", + "ko": "42" + }, + "minResponseTime": { + "total": "182", + "ok": "722", + "ko": "182" + }, + "maxResponseTime": { + "total": "2636", + "ok": "2591", + "ko": "2636" + }, + "meanResponseTime": { + "total": "1051", + "ok": "1521", + "ko": "669" + }, + "standardDeviation": { + "total": "730", + "ok": "464", + "ko": "681" + }, + "percentiles1": { + "total": "1043", + "ok": "1443", + "ko": "213" + }, + "percentiles2": { + "total": "1479", + "ok": "1813", + "ko": "816" + }, + "percentiles3": { + "total": "2420", + "ok": "2382", + "ko": "2451" + }, + "percentiles4": { + "total": "2602", + "ok": "2525", + "ko": "2607" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 1 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 26, + "percentage": 34 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 42, + "percentage": 55 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.354", + "ko": "0.438" + } +} + },"req_request-20-6804b": { + type: "REQUEST", + name: "request_20", +path: "request_20", +pathFormatted: "req_request-20-6804b", +stats: { + "name": "request_20", + "numberOfRequests": { + "total": "76", + "ok": "37", + "ko": "39" + }, + "minResponseTime": { + "total": "183", + "ok": "490", + "ko": "183" + }, + "maxResponseTime": { + "total": "2636", + "ok": "1994", + "ko": "2636" + }, + "meanResponseTime": { + "total": "790", + "ok": "899", + "ko": "686" + }, + "standardDeviation": { + "total": "579", + "ok": "394", + "ko": "696" + }, + "percentiles1": { + "total": "687", + "ok": "748", + "ko": "203" + }, + "percentiles2": { + "total": "1123", + "ok": "1142", + "ko": "817" + }, + "percentiles3": { + "total": "1860", + "ok": "1742", + "ko": "2494" + }, + "percentiles4": { + "total": "2535", + "ok": "1930", + "ko": "2585" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 29 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 11 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 7, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 39, + "percentage": 51 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.385", + "ko": "0.406" + } +} + },"req_request-23-98f5d": { + type: "REQUEST", + name: "request_23", +path: "request_23", +pathFormatted: "req_request-23-98f5d", +stats: { + "name": "request_23", + "numberOfRequests": { + "total": "76", + "ok": "34", + "ko": "42" + }, + "minResponseTime": { + "total": "182", + "ok": "721", + "ko": "182" + }, + "maxResponseTime": { + "total": "2636", + "ok": "2581", + "ko": "2636" + }, + "meanResponseTime": { + "total": "1069", + "ok": "1531", + "ko": "695" + }, + "standardDeviation": { + "total": "716", + "ok": "454", + "ko": "669" + }, + "percentiles1": { + "total": "1064", + "ok": "1372", + "ko": "206" + }, + "percentiles2": { + "total": "1435", + "ok": "1879", + "ko": "829" + }, + "percentiles3": { + "total": "2463", + "ok": "2257", + "ko": "2431" + }, + "percentiles4": { + "total": "2595", + "ok": "2540", + "ko": "2583" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 1 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 26, + "percentage": 34 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 42, + "percentage": 55 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.354", + "ko": "0.438" + } +} + },"req_request-222-24864": { + type: "REQUEST", + name: "request_222", +path: "request_222", +pathFormatted: "req_request-222-24864", +stats: { + "name": "request_222", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "35", + "ok": "35", + "ko": "-" + }, + "maxResponseTime": { + "total": "116", + "ok": "116", + "ko": "-" + }, + "meanResponseTime": { + "total": "49", + "ok": "49", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "percentiles2": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles3": { + "total": "71", + "ok": "71", + "ko": "-" + }, + "percentiles4": { + "total": "85", + "ok": "85", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-227-2507b": { + type: "REQUEST", + name: "request_227", +path: "request_227", +pathFormatted: "req_request-227-2507b", +stats: { + "name": "request_227", + "numberOfRequests": { + "total": "76", + "ok": "76", + "ko": "0" + }, + "minResponseTime": { + "total": "36", + "ok": "36", + "ko": "-" + }, + "maxResponseTime": { + "total": "115", + "ok": "115", + "ko": "-" + }, + "meanResponseTime": { + "total": "47", + "ok": "47", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "percentiles2": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "percentiles3": { + "total": "69", + "ok": "69", + "ko": "-" + }, + "percentiles4": { + "total": "93", + "ok": "93", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.792", + "ko": "-" + } +} + },"req_request-240-e27d8": { + type: "REQUEST", + name: "request_240", +path: "request_240", +pathFormatted: "req_request-240-e27d8", +stats: { + "name": "request_240", + "numberOfRequests": { + "total": "76", + "ok": "67", + "ko": "9" + }, + "minResponseTime": { + "total": "241", + "ok": "327", + "ko": "241" + }, + "maxResponseTime": { + "total": "3222", + "ok": "3222", + "ko": "2676" + }, + "meanResponseTime": { + "total": "995", + "ok": "968", + "ko": "1200" + }, + "standardDeviation": { + "total": "608", + "ok": "597", + "ko": "652" + }, + "percentiles1": { + "total": "848", + "ok": "839", + "ko": "903" + }, + "percentiles2": { + "total": "1154", + "ok": "1095", + "ko": "1487" + }, + "percentiles3": { + "total": "2573", + "ok": "2498", + "ko": "2204" + }, + "percentiles4": { + "total": "2813", + "ok": "2862", + "ko": "2582" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 32, + "percentage": 42 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 29 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 13, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.698", + "ko": "0.094" + } +} + },"req_request-241-2919b": { + type: "REQUEST", + name: "request_241", +path: "request_241", +pathFormatted: "req_request-241-2919b", +stats: { + "name": "request_241", + "numberOfRequests": { + "total": "76", + "ok": "66", + "ko": "10" + }, + "minResponseTime": { + "total": "231", + "ok": "296", + "ko": "231" + }, + "maxResponseTime": { + "total": "2696", + "ok": "2514", + "ko": "2696" + }, + "meanResponseTime": { + "total": "936", + "ok": "882", + "ko": "1291" + }, + "standardDeviation": { + "total": "490", + "ok": "390", + "ko": "823" + }, + "percentiles1": { + "total": "859", + "ok": "838", + "ko": "1194" + }, + "percentiles2": { + "total": "1037", + "ok": "997", + "ko": "1487" + }, + "percentiles3": { + "total": "1992", + "ok": "1532", + "ko": "2686" + }, + "percentiles4": { + "total": "2679", + "ok": "2262", + "ko": "2694" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 32, + "percentage": 42 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 26, + "percentage": 34 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 8, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 10, + "percentage": 13 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.688", + "ko": "0.104" + } +} + },"req_request-243-b078b": { + type: "REQUEST", + name: "request_243", +path: "request_243", +pathFormatted: "req_request-243-b078b", +stats: { + "name": "request_243", + "numberOfRequests": { + "total": "62", + "ok": "62", + "ko": "0" + }, + "minResponseTime": { + "total": "35", + "ok": "35", + "ko": "-" + }, + "maxResponseTime": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "meanResponseTime": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "standardDeviation": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "percentiles1": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "percentiles2": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "percentiles3": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "percentiles4": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 62, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.646", + "ok": "0.646", + "ko": "-" + } +} + },"req_request-244-416e5": { + type: "REQUEST", + name: "request_244", +path: "request_244", +pathFormatted: "req_request-244-416e5", +stats: { + "name": "request_244", + "numberOfRequests": { + "total": "46", + "ok": "46", + "ko": "0" + }, + "minResponseTime": { + "total": "35", + "ok": "35", + "ko": "-" + }, + "maxResponseTime": { + "total": "98", + "ok": "98", + "ko": "-" + }, + "meanResponseTime": { + "total": "47", + "ok": "47", + "ko": "-" + }, + "standardDeviation": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "percentiles1": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "percentiles2": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "percentiles3": { + "total": "84", + "ok": "84", + "ko": "-" + }, + "percentiles4": { + "total": "93", + "ok": "93", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 46, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.479", + "ok": "0.479", + "ko": "-" + } +} + },"req_request-250-8cb1f": { + type: "REQUEST", + name: "request_250", +path: "request_250", +pathFormatted: "req_request-250-8cb1f", +stats: { + "name": "request_250", + "numberOfRequests": { + "total": "76", + "ok": "67", + "ko": "9" + }, + "minResponseTime": { + "total": "340", + "ok": "340", + "ko": "824" + }, + "maxResponseTime": { + "total": "3229", + "ok": "3229", + "ko": "2671" + }, + "meanResponseTime": { + "total": "1081", + "ok": "1030", + "ko": "1457" + }, + "standardDeviation": { + "total": "577", + "ok": "549", + "ko": "637" + }, + "percentiles1": { + "total": "900", + "ok": "895", + "ko": "1476" + }, + "percentiles2": { + "total": "1364", + "ok": "1210", + "ko": "2031" + }, + "percentiles3": { + "total": "2230", + "ok": "2214", + "ko": "2416" + }, + "percentiles4": { + "total": "2811", + "ok": "2757", + "ko": "2620" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 28, + "percentage": 37 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 29 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.698", + "ko": "0.094" + } +} + },"req_request-252-38647": { + type: "REQUEST", + name: "request_252", +path: "request_252", +pathFormatted: "req_request-252-38647", +stats: { + "name": "request_252", + "numberOfRequests": { + "total": "76", + "ok": "65", + "ko": "11" + }, + "minResponseTime": { + "total": "445", + "ok": "445", + "ko": "821" + }, + "maxResponseTime": { + "total": "2728", + "ok": "2728", + "ko": "1535" + }, + "meanResponseTime": { + "total": "1085", + "ok": "1065", + "ko": "1207" + }, + "standardDeviation": { + "total": "453", + "ok": "468", + "ko": "325" + }, + "percentiles1": { + "total": "935", + "ok": "926", + "ko": "1466" + }, + "percentiles2": { + "total": "1404", + "ok": "1223", + "ko": "1503" + }, + "percentiles3": { + "total": "1952", + "ok": "1984", + "ko": "1531" + }, + "percentiles4": { + "total": "2691", + "ok": "2696", + "ko": "1534" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 20, + "percentage": 26 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 28, + "percentage": 37 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 11, + "percentage": 14 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.677", + "ko": "0.115" + } +} + },"req_request-260-43b5f": { + type: "REQUEST", + name: "request_260", +path: "request_260", +pathFormatted: "req_request-260-43b5f", +stats: { + "name": "request_260", + "numberOfRequests": { + "total": "76", + "ok": "61", + "ko": "15" + }, + "minResponseTime": { + "total": "235", + "ok": "417", + "ko": "235" + }, + "maxResponseTime": { + "total": "3229", + "ok": "3229", + "ko": "2120" + }, + "meanResponseTime": { + "total": "1159", + "ok": "1124", + "ko": "1301" + }, + "standardDeviation": { + "total": "636", + "ok": "655", + "ko": "530" + }, + "percentiles1": { + "total": "910", + "ok": "899", + "ko": "1445" + }, + "percentiles2": { + "total": "1447", + "ok": "1269", + "ko": "1492" + }, + "percentiles3": { + "total": "2570", + "ok": "2575", + "ko": "2090" + }, + "percentiles4": { + "total": "3217", + "ok": "3219", + "ko": "2114" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 29 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 16, + "percentage": 21 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 15, + "percentage": 20 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.635", + "ko": "0.156" + } +} + },"req_request-265-cf160": { + type: "REQUEST", + name: "request_265", +path: "request_265", +pathFormatted: "req_request-265-cf160", +stats: { + "name": "request_265", + "numberOfRequests": { + "total": "76", + "ok": "60", + "ko": "16" + }, + "minResponseTime": { + "total": "239", + "ok": "563", + "ko": "239" + }, + "maxResponseTime": { + "total": "3544", + "ok": "3544", + "ko": "2695" + }, + "meanResponseTime": { + "total": "1271", + "ok": "1252", + "ko": "1343" + }, + "standardDeviation": { + "total": "598", + "ok": "602", + "ko": "580" + }, + "percentiles1": { + "total": "1063", + "ok": "1060", + "ko": "1449" + }, + "percentiles2": { + "total": "1511", + "ok": "1531", + "ko": "1492" + }, + "percentiles3": { + "total": "2505", + "ok": "2480", + "ko": "2215" + }, + "percentiles4": { + "total": "2907", + "ok": "2992", + "ko": "2599" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 14, + "percentage": 18 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 21, + "percentage": 28 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 25, + "percentage": 33 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 16, + "percentage": 21 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.792", + "ok": "0.625", + "ko": "0.167" + } +} + },"req_request-273-0cd3c": { + type: "REQUEST", + name: "request_273", +path: "request_273", +pathFormatted: "req_request-273-0cd3c", +stats: { + "name": "request_273", + "numberOfRequests": { + "total": "50", + "ok": "47", + "ko": "3" + }, + "minResponseTime": { + "total": "220", + "ok": "321", + "ko": "220" + }, + "maxResponseTime": { + "total": "2002", + "ok": "2002", + "ko": "249" + }, + "meanResponseTime": { + "total": "691", + "ok": "720", + "ko": "233" + }, + "standardDeviation": { + "total": "409", + "ok": "405", + "ko": "12" + }, + "percentiles1": { + "total": "563", + "ok": "592", + "ko": "229" + }, + "percentiles2": { + "total": "941", + "ok": "961", + "ko": "239" + }, + "percentiles3": { + "total": "1458", + "ok": "1464", + "ko": "247" + }, + "percentiles4": { + "total": "1988", + "ok": "1989", + "ko": "249" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 31, + "percentage": 62 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 12, + "percentage": 24 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 6 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.49", + "ko": "0.031" + } +} + },"req_request-277-d0ec5": { + type: "REQUEST", + name: "request_277", +path: "request_277", +pathFormatted: "req_request-277-d0ec5", +stats: { + "name": "request_277", + "numberOfRequests": { + "total": "29", + "ok": "29", + "ko": "0" + }, + "minResponseTime": { + "total": "329", + "ok": "329", + "ko": "-" + }, + "maxResponseTime": { + "total": "1905", + "ok": "1905", + "ko": "-" + }, + "meanResponseTime": { + "total": "720", + "ok": "720", + "ko": "-" + }, + "standardDeviation": { + "total": "397", + "ok": "397", + "ko": "-" + }, + "percentiles1": { + "total": "524", + "ok": "524", + "ko": "-" + }, + "percentiles2": { + "total": "966", + "ok": "966", + "ko": "-" + }, + "percentiles3": { + "total": "1483", + "ok": "1483", + "ko": "-" + }, + "percentiles4": { + "total": "1788", + "ok": "1788", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 19, + "percentage": 66 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 24 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.302", + "ok": "0.302", + "ko": "-" + } +} + },"req_request-270-e02a1": { + type: "REQUEST", + name: "request_270", +path: "request_270", +pathFormatted: "req_request-270-e02a1", +stats: { + "name": "request_270", + "numberOfRequests": { + "total": "26", + "ok": "21", + "ko": "5" + }, + "minResponseTime": { + "total": "232", + "ok": "321", + "ko": "232" + }, + "maxResponseTime": { + "total": "1785", + "ok": "1785", + "ko": "835" + }, + "meanResponseTime": { + "total": "763", + "ok": "832", + "ko": "475" + }, + "standardDeviation": { + "total": "381", + "ok": "367", + "ko": "292" + }, + "percentiles1": { + "total": "688", + "ok": "759", + "ko": "240" + }, + "percentiles2": { + "total": "1008", + "ok": "1089", + "ko": "831" + }, + "percentiles3": { + "total": "1396", + "ok": "1407", + "ko": "834" + }, + "percentiles4": { + "total": "1691", + "ok": "1709", + "ko": "835" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 12, + "percentage": 46 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 23 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 12 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.271", + "ok": "0.219", + "ko": "0.052" + } +} + },"req_request-322-a2de9": { + type: "REQUEST", + name: "request_322", +path: "request_322", +pathFormatted: "req_request-322-a2de9", +stats: { + "name": "request_322", + "numberOfRequests": { + "total": "150", + "ok": "150", + "ko": "0" + }, + "minResponseTime": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "maxResponseTime": { + "total": "95", + "ok": "95", + "ko": "-" + }, + "meanResponseTime": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "standardDeviation": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles1": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles2": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles3": { + "total": "72", + "ok": "72", + "ko": "-" + }, + "percentiles4": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.562", + "ok": "1.562", + "ko": "-" + } +} + },"req_request-323-2fefc": { + type: "REQUEST", + name: "request_323", +path: "request_323", +pathFormatted: "req_request-323-2fefc", +stats: { + "name": "request_323", + "numberOfRequests": { + "total": "150", + "ok": "150", + "ko": "0" + }, + "minResponseTime": { + "total": "49", + "ok": "49", + "ko": "-" + }, + "maxResponseTime": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "meanResponseTime": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "percentiles2": { + "total": "69", + "ok": "69", + "ko": "-" + }, + "percentiles3": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles4": { + "total": "95", + "ok": "95", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.562", + "ok": "1.562", + "ko": "-" + } +} + } +} + +} + +function fillStats(stat){ + $("#numberOfRequests").append(stat.numberOfRequests.total); + $("#numberOfRequestsOK").append(stat.numberOfRequests.ok); + $("#numberOfRequestsKO").append(stat.numberOfRequests.ko); + + $("#minResponseTime").append(stat.minResponseTime.total); + $("#minResponseTimeOK").append(stat.minResponseTime.ok); + $("#minResponseTimeKO").append(stat.minResponseTime.ko); + + $("#maxResponseTime").append(stat.maxResponseTime.total); + $("#maxResponseTimeOK").append(stat.maxResponseTime.ok); + $("#maxResponseTimeKO").append(stat.maxResponseTime.ko); + + $("#meanResponseTime").append(stat.meanResponseTime.total); + $("#meanResponseTimeOK").append(stat.meanResponseTime.ok); + $("#meanResponseTimeKO").append(stat.meanResponseTime.ko); + + $("#standardDeviation").append(stat.standardDeviation.total); + $("#standardDeviationOK").append(stat.standardDeviation.ok); + $("#standardDeviationKO").append(stat.standardDeviation.ko); + + $("#percentiles1").append(stat.percentiles1.total); + $("#percentiles1OK").append(stat.percentiles1.ok); + $("#percentiles1KO").append(stat.percentiles1.ko); + + $("#percentiles2").append(stat.percentiles2.total); + $("#percentiles2OK").append(stat.percentiles2.ok); + $("#percentiles2KO").append(stat.percentiles2.ko); + + $("#percentiles3").append(stat.percentiles3.total); + $("#percentiles3OK").append(stat.percentiles3.ok); + $("#percentiles3KO").append(stat.percentiles3.ko); + + $("#percentiles4").append(stat.percentiles4.total); + $("#percentiles4OK").append(stat.percentiles4.ok); + $("#percentiles4KO").append(stat.percentiles4.ko); + + $("#meanNumberOfRequestsPerSecond").append(stat.meanNumberOfRequestsPerSecond.total); + $("#meanNumberOfRequestsPerSecondOK").append(stat.meanNumberOfRequestsPerSecond.ok); + $("#meanNumberOfRequestsPerSecondKO").append(stat.meanNumberOfRequestsPerSecond.ko); +} diff --git a/webapp/loadTests/150users1minute/js/stats.json b/webapp/loadTests/150users1minute/js/stats.json new file mode 100644 index 0000000..1c161a3 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/stats.json @@ -0,0 +1,4023 @@ +{ + "type": "GROUP", +"name": "All Requests", +"path": "", +"pathFormatted": "group_missing-name-b06d1", +"stats": { + "name": "All Requests", + "numberOfRequests": { + "total": 4184, + "ok": 3638, + "ko": 546 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 179 + }, + "maxResponseTime": { + "total": 3544, + "ok": 3544, + "ko": 2696 + }, + "meanResponseTime": { + "total": 415, + "ok": 369, + "ko": 717 + }, + "standardDeviation": { + "total": 569, + "ok": 527, + "ko": 723 + }, + "percentiles1": { + "total": 120, + "ok": 80, + "ko": 212 + }, + "percentiles2": { + "total": 627, + "ok": 567, + "ko": 857 + }, + "percentiles3": { + "total": 1591, + "ok": 1467, + "ko": 2534 + }, + "percentiles4": { + "total": 2573, + "ok": 2376, + "ko": 2647 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3034, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 312, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 292, + "percentage": 7 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 546, + "percentage": 13 +}, + "meanNumberOfRequestsPerSecond": { + "total": 43.583333333333336, + "ok": 37.895833333333336, + "ko": 5.6875 + } +}, +"contents": { +"req_request-0-684d2": { + "type": "REQUEST", + "name": "request_0", +"path": "request_0", +"pathFormatted": "req_request-0-684d2", +"stats": { + "name": "request_0", + "numberOfRequests": { + "total": 150, + "ok": 150, + "ko": 0 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "maxResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "meanResponseTime": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "standardDeviation": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles1": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "percentiles2": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles3": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles4": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.5625, + "ok": 1.5625, + "ko": 0 + } +} + },"req_request-1-46da4": { + "type": "REQUEST", + "name": "request_1", +"path": "request_1", +"pathFormatted": "req_request-1-46da4", +"stats": { + "name": "request_1", + "numberOfRequests": { + "total": 150, + "ok": 150, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "meanResponseTime": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "standardDeviation": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles3": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles4": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.5625, + "ok": 1.5625, + "ko": 0 + } +} + },"req_request-2-93baf": { + "type": "REQUEST", + "name": "request_2", +"path": "request_2", +"pathFormatted": "req_request-2-93baf", +"stats": { + "name": "request_2", + "numberOfRequests": { + "total": 150, + "ok": 120, + "ko": 30 + }, + "minResponseTime": { + "total": 184, + "ok": 412, + "ko": 184 + }, + "maxResponseTime": { + "total": 2909, + "ok": 2909, + "ko": 2489 + }, + "meanResponseTime": { + "total": 753, + "ok": 759, + "ko": 731 + }, + "standardDeviation": { + "total": 542, + "ok": 522, + "ko": 616 + }, + "percentiles1": { + "total": 520, + "ok": 505, + "ko": 790 + }, + "percentiles2": { + "total": 811, + "ok": 755, + "ko": 813 + }, + "percentiles3": { + "total": 1988, + "ok": 1876, + "ko": 1988 + }, + "percentiles4": { + "total": 2505, + "ok": 2510, + "ko": 2349 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 91, + "percentage": 61 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 16, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 30, + "percentage": 20 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.5625, + "ok": 1.25, + "ko": 0.3125 + } +} + },"req_request-3-d0973": { + "type": "REQUEST", + "name": "request_3", +"path": "request_3", +"pathFormatted": "req_request-3-d0973", +"stats": { + "name": "request_3", + "numberOfRequests": { + "total": 120, + "ok": 120, + "ko": 0 + }, + "minResponseTime": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "maxResponseTime": { + "total": 549, + "ok": 549, + "ko": 0 + }, + "meanResponseTime": { + "total": 162, + "ok": 162, + "ko": 0 + }, + "standardDeviation": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "percentiles1": { + "total": 103, + "ok": 103, + "ko": 0 + }, + "percentiles2": { + "total": 205, + "ok": 205, + "ko": 0 + }, + "percentiles3": { + "total": 392, + "ok": 392, + "ko": 0 + }, + "percentiles4": { + "total": 479, + "ok": 479, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 120, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.25, + "ok": 1.25, + "ko": 0 + } +} + },"req_request-5-48829": { + "type": "REQUEST", + "name": "request_5", +"path": "request_5", +"pathFormatted": "req_request-5-48829", +"stats": { + "name": "request_5", + "numberOfRequests": { + "total": 120, + "ok": 82, + "ko": 38 + }, + "minResponseTime": { + "total": 179, + "ok": 367, + "ko": 179 + }, + "maxResponseTime": { + "total": 2850, + "ok": 2850, + "ko": 2645 + }, + "meanResponseTime": { + "total": 658, + "ok": 674, + "ko": 622 + }, + "standardDeviation": { + "total": 564, + "ok": 450, + "ko": 753 + }, + "percentiles1": { + "total": 425, + "ok": 460, + "ko": 201 + }, + "percentiles2": { + "total": 795, + "ok": 736, + "ko": 796 + }, + "percentiles3": { + "total": 1730, + "ok": 1639, + "ko": 2614 + }, + "percentiles4": { + "total": 2643, + "ok": 2059, + "ko": 2642 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 63, + "percentage": 53 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 9, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 10, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 38, + "percentage": 32 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.25, + "ok": 0.8541666666666666, + "ko": 0.3958333333333333 + } +} + },"req_request-6-027a9": { + "type": "REQUEST", + "name": "request_6", +"path": "request_6", +"pathFormatted": "req_request-6-027a9", +"stats": { + "name": "request_6", + "numberOfRequests": { + "total": 120, + "ok": 76, + "ko": 44 + }, + "minResponseTime": { + "total": 179, + "ok": 544, + "ko": 179 + }, + "maxResponseTime": { + "total": 2645, + "ok": 2239, + "ko": 2645 + }, + "meanResponseTime": { + "total": 777, + "ok": 881, + "ko": 597 + }, + "standardDeviation": { + "total": 601, + "ok": 424, + "ko": 788 + }, + "percentiles1": { + "total": 605, + "ok": 648, + "ko": 200 + }, + "percentiles2": { + "total": 925, + "ok": 1191, + "ko": 612 + }, + "percentiles3": { + "total": 2056, + "ok": 1763, + "ko": 2578 + }, + "percentiles4": { + "total": 2594, + "ok": 2094, + "ko": 2624 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 41 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 19, + "percentage": 16 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 44, + "percentage": 37 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.25, + "ok": 0.7916666666666666, + "ko": 0.4583333333333333 + } +} + },"req_request-4-e7d1b": { + "type": "REQUEST", + "name": "request_4", +"path": "request_4", +"pathFormatted": "req_request-4-e7d1b", +"stats": { + "name": "request_4", + "numberOfRequests": { + "total": 120, + "ok": 76, + "ko": 44 + }, + "minResponseTime": { + "total": 179, + "ok": 406, + "ko": 179 + }, + "maxResponseTime": { + "total": 2647, + "ok": 1723, + "ko": 2647 + }, + "meanResponseTime": { + "total": 629, + "ok": 672, + "ko": 555 + }, + "standardDeviation": { + "total": 503, + "ok": 376, + "ko": 660 + }, + "percentiles1": { + "total": 458, + "ok": 472, + "ko": 200 + }, + "percentiles2": { + "total": 791, + "ok": 729, + "ko": 796 + }, + "percentiles3": { + "total": 1663, + "ok": 1625, + "ko": 2398 + }, + "percentiles4": { + "total": 2604, + "ok": 1703, + "ko": 2632 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 58, + "percentage": 48 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 11, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 44, + "percentage": 37 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.25, + "ok": 0.7916666666666666, + "ko": 0.4583333333333333 + } +} + },"req_request-7-f222f": { + "type": "REQUEST", + "name": "request_7", +"path": "request_7", +"pathFormatted": "req_request-7-f222f", +"stats": { + "name": "request_7", + "numberOfRequests": { + "total": 120, + "ok": 74, + "ko": 46 + }, + "minResponseTime": { + "total": 179, + "ok": 365, + "ko": 179 + }, + "maxResponseTime": { + "total": 2647, + "ok": 1871, + "ko": 2647 + }, + "meanResponseTime": { + "total": 616, + "ok": 634, + "ko": 587 + }, + "standardDeviation": { + "total": 523, + "ok": 361, + "ko": 709 + }, + "percentiles1": { + "total": 421, + "ok": 458, + "ko": 200 + }, + "percentiles2": { + "total": 776, + "ok": 694, + "ko": 793 + }, + "percentiles3": { + "total": 1639, + "ok": 1418, + "ko": 2564 + }, + "percentiles4": { + "total": 2627, + "ok": 1729, + "ko": 2642 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 57, + "percentage": 48 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 6, + "percentage": 5 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 46, + "percentage": 38 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.25, + "ok": 0.7708333333333334, + "ko": 0.4791666666666667 + } +} + },"req_request-5-redir-affb3": { + "type": "REQUEST", + "name": "request_5 Redirect 1", +"path": "request_5 Redirect 1", +"pathFormatted": "req_request-5-redir-affb3", +"stats": { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": 82, + "ok": 82, + "ko": 0 + }, + "minResponseTime": { + "total": 95, + "ok": 95, + "ko": 0 + }, + "maxResponseTime": { + "total": 922, + "ok": 922, + "ko": 0 + }, + "meanResponseTime": { + "total": 213, + "ok": 213, + "ko": 0 + }, + "standardDeviation": { + "total": 209, + "ok": 209, + "ko": 0 + }, + "percentiles1": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "percentiles2": { + "total": 179, + "ok": 179, + "ko": 0 + }, + "percentiles3": { + "total": 740, + "ok": 740, + "ko": 0 + }, + "percentiles4": { + "total": 845, + "ok": 845, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 78, + "percentage": 95 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 5 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8541666666666666, + "ok": 0.8541666666666666, + "ko": 0 + } +} + },"req_request-8-ef0c8": { + "type": "REQUEST", + "name": "request_8", +"path": "request_8", +"pathFormatted": "req_request-8-ef0c8", +"stats": { + "name": "request_8", + "numberOfRequests": { + "total": 150, + "ok": 100, + "ko": 50 + }, + "minResponseTime": { + "total": 179, + "ok": 409, + "ko": 179 + }, + "maxResponseTime": { + "total": 3421, + "ok": 3421, + "ko": 2538 + }, + "meanResponseTime": { + "total": 906, + "ok": 1042, + "ko": 636 + }, + "standardDeviation": { + "total": 647, + "ok": 608, + "ko": 639 + }, + "percentiles1": { + "total": 797, + "ok": 955, + "ko": 200 + }, + "percentiles2": { + "total": 1219, + "ok": 1220, + "ko": 821 + }, + "percentiles3": { + "total": 2319, + "ok": 2397, + "ko": 1747 + }, + "percentiles4": { + "total": 2902, + "ok": 2928, + "ko": 2519 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 41, + "percentage": 27 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 30, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 29, + "percentage": 19 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 50, + "percentage": 33 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.5625, + "ok": 1.0416666666666667, + "ko": 0.5208333333333334 + } +} + },"req_request-8-redir-98b2a": { + "type": "REQUEST", + "name": "request_8 Redirect 1", +"path": "request_8 Redirect 1", +"pathFormatted": "req_request-8-redir-98b2a", +"stats": { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": 100, + "ok": 85, + "ko": 15 + }, + "minResponseTime": { + "total": 179, + "ok": 184, + "ko": 179 + }, + "maxResponseTime": { + "total": 2540, + "ok": 2271, + "ko": 2540 + }, + "meanResponseTime": { + "total": 706, + "ok": 706, + "ko": 709 + }, + "standardDeviation": { + "total": 520, + "ok": 454, + "ko": 797 + }, + "percentiles1": { + "total": 523, + "ok": 529, + "ko": 209 + }, + "percentiles2": { + "total": 961, + "ok": 987, + "ko": 796 + }, + "percentiles3": { + "total": 1799, + "ok": 1665, + "ko": 2527 + }, + "percentiles4": { + "total": 2521, + "ok": 2094, + "ko": 2537 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 60, + "percentage": 60 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 12, + "percentage": 12 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 15, + "percentage": 15 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.0416666666666667, + "ok": 0.8854166666666666, + "ko": 0.15625 + } +} + },"req_request-8-redir-fc911": { + "type": "REQUEST", + "name": "request_8 Redirect 2", +"path": "request_8 Redirect 2", +"pathFormatted": "req_request-8-redir-fc911", +"stats": { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": 85, + "ok": 76, + "ko": 9 + }, + "minResponseTime": { + "total": 190, + "ok": 227, + "ko": 190 + }, + "maxResponseTime": { + "total": 2913, + "ok": 2913, + "ko": 1398 + }, + "meanResponseTime": { + "total": 682, + "ok": 715, + "ko": 404 + }, + "standardDeviation": { + "total": 557, + "ok": 564, + "ko": 398 + }, + "percentiles1": { + "total": 468, + "ok": 482, + "ko": 209 + }, + "percentiles2": { + "total": 940, + "ok": 950, + "ko": 223 + }, + "percentiles3": { + "total": 1807, + "ok": 1820, + "ko": 1160 + }, + "percentiles4": { + "total": 2431, + "ok": 2483, + "ko": 1350 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 55, + "percentage": 65 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 9, + "percentage": 11 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 12, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 11 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8854166666666666, + "ok": 0.7916666666666666, + "ko": 0.09375 + } +} + },"req_request-8-redir-e875c": { + "type": "REQUEST", + "name": "request_8 Redirect 3", +"path": "request_8 Redirect 3", +"pathFormatted": "req_request-8-redir-e875c", +"stats": { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "maxResponseTime": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "meanResponseTime": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "standardDeviation": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles1": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "percentiles2": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles3": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "percentiles4": { + "total": 31, + "ok": 31, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-12-61da2": { + "type": "REQUEST", + "name": "request_12", +"path": "request_12", +"pathFormatted": "req_request-12-61da2", +"stats": { + "name": "request_12", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 83, + "ok": 83, + "ko": 0 + }, + "meanResponseTime": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles3": { + "total": 31, + "ok": 31, + "ko": 0 + }, + "percentiles4": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-14-a0e30": { + "type": "REQUEST", + "name": "request_14", +"path": "request_14", +"pathFormatted": "req_request-14-a0e30", +"stats": { + "name": "request_14", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "maxResponseTime": { + "total": 89, + "ok": 89, + "ko": 0 + }, + "meanResponseTime": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles2": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles3": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "percentiles4": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-22-8ecb1": { + "type": "REQUEST", + "name": "request_22", +"path": "request_22", +"pathFormatted": "req_request-22-8ecb1", +"stats": { + "name": "request_22", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "maxResponseTime": { + "total": 144, + "ok": 144, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "percentiles1": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles2": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "percentiles3": { + "total": 80, + "ok": 80, + "ko": 0 + }, + "percentiles4": { + "total": 127, + "ok": 127, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-21-be4cb": { + "type": "REQUEST", + "name": "request_21", +"path": "request_21", +"pathFormatted": "req_request-21-be4cb", +"stats": { + "name": "request_21", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "maxResponseTime": { + "total": 144, + "ok": 144, + "ko": 0 + }, + "meanResponseTime": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "standardDeviation": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles1": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "percentiles2": { + "total": 57, + "ok": 57, + "ko": 0 + }, + "percentiles3": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "percentiles4": { + "total": 107, + "ok": 107, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-24-dd0c9": { + "type": "REQUEST", + "name": "request_24", +"path": "request_24", +"pathFormatted": "req_request-24-dd0c9", +"stats": { + "name": "request_24", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "maxResponseTime": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "meanResponseTime": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "standardDeviation": { + "total": 18, + "ok": 18, + "ko": 0 + }, + "percentiles1": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles2": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles3": { + "total": 81, + "ok": 81, + "ko": 0 + }, + "percentiles4": { + "total": 137, + "ok": 137, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-200-636fa": { + "type": "REQUEST", + "name": "request_200", +"path": "request_200", +"pathFormatted": "req_request-200-636fa", +"stats": { + "name": "request_200", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "maxResponseTime": { + "total": 155, + "ok": 155, + "ko": 0 + }, + "meanResponseTime": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "standardDeviation": { + "total": 18, + "ok": 18, + "ko": 0 + }, + "percentiles1": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "percentiles2": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles3": { + "total": 85, + "ok": 85, + "ko": 0 + }, + "percentiles4": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-13-5cca6": { + "type": "REQUEST", + "name": "request_13", +"path": "request_13", +"pathFormatted": "req_request-13-5cca6", +"stats": { + "name": "request_13", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "maxResponseTime": { + "total": 171, + "ok": 171, + "ko": 0 + }, + "meanResponseTime": { + "total": 85, + "ok": 85, + "ko": 0 + }, + "standardDeviation": { + "total": 24, + "ok": 24, + "ko": 0 + }, + "percentiles1": { + "total": 79, + "ok": 79, + "ko": 0 + }, + "percentiles2": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles3": { + "total": 143, + "ok": 143, + "ko": 0 + }, + "percentiles4": { + "total": 161, + "ok": 161, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-16-24733": { + "type": "REQUEST", + "name": "request_16", +"path": "request_16", +"pathFormatted": "req_request-16-24733", +"stats": { + "name": "request_16", + "numberOfRequests": { + "total": 76, + "ok": 42, + "ko": 34 + }, + "minResponseTime": { + "total": 89, + "ok": 89, + "ko": 183 + }, + "maxResponseTime": { + "total": 2573, + "ok": 2494, + "ko": 2573 + }, + "meanResponseTime": { + "total": 659, + "ok": 646, + "ko": 674 + }, + "standardDeviation": { + "total": 657, + "ok": 534, + "ko": 783 + }, + "percentiles1": { + "total": 469, + "ok": 581, + "ko": 211 + }, + "percentiles2": { + "total": 812, + "ok": 871, + "ko": 803 + }, + "percentiles3": { + "total": 2507, + "ok": 1792, + "ko": 2566 + }, + "percentiles4": { + "total": 2569, + "ok": 2260, + "ko": 2571 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 31, + "percentage": 41 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 5 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 34, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.4375, + "ko": 0.3541666666666667 + } +} + },"req_request-15-56eac": { + "type": "REQUEST", + "name": "request_15", +"path": "request_15", +"pathFormatted": "req_request-15-56eac", +"stats": { + "name": "request_15", + "numberOfRequests": { + "total": 76, + "ok": 63, + "ko": 13 + }, + "minResponseTime": { + "total": 89, + "ok": 89, + "ko": 185 + }, + "maxResponseTime": { + "total": 2545, + "ok": 1992, + "ko": 2545 + }, + "meanResponseTime": { + "total": 520, + "ok": 447, + "ko": 875 + }, + "standardDeviation": { + "total": 603, + "ok": 465, + "ko": 963 + }, + "percentiles1": { + "total": 205, + "ok": 200, + "ko": 205 + }, + "percentiles2": { + "total": 765, + "ok": 725, + "ko": 1404 + }, + "percentiles3": { + "total": 1859, + "ok": 1263, + "ko": 2522 + }, + "percentiles4": { + "total": 2517, + "ok": 1882, + "ko": 2540 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 51, + "percentage": 67 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 7 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 13, + "percentage": 17 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.65625, + "ko": 0.13541666666666666 + } +} + },"req_logo-png-c9c2b": { + "type": "REQUEST", + "name": "Logo.png", +"path": "Logo.png", +"pathFormatted": "req_logo-png-c9c2b", +"stats": { + "name": "Logo.png", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "maxResponseTime": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "meanResponseTime": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles2": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles3": { + "total": 37, + "ok": 37, + "ko": 0 + }, + "percentiles4": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-18-f5b64": { + "type": "REQUEST", + "name": "request_18", +"path": "request_18", +"pathFormatted": "req_request-18-f5b64", +"stats": { + "name": "request_18", + "numberOfRequests": { + "total": 76, + "ok": 54, + "ko": 22 + }, + "minResponseTime": { + "total": 180, + "ok": 180, + "ko": 181 + }, + "maxResponseTime": { + "total": 2594, + "ok": 2594, + "ko": 1407 + }, + "meanResponseTime": { + "total": 503, + "ok": 528, + "ko": 441 + }, + "standardDeviation": { + "total": 488, + "ok": 507, + "ko": 430 + }, + "percentiles1": { + "total": 255, + "ok": 310, + "ko": 202 + }, + "percentiles2": { + "total": 699, + "ok": 684, + "ko": 645 + }, + "percentiles3": { + "total": 1389, + "ok": 1303, + "ko": 1383 + }, + "percentiles4": { + "total": 2575, + "ok": 2581, + "ko": 1402 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 45, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 22, + "percentage": 29 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.5625, + "ko": 0.22916666666666666 + } +} + },"req_bundle-js-0b837": { + "type": "REQUEST", + "name": "bundle.js", +"path": "bundle.js", +"pathFormatted": "req_bundle-js-0b837", +"stats": { + "name": "bundle.js", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "maxResponseTime": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "meanResponseTime": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "standardDeviation": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles1": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "percentiles2": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles3": { + "total": 29, + "ok": 29, + "ko": 0 + }, + "percentiles4": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-9-d127e": { + "type": "REQUEST", + "name": "request_9", +"path": "request_9", +"pathFormatted": "req_request-9-d127e", +"stats": { + "name": "request_9", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "maxResponseTime": { + "total": 68, + "ok": 68, + "ko": 0 + }, + "meanResponseTime": { + "total": 24, + "ok": 24, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "percentiles2": { + "total": 27, + "ok": 27, + "ko": 0 + }, + "percentiles3": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "percentiles4": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-242-d6d33": { + "type": "REQUEST", + "name": "request_242", +"path": "request_242", +"pathFormatted": "req_request-242-d6d33", +"stats": { + "name": "request_242", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "maxResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "meanResponseTime": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "percentiles2": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "percentiles3": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles4": { + "total": 61, + "ok": 61, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-10-1cfbe": { + "type": "REQUEST", + "name": "request_10", +"path": "request_10", +"pathFormatted": "req_request-10-1cfbe", +"stats": { + "name": "request_10", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "maxResponseTime": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "meanResponseTime": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "percentiles2": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "percentiles3": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles4": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-11-f11e8": { + "type": "REQUEST", + "name": "request_11", +"path": "request_11", +"pathFormatted": "req_request-11-f11e8", +"stats": { + "name": "request_11", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "maxResponseTime": { + "total": 165, + "ok": 165, + "ko": 0 + }, + "meanResponseTime": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "standardDeviation": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "percentiles1": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "percentiles2": { + "total": 69, + "ok": 69, + "ko": 0 + }, + "percentiles3": { + "total": 131, + "ok": 131, + "ko": 0 + }, + "percentiles4": { + "total": 161, + "ok": 161, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_css2-family-rob-cf8a9": { + "type": "REQUEST", + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"path": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"pathFormatted": "req_css2-family-rob-cf8a9", +"stats": { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "maxResponseTime": { + "total": 206, + "ok": 206, + "ko": 0 + }, + "meanResponseTime": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "standardDeviation": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "percentiles1": { + "total": 114, + "ok": 114, + "ko": 0 + }, + "percentiles2": { + "total": 132, + "ok": 132, + "ko": 0 + }, + "percentiles3": { + "total": 167, + "ok": 167, + "ko": 0 + }, + "percentiles4": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-19-10d85": { + "type": "REQUEST", + "name": "request_19", +"path": "request_19", +"pathFormatted": "req_request-19-10d85", +"stats": { + "name": "request_19", + "numberOfRequests": { + "total": 76, + "ok": 34, + "ko": 42 + }, + "minResponseTime": { + "total": 182, + "ok": 722, + "ko": 182 + }, + "maxResponseTime": { + "total": 2636, + "ok": 2591, + "ko": 2636 + }, + "meanResponseTime": { + "total": 1051, + "ok": 1521, + "ko": 669 + }, + "standardDeviation": { + "total": 730, + "ok": 464, + "ko": 681 + }, + "percentiles1": { + "total": 1043, + "ok": 1443, + "ko": 213 + }, + "percentiles2": { + "total": 1479, + "ok": 1813, + "ko": 816 + }, + "percentiles3": { + "total": 2420, + "ok": 2382, + "ko": 2451 + }, + "percentiles4": { + "total": 2602, + "ok": 2525, + "ko": 2607 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 1 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 26, + "percentage": 34 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 42, + "percentage": 55 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.3541666666666667, + "ko": 0.4375 + } +} + },"req_request-20-6804b": { + "type": "REQUEST", + "name": "request_20", +"path": "request_20", +"pathFormatted": "req_request-20-6804b", +"stats": { + "name": "request_20", + "numberOfRequests": { + "total": 76, + "ok": 37, + "ko": 39 + }, + "minResponseTime": { + "total": 183, + "ok": 490, + "ko": 183 + }, + "maxResponseTime": { + "total": 2636, + "ok": 1994, + "ko": 2636 + }, + "meanResponseTime": { + "total": 790, + "ok": 899, + "ko": 686 + }, + "standardDeviation": { + "total": 579, + "ok": 394, + "ko": 696 + }, + "percentiles1": { + "total": 687, + "ok": 748, + "ko": 203 + }, + "percentiles2": { + "total": 1123, + "ok": 1142, + "ko": 817 + }, + "percentiles3": { + "total": 1860, + "ok": 1742, + "ko": 2494 + }, + "percentiles4": { + "total": 2535, + "ok": 1930, + "ko": 2585 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 29 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 11 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 7, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 39, + "percentage": 51 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.3854166666666667, + "ko": 0.40625 + } +} + },"req_request-23-98f5d": { + "type": "REQUEST", + "name": "request_23", +"path": "request_23", +"pathFormatted": "req_request-23-98f5d", +"stats": { + "name": "request_23", + "numberOfRequests": { + "total": 76, + "ok": 34, + "ko": 42 + }, + "minResponseTime": { + "total": 182, + "ok": 721, + "ko": 182 + }, + "maxResponseTime": { + "total": 2636, + "ok": 2581, + "ko": 2636 + }, + "meanResponseTime": { + "total": 1069, + "ok": 1531, + "ko": 695 + }, + "standardDeviation": { + "total": 716, + "ok": 454, + "ko": 669 + }, + "percentiles1": { + "total": 1064, + "ok": 1372, + "ko": 206 + }, + "percentiles2": { + "total": 1435, + "ok": 1879, + "ko": 829 + }, + "percentiles3": { + "total": 2463, + "ok": 2257, + "ko": 2431 + }, + "percentiles4": { + "total": 2595, + "ok": 2540, + "ko": 2583 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 1 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 26, + "percentage": 34 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 42, + "percentage": 55 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.3541666666666667, + "ko": 0.4375 + } +} + },"req_request-222-24864": { + "type": "REQUEST", + "name": "request_222", +"path": "request_222", +"pathFormatted": "req_request-222-24864", +"stats": { + "name": "request_222", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 35, + "ok": 35, + "ko": 0 + }, + "maxResponseTime": { + "total": 116, + "ok": 116, + "ko": 0 + }, + "meanResponseTime": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "percentiles2": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles3": { + "total": 71, + "ok": 71, + "ko": 0 + }, + "percentiles4": { + "total": 85, + "ok": 85, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-227-2507b": { + "type": "REQUEST", + "name": "request_227", +"path": "request_227", +"pathFormatted": "req_request-227-2507b", +"stats": { + "name": "request_227", + "numberOfRequests": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "minResponseTime": { + "total": 36, + "ok": 36, + "ko": 0 + }, + "maxResponseTime": { + "total": 115, + "ok": 115, + "ko": 0 + }, + "meanResponseTime": { + "total": 47, + "ok": 47, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "percentiles2": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "percentiles3": { + "total": 69, + "ok": 69, + "ko": 0 + }, + "percentiles4": { + "total": 93, + "ok": 93, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 76, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.7916666666666666, + "ko": 0 + } +} + },"req_request-240-e27d8": { + "type": "REQUEST", + "name": "request_240", +"path": "request_240", +"pathFormatted": "req_request-240-e27d8", +"stats": { + "name": "request_240", + "numberOfRequests": { + "total": 76, + "ok": 67, + "ko": 9 + }, + "minResponseTime": { + "total": 241, + "ok": 327, + "ko": 241 + }, + "maxResponseTime": { + "total": 3222, + "ok": 3222, + "ko": 2676 + }, + "meanResponseTime": { + "total": 995, + "ok": 968, + "ko": 1200 + }, + "standardDeviation": { + "total": 608, + "ok": 597, + "ko": 652 + }, + "percentiles1": { + "total": 848, + "ok": 839, + "ko": 903 + }, + "percentiles2": { + "total": 1154, + "ok": 1095, + "ko": 1487 + }, + "percentiles3": { + "total": 2573, + "ok": 2498, + "ko": 2204 + }, + "percentiles4": { + "total": 2813, + "ok": 2862, + "ko": 2582 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 32, + "percentage": 42 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 29 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 13, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.6979166666666666, + "ko": 0.09375 + } +} + },"req_request-241-2919b": { + "type": "REQUEST", + "name": "request_241", +"path": "request_241", +"pathFormatted": "req_request-241-2919b", +"stats": { + "name": "request_241", + "numberOfRequests": { + "total": 76, + "ok": 66, + "ko": 10 + }, + "minResponseTime": { + "total": 231, + "ok": 296, + "ko": 231 + }, + "maxResponseTime": { + "total": 2696, + "ok": 2514, + "ko": 2696 + }, + "meanResponseTime": { + "total": 936, + "ok": 882, + "ko": 1291 + }, + "standardDeviation": { + "total": 490, + "ok": 390, + "ko": 823 + }, + "percentiles1": { + "total": 859, + "ok": 838, + "ko": 1194 + }, + "percentiles2": { + "total": 1037, + "ok": 997, + "ko": 1487 + }, + "percentiles3": { + "total": 1992, + "ok": 1532, + "ko": 2686 + }, + "percentiles4": { + "total": 2679, + "ok": 2262, + "ko": 2694 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 32, + "percentage": 42 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 26, + "percentage": 34 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 8, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 10, + "percentage": 13 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.6875, + "ko": 0.10416666666666667 + } +} + },"req_request-243-b078b": { + "type": "REQUEST", + "name": "request_243", +"path": "request_243", +"pathFormatted": "req_request-243-b078b", +"stats": { + "name": "request_243", + "numberOfRequests": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "minResponseTime": { + "total": 35, + "ok": 35, + "ko": 0 + }, + "maxResponseTime": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "meanResponseTime": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "standardDeviation": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "percentiles1": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "percentiles2": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "percentiles3": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "percentiles4": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 62, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6458333333333334, + "ok": 0.6458333333333334, + "ko": 0 + } +} + },"req_request-244-416e5": { + "type": "REQUEST", + "name": "request_244", +"path": "request_244", +"pathFormatted": "req_request-244-416e5", +"stats": { + "name": "request_244", + "numberOfRequests": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "minResponseTime": { + "total": 35, + "ok": 35, + "ko": 0 + }, + "maxResponseTime": { + "total": 98, + "ok": 98, + "ko": 0 + }, + "meanResponseTime": { + "total": 47, + "ok": 47, + "ko": 0 + }, + "standardDeviation": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "percentiles1": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "percentiles2": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "percentiles3": { + "total": 84, + "ok": 84, + "ko": 0 + }, + "percentiles4": { + "total": 93, + "ok": 93, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 46, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.4791666666666667, + "ok": 0.4791666666666667, + "ko": 0 + } +} + },"req_request-250-8cb1f": { + "type": "REQUEST", + "name": "request_250", +"path": "request_250", +"pathFormatted": "req_request-250-8cb1f", +"stats": { + "name": "request_250", + "numberOfRequests": { + "total": 76, + "ok": 67, + "ko": 9 + }, + "minResponseTime": { + "total": 340, + "ok": 340, + "ko": 824 + }, + "maxResponseTime": { + "total": 3229, + "ok": 3229, + "ko": 2671 + }, + "meanResponseTime": { + "total": 1081, + "ok": 1030, + "ko": 1457 + }, + "standardDeviation": { + "total": 577, + "ok": 549, + "ko": 637 + }, + "percentiles1": { + "total": 900, + "ok": 895, + "ko": 1476 + }, + "percentiles2": { + "total": 1364, + "ok": 1210, + "ko": 2031 + }, + "percentiles3": { + "total": 2230, + "ok": 2214, + "ko": 2416 + }, + "percentiles4": { + "total": 2811, + "ok": 2757, + "ko": 2620 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 28, + "percentage": 37 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 29 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.6979166666666666, + "ko": 0.09375 + } +} + },"req_request-252-38647": { + "type": "REQUEST", + "name": "request_252", +"path": "request_252", +"pathFormatted": "req_request-252-38647", +"stats": { + "name": "request_252", + "numberOfRequests": { + "total": 76, + "ok": 65, + "ko": 11 + }, + "minResponseTime": { + "total": 445, + "ok": 445, + "ko": 821 + }, + "maxResponseTime": { + "total": 2728, + "ok": 2728, + "ko": 1535 + }, + "meanResponseTime": { + "total": 1085, + "ok": 1065, + "ko": 1207 + }, + "standardDeviation": { + "total": 453, + "ok": 468, + "ko": 325 + }, + "percentiles1": { + "total": 935, + "ok": 926, + "ko": 1466 + }, + "percentiles2": { + "total": 1404, + "ok": 1223, + "ko": 1503 + }, + "percentiles3": { + "total": 1952, + "ok": 1984, + "ko": 1531 + }, + "percentiles4": { + "total": 2691, + "ok": 2696, + "ko": 1534 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 20, + "percentage": 26 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 28, + "percentage": 37 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 11, + "percentage": 14 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.6770833333333334, + "ko": 0.11458333333333333 + } +} + },"req_request-260-43b5f": { + "type": "REQUEST", + "name": "request_260", +"path": "request_260", +"pathFormatted": "req_request-260-43b5f", +"stats": { + "name": "request_260", + "numberOfRequests": { + "total": 76, + "ok": 61, + "ko": 15 + }, + "minResponseTime": { + "total": 235, + "ok": 417, + "ko": 235 + }, + "maxResponseTime": { + "total": 3229, + "ok": 3229, + "ko": 2120 + }, + "meanResponseTime": { + "total": 1159, + "ok": 1124, + "ko": 1301 + }, + "standardDeviation": { + "total": 636, + "ok": 655, + "ko": 530 + }, + "percentiles1": { + "total": 910, + "ok": 899, + "ko": 1445 + }, + "percentiles2": { + "total": 1447, + "ok": 1269, + "ko": 1492 + }, + "percentiles3": { + "total": 2570, + "ok": 2575, + "ko": 2090 + }, + "percentiles4": { + "total": 3217, + "ok": 3219, + "ko": 2114 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 29 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 16, + "percentage": 21 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 15, + "percentage": 20 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.6354166666666666, + "ko": 0.15625 + } +} + },"req_request-265-cf160": { + "type": "REQUEST", + "name": "request_265", +"path": "request_265", +"pathFormatted": "req_request-265-cf160", +"stats": { + "name": "request_265", + "numberOfRequests": { + "total": 76, + "ok": 60, + "ko": 16 + }, + "minResponseTime": { + "total": 239, + "ok": 563, + "ko": 239 + }, + "maxResponseTime": { + "total": 3544, + "ok": 3544, + "ko": 2695 + }, + "meanResponseTime": { + "total": 1271, + "ok": 1252, + "ko": 1343 + }, + "standardDeviation": { + "total": 598, + "ok": 602, + "ko": 580 + }, + "percentiles1": { + "total": 1063, + "ok": 1060, + "ko": 1449 + }, + "percentiles2": { + "total": 1511, + "ok": 1531, + "ko": 1492 + }, + "percentiles3": { + "total": 2505, + "ok": 2480, + "ko": 2215 + }, + "percentiles4": { + "total": 2907, + "ok": 2992, + "ko": 2599 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 14, + "percentage": 18 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 21, + "percentage": 28 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 25, + "percentage": 33 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 16, + "percentage": 21 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7916666666666666, + "ok": 0.625, + "ko": 0.16666666666666666 + } +} + },"req_request-273-0cd3c": { + "type": "REQUEST", + "name": "request_273", +"path": "request_273", +"pathFormatted": "req_request-273-0cd3c", +"stats": { + "name": "request_273", + "numberOfRequests": { + "total": 50, + "ok": 47, + "ko": 3 + }, + "minResponseTime": { + "total": 220, + "ok": 321, + "ko": 220 + }, + "maxResponseTime": { + "total": 2002, + "ok": 2002, + "ko": 249 + }, + "meanResponseTime": { + "total": 691, + "ok": 720, + "ko": 233 + }, + "standardDeviation": { + "total": 409, + "ok": 405, + "ko": 12 + }, + "percentiles1": { + "total": 563, + "ok": 592, + "ko": 229 + }, + "percentiles2": { + "total": 941, + "ok": 961, + "ko": 239 + }, + "percentiles3": { + "total": 1458, + "ok": 1464, + "ko": 247 + }, + "percentiles4": { + "total": 1988, + "ok": 1989, + "ko": 249 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 31, + "percentage": 62 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 12, + "percentage": 24 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 6 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5208333333333334, + "ok": 0.4895833333333333, + "ko": 0.03125 + } +} + },"req_request-277-d0ec5": { + "type": "REQUEST", + "name": "request_277", +"path": "request_277", +"pathFormatted": "req_request-277-d0ec5", +"stats": { + "name": "request_277", + "numberOfRequests": { + "total": 29, + "ok": 29, + "ko": 0 + }, + "minResponseTime": { + "total": 329, + "ok": 329, + "ko": 0 + }, + "maxResponseTime": { + "total": 1905, + "ok": 1905, + "ko": 0 + }, + "meanResponseTime": { + "total": 720, + "ok": 720, + "ko": 0 + }, + "standardDeviation": { + "total": 397, + "ok": 397, + "ko": 0 + }, + "percentiles1": { + "total": 524, + "ok": 524, + "ko": 0 + }, + "percentiles2": { + "total": 966, + "ok": 966, + "ko": 0 + }, + "percentiles3": { + "total": 1483, + "ok": 1483, + "ko": 0 + }, + "percentiles4": { + "total": 1788, + "ok": 1788, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 19, + "percentage": 66 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 24 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.3020833333333333, + "ok": 0.3020833333333333, + "ko": 0 + } +} + },"req_request-270-e02a1": { + "type": "REQUEST", + "name": "request_270", +"path": "request_270", +"pathFormatted": "req_request-270-e02a1", +"stats": { + "name": "request_270", + "numberOfRequests": { + "total": 26, + "ok": 21, + "ko": 5 + }, + "minResponseTime": { + "total": 232, + "ok": 321, + "ko": 232 + }, + "maxResponseTime": { + "total": 1785, + "ok": 1785, + "ko": 835 + }, + "meanResponseTime": { + "total": 763, + "ok": 832, + "ko": 475 + }, + "standardDeviation": { + "total": 381, + "ok": 367, + "ko": 292 + }, + "percentiles1": { + "total": 688, + "ok": 759, + "ko": 240 + }, + "percentiles2": { + "total": 1008, + "ok": 1089, + "ko": 831 + }, + "percentiles3": { + "total": 1396, + "ok": 1407, + "ko": 834 + }, + "percentiles4": { + "total": 1691, + "ok": 1709, + "ko": 835 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 12, + "percentage": 46 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 23 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 12 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2708333333333333, + "ok": 0.21875, + "ko": 0.052083333333333336 + } +} + },"req_request-322-a2de9": { + "type": "REQUEST", + "name": "request_322", +"path": "request_322", +"pathFormatted": "req_request-322-a2de9", +"stats": { + "name": "request_322", + "numberOfRequests": { + "total": 150, + "ok": 150, + "ko": 0 + }, + "minResponseTime": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "maxResponseTime": { + "total": 95, + "ok": 95, + "ko": 0 + }, + "meanResponseTime": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "standardDeviation": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles1": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles2": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles3": { + "total": 72, + "ok": 72, + "ko": 0 + }, + "percentiles4": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.5625, + "ok": 1.5625, + "ko": 0 + } +} + },"req_request-323-2fefc": { + "type": "REQUEST", + "name": "request_323", +"path": "request_323", +"pathFormatted": "req_request-323-2fefc", +"stats": { + "name": "request_323", + "numberOfRequests": { + "total": 150, + "ok": 150, + "ko": 0 + }, + "minResponseTime": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "maxResponseTime": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "meanResponseTime": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "percentiles2": { + "total": 69, + "ok": 69, + "ko": 0 + }, + "percentiles3": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles4": { + "total": 95, + "ok": 95, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 150, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.5625, + "ok": 1.5625, + "ko": 0 + } +} + } +} + +} \ No newline at end of file diff --git a/webapp/loadTests/150users1minute/js/theme.js b/webapp/loadTests/150users1minute/js/theme.js new file mode 100644 index 0000000..b95a7b3 --- /dev/null +++ b/webapp/loadTests/150users1minute/js/theme.js @@ -0,0 +1,127 @@ +/* + * Copyright 2011-2022 Gatling Corp + * + * Licensed under the Gatling Highcharts License + */ +Highcharts.theme = { + chart: { + backgroundColor: '#f7f7f7', + borderWidth: 0, + borderRadius: 8, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#666', + tickColor: '#666', + labels: { + style: { + color: '#666' + } + }, + title: { + style: { + color: '#666' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: '#999', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#666', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#666', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + + rangeSelector: { + buttonTheme: { + fill: '#cfc9c6', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#b2b2a9' + }, + states: { + hover: { + fill: '#92918C', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#8b897d' + } + }, + select: { + fill: '#E37400', + stroke: '#000000', + style: { + color: '#FFF' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: '#8b897d' + } + }, + + navigator: { + handles: { + backgroundColor: '#f7f7f7', + borderColor: '#92918C' + }, + outlineColor: '#92918C', + outlineWidth: 1, + maskFill: 'rgba(146, 145, 140, 0.5)', + series: { + color: '#5E7BE2', + lineColor: '#5E7BE2' + } + }, + + scrollbar: { + buttonBackgroundColor: '#f7f7f7', + buttonBorderWidth: 1, + buttonBorderColor: '#92918C', + buttonArrowColor: '#92918C', + buttonBorderRadius: 2, + + barBorderWidth: 1, + barBorderRadius: 0, + barBackgroundColor: '#92918C', + barBorderColor: '#92918C', + + rifleColor: '#92918C', + + trackBackgroundColor: '#b0b0a8', + trackBorderWidth: 1, + trackBorderColor: '#b0b0a8' + } +}; + +Highcharts.setOptions(Highcharts.theme); diff --git a/webapp/loadTests/150users1minute/js/unpack.js b/webapp/loadTests/150users1minute/js/unpack.js new file mode 100644 index 0000000..883c33e --- /dev/null +++ b/webapp/loadTests/150users1minute/js/unpack.js @@ -0,0 +1,38 @@ +'use strict'; + +var unpack = function (array) { + var findNbSeries = function (array) { + var currentPlotPack; + var length = array.length; + + for (var i = 0; i < length; i++) { + currentPlotPack = array[i][1]; + if(currentPlotPack !== null) { + return currentPlotPack.length; + } + } + return 0; + }; + + var i, j; + var nbPlots = array.length; + var nbSeries = findNbSeries(array); + + // Prepare unpacked array + var unpackedArray = new Array(nbSeries); + + for (i = 0; i < nbSeries; i++) { + unpackedArray[i] = new Array(nbPlots); + } + + // Unpack the array + for (i = 0; i < nbPlots; i++) { + var timestamp = array[i][0]; + var values = array[i][1]; + for (j = 0; j < nbSeries; j++) { + unpackedArray[j][i] = [timestamp * 1000, values === null ? null : values[j]]; + } + } + + return unpackedArray; +}; diff --git a/webapp/loadTests/150users1minute/style/arrow_down.png b/webapp/loadTests/150users1minute/style/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdbc86e36d0d025402710734046405455ba300 GIT binary patch literal 983 zcmaJ=U2D@&7>;fZDHd;a3La7~Hn92V+O!GFMw@i5vXs(R?8T6!$!Qz9_ z=Rer5@K(VKz41c*2SY&wuf1>zUd=aM+wH=7NOI13d7tNf-jBSfRqrPg%L#^Il9g?} z4*PX@6IU1DyZip+6KpqWxkVeKLkDJnnW9bF7*$-ei|g35hfhA>b%t5E>oi-mW$Y*x zaXB;g;Ud=uG{dZKM!sqFF-2|Mbv%{*@#Zay99v}{(6Mta8f2H7$2EFFLFYh($vu~ z{_pC#Gw+br@wwiA5{J#9kNG+d$w6R2<2tE0l&@$3HYo|3gzQhNSnCl=!XELF){xMO zVOowC8&<~%!%!+-NKMbe6nl*YcI5V zYJ&NRkF&vr%WU+q2lF1lU?-O^-GZNDskYNBpN`kV!(aPgxlHTT#wqjtmGA&=s};T2 zjE>uT`ju-(hf9m^K6dqQrIXa_+Rv}MM}GwF^TyKc-wTU3m^&*>@7eL=F92dH<*NR& HwDFdgVhf9Ks!(i$ny>OtAWQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyvFlc$Sgh{pM)L8rMG3^=@Q{{O$p`t7BNW1mD+?G!w^;tkj$ z(itxFDR3sIr)^#L`so{%PjmYM-riK)$MRAsEYzTK67RjU>c3}HyQct6WAJqKb6Mw< G&;$UsBSU@w literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/arrow_right.png b/webapp/loadTests/150users1minute/style/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a609f80fe17e6f185e1b6373f668fc1f28baae2c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu@pObhHwBu4M$1`knic~;uxYa zvG@EzE(Qe-<_o&N{>R5n@3?e|Q?{o)*sCe{Y!G9XUG*c;{fmVEy{&lgYDVka)lZ$Q rCit0rf5s|lpJ$-R@IrLOqF~-LT3j-WcUP(c4Q23j^>bP0l+XkKUN$bz literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/arrow_right_black.png b/webapp/loadTests/150users1minute/style/arrow_right_black.png new file mode 100644 index 0000000000000000000000000000000000000000..651bd5d27675d9e92ac8d477f2db9efa89c2b355 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`!T#~#}T5FGAlLHD#mbgZgIOpf)rskC}I2WZRmZYXA zlxLP?D7bt2281{Ai31gRdb&7a_JLSF1VWMQKse&#dLi5wlM1_0 z{FM;Ti|sk&y~DuuWXc=~!vbOZMy|V())CrJpY;0L8wi!QM>m&zYv9kY5B?3u;2c!O zs6ZM%Cwv?}ZUCR5a}lC&3CiHSi?f8KBR+xu!araKY=q^sqfcTxa>ExJ5kHFbN8w@G zFbUZkx(k2U9zdM>;c2eb9<@Vt5POLKHVlK|b%E|Ae7gwwDx3hf9oZ^{qwoRjg6;52 zcpeJLI}f_J>rdS@R>r_B=yd$%s`3!zFD&bhZdZTkLaK?cPhvA2 zKl><4eGxC4a;Mdo*PR{+mo_KQ0&Hlk7(2(YeOGR{yx#iw!sRK{pC^Z_`%&gZIOHn( z0A)|bA46eyt%M^3$D@Q6QTcTUVt9h#E14pioqpnJ5Fv4vueCTp(_y(W_1RLr&f2 zqI)=IL-U*F1Lco^e7uSJ_DHlro5zyo?tjgxFM|B=QxDdXXQn?~UhTf54G*EKdD-|u zWftJKwuxmXUXwQ)-H%*()s8zUXDUnsXPpUz?CyzqH4f0-=E{2#{o&G^u_}`4MWPK| zGcOFrhQ_|B|0!d~OW(w?ZnYrKW>-GtKStgfYlX>^DA8Z$%3n^K?&qG-Jk_EOS}M&~ zSmyKt;kMY&T4m~Q6TU}wa>8Y`&PSBh4?T@@lTT9pxFoTjwOyl|2O4L_#y<(a2I`l( z_!a5jhgQ_TIdUr)8=4RH#^M$;j#_w?Px@py3nrhDhiKc)UU?GZD0>?D-D{Dt(GYo> z{mz&`fvtJyWsiEu#tG^&D6w2!Q}%77YrgU->oD<47@K|3>re}AiN6y)?PZJ&g*E?a zKTsDRQLmTaI&A1ZdIO9NN$rJnU;Z3Adexu2ePcTAeC}{L>Br!2@E6#XfZ{#`%~>X& z=AN$5tsc5kzOxRXr#W;#7#o`Z7J&8>o@2-Hf7Kkm!IjVCzgl^TIpI5AzN#yZ@~41% z3?8H2{p-qO(%6fPB=3LfX@mT$KG1!s`_Axt!dfRxdvzbLVLaRm@%_FltoUKGf*0d+ ziZ5(8A*2esb2%T!qR?L?zjmkbm{QqUbpo+5Y;bl<5@UZ>vksWYd= z)qkY5f?t3sS9McgxSvZB!y4B+m=m1+1HSLY^_yU9NU9HI=MZCKZ1qyBuJVc^sZe8I z76_F!A|Lxc=ickgKD?!mwk6ugVUJ6j9zaj^F=hXOxLKez+Y7DZig(sV+HgH#tq*Fq zv9Xu9c`>~afx=SHJ#wJXPWJ`Nn9dG0~%k(XL|0)b(fP9EKlYB(7M_h zTG8GN*3cg0nE{&5KXv6lO?Vx8{oFR{3;PP4=f?@yR=;-h)v?bYy(tW%oae#4-W?$S z^qDI!&nGH(RS)ppgpSgYFay zfX-0*!FbR*qP1P)#q_s)rf1k8c`Iw)A8G^pRqYAB!v3HiWsHnrp7XVCwx{i$<6HT! z!K7 zY1Mc-Co%a;dLZe6FN_B`E73b>oe7VIDLfDA+(FWyvn4$zdST9EFRHo+DTeofqdI0t$jFNyI9 zQfKTs`+N&tf;p7QOzXUtYC?Dr<*UBkb@qhhywuir2b~Ddgzcd7&O_93j-H`?=(!=j z1?gFE7pUGk$EX0k7tBH43ZtM8*X?+Z>zw&fPHW1kb9TfwXB^HsjQpVUhS`Cj-I%lA zbT_kuk;YD&cxR8!i=aB3BLDon2E1oRHx)XraG zuGLrVtNJ!Ffw11ONMCIBde24Mnv(V`$X}}Klc4h|z4z9q$?+f8KLXj(dr-YU?E^Z0 zGQ{8Gs4Vn;7t=q592Ga@3J|ZeqBAi)wOyY%d;Un91$yUG28$_o1dMi}Gre)7_45VK zryy5>>KlQFNV}f)#`{%;5Wgg*WBl|S?^s%SRRBHNHg(lKdBFpfrT*&$ZriH&9>{dt z=K2vZWlO4UTS4!rZwE8~e1o`0L1ju$=aV`&d?kU6To*82GLSz2>FVD36XXNCt;;{I zvq57=dTunvROdvbqqtd@t<(%LcAKMP`u}6Xp5IFF4xtHY8gr_nyL?^04*8(5sJZc9 zARYN=GpqrfH;SLYgDO|GA*^v_+NFDBKJ!ks?+Q$<858o=!|*N~fnD$zzIX1Wn7u*7 z6@$uGA84*U@1m5j@-ffb9g)8U>8c&l+e%yG?+W#PgfseheRwyb@!A&nt}D_mr@)TC z7vWw~{3ejS!{A3}400?;YTQfqhMu4?q5D~5@d?s2ZnI2#jih|Og|gfGYdK?%wYv*> z*MY{vX>83k`B@9}9YF@Dekyw*>;aXndM*a1KTICC^cUJ%e}<>k`j> z&a;&EIBlRiq{Dc44?=J^+zYuNTOWY-tv!wV36BKrC$tVvQathjI1A5#_IcXhYR{#5 zXuolbqsM-i@OsdmWd=IVH#3CQ?&I(>JPALBr7#E1fa3Ihz4E^RQPBQp13Uv-XFmt6 znG0h~jmgiD_k;5e7^$+h!$Eiow7$Ixs{d=C=Tfb)^3OIn3Ad{L_>Vn;-IVKA(2@G+ z8!hM&P7LH*?Hb7SjjFRsUd%6%NRz+7xKmOnt_Vj9eV__wnvUqALE y@<9iX-XLgKmGb5P*V(C?vZI{Ap0ljoe9iI#Pp2!ETh`m`k}sX$tTjPb`Thqd2I;E+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/little_arrow_right.png b/webapp/loadTests/150users1minute/style/little_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..252abe66d3a92aced2cff2df88e8a23d91459251 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd;O^<-7$PB=oN$2m z-(ru2pAv$OC-6w{28nSzPFOlManYH8W7Z01d5`Q)6p~NiIh8RX*um{#37-cePkG{I i?kCneiZ^N=&|+f{`pw(F`1}WPkkOv5elF{r5}E)*4>EfI literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/logo-enterprise.svg b/webapp/loadTests/150users1minute/style/logo-enterprise.svg new file mode 100644 index 0000000..4a6e1de --- /dev/null +++ b/webapp/loadTests/150users1minute/style/logo-enterprise.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/webapp/loadTests/150users1minute/style/logo.svg b/webapp/loadTests/150users1minute/style/logo.svg new file mode 100644 index 0000000..f519eef --- /dev/null +++ b/webapp/loadTests/150users1minute/style/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/webapp/loadTests/150users1minute/style/sortable.png b/webapp/loadTests/150users1minute/style/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb54f9acddb8848e68b640d416bf959cb18b6a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd5b5dS7$PCr+ka7z zL4e13=24exMiQ@YG*qwKncdI-GfUZ1Rki=vCY#SQRzF`R>17u7PVwr=D?vVeZ+UA{ zG@h@BI20Mdp}F2&UODjiSKfWA%2W&v$1X_F*vS}sO7fVb_47iIWuC5nF6*2Ung9-k BJ)r;q literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/sorted-down.png b/webapp/loadTests/150users1minute/style/sorted-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5100cc8efd490cf534a6186f163143bc59de3036 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVDIVT7$PB=oN$2m z-{GYajXDDFEn-;Il?7IbEN2SgoY1K-S+LB}QlU75b4p`dJwwurrwV2sJj^AGt`0LQ Z7#M<{@}@-BSMLEC>FMg{vd$@?2>{QlDr5iv literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/sorted-up.png b/webapp/loadTests/150users1minute/style/sorted-up.png new file mode 100644 index 0000000000000000000000000000000000000000..340a5f0370f1a74439459179e9c4cf1610de75d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVD0JR7$PB=oN$2m z-(rtihEG!hT@vQ#Ni?%SDB=JB literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/stat-fleche-bas.png b/webapp/loadTests/150users1minute/style/stat-fleche-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b501a37f521fa56ce790b5279b204cf16f275 GIT binary patch literal 625 zcmV-%0*?KOP)X1^@s6HR9gx0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6G=otRCwBaRk3XYF$@$1uayA|xJs2O zh6iw!${V;%XBun$AzDJ_5hsobnt%D0lR{6AC-TZ=qQYNSE%4fZr(r%*U%{3#@fMV-wZ|U32I`2RVTet9ov9a1><;a zc490LC;}x<)W9HSa|@E2D5Q~wPER)4Hd~) z7a}hi*bPEZ3E##6tEpfWilBDoTvc z!^R~Z;5%h77OwQK2sCp1=!WSe*z2u-)=XU8l4MF00000 LNkvXXu0mjfMhXuu literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/stat-l-roue.png b/webapp/loadTests/150users1minute/style/stat-l-roue.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a3aae0169d62a079278f0a6737f3376f1b45ae GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!N$PAIIE<7Cy>LE?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2hb1*QrXELw=S&Tp|1;h*tObeLcA_5DT;cR}8^0f~MUKVSdnX!bNbd8LT)Sw-%(F%_zr0N|UagV3xWgqvH;8K?&n0oOR41jMpR4np z@3~veKIhln&vTy7`M&S_y+s{K$4a+%SBakr4tulXXK%nlnMZA<7fW86CAV}Io#FMZ zJKEZlXuR&E=;dFVn4ON?-myI9m-fc)cdfl=xStxmHlE_%*ZyqH3w8e^yf4K+{I{K9 z7w&AxcaMk7ySZ|)QCy;@Qg`etYuie0o>bqd-!G^vY&6qP5x86+IYoDN%G}3H>wNMj zPL^13>44!EmANYvNU$)%J@GUM4J8`33?}zp?$qRpGv)z8kkP`CHe&Oqvvu;}m~M yv&%5+ugjcD{r&Hid!>2~a6b9iXUJ`u|A%4w{h$p3k*sGyq3h}D=d#Wzp$Py=EVp6+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/stat-l-temps.png b/webapp/loadTests/150users1minute/style/stat-l-temps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce268037f94ef73f56cd658d392ef393d562db3 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^{2w#$-&vQnwtC-_ zkh{O~uCAT`QnSlTzs$^@t=jDWl)1cj-p;w{budGVRji^Z`nX^5u3Kw&?Kk^Y?fZDw zg5!e%<_ApQ}k@w$|KtRPs~#LkYapu zf%*GA`~|UpRDQGRR`SL_+3?i5Es{UA^j&xb|x=ujSRd8$p5V>FVdQ&MBb@04c<~BLDyZ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/150users1minute/style/style.css b/webapp/loadTests/150users1minute/style/style.css new file mode 100644 index 0000000..7f50e1b --- /dev/null +++ b/webapp/loadTests/150users1minute/style/style.css @@ -0,0 +1,988 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --gatling-background-color: #f2f2f2; + --gatling-background-light-color: #f7f7f7; + --gatling-border-color: #dddddd; + --gatling-blue-color: #4a9fe5; + --gatling-dark-blue-color: #24275e; + --gatling-danger-color: #f15b4f; + --gatling-danger-light-color: #f5d1ce; + --gatling-enterprise-color: #6161d6; + --gatling-enterprise-light-color: #c4c4ed; + --gatling-gray-medium-color: #bbb; + --gatling-hover-color: #e6e6e6; + --gatling-light-color: #ffffff; + --gatling-orange-color: #f78557; + --gatling-success-color: #68b65c; + --gatling-text-color: #1f2024; + --gatling-total-color: #ffa900; + + --gatling-border-radius: 2px; + --gatling-spacing-small: 5px; + --gatling-spacing: 10px; + --gatling-spacing-layout: 20px; + + --gatling-font-weight-normal: 400; + --gatling-font-weight-medium: 500; + --gatling-font-weight-bold: 700; + --gatling-font-size-secondary: 12px; + --gatling-font-size-default: 14px; + --gatling-font-size-heading: 16px; + --gatling-font-size-section: 22px; + --gatling-font-size-header: 34px; + + --gatling-media-desktop-large: 1920px; +} + +* { + min-height: 0; + min-width: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + color: var(--gatling-text-color); + font-family: arial; + font-size: var(--gatling-font-size-secondary); + margin: 0; +} + +.app-container { + display: flex; + flex-direction: column; + + height: 100%; + width: 100%; +} + +.head { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + + flex: 1; + + background-color: var(--gatling-light-color); + border-bottom: 1px solid var(--gatling-border-color); + min-height: 69px; + padding: 0 var(--gatling-spacing-layout); +} + +.gatling-open-source { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + gap: var(--gatling-spacing-layout); +} + +.gatling-documentation { + display: flex; + align-items: center; + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-orange-color); + border: 1px solid var(--gatling-orange-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 23px; +} + +.gatling-documentation:hover { + background-color: var(--gatling-orange-color); + color: var(--gatling-light-color); +} + +.gatling-logo { + height: 35px; +} + +.gatling-logo img { + height: 100%; +} + +.container { + display: flex; + align-items: stretch; + height: 100%; +} + +.nav { + min-width: 210px; + width: 210px; + max-height: calc(100vh - var(--gatling-spacing-layout) - var(--gatling-spacing-layout)); + background: var(--gatling-light-color); + border-right: 1px solid var(--gatling-border-color); + overflow-y: auto; +} + +@media print { + .nav { + display: none; + } +} + +@media screen and (min-width: 1920px) { + .nav { + min-width: 310px; + width: 310px; + } +} + +.nav ul { + display: flex; + flex-direction: column; + + padding: 0; + margin: 0; +} + +.nav li { + display: flex; + list-style: none; + width: 100%; + padding: 0; +} + +.nav .item { + display: inline-flex; + align-items: center; + margin: 0 auto; + white-space: nowrap; + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + margin: 0; + width: 100%; +} + +.nav .item .nav-label { + padding: var(--gatling-spacing) var(--gatling-spacing-layout); +} + +.nav .item:hover { + background-color: var(--gatling-hover-color); +} + +.nav .on .item { + background-color: var(--gatling-orange-color); +} + +.nav .on .item span { + color: var(--gatling-light-color); +} + +.cadre { + width: 100%; + height: 100%; + overflow-y: scroll; + scroll-behavior: smooth; +} + +@media print { + .cadre { + overflow-y: unset; + } +} + +.frise { + position: absolute; + top: 60px; + z-index: -1; + + background-color: var(--gatling-background-color); + height: 530px; +} + +.global { + height: 650px +} + +a { + text-decoration: none; +} + +a:hover { + color: var(--gatling-hover-color); +} + +img { + border: 0; +} + +h1 { + color: var(--gatling-dark-blue-color); + font-size: var(--gatling-font-size-section); + font-weight: var(--gatling-font-weight-medium); + text-align: center; + margin: 0; +} + +h1 span { + color: var(--gatling-hover-color); +} + +.enterprise { + display: flex; + align-items: center; + justify-content: center; + gap: var(--gatling-spacing-small); + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-enterprise-color); + color: var(--gatling-enterprise-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 25px; +} + +.enterprise:hover { + background-color: var(--gatling-enterprise-light-color); + color: var(--gatling-enterprise-color); +} + +.enterprise img { + display: block; + width: 160px; +} + +.simulation-card { + display: flex; + flex-direction: column; + align-self: stretch; + flex: 1; + gap: var(--gatling-spacing-layout); + max-height: 375px; +} + +#simulation-information { + flex: 1; +} + +.simulation-version-information { + display: flex; + flex-direction: column; + + gap: var(--gatling-spacing); + font-size: var(--gatling-font-size-default); + + background-color: var(--gatling-background-color); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing); +} + +.simulation-information-container { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing); +} + +.withTooltip .popover-title { + display: none; +} + +.popover-content p { + margin: 0; +} + +.ellipsed-name { + display: block; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.simulation-information-item { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--gatling-spacing-small); +} + +.simulation-information-item.description { + flex-direction: column; +} + +.simulation-information-label { + display: inline-block; + font-weight: var(--gatling-font-weight-bold); + min-width: fit-content; +} + +.simulation-information-title { + display: block; + text-align: center; + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + width: 100%; +} + +.simulation-tooltip span { + display: inline-block; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; +} + +.content { + display: flex; + flex-direction: column; +} + +.content-in { + width: 100%; + height: 100%; + + overflow-x: scroll; +} + +@media print { + .content-in { + overflow-x: unset; + } +} + +.container-article { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + min-width: 1050px; + width: 1050px; + margin: 0 auto; + padding: var(--gatling-spacing-layout); + box-sizing: border-box; +} + +@media screen and (min-width: 1920px) { + .container-article { + min-width: 1350px; + width: 1350px; + } + + #responses * .highcharts-tracker { + transform: translate(400px, 70px); + } +} + +.content-header { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + background-color: var(--gatling-background-light-color); + border-bottom: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-layout) var(--gatling-spacing-layout) 0; +} + +.onglet { + font-size: var(--gatling-font-size-header); + font-weight: var(--gatling-font-weight-medium); + text-align: center; +} + +.sous-menu { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.sous-menu-spacer { + display: flex; + align-items: center; + flex-direction: row; +} + +.sous-menu .item { + margin-bottom: -1px; +} + +.sous-menu a { + display: block; + + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-normal); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border-bottom: 2px solid transparent; + color: var(--gatling-text-color); + text-align: center; + width: 100px; +} + +.sous-menu a:hover { + border-bottom-color: var(--gatling-text-color); +} + +.sous-menu .ouvert a { + border-bottom-color: var(--gatling-orange-color); + font-weight: var(--gatling-font-weight-bold); +} + +.article { + position: relative; + + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); +} + +.infos { + width: 340px; + color: var(--gatling-light-color); +} + +.infos-title { + background-color: var(--gatling-background-light-color); + border: 1px solid var(--gatling-border-color); + border-bottom: 0; + border-top-left-radius: var(--gatling-border-radius); + border-top-right-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.info { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + height: 100%; + margin: 0; +} + +.info table { + margin: auto; + padding-right: 15px; +} + +.alert-danger { + background-color: var(--gatling-danger-light-color); + border: 1px solid var(--gatling-danger-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + padding: var(--gatling-spacing-layout); + font-weight: var(--gatling-font-weight-bold); +} + +.repli { + position: absolute; + bottom: 0; + right: 0; + + background: url('stat-fleche-bas.png') no-repeat top left; + height: 25px; + width: 22px; +} + +.infos h2 { + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + height: 19px; + margin: 0; + padding: 3.5px 0 0 35px; +} + +.infos .first { + background: url('stat-l-roue.png') no-repeat 15px 5px; +} + +.infos .second { + background: url('stat-l-temps.png') no-repeat 15px 3px; + border-top: 1px solid var(--gatling-border-color); +} + +.infos th { + text-align: center; +} + +.infos td { + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing-small); + -webkit-border-radius: var(--gatling-border-radius); + -moz-border-radius: var(--gatling-border-radius); + -ms-border-radius: var(--gatling-border-radius); + -o-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + text-align: right; + width: 50px; +} + +.infos .title { + width: 120px; +} + +.infos .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); +} + +.infos .total { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); +} + +.infos .ko { + background-color: var(--gatling-danger-color); + -webkit-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); +} + +.schema-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--gatling-spacing-layout); +} + +.schema { + background: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); +} + +.ranges { + height: 375px; + width: 500px; +} + +.ranges-large { + height: 375px; + width: 530px; +} + +.geant { + height: 362px; +} + +.extensible-geant { + width: 100%; +} + +.polar { + height: 375px; + width: 230px; +} + +.chart_title { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + padding: 2px var(--gatling-spacing); +} + +.statistics { + display: flex; + flex-direction: column; + + background-color: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border-collapse: collapse; + color: var(--gatling-text-color); + max-height: 100%; +} + +.statistics .title { + display: flex; + text-align: center; + justify-content: space-between; + + min-height: 49.5px; + box-sizing: border-box; + + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing); +} + +.title_base { + display: flex; + align-items: center; + text-align: left; + user-select: none; +} + +.title_base_stats { + color: var(--gatling-text-color); + margin-right: 20px; +} + +.toggle-table { + position: relative; + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: 25px; + width: 40px; + height: 20px; + margin: 0 var(--gatling-spacing-small); +} + +.toggle-table::before { + position: absolute; + top: calc(50% - 9px); + left: 1px; + content: ""; + width: 50%; + height: 18px; + border-radius: 50%; + background-color: var(--gatling-text-color); +} + +.toggle-table.off::before { + left: unset; + right: 1px; +} + +.title_expanded { + cursor: pointer; + color: var(--gatling-text-color); +} + +.expand-table, +.collapse-table { + font-size: var(--gatling-font-size-secondary); + font-weight: var(--gatling-font-weight-normal); +} + +.title_expanded span.expand-table { + color: var(--gatling-gray-medium-color); +} + +.title_collapsed { + cursor: pointer; + color: var(--gatling-text-color); +} + +.title_collapsed span.collapse-table { + color: var(--gatling-gray-medium-color); +} + +#container_statistics_head { + position: sticky; + top: -1px; + + background: var(--gatling-background-light-color); + margin-top: -1px; + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); +} + +#container_statistics_body { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + margin-top: -1px; + padding: 0px var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small); +} + +#container_errors { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); + margin-top: -1px; +} + +#container_assertions { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small); + margin-top: -1px; +} + +.statistics-in { + border-spacing: var(--gatling-spacing-small); + border-collapse: collapse; + margin: 0; +} + +.statistics .scrollable { + max-height: 100%; + overflow-y: auto; +} + +#statistics_table_container .statistics .scrollable { + max-height: 785px; +} + +.statistics-in a { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .header { + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small); +} + +.sortable { + cursor: pointer; +} + +.sortable span { + background: url('sortable.png') no-repeat right 3px; + padding-right: 10px; +} + +.sorted-up span { + background-image: url('sorted-up.png'); +} + +.sorted-down span { + background-image: url('sorted-down.png'); +} + +.executions { + background: url('stat-l-roue.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.response-time { + background: url('stat-l-temps.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.statistics-in td { + background-color: var(--gatling-light-color); + border: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-small); + min-width: 50px; +} + +.statistics-in .col-1 { + width: 175px; + max-width: 175px; +} +@media screen and (min-width: 1200px) { + .statistics-in .col-1 { + width: 50%; + } +} + +.expandable-container { + display: flex; + flex-direction: row; + box-sizing: border-box; + max-width: 100%; +} + +.statistics-in .value { + text-align: right; + width: 50px; +} + +.statistics-in .total { + color: var(--gatling-text-color); +} + +.statistics-in .col-2 { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .error-col-1 { + background-color: var(--gatling-light-color); + color: var(--gatling-text-color); +} + +.statistics-in .error-col-2 { + text-align: center; +} + +.statistics-in .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .ko { + background-color: var(--gatling-danger-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .expand-button { + padding-left: var(--gatling-spacing); + cursor: pointer; +} + +.expand-button.hidden { + background: none; + cursor: default; +} + +.statistics-button { + background-color: var(--gatling-light-color); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); +} + +.statistics-button:hover:not(:disabled) { + cursor: pointer; + background-color: var(--gatling-hover-color); +} + +.statistics-in .expand-button.expand { + background: url('little_arrow_right.png') no-repeat 3px 3px; +} + +.statistics-in .expand-button.collapse { + background: url('sorted-down.png') no-repeat 3px 3px; +} + +.nav .expand-button { + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.nav .expand-button.expand { + background: url('arrow_right_black.png') no-repeat 5px 10px; + cursor: pointer; +} + +.nav .expand-button.collapse { + background: url('arrow_down_black.png') no-repeat 3px 12px; + cursor: pointer; +} + +.nav .on .expand-button.expand { + background-image: url('arrow_right_black.png'); +} + +.nav .on .expand-button.collapse { + background-image: url('arrow_down_black.png'); +} + +.right { + display: flex; + align-items: center; + gap: var(--gatling-spacing); + float: right; + font-size: var(--gatling-font-size-default); +} + +.withTooltip { + outline: none; +} + +.withTooltip:hover { + text-decoration: none; +} + +.withTooltip .tooltipContent { + position: absolute; + z-index: 10; + display: none; + + background: var(--gatling-orange-color); + -webkit-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + -moz-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); + margin-top: -5px; + padding: var(--gatling-spacing-small); +} + +.withTooltip:hover .tooltipContent { + display: inline; +} + +.statistics-table-modal { + height: calc(100% - 60px); + width: calc(100% - 60px); + border-radius: var(--gatling-border-radius); +} + +.statistics-table-modal::backdrop { + position: fixed; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + + background-color: rgba(100, 100, 100, 0.9); +} + +.statistics-table-modal-container { + display: flex; + flex-direction: column; + + width: 100%; + height: calc(100% - 35px); + overflow-x: auto; +} + +.button-modal { + cursor: pointer; + + height: 25px; + width: 25px; + + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); +} + +.button-modal:hover { + background-color: var(--gatling-background-color); +} + +.statistics-table-modal-header { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-bottom: var(--gatling-spacing); +} + +.statistics-table-modal-content { + flex: 1; + overflow-y: auto; + min-width: 1050px; +} + +.statistics-table-modal-footer { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-top: var(--gatling-spacing); +} diff --git a/webapp/loadTests/1user.html b/webapp/loadTests/1user/1user.html similarity index 100% rename from webapp/loadTests/1user.html rename to webapp/loadTests/1user/1user.html diff --git a/webapp/loadTests/1user/js/all_sessions.js b/webapp/loadTests/1user/js/all_sessions.js new file mode 100644 index 0000000..454e4bb --- /dev/null +++ b/webapp/loadTests/1user/js/all_sessions.js @@ -0,0 +1,11 @@ +allUsersData = { + +color: '#FFA900', +name: 'Active Users', +data: [ + [1682848329000,1],[1682848330000,1],[1682848331000,1],[1682848332000,1],[1682848333000,1],[1682848334000,1],[1682848335000,1],[1682848336000,1],[1682848337000,1],[1682848338000,1],[1682848339000,1],[1682848340000,1],[1682848341000,1],[1682848342000,1],[1682848343000,1],[1682848344000,1],[1682848345000,1],[1682848346000,1],[1682848347000,1],[1682848348000,1],[1682848349000,1],[1682848350000,1],[1682848351000,1],[1682848352000,1],[1682848353000,1],[1682848354000,1],[1682848355000,1],[1682848356000,1],[1682848357000,1],[1682848358000,1],[1682848359000,1],[1682848360000,1],[1682848361000,1],[1682848362000,1] +], +tooltip: { yDecimals: 0, ySuffix: '', valueDecimals: 0 } + , zIndex: 20 + , yAxis: 1 +}; \ No newline at end of file diff --git a/webapp/loadTests/1user/js/assertions.json b/webapp/loadTests/1user/js/assertions.json new file mode 100644 index 0000000..67a374f --- /dev/null +++ b/webapp/loadTests/1user/js/assertions.json @@ -0,0 +1,10 @@ +{ + "simulation": "RecordedSimulation", + "simulationId": "recordedsimulation-20230430095208027", + "start": 1682848328751, + "description": "", + "scenarios": ["RecordedSimulation"], + "assertions": [ + + ] +} \ No newline at end of file diff --git a/webapp/loadTests/1user/js/assertions.xml b/webapp/loadTests/1user/js/assertions.xml new file mode 100644 index 0000000..5e4dbe9 --- /dev/null +++ b/webapp/loadTests/1user/js/assertions.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/webapp/loadTests/1user/js/bootstrap.min.js b/webapp/loadTests/1user/js/bootstrap.min.js new file mode 100644 index 0000000..ea41042 --- /dev/null +++ b/webapp/loadTests/1user/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-tooltip.js, bootstrap-popover.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery) \ No newline at end of file diff --git a/webapp/loadTests/1user/js/ellipsis.js b/webapp/loadTests/1user/js/ellipsis.js new file mode 100644 index 0000000..781d0de --- /dev/null +++ b/webapp/loadTests/1user/js/ellipsis.js @@ -0,0 +1,26 @@ +function parentId(name) { + return "parent-" + name; +} + +function isEllipsed(name) { + const child = document.getElementById(name); + const parent = document.getElementById(parentId(name)); + const emptyData = parent.getAttribute("data-content") === ""; + const hasOverflow = child.clientWidth < child.scrollWidth; + + if (hasOverflow) { + if (emptyData) { + parent.setAttribute("data-content", name); + } + } else { + if (!emptyData) { + parent.setAttribute("data-content", ""); + } + } +} + +function ellipsedLabel ({ name, parentClass = "", childClass = "" }) { + const child = "" + name + ""; + + return "" + child + ""; +} diff --git a/webapp/loadTests/1user/js/gatling.js b/webapp/loadTests/1user/js/gatling.js new file mode 100644 index 0000000..0208f82 --- /dev/null +++ b/webapp/loadTests/1user/js/gatling.js @@ -0,0 +1,137 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function ($) { + $.fn.expandable = function () { + var scope = this; + + this.find('.expand-button:not([class*=hidden])').addClass('collapse').on('click', function () { + var $this = $(this); + + if ($this.hasClass('expand')) + $this.expand(scope); + else + $this.collapse(scope); + }); + + this.find('.expand-all-button').on('click', function () { + $(this).expandAll(scope); + }); + + this.find('.collapse-all-button').on('click', function () { + $(this).collapseAll(scope); + }); + + this.collapseAll(this); + + return this; + }; + + $.fn.expand = function (scope, recursive) { + return this.each(function () { + var $this = $(this); + + if (recursive) { + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + } + + if ($this.hasClass('expand')) { + $('*[data-parent=' + $this.attr('id') + ']').toggle(true); + $this.toggleClass('expand').toggleClass('collapse'); + } + }); + }; + + $.fn.expandAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.expand').expand(scope, true); + $('*[data-parent=ROOT]').find('.expand-button.collapse').expand(scope, true); + }; + + $.fn.collapse = function (scope) { + return this.each(function () { + var $this = $(this); + + scope.find('*[data-parent=' + $this.attr('id') + '] .expand-button.collapse').collapse(scope); + scope.find('*[data-parent=' + $this.attr('id') + ']').toggle(false); + $this.toggleClass('expand').toggleClass('collapse'); + }); + }; + + $.fn.collapseAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.collapse').collapse(scope); + }; + + $.fn.sortable = function (target) { + var table = this; + + this.find('thead .sortable').on('click', function () { + var $this = $(this); + + if ($this.hasClass('sorted-down')) { + var desc = false; + var style = 'sorted-up'; + } + else { + var desc = true; + var style = 'sorted-down'; + } + + $(target).sortTable($this.attr('id'), desc); + + table.find('thead .sortable').removeClass('sorted-up sorted-down'); + $this.addClass(style); + + return false; + }); + + return this; + }; + + $.fn.sortTable = function (col, desc) { + function getValue(line) { + var cell = $(line).find('.' + col); + + if (cell.hasClass('value')) + var value = cell.text(); + else + var value = cell.find('.value').text(); + + return parseFloat(value); + } + + function sortLines (lines, group) { + var notErrorTable = col.search("error") == -1; + var linesToSort = notErrorTable ? lines.filter('*[data-parent=' + group + ']') : lines; + + var sortedLines = linesToSort.sort(function (a, b) { + return desc ? getValue(b) - getValue(a): getValue(a) - getValue(b); + }).toArray(); + + var result = []; + $.each(sortedLines, function (i, line) { + result.push(line); + if (notErrorTable) + result = result.concat(sortLines(lines, $(line).attr('id'))); + }); + + return result; + } + + this.find('tbody').append(sortLines(this.find('tbody tr').detach(), 'ROOT')); + + return this; + }; +})(jQuery); diff --git a/webapp/loadTests/1user/js/global_stats.json b/webapp/loadTests/1user/js/global_stats.json new file mode 100644 index 0000000..7636f35 --- /dev/null +++ b/webapp/loadTests/1user/js/global_stats.json @@ -0,0 +1,77 @@ +{ + "name": "All Requests", + "numberOfRequests": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "minResponseTime": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "maxResponseTime": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "meanResponseTime": { + "total": 324, + "ok": 324, + "ko": 0 + }, + "standardDeviation": { + "total": 261, + "ok": 261, + "ko": 0 + }, + "percentiles1": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "percentiles2": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "percentiles3": { + "total": 802, + "ok": 802, + "ko": 0 + }, + "percentiles4": { + "total": 873, + "ok": 873, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 42, + "percentage": 93 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3235294117647058, + "ok": 1.3235294117647058, + "ko": 0 + } +} \ No newline at end of file diff --git a/webapp/loadTests/1user/js/highcharts-more.js b/webapp/loadTests/1user/js/highcharts-more.js new file mode 100644 index 0000000..2d78893 --- /dev/null +++ b/webapp/loadTests/1user/js/highcharts-more.js @@ -0,0 +1,60 @@ +/* + Highcharts JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(x){"object"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(b){function r(b,a,d){this.init(b,a,d)}var t=b.each,w=b.extend,m=b.merge,q=b.splat;w(r.prototype,{init:function(b,a,d){var f=this,h=f.defaultOptions;f.chart=a;f.options=b=m(h,a.angular?{background:{}}:void 0,b);(b=b.background)&&t([].concat(q(b)).reverse(),function(a){var c,h=d.userOptions;c=m(f.defaultBackgroundOptions,a);a.backgroundColor&&(c.backgroundColor=a.backgroundColor);c.color=c.backgroundColor; +d.options.plotBands.unshift(c);h.plotBands=h.plotBands||[];h.plotBands!==d.options.plotBands&&h.plotBands.unshift(c)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{className:"highcharts-pane",shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});b.Pane=r})(x);(function(b){var r=b.CenteredSeriesMixin, +t=b.each,w=b.extend,m=b.map,q=b.merge,e=b.noop,a=b.Pane,d=b.pick,f=b.pInt,h=b.splat,u=b.wrap,c,l,k=b.Axis.prototype;b=b.Tick.prototype;c={getOffset:e,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:e,setCategories:e,setTitle:e};l={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2}, +defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);a.plotBands||(a.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= +r.getCenter.call(this.pane)},getLinePath:function(a,g){a=this.center;var c=this.chart,f=d(g,a[2]/2-this.offset);this.isCircular||void 0!==g?g=this.chart.renderer.symbols.arc(this.left+a[0],this.top+a[1],f,f,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(g=this.postTranslate(this.angleRad,f),g=["M",a[0]+c.plotLeft,a[1]+c.plotTop,"L",g.x,g.y]);return g},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/ +(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===d(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.center=this.pane.center=r.getCenter.call(this.pane),this.isCircular&& +(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*d(this.sector,1)/2)},getPosition:function(a,g){return this.postTranslate(this.isCircular?this.translate(a):this.angleRad,d(this.isCircular?g:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,g){var d=this.chart,c=this.center;a=this.startAngleRad+a;return{x:d.plotLeft+c[0]+Math.cos(a)*g,y:d.plotTop+c[1]+Math.sin(a)*g}},getPlotBandPath:function(a,g,c){var h=this.center,p=this.startAngleRad, +k=h[2]/2,n=[d(c.outerRadius,"100%"),c.innerRadius,d(c.thickness,10)],b=Math.min(this.offset,0),l=/%$/,u,e=this.isCircular;"polygon"===this.options.gridLineInterpolation?h=this.getPlotLinePath(a).concat(this.getPlotLinePath(g,!0)):(a=Math.max(a,this.min),g=Math.min(g,this.max),e||(n[0]=this.translate(a),n[1]=this.translate(g)),n=m(n,function(a){l.test(a)&&(a=f(a,10)*k/100);return a}),"circle"!==c.shape&&e?(a=p+this.translate(a),g=p+this.translate(g)):(a=-Math.PI/2,g=1.5*Math.PI,u=!0),n[0]-=b,n[2]-= +b,h=this.chart.renderer.symbols.arc(this.left+h[0],this.top+h[1],n[0],n[0],{start:Math.min(a,g),end:Math.max(a,g),innerR:d(n[1],n[0]-n[2]),open:u}));return h},getPlotLinePath:function(a,g){var d=this,c=d.center,f=d.chart,h=d.getPosition(a),k,b,p;d.isCircular?p=["M",c[0]+f.plotLeft,c[1]+f.plotTop,"L",h.x,h.y]:"circle"===d.options.gridLineInterpolation?(a=d.translate(a))&&(p=d.getLinePath(0,a)):(t(f.xAxis,function(a){a.pane===d.pane&&(k=a)}),p=[],a=d.translate(a),c=k.tickPositions,k.autoConnect&&(c= +c.concat([c[0]])),g&&(c=[].concat(c).reverse()),t(c,function(g,d){b=k.getPosition(g,a);p.push(d?"L":"M",b.x,b.y)}));return p},getTitlePosition:function(){var a=this.center,g=this.chart,d=this.options.title;return{x:g.plotLeft+a[0]+(d.x||0),y:g.plotTop+a[1]-{high:.5,middle:.25,low:0}[d.align]*a[2]+(d.y||0)}}};u(k,"init",function(f,g,k){var b=g.angular,p=g.polar,n=k.isX,u=b&&n,e,A=g.options,m=k.pane||0;if(b){if(w(this,u?c:l),e=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(w(this, +l),this.defaultRadialOptions=(e=n)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions));b||p?(this.isRadial=!0,g.inverted=!1,A.chart.zoomType=null):this.isRadial=!1;f.call(this,g,k);u||!b&&!p||(f=this.options,g.panes||(g.panes=[]),this.pane=g=g.panes[m]=g.panes[m]||new a(h(A.pane)[m],g,this),g=g.options,this.angleRad=(f.angle||0)*Math.PI/180,this.startAngleRad=(g.startAngle-90)*Math.PI/180,this.endAngleRad=(d(g.endAngle,g.startAngle+360)-90)*Math.PI/180,this.offset=f.offset|| +0,this.isCircular=e)});u(k,"autoLabelAlign",function(a){if(!this.isRadial)return a.apply(this,[].slice.call(arguments,1))});u(b,"getPosition",function(a,d,c,f,h){var g=this.axis;return g.getPosition?g.getPosition(c):a.call(this,d,c,f,h)});u(b,"getLabelPosition",function(a,g,c,f,h,k,b,l,u){var n=this.axis,p=k.y,e=20,y=k.align,v=(n.translate(this.pos)+n.startAngleRad+Math.PI/2)/Math.PI*180%360;n.isRadial?(a=n.getPosition(this.pos,n.center[2]/2+d(k.distance,-25)),"auto"===k.rotation?f.attr({rotation:v}): +null===p&&(p=n.chart.renderer.fontMetrics(f.styles.fontSize).b-f.getBBox().height/2),null===y&&(n.isCircular?(this.label.getBBox().width>n.len*n.tickInterval/(n.max-n.min)&&(e=0),y=v>e&&v<180-e?"left":v>180+e&&v<360-e?"right":"center"):y="center",f.attr({align:y})),a.x+=k.x,a.y+=p):a=a.call(this,g,c,f,h,k,b,l,u);return a});u(b,"getMarkPath",function(a,d,c,f,h,k,b){var g=this.axis;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+f),d=["M",d,c,"L",a.x,a.y]):d=a.call(this,d,c,f,h,k,b);return d})})(x); +(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.Series,q=b.seriesType,e=b.seriesTypes;q("arearange","area",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:["low","high"],dataLabelCollections:["dataLabel", +"dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var d=this.chart,f=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=f.x-d.plotLeft;a.plotHigh=f.y-d.plotTop},translate:function(){var a=this,d=a.yAxis,f=!!a.modifyValue;e.area.prototype.translate.apply(a);r(a.points,function(h){var b=h.low,c=h.high,l=h.plotY;null===c||null===b?h.isNull=!0:(h.plotLow=l,h.plotHigh=d.translate(f?a.modifyValue(c,h):c,0,1, +0,1),f&&(h.yBottom=h.plotHigh))});this.chart.polar&&r(this.points,function(d){a.highToXY(d)})},getGraphPath:function(a){var d=[],f=[],h,b=e.area.prototype.getGraphPath,c,l,k;k=this.options;var p=k.step;a=a||this.points;for(h=a.length;h--;)c=a[h],c.isNull||k.connectEnds||a[h+1]&&!a[h+1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),l={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,yBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},f.push(l),d.push(l),c.isNull|| +k.connectEnds||a[h-1]&&!a[h-1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=b.call(this,a);p&&(!0===p&&(p="left"),k.step={left:"right",center:"center",right:"left"}[p]);d=b.call(this,d);f=b.call(this,f);k.step=p;k=[].concat(a,d);this.chart.polar||"M"!==f[0]||(f[0]="L");this.graphPath=k;this.areaPath=this.areaPath.concat(a,f);k.isArea=!0;k.xMap=a.xMap;this.areaPath.xMap=a.xMap;return k},drawDataLabels:function(){var a=this.data,d=a.length,f,h=[],b=m.prototype,c=this.options.dataLabels, +l=c.align,k=c.verticalAlign,p=c.inside,g,n,e=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,h[f]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=n,e?l||(c.align=n?"right":"left"):k||(c.verticalAlign=n?"top":"bottom"),c.x=c.xHigh,c.y=c.yHigh;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.dataLabelUpper= +g.dataLabel,g.dataLabel=h[f],g.y=g.low,g.plotY=g._plotY,g.below=!n,e?l||(c.align=n?"left":"right"):k||(c.verticalAlign=n?"bottom":"top"),c.x=c.xLow,c.y=c.yLow;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}c.align=l;c.verticalAlign=k},alignDataLabel:function(){e.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(x);(function(b){var r=b.seriesType;r("areasplinerange","arearange",null,{getPointSpline:b.seriesTypes.spline.prototype.getPointSpline})})(x); +(function(b){var r=b.defaultPlotOptions,t=b.each,w=b.merge,m=b.noop,q=b.pick,e=b.seriesType,a=b.seriesTypes.column.prototype;e("columnrange","arearange",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var d=this,f=d.yAxis,b=d.xAxis,u=b.startAngleRad,c,l=d.chart,k=d.xAxis.isRadial,p;a.translate.apply(d);t(d.points,function(a){var g=a.shapeArgs,h=d.options.minPointLength,e,v;a.plotHigh=p=f.translate(a.high,0,1,0,1);a.plotLow=a.plotY;v=p;e=q(a.rectPlotY,a.plotY)-p;Math.abs(e)< +h?(h-=e,e+=h,v-=h/2):0>e&&(e*=-1,v-=e);k?(c=a.barX+u,a.shapeType="path",a.shapeArgs={d:d.polarArc(v+e,v,c,c+a.pointWidth)}):(g.height=e,g.y=v,a.tooltipPos=l.inverted?[f.len+f.pos-l.plotLeft-v-e/2,b.len+b.pos-l.plotTop-g.x-g.width/2,e]:[b.left-l.plotLeft+g.x+g.width/2,f.pos-l.plotTop+v+e/2,e])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:m,crispCol:a.crispCol,drawPoints:a.drawPoints,drawTracker:a.drawTracker,getColumnMetrics:a.getColumnMetrics,animate:function(){return a.animate.apply(this, +arguments)},polarArc:function(){return a.polarArc.apply(this,arguments)},pointAttribs:a.pointAttribs})})(x);(function(b){var r=b.each,t=b.isNumber,w=b.merge,m=b.pick,q=b.pInt,e=b.Series,a=b.seriesType,d=b.TrackerMixin;a("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:b.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,d=this.options,b=a.center;this.generatePoints();r(this.points,function(c){var f=w(d.dial,c.dial),k=q(m(f.radius,80))*b[2]/200,h=q(m(f.baseLength,70))*k/100,g=q(m(f.rearLength,10))*k/100,n=f.baseWidth||3,u=f.topWidth||1,e=d.overshoot,v=a.startAngleRad+a.translate(c.y,null,null,null,!0);t(e)?(e=e/180*Math.PI,v=Math.max(a.startAngleRad-e,Math.min(a.endAngleRad+e,v))):!1===d.wrap&&(v=Math.max(a.startAngleRad,Math.min(a.endAngleRad, +v)));v=180*v/Math.PI;c.shapeType="path";c.shapeArgs={d:f.path||["M",-g,-n/2,"L",h,-n/2,k,-u/2,k,u/2,h,n/2,-g,n/2,"z"],translateX:b[0],translateY:b[1],rotation:v};c.plotX=b[0];c.plotY=b[1]})},drawPoints:function(){var a=this,d=a.yAxis.center,b=a.pivot,c=a.options,l=c.pivot,k=a.chart.renderer;r(a.points,function(d){var g=d.graphic,b=d.shapeArgs,f=b.d,h=w(c.dial,d.dial);g?(g.animate(b),b.d=f):(d.graphic=k[d.shapeType](b).attr({rotation:b.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group),d.graphic.attr({stroke:h.borderColor|| +"none","stroke-width":h.borderWidth||0,fill:h.backgroundColor||"#000000"}))});b?b.animate({translateX:d[0],translateY:d[1]}):(a.pivot=k.circle(0,0,m(l.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(d[0],d[1]).add(a.group),a.pivot.attr({"stroke-width":l.borderWidth||0,stroke:l.borderColor||"#cccccc",fill:l.backgroundColor||"#000000"}))},animate:function(a){var d=this;a||(r(d.points,function(a){var c=a.graphic;c&&(c.attr({rotation:180*d.yAxis.startAngleRad/Math.PI}),c.animate({rotation:a.shapeArgs.rotation}, +d.options.animation))}),d.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);e.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,d){e.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();m(d,!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(a){this.state=a}})})(x);(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.seriesType, +q=b.seriesTypes;m("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:["low","q1","median", +"q3","high"],toYData:function(b){return[b.low,b.q1,b.median,b.q3,b.high]},pointValKey:"high",pointAttribs:function(b){var a=this.options,d=b&&b.color||this.color;return{fill:b.fillColor||a.fillColor||d,stroke:a.lineColor||d,"stroke-width":a.lineWidth||0}},drawDataLabels:t,translate:function(){var b=this.yAxis,a=this.pointArrayMap;q.column.prototype.translate.apply(this);r(this.points,function(d){r(a,function(a){null!==d[a]&&(d[a+"Plot"]=b.translate(d[a],0,1,0,1))})})},drawPoints:function(){var b= +this,a=b.options,d=b.chart.renderer,f,h,u,c,l,k,p=0,g,n,m,q,v=!1!==b.doQuartiles,t,x=b.options.whiskerLength;r(b.points,function(e){var r=e.graphic,y=r?"animate":"attr",I=e.shapeArgs,z={},B={},G={},H=e.color||b.color;void 0!==e.plotY&&(g=I.width,n=Math.floor(I.x),m=n+g,q=Math.round(g/2),f=Math.floor(v?e.q1Plot:e.lowPlot),h=Math.floor(v?e.q3Plot:e.lowPlot),u=Math.floor(e.highPlot),c=Math.floor(e.lowPlot),r||(e.graphic=r=d.g("point").add(b.group),e.stem=d.path().addClass("highcharts-boxplot-stem").add(r), +x&&(e.whiskers=d.path().addClass("highcharts-boxplot-whisker").add(r)),v&&(e.box=d.path(void 0).addClass("highcharts-boxplot-box").add(r)),e.medianShape=d.path(void 0).addClass("highcharts-boxplot-median").add(r),z.stroke=e.stemColor||a.stemColor||H,z["stroke-width"]=w(e.stemWidth,a.stemWidth,a.lineWidth),z.dashstyle=e.stemDashStyle||a.stemDashStyle,e.stem.attr(z),x&&(B.stroke=e.whiskerColor||a.whiskerColor||H,B["stroke-width"]=w(e.whiskerWidth,a.whiskerWidth,a.lineWidth),e.whiskers.attr(B)),v&&(r= +b.pointAttribs(e),e.box.attr(r)),G.stroke=e.medianColor||a.medianColor||H,G["stroke-width"]=w(e.medianWidth,a.medianWidth,a.lineWidth),e.medianShape.attr(G)),k=e.stem.strokeWidth()%2/2,p=n+q+k,e.stem[y]({d:["M",p,h,"L",p,u,"M",p,f,"L",p,c]}),v&&(k=e.box.strokeWidth()%2/2,f=Math.floor(f)+k,h=Math.floor(h)+k,n+=k,m+=k,e.box[y]({d:["M",n,h,"L",n,f,"L",m,f,"L",m,h,"L",n,h,"z"]})),x&&(k=e.whiskers.strokeWidth()%2/2,u+=k,c+=k,t=/%$/.test(x)?q*parseFloat(x)/100:x/2,e.whiskers[y]({d:["M",p-t,u,"L",p+t,u, +"M",p-t,c,"L",p+t,c]})),l=Math.round(e.medianPlot),k=e.medianShape.strokeWidth()%2/2,l+=k,e.medianShape[y]({d:["M",n,l,"L",m,l]}))})},setStackedPoints:t})})(x);(function(b){var r=b.each,t=b.noop,w=b.seriesType,m=b.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},whiskerWidth:null},{type:"errorbar", +pointArrayMap:["low","high"],toYData:function(b){return[b.low,b.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:m.arearange?function(){var b=this.pointValKey;m.arearange.prototype.drawDataLabels.call(this);r(this.data,function(e){e.y=e[b]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||m.column.prototype.getColumnMetrics.call(this)}})})(x);(function(b){var r=b.correctFloat,t=b.isNumber,w=b.pick,m=b.Point,q=b.Series,e=b.seriesType,a=b.seriesTypes; +e("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",translate:function(){var d=this.options,b=this.yAxis,h,e,c,l,k,p,g,n,m,q=w(d.minPointLength,5),v=d.threshold,t=d.stacking;a.column.prototype.translate.apply(this);this.minPointLengthOffset=0;g=n=v;e=this.points;h=0;for(d=e.length;hl.height&&(l.y+=l.height,l.height*=-1),c.plotY=l.y=Math.round(l.y)- +this.borderWidth%2/2,l.height=Math.max(Math.round(l.height),.001),c.yBottom=l.y+l.height,l.height<=q&&(l.height=q,this.minPointLengthOffset+=q),l.y-=this.minPointLengthOffset,l=c.plotY+(c.negative?l.height:0)-this.minPointLengthOffset,this.chart.inverted?c.tooltipPos[0]=b.len-l:c.tooltipPos[1]=l},processData:function(a){var b=this.yData,d=this.options.data,e,c=b.length,l,k,p,g,n,m;k=l=p=g=this.options.threshold||0;for(m=0;ma[k-1].y&&(l[2]+=c.height,l[5]+=c.height),e=e.concat(l);return e},drawGraph:function(){q.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},getExtremes:b.noop},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum"); +return a},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(x);(function(b){var r=b.Series,t=b.seriesType,w=b.seriesTypes;t("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var b=r.prototype.getGraphPath.call(this),q=b.length+1;q--;)(q===b.length||"M"===b[q])&&0=this.minPxSize/2?(d.shapeType="circle",d.shapeArgs={x:d.plotX,y:d.plotY,r:c},d.dlBox={x:d.plotX-c,y:d.plotY-c,width:2*c,height:2*c}):d.shapeArgs=d.plotY=d.dlBox=void 0},drawLegendSymbol:function(a,b){var d=this.chart.renderer,c=d.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=d.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker= +!0},drawPoints:l.column.prototype.drawPoints,alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:a,applyZones:a},{haloPath:function(a){return h.prototype.haloPath.call(this,this.shapeArgs.r+a)},ttBelow:!1});w.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,h=0,l=b,u=this.isXAxis,m=u?"xData":"yData",w=this.min,x={},A=Math.min(c.plotWidth,c.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-w,z=b/E,F=[];q(this.series,function(b){var g=b.options;!b.bubblePadding|| +!b.visible&&c.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,F.push(b),u&&(q(["minSize","maxSize"],function(a){var b=g[a],d=/%$/.test(b),b=f(b);x[a]=d?A*b/100:b}),b.minPxSize=x.minSize,b.maxPxSize=Math.max(x.maxSize,x.minSize),b=b.zData,b.length&&(C=d(g.zMin,Math.min(C,Math.max(t(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=d(g.zMax,Math.max(D,r(b))))))});q(F,function(b){var d=b[m],c=d.length,f;u&&b.getRadii(C,D,b.minPxSize,b.maxPxSize);if(0f&&(f+=360),a.clientX=f):a.clientX=a.plotX};m.spline&&q(m.spline.prototype,"getPointSpline",function(a,b,f,h){var d,c,e,k,p,g,n;this.chart.polar?(d=f.plotX, +c=f.plotY,a=b[h-1],e=b[h+1],this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])),a&&e&&(k=a.plotX,p=a.plotY,b=e.plotX,g=e.plotY,k=(1.5*d+k)/2.5,p=(1.5*c+p)/2.5,e=(1.5*d+b)/2.5,n=(1.5*c+g)/2.5,b=Math.sqrt(Math.pow(k-d,2)+Math.pow(p-c,2)),g=Math.sqrt(Math.pow(e-d,2)+Math.pow(n-c,2)),k=Math.atan2(p-c,k-d),p=Math.atan2(n-c,e-d),n=Math.PI/2+(k+p)/2,Math.abs(k-n)>Math.PI/2&&(n-=Math.PI),k=d+Math.cos(n)*b,p=c+Math.sin(n)*b,e=d+Math.cos(Math.PI+n)*g,n=c+Math.sin(Math.PI+n)*g,f.rightContX=e,f.rightContY=n), +h?(f=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,k||d,p||c,d,c],a.rightContX=a.rightContY=null):f=["M",d,c]):f=a.call(this,b,f,h);return f});q(e,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});q(e,"getGraphPath",function(a,b){var d=this,e,m;if(this.chart.polar){b=b||this.points;for(e=0;eb.center[1]}),q(m,"alignDataLabel",function(a,b,f,h,m,c){this.chart.polar?(a=b.rectPlotX/Math.PI*180,null===h.align&&(h.align=20a?"left":200a?"right":"center"),null===h.verticalAlign&&(h.verticalAlign=45>a||315a?"top":"middle"),e.alignDataLabel.call(this,b,f,h,m,c)):a.call(this, +b,f,h,m,c)}));q(b,"getCoordinates",function(a,b){var d=this.chart,e={xAxis:[],yAxis:[]};d.polar?t(d.axes,function(a){var c=a.isXAxis,f=a.center,h=b.chartX-f[0]-d.plotLeft,f=b.chartY-f[1]-d.plotTop;e[c?"xAxis":"yAxis"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,f):Math.sqrt(Math.pow(h,2)+Math.pow(f,2)),!0)})}):e=a.call(this,b);return e})})(x)}); diff --git a/webapp/loadTests/1user/js/highstock.js b/webapp/loadTests/1user/js/highstock.js new file mode 100644 index 0000000..34a3f91 --- /dev/null +++ b/webapp/loadTests/1user/js/highstock.js @@ -0,0 +1,496 @@ +/* + Highstock JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(N,a){"object"===typeof module&&module.exports?module.exports=N.document?a(N):a:N.Highcharts=a(N)})("undefined"!==typeof window?window:this,function(N){N=function(){var a=window,D=a.document,B=a.navigator&&a.navigator.userAgent||"",G=D&&D.createElementNS&&!!D.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,H=/(edge|msie|trident)/i.test(B)&&!window.opera,p=!G,l=/Firefox/.test(B),r=l&&4>parseInt(B.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highstock", +version:"5.0.3",deg2rad:2*Math.PI/360,doc:D,hasBidiBug:r,hasTouch:D&&void 0!==D.documentElement.ontouchstart,isMS:H,isWebKit:/AppleWebKit/.test(B),isFirefox:l,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(B),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:p,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var D=[],B=a.charts,G=a.doc,H=a.win;a.error=function(a,l){a="Highcharts error #"+ +a+": www.highcharts.com/errors/"+a;if(l)throw Error(a);H.console&&console.log(a)};a.Fx=function(a,l,r){this.options=l;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],l=this.paths[1],r=[],w=this.now,t=a.length,k;if(1===w)r=this.toD;else if(t===l.length&&1>w)for(;t--;)k=parseFloat(a[t]),r[t]=isNaN(k)?a[t]:w*parseFloat(l[t]-k)+k;else r=l;this.elem.attr("d",r)},update:function(){var a=this.elem,l=this.prop,r=this.now,w=this.options.step;if(this[l+"Setter"])this[l+"Setter"](); +else a.attr?a.element&&a.attr(l,r):a.style[l]=r+this.unit;w&&w.call(a,r,this)},run:function(a,l,r){var p=this,t=function(a){return t.stopped?!1:p.step(a)},k;this.startTime=+new Date;this.start=a;this.end=l;this.unit=r;this.now=this.start;this.pos=0;t.elem=this.elem;t()&&1===D.push(t)&&(t.timerId=setInterval(function(){for(k=0;k=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=m[this.prop]=!0;for(e in m)!0!==m[e]&&(a=!1);a&&t&&t.call(p);p=!1}else this.pos=w.easing((l-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),p=!0;return p},initPath:function(p,l,r){function w(a){for(b=a.length;b--;)"M"!==a[b]&&"L"!==a[b]||a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function t(a,c){for(;a.lengthm?"AM":"PM",P:12>m?"am":"pm",S:q(t.getSeconds()),L:q(Math.round(l%1E3),3)},a.dateFormats);for(k in w)for(;-1!==p.indexOf("%"+k);)p= +p.replace("%"+k,"function"===typeof w[k]?w[k](l):w[k]);return r?p.substr(0,1).toUpperCase()+p.substr(1):p};a.formatSingle=function(p,l){var r=/\.([0-9])/,w=a.defaultOptions.lang;/f$/.test(p)?(r=(r=p.match(r))?r[1]:-1,null!==l&&(l=a.numberFormat(l,r,w.decimalPoint,-1=r&&(l=[1/r])));for(w=0;w=p||!t&&k<=(l[w]+(l[w+1]||l[w]))/ +2);w++);return m*r};a.stableSort=function(a,l){var r=a.length,p,t;for(t=0;tr&&(r=a[l]);return r};a.destroyObjectProperties=function(a,l){for(var r in a)a[r]&&a[r]!==l&&a[r].destroy&&a[r].destroy(),delete a[r]};a.discardElement=function(p){var l= +a.garbageBin;l||(l=a.createElement("div"));p&&l.appendChild(p);l.innerHTML=""};a.correctFloat=function(a,l){return parseFloat(a.toPrecision(l||14))};a.setAnimation=function(p,l){l.renderer.globalAnimation=a.pick(p,l.options.chart.animation,!0)};a.animObject=function(p){return a.isObject(p)?a.merge(p):{duration:p?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(p,l,r,w){p=+p||0;l=+l;var t=a.defaultOptions.lang, +k=(p.toString().split(".")[1]||"").length,m,e,g=Math.abs(p);-1===l?l=Math.min(k,20):a.isNumber(l)||(l=2);m=String(a.pInt(g.toFixed(l)));e=3p?"-":"")+(e?m.substr(0,e)+w:"");p+=m.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+w);l&&(w=Math.abs(g-m+Math.pow(10,-Math.max(l,k)-1)),p+=r+w.toFixed(l).slice(2));return p};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(p,l){return"width"===l?Math.min(p.offsetWidth, +p.scrollWidth)-a.getStyle(p,"padding-left")-a.getStyle(p,"padding-right"):"height"===l?Math.min(p.offsetHeight,p.scrollHeight)-a.getStyle(p,"padding-top")-a.getStyle(p,"padding-bottom"):(p=H.getComputedStyle(p,void 0))&&a.pInt(p.getPropertyValue(l))};a.inArray=function(a,l){return l.indexOf?l.indexOf(a):[].indexOf.call(l,a)};a.grep=function(a,l){return[].filter.call(a,l)};a.map=function(a,l){for(var r=[],p=0,t=a.length;pl;l++)w[l]+=p(255*a),0>w[l]&&(w[l]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width, +b=z.height,c&&L&&"11px"===L.fontSize&&"16.9"===b.toPrecision(3)&&(z.height=b=14),v&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(g&&0]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,c,v){"string"===typeof a?v.setAttribute(c, +a):a&&this.colorGradient(a,c,v)},visibilitySetter:function(a,c,v){"inherit"===a?v.removeAttribute(c):v.setAttribute(c,a)},zIndexSetter:function(a,c){var v=this.renderer,z=this.parentGroup,b=(z||v).element||v.box,d,n=this.element,f;d=this.added;var e;k(a)&&(n.zIndex=a,a=+a,this[c]===a&&(d=!1),this[c]=a);if(d){(a=this.zIndex)&&z&&(z.handleZ=!0);c=b.childNodes;for(e=0;ea||!k(a)&&k(d)||0>a&&!k(d)&&b!==v.box)&&(b.insertBefore(n,z),f=!0);f||b.appendChild(n)}return f}, +_defaultSetter:function(a,c,v){v.setAttribute(c,a)}};D.prototype.yGetter=D.prototype.xGetter;D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.rotationSetter=D.prototype.verticalAlignSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=function(a,c){this[c]=a;this.doTransform=!0};D.prototype["stroke-widthSetter"]=D.prototype.strokeSetter=function(a,c,v){this[c]=a;this.stroke&&this["stroke-width"]?(D.prototype.fillSetter.call(this,this.stroke,"stroke",v),v.setAttribute("stroke-width", +this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===a&&this.hasStroke&&(v.removeAttribute("stroke"),this.hasStroke=!1)};B=a.SVGRenderer=function(){this.init.apply(this,arguments)};B.prototype={Element:D,SVG_NS:K,init:function(a,c,v,b,d,n){var z;b=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(b));z=b.element;a.appendChild(z);-1===a.innerHTML.indexOf("xmlns")&&p(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=b;this.alignedObjects= +[];this.url=(E||A)&&g.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(g.createTextNode("Created with Highstock 5.0.3"));this.defs=this.createElement("defs").add();this.allowHTML=n;this.forExport=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,v,!1);var f;E&&a.getBoundingClientRect&&(c=function(){w(a,{left:0,top:0});f=a.getBoundingClientRect(); +w(a,{left:Math.ceil(f.left)-f.left+"px",top:Math.ceil(f.top)-f.top+"px"})},c(),this.unSubPixelFix=G(R,"resize",c))},getStyle:function(a){return this.style=C({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients= +null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var c=new this.Element;c.init(this,a);return c},draw:J,getRadialAttr:function(a,c){return{cx:a[0]-a[2]/2+c.cx*a[2],cy:a[1]-a[2]/2+c.cy*a[2],r:c.r*a[2]}},buildText:function(a){for(var c=a.element,z=this,b=z.forExport,n=y(a.textStr,"").toString(),f=-1!==n.indexOf("\x3c"),e=c.childNodes,q,F,x,A,I=p(c,"x"),m=a.styles,k=a.textWidth,C=m&&m.lineHeight,M=m&&m.textOutline,J=m&& +"ellipsis"===m.textOverflow,E=e.length,O=k&&!a.added&&this.box,t=function(a){var v;v=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:m&&m.fontSize||z.style.fontSize||12;return C?u(C):z.fontMetrics(v,a.getAttribute("style")?a:c).h};E--;)c.removeChild(e[E]);f||M||J||k||-1!==n.indexOf(" ")?(q=/<.*class="([^"]+)".*>/,F=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,O&&O.appendChild(c),n=f?n.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[n],n=d(n,function(a){return""!==a}),h(n,function(d,n){var f,e=0;d=d.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");f=d.split("|||");h(f,function(d){if(""!==d||1===f.length){var u={},y=g.createElementNS(z.SVG_NS,"tspan"),L,h;q.test(d)&&(L=d.match(q)[1],p(y,"class",L));F.test(d)&&(h=d.match(F)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),p(y,"style",h));x.test(d)&&!b&&(p(y, +"onclick",'location.href\x3d"'+d.match(x)[1]+'"'),w(y,{cursor:"pointer"}));d=(d.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==d){y.appendChild(g.createTextNode(d));e?u.dx=0:n&&null!==I&&(u.x=I);p(y,u);c.appendChild(y);!e&&n&&(!v&&b&&w(y,{display:"block"}),p(y,"dy",t(y)));if(k){u=d.replace(/([^\^])-/g,"$1- ").split(" ");L="nowrap"===m.whiteSpace;for(var C=1k,void 0===A&&(A=M),J&&A?(Q/=2,""===l||!M&&.5>Q?u=[]:(l=d.substring(0,l.length+(M?-1:1)*Math.ceil(Q)),u=[l+(3k&&(k=P)),u.length&&y.appendChild(g.createTextNode(u.join(" ").replace(/- /g, +"-")));a.rotation=R}e++}}})}),A&&a.attr("title",a.textStr),O&&O.removeChild(c),M&&a.applyTextOutline&&a.applyTextOutline(M)):c.appendChild(g.createTextNode(n.replace(/</g,"\x3c").replace(/>/g,"\x3e")))},getContrast:function(a){a=r(a).rgba;return 510v?d>c+f&&de?d>c+f&&db&&e>a+f&&ed&&e>a+f&&ea?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a, +c,v){var b=a;c&&v&&(b=Math.max(b*Math.cos(c*m),4));return{x:-a/3*Math.sin(c*m),y:b}},label:function(a,c,v,b,d,n,f,e,K){var q=this,u=q.g("button"!==K&&"label"),y=u.text=q.text("",0,0,f).attr({zIndex:1}),g,F,z=0,A=3,L=0,m,M,J,E,O,t={},l,R,r=/^url\((.*?)\)$/.test(b),p=r,P,w,Q,S;K&&u.addClass("highcharts-"+K);p=r;P=function(){return(l||0)%2/2};w=function(){var a=y.element.style,c={};F=(void 0===m||void 0===M||O)&&k(y.textStr)&&y.getBBox();u.width=(m||F.width||0)+2*A+L;u.height=(M||F.height||0)+2*A;R= +A+q.fontMetrics(a&&a.fontSize,y).b;p&&(g||(u.box=g=q.symbols[b]||r?q.symbol(b):q.rect(),g.addClass(("button"===K?"":"highcharts-label-box")+(K?" highcharts-"+K+"-box":"")),g.add(u),a=P(),c.x=a,c.y=(e?-R:0)+a),c.width=Math.round(u.width),c.height=Math.round(u.height),g.attr(C(c,t)),t={})};Q=function(){var a=L+A,c;c=e?0:R;k(m)&&F&&("center"===O||"right"===O)&&(a+={center:.5,right:1}[O]*(m-F.width));if(a!==y.x||c!==y.y)y.attr("x",a),void 0!==c&&y.attr("y",c);y.x=a;y.y=c};S=function(a,c){g?g.attr(a,c): +t[a]=c};u.onAdd=function(){y.add(u);u.attr({text:a||0===a?a:"",x:c,y:v});g&&k(d)&&u.attr({anchorX:d,anchorY:n})};u.widthSetter=function(a){m=a};u.heightSetter=function(a){M=a};u["text-alignSetter"]=function(a){O=a};u.paddingSetter=function(a){k(a)&&a!==A&&(A=u.padding=a,Q())};u.paddingLeftSetter=function(a){k(a)&&a!==L&&(L=a,Q())};u.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,F&&u.attr({x:J}))};u.textSetter=function(a){void 0!==a&&y.textSetter(a);w();Q()};u["stroke-widthSetter"]= +function(a,c){a&&(p=!0);l=this["stroke-width"]=a;S(c,a)};u.strokeSetter=u.fillSetter=u.rSetter=function(a,c){"fill"===c&&a&&(p=!0);S(c,a)};u.anchorXSetter=function(a,c){d=a;S(c,Math.round(a)-P()-J)};u.anchorYSetter=function(a,c){n=a;S(c,a-E)};u.xSetter=function(a){u.x=a;z&&(a-=z*((m||F.width)+2*A));J=Math.round(a);u.attr("translateX",J)};u.ySetter=function(a){E=u.y=Math.round(a);u.attr("translateY",E)};var T=u.css;return C(u,{css:function(a){if(a){var c={};a=x(a);h(u.textProps,function(v){void 0!== +a[v]&&(c[v]=a[v],delete a[v])});y.css(c)}return T.call(u,a)},getBBox:function(){return{width:F.width+2*A,height:F.height+2*A,x:F.x-A,y:F.y-A}},shadow:function(a){a&&(w(),g&&g.shadow(a));return u},destroy:function(){I(u.element,"mouseenter");I(u.element,"mouseleave");y&&(y=y.destroy());g&&(g=g.destroy());D.prototype.destroy.call(u);u=q=w=Q=S=null}})}};a.Renderer=B})(N);(function(a){var D=a.attr,B=a.createElement,G=a.css,H=a.defined,p=a.each,l=a.extend,r=a.isFirefox,w=a.isMS,t=a.isWebKit,k=a.pInt,m= +a.SVGRenderer,e=a.win,g=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var e=this.element;if(e=a&&"SPAN"===e.tagName&&a.width)delete a.width,this.textWidth=e,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a= +this.renderer,e=this.element,f=this.translateX||0,d=this.translateY||0,b=this.x||0,q=this.y||0,g=this.textAlign||"left",c={left:0,center:.5,right:1}[g],F=this.styles;G(e,{marginLeft:f,marginTop:d});this.shadows&&p(this.shadows,function(a){G(a,{marginLeft:f+1,marginTop:d+1})});this.inverted&&p(e.childNodes,function(c){a.invertChild(c,e)});if("SPAN"===e.tagName){var n=this.rotation,A=k(this.textWidth),x=F&&F.whiteSpace,m=[n,g,e.innerHTML,this.textWidth,this.textAlign].join();m!==this.cTT&&(F=a.fontMetrics(e.style.fontSize).b, +H(n)&&this.setSpanRotation(n,c,F),G(e,{width:"",whiteSpace:x||"nowrap"}),e.offsetWidth>A&&/[ \-]/.test(e.textContent||e.innerText)&&G(e,{width:A+"px",display:"block",whiteSpace:x||"normal"}),this.getSpanCorrection(e.offsetWidth,F,c,n,g));G(e,{left:b+(this.xCorr||0)+"px",top:q+(this.yCorr||0)+"px"});t&&(F=e.offsetHeight);this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,g,f){var d={},b=w?"-ms-transform":t?"-webkit-transform":r?"MozTransform":e.opera?"-o-transform":"";d[b]=d.transform= +"rotate("+a+"deg)";d[b+(r?"Origin":"-origin")]=d.transformOrigin=100*g+"% "+f+"px";G(this.element,d)},getSpanCorrection:function(a,e,f){this.xCorr=-a*f;this.yCorr=-e}});l(m.prototype,{html:function(a,e,f){var d=this.createElement("span"),b=d.element,q=d.renderer,h=q.isSVG,c=function(a,c){p(["opacity","visibility"],function(b){g(a,b+"Setter",function(a,b,d,n){a.call(this,b,d,n);c[d]=b})})};d.textSetter=function(a){a!==b.innerHTML&&delete this.bBox;b.innerHTML=this.textStr=a;d.htmlUpdateTransform()}; +h&&c(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,c){"align"===c&&(c="textAlign");d[c]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(e),y:Math.round(f)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});b.style.whiteSpace="nowrap";d.css=d.htmlCss;h&&(d.add=function(a){var n,f=q.box.parentNode,e=[];if(this.parentGroup=a){if(n=a.div,!n){for(;a;)e.push(a),a=a.parentGroup;p(e.reverse(),function(a){var b,d=D(a.element, +"class");d&&(d={className:d});n=a.div=a.div||B("div",d,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},n||f);b=n.style;l(a,{translateXSetter:function(c,d){b.left=c+"px";a[d]=c;a.doTransform=!0},translateYSetter:function(c,d){b.top=c+"px";a[d]=c;a.doTransform=!0}});c(a,b)})}}else n=f;n.appendChild(b);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d});return d}})})(N);(function(a){var D, +B,G=a.createElement,H=a.css,p=a.defined,l=a.deg2rad,r=a.discardElement,w=a.doc,t=a.each,k=a.erase,m=a.extend;D=a.extendClass;var e=a.isArray,g=a.isNumber,h=a.isObject,C=a.merge;B=a.noop;var f=a.pick,d=a.pInt,b=a.SVGElement,q=a.SVGRenderer,E=a.win;a.svg||(B={docMode8:w&&8===w.documentMode,init:function(a,b){var c=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],f="div"===b;("shape"===b||f)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",f?"hidden":"visible"); +c.push(' style\x3d"',d.join(""),'"/\x3e');b&&(c=f||"span"===b||"img"===b?c.join(""):a.prepVML(c),this.element=G(c));this.renderer=a},add:function(a){var c=this.renderer,b=this.element,d=c.box,f=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);f&&c.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},updateTransform:b.prototype.htmlUpdateTransform, +setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*l),d=Math.sin(a*l);H(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,e,q){var c=e?Math.cos(e*l):1,n=e?Math.sin(e*l):0,u=f(this.elemHeight,this.element.offsetHeight),g;this.xCorr=0>c&&-a;this.yCorr=0>n&&-u;g=0>c*n;this.xCorr+=n*b*(g?1-d:d);this.yCorr-=c*b*(e?g?d:1-d:1);q&&"left"!== +q&&(this.xCorr-=a*d*(0>c?-1:1),e&&(this.yCorr-=u*d*(0>n?-1:1)),H(this.element,{textAlign:q}))},pathToVML:function(a){for(var c=a.length,b=[];c--;)g(a[c])?b[c]=Math.round(10*a[c])-5:"Z"===a[c]?b[c]="x":(b[c]=a[c],!a.isArc||"wa"!==a[c]&&"at"!==a[c]||(b[c+5]===b[c+7]&&(b[c+7]+=a[c+7]>a[c+5]?1:-1),b[c+6]===b[c+8]&&(b[c+8]+=a[c+8]>a[c+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var c=this,b;a?(b=a.members,k(b,c),b.push(c),c.destroyClip=function(){k(b,c)},a=a.getCSS(c)):(c.destroyClip&&c.destroyClip(), +a={clip:c.docMode8?"inherit":"rect(auto)"});return c.css(a)},css:b.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&r(a)},destroy:function(){this.destroyClip&&this.destroyClip();return b.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c;a=a.split(/[ ,]/);c=a.length;if(9===c||11===c)a[c-4]=a[c-2]=d(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,e){var c=[],n,q=this.element, +g=this.renderer,u,I=q.style,F,v=q.path,K,h,m,z;v&&"string"!==typeof v.value&&(v="x");h=v;if(a){m=f(a.width,3);z=(a.opacity||.15)/m;for(n=1;3>=n;n++)K=2*m+1-2*n,e&&(h=this.cutOffPath(v.value,K+.5)),F=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',K,'" filled\x3d"false" path\x3d"',h,'" coordsize\x3d"10 10" style\x3d"',q.style.cssText,'" /\x3e'],u=G(g.prepVML(F),null,{left:d(I.left)+f(a.offsetX,1),top:d(I.top)+f(a.offsetY,1)}),e&&(u.cutOff=K+1),F=['\x3cstroke color\x3d"',a.color||"#000000",'" opacity\x3d"', +z*n,'"/\x3e'],G(g.prepVML(F),null,null,u),b?b.element.appendChild(u):q.parentNode.insertBefore(u,q),c.push(u);this.shadows=c}return this},updateShadows:B,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||G(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,b,d){var c=this.shadows; +a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(c)for(d=c.length;d--;)c[d].path=c[d].cutOff?this.cutOffPath(a,c[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var c=d.nodeName;"SPAN"===c?d.style.color=a:"IMG"!==c&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){G(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:B,rotationSetter:function(a,b,d){d= +d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*l)+1)+"px";d.top=Math.round(Math.cos(a*l))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;g(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&t(this.shadows,function(c){c.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===a?"-999em": +0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},B["stroke-opacitySetter"]=B["fill-opacitySetter"],a.VMLElement=B=D(b,B),B.prototype.ySetter=B.prototype.widthSetter=B.prototype.heightSetter=B.prototype.xSetter,B={Element:B,isIE8:-1l[0]&&c.push([1,l[1]]);t(c,function(c,b){q.test(c[1])?(n=a.color(c[1]),v=n.get("rgb"),K=n.get("a")):(v=c[1],K=1);r.push(100*c[0]+"% "+v);b?(m=K,k=v):(z=K,E=v)});if("fill"===d)if("gradient"===g)d=A.x1||A[0]||0,c=A.y1||A[1]||0,F=A.x2||A[2]||0,A=A.y2||A[3]||0,C='angle\x3d"'+(90-180*Math.atan((A-c)/(F-d))/Math.PI)+'"',p();else{var h=A.r,w=2*h,B=2*h,D=A.cx,H=A.cy,V=b.radialReference,U,h=function(){V&&(U=f.getBBox(),D+=(V[0]- +U.x)/U.width-.5,H+=(V[1]-U.y)/U.height-.5,w*=V[2]/U.width,B*=V[2]/U.height);C='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+w+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+D+","+H+'" color2\x3d"'+E+'" ';p()};f.added?h():f.onAdd=h;h=k}else h=v}else q.test(c)&&"IMG"!==b.tagName?(n=a.color(c),f[d+"-opacitySetter"](n.get("a"),d,b),h=n.get("rgb")):(h=b.getElementsByTagName(d),h.length&&(h[0].opacity=1,h[0].type="solid"),h=c);return h},prepVML:function(a){var c=this.isIE8;a=a.join(""); +c?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:q.prototype.html,path:function(a){var c={coordsize:"10 10"};e(a)?c.d=a:h(a)&&m(c,a);return this.createElement("shape").attr(c)},circle:function(a,b,d){var c=this.symbol("circle"); +h(a)&&(d=a.r,b=a.y,a=a.x);c.isCircle=!0;c.r=d;return c.attr({x:a,y:b})},g:function(a){var c;a&&(c={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(c)},image:function(a,b,d,f,e){var c=this.createElement("img").attr({src:a});1f&&m-d*bg&&(F=Math.round((e-m)/Math.cos(f*w)));else if(e=m+(1-d)*b,m-d*bg&&(E=g-a.x+E*d,c=-1),E=Math.min(q, +E),EE||k.autoRotation&&(C.styles||{}).width)F=E;F&&(n.width=F,(k.options.labels.style||{}).textOverflow||(n.textOverflow="ellipsis"),C.css(n))},getPosition:function(a,k,m,e){var g=this.axis,h=g.chart,l=e&&h.oldChartHeight||h.chartHeight;return{x:a?g.translate(k+m,null,null,e)+g.transB:g.left+g.offset+(g.opposite?(e&&h.oldChartWidth||h.chartWidth)-g.right-g.left:0),y:a?l-g.bottom+g.offset-(g.opposite?g.height:0):l-g.translate(k+m,null, +null,e)-g.transB}},getLabelPosition:function(a,k,m,e,g,h,l,f){var d=this.axis,b=d.transA,q=d.reversed,E=d.staggerLines,c=d.tickRotCorr||{x:0,y:0},F=g.y;B(F)||(F=0===d.side?m.rotation?-8:-m.getBBox().height:2===d.side?c.y+8:Math.cos(m.rotation*w)*(c.y-m.getBBox(!1,0).height/2));a=a+g.x+c.x-(h&&e?h*b*(q?-1:1):0);k=k+F-(h&&!e?h*b*(q?1:-1):0);E&&(m=l/(f||1)%E,d.opposite&&(m=E-m-1),k+=d.labelOffset/E*m);return{x:a,y:Math.round(k)}},getMarkPath:function(a,k,m,e,g,h){return h.crispLine(["M",a,k,"L",a+(g? +0:-m),k+(g?m:0)],e)},render:function(a,k,m){var e=this.axis,g=e.options,h=e.chart.renderer,C=e.horiz,f=this.type,d=this.label,b=this.pos,q=g.labels,E=this.gridLine,c=f?f+"Tick":"tick",F=e.tickSize(c),n=this.mark,A=!n,x=q.step,p={},y=!0,u=e.tickmarkOffset,I=this.getPosition(C,b,u,k),M=I.x,I=I.y,v=C&&M===e.pos+e.len||!C&&I===e.pos?-1:1,K=f?f+"Grid":"grid",O=g[K+"LineWidth"],R=g[K+"LineColor"],z=g[K+"LineDashStyle"],K=l(g[c+"Width"],!f&&e.isXAxis?1:0),c=g[c+"Color"];m=l(m,1);this.isActive=!0;E||(p.stroke= +R,p["stroke-width"]=O,z&&(p.dashstyle=z),f||(p.zIndex=1),k&&(p.opacity=0),this.gridLine=E=h.path().attr(p).addClass("highcharts-"+(f?f+"-":"")+"grid-line").add(e.gridGroup));if(!k&&E&&(b=e.getPlotLinePath(b+u,E.strokeWidth()*v,k,!0)))E[this.isNew?"attr":"animate"]({d:b,opacity:m});F&&(e.opposite&&(F[0]=-F[0]),A&&(this.mark=n=h.path().addClass("highcharts-"+(f?f+"-":"")+"tick").add(e.axisGroup),n.attr({stroke:c,"stroke-width":K})),n[A?"attr":"animate"]({d:this.getMarkPath(M,I,F[0],n.strokeWidth()* +v,C,h),opacity:m}));d&&H(M)&&(d.xy=I=this.getLabelPosition(M,I,d,C,q,u,a,x),this.isFirst&&!this.isLast&&!l(g.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(g.showLastLabel,1)?y=!1:!C||e.isRadial||q.step||q.rotation||k||0===m||this.handleOverflow(I),x&&a%x&&(y=!1),y&&H(I.y)?(I.opacity=m,d[this.isNew?"attr":"animate"](I)):(r(d),d.attr("y",-9999)),this.isNew=!1)},destroy:function(){G(this,this.axis)}}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.AxisPlotLineOrBandExtension, +l=a.color,r=a.correctFloat,w=a.defaultOptions,t=a.defined,k=a.deg2rad,m=a.destroyObjectProperties,e=a.each,g=a.error,h=a.extend,C=a.fireEvent,f=a.format,d=a.getMagnitude,b=a.grep,q=a.inArray,E=a.isArray,c=a.isNumber,F=a.isString,n=a.merge,A=a.normalizeTickInterval,x=a.pick,J=a.PlotLineOrBand,y=a.removeEvent,u=a.splat,I=a.syncTimeout,M=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M", +hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb", +lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15}, +title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var b=c.isX;this.chart=a;this.horiz=a.inverted?!b:b;this.isXAxis=b;this.coll=this.coll||(b?"xAxis":"yAxis");this.opposite=c.opposite;this.side=c.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,v=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter; +this.userOptions=c;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===v||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===v;this.isDatetimeAxis="datetime"===v;this.isLinked=t(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom; +this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=x(d.crosshair,u(a.options.tooltip.crosshairs)[b?0:1],!1);var f;c=this.options.events;-1===q(this,a.axes)&&(b?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&b&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in c)D(this,f,c[f]); +this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=n(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],n(w[this.coll],a))},defaultLabelFormatter:function(){var c=this.axis,b=this.value,d=c.categories,e=this.dateTimeLabelFormat,q=w.lang,u=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,n=u&&u.length,g,y=c.options.labels.format, +c=c.isLog?b:c.tickInterval;if(y)g=f(y,this);else if(d)g=b;else if(e)g=a.dateFormat(e,b);else if(n&&1E3<=c)for(;n--&&void 0===g;)d=Math.pow(q,n+1),c>=d&&0===10*b%d&&null!==u[n]&&0!==b&&(g=a.numberFormat(b/d,-1)+u[n]);void 0===g&&(g=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return g},getSeriesExtremes:function(){var a=this,d=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();e(a.series,function(v){if(v.visible|| +!d.options.chart.ignoreHiddenSeries){var f=v.options,e=f.threshold,q;a.hasVisibleSeries=!0;a.isLog&&0>=e&&(e=null);if(a.isXAxis)f=v.xData,f.length&&(v=H(f),c(v)||v instanceof Date||(f=b(f,function(a){return c(a)}),v=H(f)),a.dataMin=Math.min(x(a.dataMin,f[0]),v),a.dataMax=Math.max(x(a.dataMax,f[0]),G(f)));else if(v.getExtremes(),q=v.dataMax,v=v.dataMin,t(v)&&t(q)&&(a.dataMin=Math.min(x(a.dataMin,v),v),a.dataMax=Math.max(x(a.dataMax,q),q)),t(e)&&(a.threshold=e),!f.softThreshold||a.isLog)a.softThreshold= +!1}})},translate:function(a,b,d,f,e,q){var v=this.linkedParent||this,u=1,n=0,g=f?v.oldTransA:v.transA;f=f?v.oldMin:v.min;var K=v.minPixelPadding;e=(v.isOrdinal||v.isBroken||v.isLog&&e)&&v.lin2val;g||(g=v.transA);d&&(u*=-1,n=v.len);v.reversed&&(u*=-1,n-=u*(v.sector||v.len));b?(a=(a*u+n-K)/g+f,e&&(a=v.lin2val(a))):(e&&(a=v.val2lin(a)),a=u*(a-f)*g+n+u*K+(c(q)?g*q:0));return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a- +(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,f,e){var v=this.chart,q=this.left,u=this.top,n,g,K=d&&v.oldChartHeight||v.chartHeight,y=d&&v.oldChartWidth||v.chartWidth,z;n=this.transB;var h=function(a,c,b){if(ab)f?a=Math.min(Math.max(c,a),b):z=!0;return a};e=x(e,this.translate(a,null,null,d));a=d=Math.round(e+n);n=g=Math.round(K-e-n);c(e)?this.horiz?(n=u,g=K-this.bottom,a=d=h(a,q,q+this.width)):(a=q,d=y-this.right,n=g=h(n,u,u+this.height)):z=!0;return z&&!f?null:v.renderer.crispLine(["M", +a,n,"L",d,g],b||1)},getLinearTickPositions:function(a,b,d){var v,f=r(Math.floor(b/a)*a),e=r(Math.ceil(d/a)*a),q=[];if(b===d&&c(b))return[b];for(b=f;b<=e;){q.push(b);b=r(b+a);if(b===v)break;v=b}return q},getMinorTickPositions:function(){var a=this.options,c=this.tickPositions,b=this.minorTickInterval,d=[],f,e=this.pointRangePadding||0;f=this.min-e;var e=this.max+e,q=e-f;if(q&&q/b=this.minRange,q,u,n,g,y,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(t(a.min)||t(a.max)?this.minRange=null:(e(this.series,function(a){g=a.xData;for(u=y=a.xIncrement? +1:g.length-1;0=E?(p=E,m=0):b.dataMax<=E&&(J=E,I=0)),b.min=x(w,p,b.dataMin),b.max=x(B,J,b.dataMax));q&&(!a&&0>=Math.min(b.min, +x(b.dataMin,b.min))&&g(10,1),b.min=r(u(b.min),15),b.max=r(u(b.max),15));b.range&&t(b.max)&&(b.userMin=b.min=w=Math.max(b.min,b.minFromRange()),b.userMax=B=b.max,b.range=null);C(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(l||b.axisPointRange||b.usePercentage||h)&&t(b.min)&&t(b.max)&&(u=b.max-b.min)&&(!t(w)&&m&&(b.min-=u*m),!t(B)&&I&&(b.max+=u*I));c(f.floor)?b.min=Math.max(b.min,f.floor):c(f.softMin)&&(b.min=Math.min(b.min,f.softMin));c(f.ceiling)?b.max=Math.min(b.max, +f.ceiling):c(f.softMax)&&(b.max=Math.max(b.max,f.softMax));M&&t(b.dataMin)&&(E=E||0,!t(w)&&b.min=E?b.min=E:!t(B)&&b.max>E&&b.dataMax<=E&&(b.max=E));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:h&&!k&&F===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:x(k,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*F/Math.max(b.len,F));y&&!a&&e(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); +b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!k&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));a=x(f.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!k&&b.tickIntervalb.tickInterval&&1E3b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval= +b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,f=a.startOnTick,e=a.endOnTick,q;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), +this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.isLinked||(this.trimTicks(b,f,e),this.min===this.max&&t(this.min)&&!this.tickAmount&&(q=!0,this.min-=.5,this.max+=.5),this.single=q,c||d||this.adjustTickAmount())}, +trimTicks:function(a,b,c){var d=a[0],f=a[a.length-1],v=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-v>a[0];)a.shift();if(c)this.max=f;else for(;this.max+vb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,f=b&&b.length;if(fc&&(this.tickInterval*= +2,this.setTickPositions());if(t(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0=f&&(b=f)),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,f=x(b.width,a.plotWidth-c+(b.offsetRight||0)),e=x(b.height,a.plotHeight),q=x(b.top,a.plotTop),b=x(b.left,a.plotLeft+c),c=/%$/;c.test(e)&&(e=Math.round(parseFloat(e)/ +100*a.plotHeight));c.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight+a.plotTop));this.left=b;this.top=q;this.width=f;this.height=e;this.bottom=a.chartHeight-e-q;this.right=a.chartWidth-f-b;this.len=Math.max(d?f:e,0);this.pos=d?b:q},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?r(b(this.min)):this.min,max:a?r(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log, +d=b?c(this.min):this.min,b=b?c(this.max):this.max;null===a?a=d:d>a?a=d:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],d=x(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize, +this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,f=this.len/(((this.categories?1:0)+this.max-this.min)/c),q,u=a.rotation,n=this.labelMetrics(),g,y=Number.MAX_VALUE,h,I=function(a){a/=f||1;a=1=a)g=I(Math.abs(n.h/Math.sin(k*a))),b=g+Math.abs(a/360),b(c.step||0)&&!c.rotation&&(this.staggerLines||1)*a.plotWidth/d||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,f=this.options.labels,q=this.horiz,u=this.getSlotWidth(),g=Math.max(1, +Math.round(u-2*(f.padding||5))),y={},h=this.labelMetrics(),I=f.style&&f.style.textOverflow,A,x=0,m,k;F(f.rotation)||(y.rotation=f.rotation||0);e(c,function(a){(a=d[a])&&a.labelLength>x&&(x=a.labelLength)});this.maxLabelLength=x;if(this.autoRotation)x>g&&x>h.h?y.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(A={width:g+"px"},!I))for(A.textOverflow="clip",m=c.length;!q&&m--;)if(k=c[m],g=d[k].label)g.styles&&"ellipsis"===g.styles.textOverflow?g.css({textOverflow:"clip"}):d[k].labelLength> +u&&g.css({width:u+"px"}),g.getBBox().height>this.len/c.length-(h.h-h.f)&&(g.specCss={textOverflow:"ellipsis"});y.rotation&&(A={width:(x>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},I||(A.textOverflow="ellipsis"));if(this.labelAlign=f.align||this.autoLabelAlign(this.labelRotation))y.align=this.labelAlign;e(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(y),A&&b.css(n(A,b.specCss)),delete b.specCss,a.rotation=y.rotation)});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,0!==this.side)}, +hasData:function(){return this.hasVisibleSeries||t(this.min)&&t(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,f=a.tickPositions,q=a.ticks,u=a.horiz,n=a.side,g=b.inverted?[1,0,3,2][n]:n,y,h,I=0,A,m=0,k=d.title,F=d.labels,E=0,l=a.opposite,C=b.axisOffset,b=b.clipOffset,p=[-1,1,1,-1][n],r,J=d.className,w=a.axisParent,B=this.tickSize("tick");y=a.hasData();a.showAxis=h=y||x(d.showEmpty,!0);a.staggerLines=a.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(J||"")).add(w),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(J||"")).add(w),a.labelGroup=c.g("axis-labels").attr({zIndex:F.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(J||"")).add(w));if(y||a.isLinked)e(f,function(b){q[b]?q[b].addLabel():q[b]=new M(a,b)}),a.renderUnsquish(),!1===F.reserveSpace||0!==n&&2!==n&&{1:"left",3:"right"}[n]!== +a.labelAlign&&"center"!==a.labelAlign||e(f,function(a){E=Math.max(q[a].getLabelSize(),E)}),a.staggerLines&&(E*=a.staggerLines,a.labelOffset=E*(a.opposite?-1:1));else for(r in q)q[r].destroy(),delete q[r];k&&k.text&&!1!==k.enabled&&(a.axisTitle||((r=k.textAlign)||(r=(u?{low:"left",middle:"center",high:"right"}:{low:l?"right":"left",middle:"center",high:l?"left":"right"})[k.align]),a.axisTitle=c.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:r}).addClass("highcharts-axis-title").css(k.style).add(a.axisGroup), +a.axisTitle.isNew=!0),h&&(I=a.axisTitle.getBBox()[u?"height":"width"],A=k.offset,m=t(A)?0:x(k.margin,u?5:10)),a.axisTitle[h?"show":"hide"](!0));a.renderLine();a.offset=p*x(d.offset,C[n]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===n?-a.labelMetrics().h:2===n?a.tickRotCorr.y:0;m=Math.abs(E)+m;E&&(m=m-c+p*(u?x(F.y,a.tickRotCorr.y+8*p):F.x));a.axisTitleMargin=x(A,m);C[n]=Math.max(C[n],a.axisTitleMargin+I+p*a.offset,m,y&&f.length&&B?B[0]:0);d=d.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[g]= +Math.max(b[g],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,f=this.horiz,e=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:e,f?d:this.top,"L",f?b.chartWidth-this.right:e,f?d:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor, +"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,f=this.options.title,e=a?b:c,q=this.opposite,u=this.offset,n=f.x||0,g=f.y||0,y=this.chart.renderer.fontMetrics(f.style&&f.style.fontSize,this.axisTitle).f,d={low:e+(a?0:d),middle:e+d/2,high:e+(a?d:0)}[f.align],b=(a?c+this.height:b)+(a?1:-1)*(q?-1:1)*this.axisTitleMargin+(2===this.side?y:0);return{x:a?d+n:b+(q?this.width:0)+u+n,y:a?b+g-(q?this.height:0)+u:d+g}},render:function(){var a= +this,b=a.chart,d=b.renderer,f=a.options,q=a.isLog,u=a.lin2log,n=a.isLinked,g=a.tickPositions,y=a.axisTitle,h=a.ticks,A=a.minorTicks,x=a.alternateBands,m=f.stackLabels,k=f.alternateGridColor,F=a.tickmarkOffset,E=a.axisLine,l=b.hasRendered&&c(a.oldMin),C=a.showAxis,p=B(d.globalAnimation),r,t;a.labelEdge.length=0;a.overlap=!1;e([h,A,x],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||n)a.minorTickInterval&&!a.categories&&e(a.getMinorTickPositions(),function(b){A[b]||(A[b]=new M(a,b,"minor")); +l&&A[b].isNew&&A[b].render(null,!0);A[b].render(null,!1,1)}),g.length&&(e(g,function(b,c){if(!n||b>=a.min&&b<=a.max)h[b]||(h[b]=new M(a,b)),l&&h[b].isNew&&h[b].render(c,!0,.1),h[b].render(c)}),F&&(0===a.min||a.single)&&(h[-1]||(h[-1]=new M(a,-1,null,!0)),h[-1].render(-1))),k&&e(g,function(c,d){t=void 0!==g[d+1]?g[d+1]+F:a.max-F;0===d%2&&c=e.second?0:A*Math.floor(c.getMilliseconds()/A));if(n>=e.second)c[B.hcSetSeconds](n>=e.minute?0:A*Math.floor(c.getSeconds()/ +A));if(n>=e.minute)c[B.hcSetMinutes](n>=e.hour?0:A*Math.floor(c[B.hcGetMinutes]()/A));if(n>=e.hour)c[B.hcSetHours](n>=e.day?0:A*Math.floor(c[B.hcGetHours]()/A));if(n>=e.day)c[B.hcSetDate](n>=e.month?1:A*Math.floor(c[B.hcGetDate]()/A));n>=e.month&&(c[B.hcSetMonth](n>=e.year?0:A*Math.floor(c[B.hcGetMonth]()/A)),g=c[B.hcGetFullYear]());if(n>=e.year)c[B.hcSetFullYear](g-g%A);if(n===e.week)c[B.hcSetDate](c[B.hcGetDate]()-c[B.hcGetDay]()+m(f,1));g=c[B.hcGetFullYear]();f=c[B.hcGetMonth]();var C=c[B.hcGetDate](), +y=c[B.hcGetHours]();if(B.hcTimezoneOffset||B.hcGetTimezoneOffset)x=(!q||!!B.hcGetTimezoneOffset)&&(k-h>4*e.month||t(h)!==t(k)),c=c.getTime(),c=new B(c+t(c));q=c.getTime();for(h=1;qr&&(!t||b<=w)&&void 0!==b&&h.push(b),b>w&&(q=!0),b=d;else r=e(r),w= +e(w),a=k[t?"minorTickInterval":"tickInterval"],a=p("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(t?5:1)*(w-r)/((t?m/this.tickPositions.length:m)||1)),a=H(a,null,B(a)),h=G(this.getLinearTickPositions(a,r,w),g),t||(this._minorAutoInterval=a/5);t||(this.tickInterval=a);return h};D.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};D.prototype.lin2log=function(a){return Math.pow(10,a)}})(N);(function(a){var D=a.dateFormat,B=a.each,G=a.extend,H=a.format,p=a.isNumber,l=a.map,r= +a.merge,w=a.pick,t=a.splat,k=a.stop,m=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){B(this.chart.series,function(e){var g=e&&e.tt;g&&(!g.isActive||a?e.tt=g.destroy():g.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label|| +(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,r(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart, +!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,m,f){var d=this,b=d.now,q=!1!==d.options.animation&&!d.isHidden&&(1h-q?h:h-q);else if(v)b[a]=Math.max(g,e+q+f>c?e:e+q);else return!1},x=function(a,c,f,e){var q;ec-d?q=!1:b[a]=ec-f/2?c-f-2:e-f/2;return q},k=function(a){var b=c;c=h;h=b;g=a},y=function(){!1!==A.apply(0,c)?!1!==x.apply(0,h)||g||(k(!0),y()):g?b.x=b.y=0:(k(!0),y())};(f.inverted||1y&&(q=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=d.plotTop;f.push({target:e.isHeader?d.plotHeight+c:a,rank:e.isHeader?1:0,size:n.tt.getBBox().height+1,point:e,x:y,tt:A})});this.cleanSplit(); +a.distribute(f,d.plotHeight+c);B(f,function(a){var b=a.point;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:q||b.isHeader?a.x:b.plotX+d.plotLeft+w(m.distance,16),y:a.pos+d.plotTop,anchorX:b.plotX+d.plotLeft,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+d.plotTop})})},updatePosition:function(a){var e=this.chart,g=this.getLabel(),g=(this.options.positioner||this.getPosition).call(this,g.width,g.height,a);this.move(Math.round(g.x),Math.round(g.y||0),a.plotX+e.plotLeft,a.plotY+e.plotTop)}, +getXDateFormat:function(a,h,m){var f;h=h.dateTimeLabelFormats;var d=m&&m.closestPointRange,b,q={millisecond:15,second:12,minute:9,hour:6,day:3},g,c="millisecond";if(d){g=D("%m-%d %H:%M:%S.%L",a.x);for(b in e){if(d===e.week&&+D("%w",a.x)===m.options.startOfWeek&&"00:00:00.000"===g.substr(6)){b="week";break}if(e[b]>d){b=c;break}if(q[b]&&g.substr(q[b])!=="01-01 00:00:00.000".substr(q[b]))break;"week"!==b&&(c=b)}b&&(f=h[b])}else f=h.day;return f||h.year},tooltipFooterHeaderFormatter:function(a,e){var g= +e?"footer":"header";e=a.series;var f=e.tooltipOptions,d=f.xDateFormat,b=e.xAxis,q=b&&"datetime"===b.options.type&&p(a.key),g=f[g+"Format"];q&&!d&&(d=this.getXDateFormat(a,f,b));q&&d&&(g=g.replace("{point.key}","{point.key:"+d+"}"));return H(g,{point:a,series:e})},bodyFormatter:function(a){return l(a,function(a){var e=a.series.tooltipOptions;return(e.pointFormatter||a.point.tooltipFormatter).call(a.point,e.pointFormat)})}}})(N);(function(a){var D=a.addEvent,B=a.attr,G=a.charts,H=a.color,p=a.css,l= +a.defined,r=a.doc,w=a.each,t=a.extend,k=a.fireEvent,m=a.offset,e=a.pick,g=a.removeEvent,h=a.splat,C=a.Tooltip,f=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};C&&b.tooltip.enabled&&(a.tooltip=new C(a,b.tooltip),this.followTouchMove=e(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart, +f=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(f=e(d.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,b){var d,e;a=a||f.event;a.target||(a.target=a.srcElement);e=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));void 0===e.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=e.pageX-b.left,b=e.pageY-b.top);return t(a,{chartX:Math.round(d), +chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};w(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},runPointActions:function(d){var b=this.chart,f=b.series,g=b.tooltip,c=g?g.shared:!1,h=!0,n=b.hoverPoint,m=b.hoverSeries,x,k,y,u=[],I;if(!c&&!m)for(x=0;xb.series.index?-1:1}));if(c)for(x=u.length;x--;)(u[x].x!==u[0].x||u[x].series.noSharedTooltip)&&u.splice(x,1);if(u[0]&&(u[0]!==this.prevKDPoint||g&&g.isHidden)){if(c&& +!u[0].series.noSharedTooltip){for(x=0;xh+k&&(f=h+k),cm+y&&(c=m+y),this.hasDragged=Math.sqrt(Math.pow(l-f,2)+Math.pow(v-c,2)),10x.max&&(l=x.max-c,v=!0);v?(u-=.8*(u-g[f][0]),J||(M-=.8*(M-g[f][1])),p()):g[f]=[u,M];A||(e[f]=F-E,e[q]=c);e=A?1/n:n;m[q]=c;m[f]=l;k[A?a?"scaleY":"scaleX":"scale"+d]=n;k["translate"+d]=e* +E+(u-e*y)},pinch:function(a){var r=this,t=r.chart,k=r.pinchDown,m=a.touches,e=m.length,g=r.lastValidTouch,h=r.hasZoom,C=r.selectionMarker,f={},d=1===e&&(r.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||r.runChartClick),b={};1b-6&&n(u||d.chartWidth- +2*x-v-e.x)&&(this.itemX=v,this.itemY+=p+this.lastLineHeight+I,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,c);this.lastItemY=p+this.itemY+I;this.lastLineHeight=Math.max(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=p+g+I,this.lastLineHeight=g);this.offsetWidth=u||Math.max((f?this.itemX-v-l:c)+x,this.offsetWidth)},getAllItems:function(){var a=[];l(this.chart.series,function(d){var b=d&&d.options;d&&m(b.showInLegend,p(b.linkedTo)? +!1:void 0,!0)&&(a=a.concat(d.legendItems||("point"===b.legendType?d.data:d)))});return a},adjustMargins:function(a,d){var b=this.chart,e=this.options,f=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||l([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(c,g){c.test(f)&&!p(a[g])&&(b[t[g]]=Math.max(b[t[g]],b.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*e[g%2?"x":"y"]+m(e.margin,12)+d[g]))})},render:function(){var a=this,d=a.chart,b=d.renderer, +e=a.group,h,c,m,n,k=a.box,x=a.options,p=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=b.g("legend").attr({zIndex:7}).add(),a.contentGroup=b.g().attr({zIndex:1}).add(e),a.scrollGroup=b.g().add(a.contentGroup));a.renderTitle();h=a.getAllItems();g(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});x.reversed&&h.reverse();a.allItems=h;a.display=c=!!h.length;a.lastLineHeight=0;l(h,function(b){a.renderItem(b)}); +m=(x.width||a.offsetWidth)+p;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=p;k||(a.box=k=b.rect().addClass("highcharts-legend-box").attr({r:x.borderRadius}).add(e),k.isNew=!0);k.attr({stroke:x.borderColor,"stroke-width":x.borderWidth||0,fill:x.backgroundColor||"none"}).shadow(x.shadow);0b&&!1!==h.enabled?(this.clipHeight=g=Math.max(b-20-this.titleHeight-I,0),this.currentPage=m(this.currentPage,1),this.fullHeight=a,l(v,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var d=u.length;if(!d||c-u[d-1]>g&&(r||c)!==u[d-1])u.push(r||c),d++;b===v.length-1&&c+a-u[d-1]>g&&u.push(c);c!==r&&(r=c)}),n||(n=d.clipRect= +e.clipRect(0,I,9999,0),d.contentGroup.clip(n)),t(g),y||(this.nav=y=e.g().attr({zIndex:1}).add(this.group),this.up=e.symbol("triangle",0,0,p,p).on("click",function(){d.scroll(-1,k)}).add(y),this.pager=e.text("",15,10).addClass("highcharts-legend-navigation").css(h.style).add(y),this.down=e.symbol("triangle-down",0,0,p,p).on("click",function(){d.scroll(1,k)}).add(y)),d.scroll(0),a=b):y&&(t(),y.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,d){var b=this.pages, +f=b.length;a=this.currentPage+a;var g=this.clipHeight,c=this.options.navigation,h=this.pager,n=this.padding;a>f&&(a=f);0f&&(g=typeof a[0],"string"===g?e.name=a[0]:"number"===g&&(e.x=a[0]),d++);b=h.value;)h=e[++g];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),H(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this), +this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(g in this)this[g]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,g= +e.tooltipOptions,h=t(g.valueDecimals,""),k=g.valuePrefix||"",f=g.valueSuffix||"";B(e.pointArrayMap||["y"],function(d){d="{point."+d;if(k||f)a=a.replace(d+"}",k+d+"}"+f);a=a.replace(d+"}",d+":,."+h+"f}")});return l(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var h=this,k=this.series.options;(k.point.events[a]||h.options&&h.options.events&&h.options.events[a])&&this.importEvents();"click"===a&&k.allowPointSelect&&(g=function(a){h.select&&h.select(null,a.ctrlKey||a.metaKey||a.shiftKey)}); +p(this,a,e,g)},visible:!0}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.correctFloat,l=a.Date,r=a.defaultOptions,w=a.defaultPlotOptions,t=a.defined,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.fireEvent,C=a.grep,f=a.isArray,d=a.isNumber,b=a.isString,q=a.merge,E=a.pick,c=a.removeEvent,F=a.splat,n=a.stableSort,A=a.SVGElement,x=a.syncTimeout,J=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, +marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1, +marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var c=this,d,e,f=a.series,u,y=function(a,b){return E(a.options.index,a._i)-E(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();g(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0=== +b.selected});e=b.events;for(d in e)D(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();k(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(u=f[f.length-1]);c._i=E(u&&u._i,-1)+1;f.push(c);n(f,y);this.yAxis&&n(this.yAxis.series,y);k(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart, +d;k(a.axisTypes||[],function(f){k(c[f],function(c){d=c.options;if(b[f]===d.index||void 0!==b[f]&&b[f]===d.id||void 0===b[f]&&0===d.index)c.series.push(a),a[f]=c,c.isDirty=!0});a[f]||a.optionalAxis===f||e(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,e=arguments,f=d(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(e,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options, +b=this.xIncrement,c,d=a.pointIntervalUnit,b=E(b,a.pointStart,0);this.pointInterval=c=E(this.pointInterval,a.pointInterval,1);d&&(a=new l(b),"day"===d?a=+a[l.hcSetDate](a[l.hcGetDate]()+c):"month"===d?a=+a[l.hcSetMonth](a[l.hcGetMonth]()+c):"year"===d&&(a=+a[l.hcSetFullYear](a[l.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=q(e,c.series,a);this.tooltipOptions= +q(r.tooltip,r.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===e.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&t(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor}); +return c},getCyclic:function(a,b,c){var d,e=this.userOptions,f=a+"Index",g=a+"Counter",u=c?c.length:E(this.chart.options.chart[a+"Count"],this.chart[a+"Count"]);b||(d=E(e[f],e["_"+f]),t(d)||(e["_"+f]=d=this.chart[g]%u,this.chart[g]+=1),c&&(b=c[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||w[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol, +this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(a,c,g,n){var u=this,q=u.points,h=q&&q.length||0,y,m=u.options,x=u.chart,A=null,I=u.xAxis,l=m.turboThreshold,p=this.xData,r=this.yData,F=(y=u.pointArrayMap)&&y.length;a=a||[];y=a.length;c=E(c,!0);if(!1!==n&&y&&h===y&&!u.cropped&&!u.hasGroupedData&&u.visible)k(a,function(a,b){q[b].update&&a!==m.data[b]&&q[b].update(a,!1,null,!1)});else{u.xIncrement=null;u.colorCounter=0;k(this.parallelArrays,function(a){u[a+ +"Data"].length=0});if(l&&y>l){for(g=0;null===A&&gh||this.forceCrop))if(b[d-1]l)b=[],c=[];else if(b[0]l)f=this.cropData(this.xData,this.yData,A,l),b=f.xData,c=f.yData,f=f.start,g=!0;for(h=b.length||1;--h;)d=x?y(b[h])-y(b[h-1]):b[h]-b[h-1],0d&&this.requireSorting&&e(15);this.cropped=g;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=n},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,n=E(this.cropShoulder,1),u;for(u=0;u=c){f=Math.max(0,u- +n);break}for(c=u;cd){g=c+n;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,n=this.cropStart||0,q,h=this.hasGroupedData,k,m=[],x;b||h||(b=[],b.length=a.length,b=this.data=b);for(x=0;x=q&&(c[x-1]||k)<=h,y&&k)if(y=m.length)for(;y--;)null!==m[y]&&(g[n++]=m[y]);else g[n++]=m;this.dataMin=H(g);this.dataMax=G(g)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,e=c.categories,f=this.yAxis,g=this.points,n=g.length,q=!!this.modifyValue,h=a.pointPlacement,k="between"===h||d(h),m=a.threshold,x=a.startFromThreshold?m:0,A,l,r,F,J=Number.MAX_VALUE;"between"===h&&(h=.5);d(h)&&(h*=E(a.pointRange||c.pointRange)); +for(a=0;a=B&&(C.isNull=!0);C.plotX=A=p(Math.min(Math.max(-1E5,c.translate(w,0,0,0,1,h,"flags"===this.type)),1E5));b&&this.visible&&!C.isNull&&D&&D[w]&&(F=this.getStackIndicator(F,w,this.index),G=D[w],B=G.points[F.key],l=B[0],B=B[1],l===x&&F.key===D[w].base&&(l=E(m,f.min)),f.isLog&&0>=l&&(l=null),C.total=C.stackTotal=G.total,C.percentage=G.total&&C.y/G.total*100,C.stackY= +B,G.setOffset(this.pointXOffset||0,this.barW||0));C.yBottom=t(l)?f.translate(l,0,1,0,1):null;q&&(B=this.modifyValue(B,C));C.plotY=l="number"===typeof B&&Infinity!==B?Math.min(Math.max(-1E5,f.translate(B,0,1,0,1)),1E5):void 0;C.isInside=void 0!==l&&0<=l&&l<=f.len&&0<=A&&A<=c.len;C.clientX=k?p(c.translate(w,0,0,0,1,h)):A;C.negative=C.y<(m||0);C.category=e&&void 0!==e[C.x]?e[C.x]:C.x;C.isNull||(void 0!==r&&(J=Math.min(J,Math.abs(A-r))),r=A)}this.closestPointRangePx=J},getValidPoints:function(a,b){var c= +this.chart;return C(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,n=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(),q=b[n],h=b[n+"m"];q||(a&&(g.width=0,b[n+"m"]=h=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[n]=q=d.clipRect(g),q.count={length:0});a&&!q.count[this.index]&& +(q.count[this.index]=!0,q.count.length+=1);!1!==c.clip&&(this.group.clip(a||f?q:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=n);a||(q.count[this.index]&&(delete q.count[this.index],--q.count.length),0===q.count.length&&n&&b[n]&&(f||(b[n]=b[n].destroy()),b[n+"m"]&&(b[n+"m"]=b[n+"m"].destroy())))},animate:function(a){var b=this.chart,c=B(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+ +99},c),this.animate=null)},afterAnimate:function(){this.setClip();h(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,e,f,g,n=this.options.marker,q,h,k,m,x=this.markerGroup,A=E(n.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>2*n.radius);if(!1!==n.enabled||this._hasPointMarkers)for(e=a.length;e--;)f=a[e],c=f.plotY,g=f.graphic,q=f.marker||{},h=!!f.marker,k=A&&void 0===q.enabled||q.enabled,m=f.isInside,k&&d(c)&&null!==f.y?(c=E(q.symbol,this.symbol),f.hasImage= +0===c.indexOf("url"),k=this.markerAttribs(f,f.selected&&"select"),g?g[m?"show":"hide"](!0).animate(k):m&&(0e&&b.shadow));g&&(g.startX=c.xMap, +g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],n,q=this.graph,h=this.area,m=Math.max(b.chartWidth,b.chartHeight),x=this[(this.zoneAxis||"y")+"Axis"],A,l,p=b.inverted,r,F,C,t,J=!1;d.length&&(q||h)&&x&&void 0!==x.min&&(l=x.reversed,r=x.horiz,q&&q.hide(),h&&h.hide(),A=x.getExtremes(),k(d,function(d,u){e=l?r?b.plotWidth:0:r?0:x.toPixels(A.min);e=Math.min(Math.max(E(f,e),0),m);f=Math.min(Math.max(Math.round(x.toPixels(E(d.value,A.max), +!0)),0),m);J&&(e=f=x.toPixels(A.max));F=Math.abs(e-f);C=Math.min(e,f);t=Math.max(e,f);x.isXAxis?(n={x:p?t:C,y:0,width:F,height:m},r||(n.x=b.plotHeight-n.x)):(n={x:0,y:p?t:C,width:m,height:F},r&&(n.y=b.plotWidth-n.y));p&&c.isVML&&(n=x.isXAxis?{x:0,y:l?C:t,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});g[u]?g[u].animate(n):(g[u]=c.clipRect(n),q&&a["zone-graph-"+u].clip(g[u]),h&&a["zone-area-"+u].clip(g[u]));J=d.value>A.max}),this.clips= +g)},invertGroups:function(a){function b(){var b={width:c.yAxis.len,height:c.xAxis.len};k(["group","markerGroup"],function(d){c[d]&&c[d].attr(b).invert(a)})}var c=this,d;c.xAxis&&(d=D(c.chart,"resize",b),D(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(e),f.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className|| +"")));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=!!a.animate&&b.renderer.isSVG&&B(d.animation).duration,f=a.visible?"inherit":"hidden",g=d.zIndex,n=a.hasRendered,q=b.seriesGroup,h=b.inverted;c=a.plotGroup("group","series",f,g,q);a.markerGroup= +a.plotGroup("markerGroup","markers",f,g,q);e&&a.animate(!0);c.inverted=a.isCartesian?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);!1===d.clip||a.sharedClipKey||n||c.clip(b.clipRect);e&&a.animate();n||(a.animationTimeout=x(function(){a.afterAnimate()},e));a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty|| +this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:E(d&&d.left,a.plotLeft),translateY:E(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)}, +buildKDTree:function(){function a(c,d,e){var f,g;if(g=c&&c.length)return f=b.kdAxisArray[d%e],c.sort(function(a,b){return a[f]-b[f]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,e),right:a(c.slice(g+1),d+1,e)}}var b=this,c=b.kdDimensions;delete b.kdTree;x(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,n,q){var h=b.point,u=d.kdAxisArray[n%q],k,m,x=h;m=t(a[e])&&t(h[e])?Math.pow(a[e]-h[e],2):null;k=t(a[f])&& +t(h[f])?Math.pow(a[f]-h[f],2):null;k=(m||0)+(k||0);h.dist=t(k)?Math.sqrt(k):Number.MAX_VALUE;h.distX=t(m)?Math.sqrt(m):Number.MAX_VALUE;u=a[u]-h[u];k=0>u?"left":"right";m=0>u?"right":"left";b[k]&&(k=c(a,b[k],n+1,q),x=k[g]A;)l--;this.updateParallelArrays(h,"splice",l,0,0);this.updateParallelArrays(h,l);n&&h.name&&(n[A]=h.name);q.splice(l,0,a);m&&(this.data.splice(l,0,null),this.processData());"point"===c.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(h,"shift"),q.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(e)},removePoint:function(a, +b,d){var c=this,e=c.data,f=e[a],g=c.points,n=c.chart,h=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&n.redraw()};q(d,n);b=C(b,!0);f?f.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){e.destroy();f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();C(a,!0)&&f.redraw(b)}var e=this,f=e.chart;!1!==d?k(e,"remove",null,c):c()},update:function(a, +d){var c=this,e=this.chart,f=this.userOptions,g=this.type,q=a.type||f.type||e.options.chart.type,u=b[g].prototype,m=["group","markerGroup","dataLabelsGroup"],k;if(q&&q!==g||void 0!==a.zIndex)m.length=0;r(m,function(a){m[a]=c[a];delete c[a]});a=h(f,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1,null,!1);for(k in u)this[k]=void 0;t(this,b[q||g].prototype);r(m,function(a){c[a]=m[a]});this.init(e,a);e.linkSeries();C(d,!0)&&e.redraw(!1)}});t(G.prototype, +{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,t(a,{events:void 0}));c.isDirtyBox=!0;C(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);w(b.axes,this);w(b[c],this);b.options[c].splice(this.options.index,1);r(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;C(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a}, +b)},setCategories:function(a,b){this.update({categories:a},b)}})})(N);(function(a){var D=a.color,B=a.each,G=a.map,H=a.pick,p=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],l=[],p=this.xAxis,k=this.yAxis,m=k.stacks[this.stackKey],e={},g=this.points,h=this.index,C=k.series,f=C.length,d,b=H(k.options.reversedStacks,!0)?1:-1,q,E;if(this.options.stacking){for(q=0;qa&&t>l?(t=Math.max(a,l),m=2*l-t):tH&& +m>l?(m=Math.max(H,l),t=2*l-m):m=Math.abs(g)&&.5a.closestPointRange*a.xAxis.transA,k=a.borderWidth=r(h.borderWidth,k?0:1),f=a.yAxis,d=a.translatedThreshold=f.getThreshold(h.threshold),b=r(h.minPointLength,5),q=a.getColumnMetrics(),m=q.width,c=a.barW=Math.max(m,1+2*k),l=a.pointXOffset= +q.offset;g.inverted&&(d-=.5);h.pointPadding&&(c=Math.ceil(c));w.prototype.translate.apply(a);G(a.points,function(e){var n=r(e.yBottom,d),q=999+Math.abs(n),q=Math.min(Math.max(-q,e.plotY),f.len+q),h=e.plotX+l,k=c,u=Math.min(q,n),p,t=Math.max(q,n)-u;Math.abs(t)b?n-b:d-(p?b:0));e.barX=h;e.pointWidth=m;e.tooltipPos=g.inverted?[f.len+f.pos-g.plotLeft-q,a.xAxis.len-h-k/2,t]:[h+k/2,q+f.pos-g.plotTop,t];e.shapeType="rect";e.shapeArgs= +a.crispCol.apply(a,e.isNull?[e.plotX,f.len/2,0,0]:[h,u,k,t])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,g){var e=this.options,k=this.pointAttrToOptions||{},f=k.stroke||"borderColor",d=k["stroke-width"]||"borderWidth",b=a&&a.color||this.color,q=a[f]||e[f]||this.color||b,k=e.dashStyle,m;a&&this.zones.length&&(b=(b=a.getZone())&&b.color||a.options.color|| +this.color);g&&(g=e.states[g],m=g.brightness,b=g.color||void 0!==m&&B(b).brighten(g.brightness).get()||b,q=g[f]||q,k=g.dashStyle||k);a={fill:b,stroke:q,"stroke-width":a[d]||e[d]||this[d]||0};e.borderRadius&&(a.r=e.borderRadius);k&&(a.dashstyle=k);return a},drawPoints:function(){var a=this,g=this.chart,h=a.options,m=g.renderer,f=h.animationLimit||250,d;G(a.points,function(b){var e=b.graphic;p(b.plotY)&&null!==b.y?(d=b.shapeArgs,e?(k(e),e[g.pointCountt;++t)k=r[t],a=2>t||2===t&&/%$/.test(k),r[t]=B(k,[l,H,w,r[2]][t])+(a?p:0);r[3]>r[2]&&(r[3]=r[2]);return r}}})(N);(function(a){var D=a.addEvent,B=a.defined,G=a.each,H=a.extend,p=a.inArray,l=a.noop,r=a.pick,w=a.Point,t=a.Series,k=a.seriesType,m=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y? +void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,h=e.points,k=e.startAngleRad;a||(G(h,function(a){var d= +a.graphic,b=a.shapeArgs;d&&(d.attr({r:a.startR||e.center[3]/2,start:k,end:k}),d.animate({r:b.r,start:b.start,end:b.end},e.options.animation))}),e.animate=null)},updateTotals:function(){var a,g=0,h=this.points,k=h.length,f,d=this.options.ignoreHiddenPoint;for(a=0;af.y&&(f.y=null),g+=d&&!f.visible?0:f.y;this.total=g;for(a=0;a1.5*Math.PI?q-=2*Math.PI:q<-Math.PI/2&&(q+=2*Math.PI);t.slicedTranslation={translateX:Math.round(Math.cos(q)*k),translateY:Math.round(Math.sin(q)*k)};d=Math.cos(q)*a[2]/2;b=Math.sin(q)*a[2]/2;t.tooltipPos=[a[0]+.7*d,a[1]+.7*b];t.half=q<-Math.PI/2||q>Math.PI/2?1:0;t.angle=q;f=Math.min(f,n/5);t.labelPos=[a[0]+d+Math.cos(q)*n,a[1]+b+Math.sin(q)*n,a[0]+d+Math.cos(q)*f,a[1]+b+Math.sin(q)* +f,a[0]+d,a[1]+b,0>n?"center":t.half?"right":"left",q]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,h,k,f,d,b=a.options.shadow;b&&!a.shadowGroup&&(a.shadowGroup=g.g("shadow").add(a.group));G(a.points,function(e){if(null!==e.y){k=e.graphic;d=e.shapeArgs;h=e.sliced?e.slicedTranslation:{};var q=e.shadowGroup;b&&!q&&(q=e.shadowGroup=g.g("shadow").add(a.shadowGroup));q&&q.attr(h);f=a.pointAttribs(e,e.selected&&"select");k?k.setRadialReference(a.center).attr(f).animate(H(d,h)):(e.graphic= +k=g[e.shapeType](d).addClass(e.getClassName()).setRadialReference(a.center).attr(h).add(a.group),e.visible||k.attr({visibility:"hidden"}),k.attr(f).attr({"stroke-linejoin":"round"}).shadow(b,q))}})},searchPoint:l,sortByAngle:function(a,g){a.sort(function(a,e){return void 0!==a.angle&&(e.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:l},{init:function(){w.prototype.init.apply(this,arguments);var a=this,g;a.name=r(a.name,"Slice"); +g=function(e){a.slice("select"===e.type)};D(a,"select",g);D(a,"unselect",g);return a},setVisible:function(a,g){var e=this,k=e.series,f=k.chart,d=k.options.ignoreHiddenPoint;g=r(g,d);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,k.options.data[p(e,k.data)]=e.options,G(["graphic","dataLabel","connector","shadowGroup"],function(b){if(e[b])e[b][a?"show":"hide"](!0)}),e.legendItem&&f.legend.colorizeItem(e,a),a||"hover"!==e.state||e.setState(""),d&&(k.isDirty=!0),g&&f.redraw())}, +slice:function(a,g,h){var e=this.series;m(h,e.chart);r(g,!0);this.sliced=this.options.sliced=a=B(a)?a:!this.sliced;e.options.data[p(this,e.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(N);(function(a){var D= +a.addEvent,B=a.arrayMax,G=a.defined,H=a.each,p=a.extend,l=a.format,r=a.map,w=a.merge,t=a.noop,k=a.pick,m=a.relativeLength,e=a.Series,g=a.seriesTypes,h=a.stableSort,C=a.stop;a.distribute=function(a,d){function b(a,b){return a.target-b.target}var e,f=!0,c=a,g=[],n;n=0;for(e=a.length;e--;)n+=a[e].size;if(n>d){h(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(n=e=0;n<=d;)n+=a[e].size,e++;g=a.splice(e-1,a.length)}h(a,b);for(a=r(a,function(a){return{size:a.size,targets:[a.target]}});f;){for(e=a.length;e--;)f= +a[e],n=(Math.min.apply(0,f.targets)+Math.max.apply(0,f.targets))/2,f.pos=Math.min(Math.max(0,n-f.size/2),d-f.size);e=a.length;for(f=!1;e--;)0a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>d&&(a[e-1].pos=d-a[e-1].size),a.splice(e,1),f=!0)}e=0;H(a,function(a){var b=0;H(a.targets,function(){c[e].pos=a.pos+b;b+=c[e].size;e++})});c.push.apply(c,g);h(c,b)};e.prototype.drawDataLabels=function(){var a=this,d=a.options, +b=d.dataLabels,e=a.points,g,c,h=a.hasRendered||0,n,m,x=k(b.defer,!0),r=a.chart.renderer;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),m=a.plotGroup("dataLabelsGroup","data-labels",x&&!h?"hidden":"visible",b.zIndex||6),x&&(m.attr({opacity:+h}),h||D(a,"afterAnimate",function(){a.visible&&m.show(!0);m[d.animation?"animate":"attr"]({opacity:1},{duration:200})})),c=b,H(e,function(e){var f,q=e.dataLabel,h,x,A=e.connector,y=!0,t,z={};g=e.dlOptions||e.options&&e.options.dataLabels; +f=k(g&&g.enabled,c.enabled)&&null!==e.y;if(q&&!f)e.dataLabel=q.destroy();else if(f){b=w(c,g);t=b.style;f=b.rotation;h=e.getLabelConfig();n=b.format?l(b.format,h):b.formatter.call(h,b);t.color=k(b.color,t.color,a.color,"#000000");if(q)G(n)?(q.attr({text:n}),y=!1):(e.dataLabel=q=q.destroy(),A&&(e.connector=A.destroy()));else if(G(n)){q={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:f,padding:b.padding,zIndex:1};"contrast"===t.color&&(z.color=b.inside|| +0>b.distance||d.stacking?r.getContrast(e.color||a.color):"#000000");d.cursor&&(z.cursor=d.cursor);for(x in q)void 0===q[x]&&delete q[x];q=e.dataLabel=r[f?"text":"label"](n,0,-9999,b.shape,null,null,b.useHTML,null,"data-label").attr(q);q.addClass("highcharts-data-label-color-"+e.colorIndex+" "+(b.className||""));q.css(p(t,z));q.add(m);q.shadow(b.shadow)}q&&a.alignDataLabel(e,q,b,null,y)}})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,f=c.inverted,n=k(a.plotX,-9999),q=k(a.plotY, +-9999),h=d.getBBox(),m,l=b.rotation,u=b.align,r=this.visible&&(a.series.forceDL||c.isInsidePlot(n,Math.round(q),f)||e&&c.isInsidePlot(n,f?e.x+1:e.y+e.height-1,f)),t="justify"===k(b.overflow,"justify");r&&(m=b.style.fontSize,m=c.renderer.fontMetrics(m,d).b,e=p({x:f?c.plotWidth-q:n,y:Math.round(f?c.plotHeight-n:q),width:0,height:0},e),p(b,{width:h.width,height:h.height}),l?(t=!1,f=c.renderer.rotCorr(m,l),f={x:e.x+b.x+e.width/2+f.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g? +"attr":"animate"](f).attr({align:u}),n=(l+720)%360,n=180n,"left"===u?f.y-=n?h.height:0:"center"===u?(f.x-=h.width/2,f.y-=h.height/2):"right"===u&&(f.x-=h.width,f.y-=n?0:h.height)):(d.align(b,null,e),f=d.alignAttr),t?this.justifyDataLabel(d,b,f,h,e,g):k(b.crop,!0)&&(r=c.isInsidePlot(f.x,f.y)&&c.isInsidePlot(f.x+h.width,f.y+h.height)),b.shape&&!l&&d.attr({anchorX:a.plotX,anchorY:a.plotY}));r||(C(d),d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,c){var f=this.chart, +n=d.align,h=d.verticalAlign,q,k,m=a.box?0:a.padding||0;q=b.x+m;0>q&&("right"===n?d.align="left":d.x=-q,k=!0);q=b.x+e.width-m;q>f.plotWidth&&("left"===n?d.align="right":d.x=f.plotWidth-q,k=!0);q=b.y+m;0>q&&("bottom"===h?d.verticalAlign="top":d.y=-q,k=!0);q=b.y+e.height-m;q>f.plotHeight&&("top"===h?d.verticalAlign="bottom":d.y=f.plotHeight-q,k=!0);k&&(a.placed=!c,a.align(d,null,g))};g.pie&&(g.pie.prototype.drawDataLabels=function(){var f=this,d=f.data,b,g=f.chart,h=f.options.dataLabels,c=k(h.connectorPadding, +10),m=k(h.connectorWidth,1),n=g.plotWidth,l=g.plotHeight,x,p=h.distance,y=f.center,u=y[2]/2,t=y[1],w=0k-2?A:P,e),v._attr={visibility:S,align:D[6]},v._pos={x:L+h.x+({left:c,right:-c}[D[6]]||0),y:P+h.y-10},D.x=L,D.y=P,null===f.options.size&&(C=v.width,L-Cn-c&&(T[1]=Math.max(Math.round(L+ +C-n+c),T[1])),0>P-G/2?T[0]=Math.max(Math.round(-P+G/2),T[0]):P+G/2>l&&(T[2]=Math.max(Math.round(P+G/2-l),T[2])))}),0===B(T)||this.verifyDataLabelOverflow(T))&&(this.placeDataLabels(),w&&m&&H(this.points,function(a){var b;x=a.connector;if((v=a.dataLabel)&&v._pos&&a.visible){S=v._attr.visibility;if(b=!x)a.connector=x=g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(f.dataLabelsGroup),x.attr({"stroke-width":m,stroke:h.connectorColor||a.color||"#666666"}); +x[b?"attr":"animate"]({d:f.connectorPath(a.labelPos)});x.attr("visibility",S)}else x&&(a.connector=x.destroy())}))},g.pie.prototype.connectorPath=function(a){var d=a.x,b=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",d+("left"===a[6]?5:-5),b,"C",d,b,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",d+("left"===a[6]?5:-5),b,"L",a[2],a[3],"L",a[4],a[5]]},g.pie.prototype.placeDataLabels=function(){H(this.points,function(a){var d=a.dataLabel;d&&a.visible&&((a=d._pos)?(d.attr(d._attr), +d[d.moved?"animate":"attr"](a),d.moved=!0):d&&d.attr({y:-9999}))})},g.pie.prototype.alignDataLabel=t,g.pie.prototype.verifyDataLabelOverflow=function(a){var d=this.center,b=this.options,e=b.center,f=b.minSize||80,c,g;null!==e[0]?c=Math.max(d[2]-Math.max(a[1],a[3]),f):(c=Math.max(d[2]-a[1]-a[3],f),d[0]+=(a[3]-a[1])/2);null!==e[1]?c=Math.max(Math.min(c,d[2]-Math.max(a[0],a[2])),f):(c=Math.max(Math.min(c,d[2]-a[0]-a[2]),f),d[1]+=(a[0]-a[2])/2);ck(this.translatedThreshold,f.yAxis.len)),m=k(b.inside,!!this.options.stacking);n&&(g=w(n),0>g.y&&(g.height+=g.y,g.y=0),n=g.y+g.height-f.yAxis.len,0a+e||c+nb+f||g+hthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&r(d,function(a){a.setState()});r("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",g=c[d],n=(b.pointRange||0)/2,h=b.getExtremes(),q=b.toValue(g-f,!0)+n,n=b.toValue(g+b.len-f,!0)-n,g=g>f;b.series.length&&(g||q>Math.min(h.dataMin,h.min))&&(!g||n=p(k.minWidth,0)&&this.chartHeight>=p(k.minHeight,0)};void 0===l._id&&(l._id=a.uniqueKey());m=m.call(this);!r[l._id]&&m?l.chartOptions&&(r[l._id]=this.currentOptions(l.chartOptions),this.update(l.chartOptions,w)):r[l._id]&&!m&&(this.update(r[l._id],w),delete r[l._id])};D.prototype.currentOptions=function(a){function p(a,m,e){var g,h;for(g in a)if(-1< +G(g,["series","xAxis","yAxis"]))for(a[g]=l(a[g]),e[g]=[],h=0;hd.length||void 0===h)return a.call(this,g,h,k,f);x=d.length;for(c=0;ck;d[c]5*b||w){if(d[c]>u){for(r=a.call(this,g,d[e],d[c],f);r.length&&r[0]<=u;)r.shift();r.length&&(u=r[r.length-1]);y=y.concat(r)}e=c+1}if(w)break}a= +r.info;if(q&&a.unitRange<=m.hour){c=y.length-1;for(e=1;ek?a-1:a;for(M=void 0;q--;)e=c[q],k=M-e,M&&k<.8*C&&(null===t||k<.8*t)?(n[y[q]]&&!n[y[q+1]]?(k=q+1,M=e):k=q,y.splice(k,1)):M=e}return y});w(B.prototype,{beforeSetTickPositions:function(){var a, +g=[],h=!1,k,f=this.getExtremes(),d=f.min,b=f.max,q,m=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,c=this.chart.options.chart.ignoreHiddenSeries;if(f||m){r(this.series,function(b,d){if(!(c&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(g=g.concat(b.processedXData),a=g.length,g.sort(function(a,b){return a-b}),a))for(d=a-1;d--;)g[d]===g[d+1]&&g.splice(d,1)});a=g.length;if(2k||b-g[g.length- +1]>k)&&(h=!0)}h?(this.ordinalPositions=g,k=this.val2lin(Math.max(d,g[0]),!0),q=Math.max(this.val2lin(Math.min(b,g[g.length-1]),!0),1),this.ordinalSlope=b=(b-d)/(q-k),this.ordinalOffset=d-k*b):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=f&&h;this.groupIntervalFactor=null},val2lin:function(a,g){var e=this.ordinalPositions;if(e){var k=e.length,f,d;for(f=k;f--;)if(e[f]===a){d=f;break}for(f=k-1;f--;)if(a>e[f]||0===f){a=(a-e[f])/(e[f+1]-e[f]);d=f+a;break}g=g?d:this.ordinalSlope* +(d||0)+this.ordinalOffset}else g=a;return g},lin2val:function(a,g){var e=this.ordinalPositions;if(e){var k=this.ordinalSlope,f=this.ordinalOffset,d=e.length-1,b;if(g)0>a?a=e[0]:a>d?a=e[d]:(d=Math.floor(a),b=a-d);else for(;d--;)if(g=k*d+f,a>=g){k=k*(d+1)+f;b=(a-g)/(k-g);break}return void 0!==b&&void 0!==e[d]?e[d]+(b?b*(e[d+1]-e[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,g=this.series[0].currentDataGrouping,h=this.ordinalIndex,k=g?g.count+g.unitName:"raw",f=this.getExtremes(), +d,b;h||(h=this.ordinalIndex={});h[k]||(d={series:[],chart:a,getExtremes:function(){return{min:f.dataMin,max:f.dataMax}},options:{ordinal:!0},val2lin:B.prototype.val2lin},r(this.series,function(e){b={xAxis:d,xData:e.xData,chart:a,destroyGroupedData:t};b.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:"open",units:[[g.unitName,[g.count]]]}:{enabled:!1}};e.processData.apply(b);d.series.push(b)}),this.beforeSetTickPositions.apply(d),h[k]=d.ordinalPositions);return h[k]},getGroupIntervalFactor:function(a, +g,h){var e;h=h.processedXData;var f=h.length,d=[];e=this.groupIntervalFactor;if(!e){for(e=0;ed?(l=p,t=e.ordinalPositions?e:p):(l=e.ordinalPositions?e:p,t=p),p=t.ordinalPositions,q>p[p.length-1]&&p.push(q),this.fixedRange=c-m,d=e.toFixedRange(null,null,n.apply(l,[x.apply(l,[m,!0])+d,!0]),n.apply(t,[x.apply(t, +[c,!0])+d,!0])),d.min>=Math.min(b.dataMin,m)&&d.max<=Math.max(q,c)&&e.setExtremes(d.min,d.max,!0,!1,{trigger:"pan"}),this.mouseDownX=k,H(this.container,{cursor:"move"})):f=!0}else f=!0;f&&a.apply(this,Array.prototype.slice.call(arguments,1))});k.prototype.gappedPath=function(){var a=this.options.gapSize,g=this.points.slice(),h=g.length-1;if(a&&0this.closestPointRange*a&&g.splice(h+1,0,{isNull:!0});return this.getGraphPath(g)}})(N);(function(a){function D(){return Array.prototype.slice.call(arguments, +1)}function B(a){a.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,G(this.pointArrayMap,["y"]))}var G=a.pick,H=a.wrap,p=a.each,l=a.extend,r=a.fireEvent,w=a.Axis,t=a.Series;l(w.prototype,{isInBreak:function(a,m){var e=a.repeat||Infinity,g=a.from,h=a.to-a.from;m=m>=g?(m-g)%e:e-(g-m)%e;return a.inclusive?m<=h:m=a)break;else if(g.isInBreak(f,a)){e-=a-f.from;break}return e};this.lin2val=function(a){var e,f;for(f=0;f=a);f++)e.toh;)m-=b;for(;mb.to||l>b.from&&db.from&&db.from&&d>b.to&&d=c[0]);A++);for(A;A<=q;A++){for(;(void 0!==c[w+1]&&a[A]>=c[w+1]||A===q)&&(l=c[w],this.dataGroupInfo={start:p,length:t[0].length},p=d.apply(this,t),void 0!==p&&(g.push(l),h.push(p),m.push(this.dataGroupInfo)),p=A,t[0]=[],t[1]=[],t[2]=[],t[3]=[],w+=1,A!==q););if(A===q)break;if(x){l=this.cropStart+A;l=e&&e[l]|| +this.pointClass.prototype.applyOptions.apply({series:this},[f[l]]);var E,C;for(E=0;Ethis.chart.plotSizeX/d||b&&f.forced)&&(e=!0);return e?d:0};G.prototype.setDataGrouping=function(a,b){var c;b=e(b,!0);a||(a={forced:!1,units:null});if(this instanceof G)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else l(this.chart.options.series,function(b){b.dataGrouping=a},!1);b&&this.chart.redraw()}})(N);(function(a){var D=a.each,B=a.Point,G=a.seriesType,H=a.seriesTypes;G("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'}, +threshold:null,states:{hover:{lineWidth:3}}},{pointArrayMap:["open","high","low","close"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:"high",pointAttribs:function(a,l){l=H.column.prototype.pointAttribs.call(this,a,l);var p=this.options;delete l.fill;l["stroke-width"]=p.lineWidth;l.stroke=a.options.color||(a.openk)););B(g,function(a,b){var d;void 0===a.plotY&&(a.x>=c.min&&a.x<=c.max?a.plotY=e.chartHeight-p.bottom-(p.opposite?p.height:0)+p.offset-e.plotTop:a.shapeArgs={});a.plotX+=t;(f=g[b-1])&&f.plotX===a.plotX&&(void 0===f.stackIndex&&(f.stackIndex=0),d=f.stackIndex+1);a.stackIndex=d})},drawPoints:function(){var a=this.points,e=this.chart,g=e.renderer,k,l,f=this.options,d=f.y,b,q,p,c,r,n,t,x=this.yAxis;for(q=a.length;q--;)p=a[q],t=p.plotX>this.xAxis.len,k=p.plotX,c=p.stackIndex,b= +p.options.shape||f.shape,l=p.plotY,void 0!==l&&(l=p.plotY+d-(void 0!==c&&c*f.stackDistance)),r=c?void 0:p.plotX,n=c?void 0:p.plotY,c=p.graphic,void 0!==l&&0<=k&&!t?(c||(c=p.graphic=g.label("",null,null,b,null,null,f.useHTML).attr(this.pointAttribs(p)).css(G(f.style,p.style)).attr({align:"flag"===b?"left":"center",width:f.width,height:f.height,"text-align":f.textAlign}).addClass("highcharts-point").add(this.markerGroup),c.shadow(f.shadow)),0h&&(e-=Math.round((l-h)/2),h=l);e=k[a](e,g,h,l);d&&f&&e.push("M",d,g>f?g:g+l,"L",d,f);return e}});p===t&&B(["flag","circlepin","squarepin"],function(a){t.prototype.symbols[a]=k[a]})})(N);(function(a){function D(a,d,e){this.init(a,d,e)}var B=a.addEvent,G=a.Axis,H=a.correctFloat,p=a.defaultOptions, +l=a.defined,r=a.destroyObjectProperties,w=a.doc,t=a.each,k=a.fireEvent,m=a.hasTouch,e=a.isTouchDevice,g=a.merge,h=a.pick,C=a.removeEvent,f=a.wrap,d={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2", +trackBorderWidth:1};p.scrollbar=g(!0,d,p.scrollbar);D.prototype={init:function(a,e,f){this.scrollbarButtons=[];this.renderer=a;this.userOptions=e;this.options=g(d,e);this.chart=f;this.size=h(this.options.size,this.options.height);e.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,d=this.options,e=this.size,c;this.group=c=a.g("scrollbar").attr({zIndex:d.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0, +r:d.trackBorderRadius||0,height:e,width:e}).add(c);this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(this.swapXY(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L", +0,2*e/3,"M",3,e/4,"L",3,2*e/3],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth});this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a, +d,e,c){var b=this.options.vertical,f=0,g=this.rendered?"animate":"attr";this.x=a;this.y=d+this.trackBorderWidth;this.width=e;this.xOffset=this.height=c;this.yOffset=f;b?(this.width=this.yOffset=e=f=this.size,this.xOffset=d=0,this.barWidth=c-2*e,this.x=a+=this.options.margin):(this.height=this.xOffset=c=d=this.size,this.barWidth=e-2*c,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:e,height:c});this.scrollbarButtons[1].attr({translateX:b?0:e-d,translateY:b? +c-f:0})},drawScrollbarButton:function(a){var b=this.renderer,d=this.scrollbarButtons,c=this.options,e=this.size,f;f=b.g().add(this.group);d.push(f);f=b.rect().addClass("highcharts-scrollbar-button").add(f);f.attr({stroke:c.buttonBorderColor,"stroke-width":c.buttonBorderWidth,fill:c.buttonBackgroundColor});f.attr(f.crisp({x:-.5,y:-.5,width:e+1,height:e+1,r:c.buttonBorderRadius},f.strokeWidth()));f=b.path(this.swapXY(["M",e/2+(a?-1:1),e/2-3,"L",e/2+(a?-1:1),e/2+3,"L",e/2+(a?2:-2),e/2],c.vertical)).addClass("highcharts-scrollbar-arrow").add(d[a]); +f.attr({fill:c.buttonArrowColor})},swapXY:function(a,d){var b=a.length,c;if(d)for(d=0;d=k?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),c=a.options.vertical? +"chartY":"chartX",e=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][c]||(d=a.cursorToScrollbarPosition(d)[c],c=a[c],c=d-c,a.hasDragged=!0,a.updatePosition(e[0]+c,e[1]+c),a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b); +b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=H(a.to-a.from)*a.options.step;a.updatePosition(H(a.from-d),H(a.to-d));k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b), +c=a.to-a.from,e=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>e||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+c,a.to+c):a.updatePosition(a.from-c,a.to-c);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a, +d){1a&&(d=H(d-a),a=0);this.from=a;this.to=d},update:function(a){this.destroy();this.init(this.chart.renderer,g(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],d=this.scrollbarButtons,e=this.scrollbarGroup.element,c=this.mouseDownHandler,f=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[d[a[0]].element,"click",this.buttonToMinClick],[d[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e, +"mousedown",c],[w,"mousemove",f],[w,"mouseup",g]];m&&a.push([e,"touchstart",c],[w,"touchmove",f],[w,"touchend",g]);t(a,function(a){B.apply(null,a)});this._events=a},removeEvents:function(){t(this._events,function(a){C.apply(null,a)});this._events=void 0},destroy:function(){var a=this.chart.scroller;this.removeEvents();t(["track","scrollbarRifles","scrollbar","scrollbarGroup","group"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&(a.scrollbar=null,r(a.scrollbarButtons))}}; +f(G.prototype,"init",function(a){var b=this;a.apply(b,[].slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new D(b.chart.renderer,b.options.scrollbar,b.chart),B(b.scrollbar,"changed",function(a){var c=Math.min(h(b.options.min,b.min),b.min,b.dataMin),d=Math.max(h(b.options.max,b.max),b.max,b.dataMax)-c,e;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(e=c+d*this.to,c+=d*this.from):(e= +c+d*(1-this.from),c+=d*(1-this.to));b.setExtremes(c,e,!0,!1,a)}))});f(G.prototype,"render",function(a){var b=Math.min(h(this.options.min,this.min),this.min,this.dataMin),d=Math.max(h(this.options.max,this.max),this.max,this.dataMax),c=this.scrollbar,e;a.apply(this,[].slice.call(arguments,1));c&&(this.horiz?c.position(this.left,this.top+this.height+this.offset+2+(this.opposite?0:this.axisTitleMargin),this.width,this.height):c.position(this.left+this.width+2+this.offset+(this.opposite?this.axisTitleMargin: +0),this.top,this.width,this.height),isNaN(b)||isNaN(d)||!l(this.min)||!l(this.max)?c.setRange(0,0):(e=(this.min-b)/(d-b),b=(this.max-b)/(d-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(e,b):c.setRange(1-b,1-e)))});f(G.prototype,"getOffset",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,[].slice.call(arguments,1));d&&(this.chart.axisOffset[b]+=d.size+d.options.margin)});f(G.prototype,"destroy",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy()); +a.apply(this,[].slice.call(arguments,1))});a.Scrollbar=D})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.color,l=a.defaultOptions,r=a.defined,w=a.destroyObjectProperties,t=a.doc,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.grep,C=a.hasTouch,f=a.isNumber,d=a.isObject,b=a.isTouchDevice,q=a.merge,E=a.pick,c=a.removeEvent,F=a.Scrollbar,n=a.Series,A=a.seriesTypes,x=a.wrap,J=[].concat(a.defaultDataGroupingUnits),y=function(a){var b=h(arguments,f);if(b.length)return Math[a].apply(0, +b)};J[4]=["day",[1,2,3,4]];J[5]=["week",[1,2,3]];A=void 0===A.areaspline?"line":"areaspline";g(l,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:p("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",outlineWidth:1,series:{type:A,color:"#335cad",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:J},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series", +className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}}); +D.prototype={drawHandle:function(a,b){var c=this.chart.renderer,d=this.handles;this.rendered||(d[b]=c.path(["M",-4.5,.5,"L",3.5,.5,3.5,15.5,-4.5,15.5,-4.5,.5,"M",-1.5,4,"L",-1.5,12,"M",.5,4,"L",.5,12]).attr({zIndex:10-b}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][b]).add(),c=this.navigatorOptions.handles,d[b].attr({fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":1}).css({cursor:"ew-resize"}));d[b][this.rendered&&!this.hasDragged?"animate":"attr"]({translateX:Math.round(this.scrollerLeft+ +this.scrollbarHeight+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},update:function(a){this.destroy();q(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var e=this.chart,g=e.renderer,k,h,l,n;n=this.scrollbarHeight;var m=this.xAxis,p=this.navigatorOptions,u=p.maskInside,q=this.height,v=this.top,t=this.navigatorEnabled,x=this.outlineHeight,y;y=this.rendered;if(f(a)&&f(b)&&(!this.hasDragged||r(c))&&(this.navigatorLeft=k=E(m.left,e.plotLeft+ +n),this.navigatorWidth=h=E(m.len,e.plotWidth-2*n),this.scrollerLeft=l=k-n,this.scrollerWidth=n=n=h+2*n,c=E(c,m.translate(a)),d=E(d,m.translate(b)),f(c)&&Infinity!==Math.abs(c)||(c=0,d=n),!(m.translate(d,!0)-m.translate(c,!0)f&&tp+d-u&&rk&&re?e=0:e+v>=q&&(e=q-v,x=h.getUnionExtremes().dataMax),e!==d&&(h.fixedWidth=v,d=l.toFixedRange(e, +e+v,null,x),c.setExtremes(d.min,d.max,!0,null,{trigger:"navigator"}))))};h.mouseMoveHandler=function(b){var c=h.scrollbarHeight,d=h.navigatorLeft,e=h.navigatorWidth,f=h.scrollerLeft,g=h.scrollerWidth,k=h.range,l;b.touches&&0===b.touches[0].pageX||(b=a.pointer.normalize(b),l=b.chartX,lf+g-c&&(l=f+g-c),h.grabbedLeft?(h.hasDragged=!0,h.render(0,0,l-d,h.otherHandlePos)):h.grabbedRight?(h.hasDragged=!0,h.render(0,0,h.otherHandlePos,l-d)):h.grabbedCenter&&(h.hasDragged=!0,le+n-k&&(l=e+ +n-k),h.render(0,0,l-n,l-n+k)),h.hasDragged&&h.scrollbar&&h.scrollbar.options.liveRedraw&&(b.DOMType=b.type,setTimeout(function(){h.mouseUpHandler(b)},0)))};h.mouseUpHandler=function(b){var c,d,e=b.DOMEvent||b;if(h.hasDragged||"scrollbar"===b.trigger)h.zoomedMin===h.otherHandlePos?c=h.fixedExtreme:h.zoomedMax===h.otherHandlePos&&(d=h.fixedExtreme),h.zoomedMax===h.navigatorWidth&&(d=h.getUnionExtremes().dataMax),c=l.toFixedRange(h.zoomedMin,h.zoomedMax,c,d),r(c.min)&&a.xAxis[0].setExtremes(c.min,c.max, +!0,h.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:e});"mousemove"!==b.DOMType&&(h.grabbedLeft=h.grabbedRight=h.grabbedCenter=h.fixedWidth=h.fixedExtreme=h.otherHandlePos=h.hasDragged=n=null)};var c=a.xAxis.length,f=a.yAxis.length,m=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraBottomMargin=h.outlineHeight+d.margin;a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=l=new G(a,q({breaks:m.options.breaks,ordinal:m.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis", +isX:!0,type:"datetime",index:c,height:g,offset:0,offsetLeft:k,offsetRight:-k,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1})),h.yAxis=new G(a,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,height:g,offset:0,index:f,zoomEnabled:!1})),e||d.series.data?h.addBaseSeries():0===a.series.length&&x(a,"redraw",function(b,c){0=Math.round(a.navigatorWidth);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},destroy:function(){this.removeEvents();this.xAxis&&(m(this.chart.xAxis,this.xAxis),m(this.chart.axes,this.xAxis));this.yAxis&&(m(this.chart.yAxis,this.yAxis),m(this.chart.axes,this.yAxis));k(this.series||[],function(a){a.destroy&&a.destroy()});k("series xAxis yAxis leftShade rightShade outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" "), +function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);k([this.handles,this.elementsToDestroy],function(a){w(a)},this)}};a.Navigator=D;x(G.prototype,"zoom",function(a,b,c){var d=this.chart,e=d.options,f=e.chart.zoomType,g=e.navigator,e=e.rangeSelector,h;this.isXAxis&&(g&&g.enabled||e&&e.enabled)&&("x"===f?d.resetZoomButton="blocked":"y"===f?h=!1:"xy"===f&&(d=this.previousZoom,r(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!== +h?h:a.call(this,b,c)});x(H.prototype,"init",function(a,b,c){B(this,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});a.call(this,b,c)});x(H.prototype,"getMargins",function(a){var b=this.legend,c=b.options,d=this.scroller,e,f;a.apply(this,[].slice.call(arguments,1));d&&(e=d.xAxis,f=d.yAxis,d.top=d.navigatorOptions.top||this.chartHeight-d.height-d.scrollbarHeight-this.spacing[2]-("bottom"===c.verticalAlign&&c.enabled&& +!c.floating?b.legendHeight+E(c.margin,10):0),e&&f&&(e.options.top=f.options.top=d.top,e.setAxisSize(),f.setAxisSize()))});x(n.prototype,"addPoint",function(a,b,c,f,g){var h=this.options.turboThreshold;h&&this.xData.length>h&&d(b,!0)&&this.chart.scroller&&e(20,!0);a.call(this,b,c,f,g)});x(H.prototype,"addSeries",function(a,b,c,d){a=a.call(this,b,!1,d);this.scroller&&this.scroller.setBaseSeries();E(c,!0)&&this.redraw();return a});x(n.prototype,"update",function(a,b,c){a.call(this,b,!1);this.chart.scroller&& +this.chart.scroller.setBaseSeries();E(c,!0)&&this.chart.redraw()})})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.css,l=a.createElement,r=a.dateFormat,w=a.defaultOptions,t=w.global.useUTC,k=a.defined,m=a.destroyObjectProperties,e=a.discardElement,g=a.each,h=a.extend,C=a.fireEvent,f=a.Date,d=a.isNumber,b=a.merge,q=a.pick,E=a.pInt,c=a.splat,F=a.wrap;h(w,{rangeSelector:{buttonTheme:{"stroke-width":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:"right"}, +labelStyle:{color:"#666666"}}});w.lang=b(w.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(a,b){var e=this,f=e.chart,h=e.buttonOptions[a],k=f.xAxis[0],l=f.scroller&&f.scroller.getUnionExtremes()||k||{},n=l.dataMin,m=l.dataMax,p,r=k&&Math.round(Math.min(k.max,q(m,k.max))),w=h.type,z,l=h._range,A,C,D,E=h.dataGrouping;if(null!==n&&null!==m){f.fixedRange=l;E&&(this.forcedDataGrouping=!0,G.prototype.setDataGrouping.call(k||{chart:this.chart}, +E,!1));if("month"===w||"year"===w)k?(w={range:h,max:r,dataMin:n,dataMax:m},p=k.minFromRange.call(w),d(w.newMax)&&(r=w.newMax)):l=h;else if(l)p=Math.max(r-l,n),r=Math.min(p+l,m);else if("ytd"===w)if(k)void 0===m&&(n=Number.MAX_VALUE,m=Number.MIN_VALUE,g(f.series,function(a){a=a.xData;n=Math.min(a[0],n);m=Math.max(a[a.length-1],m)}),b=!1),r=e.getYTDExtremes(m,n,t),p=A=r.min,r=r.max;else{B(f,"beforeRender",function(){e.clickButton(a)});return}else"all"===w&&k&&(p=n,r=m);e.setSelected(a);k?k.setExtremes(p, +r,q(b,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:h}):(z=c(f.options.xAxis)[0],D=z.range,z.range=l,C=z.min,z.min=A,B(f,"load",function(){z.range=D;z.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons|| +[].concat(b.defaultButtons),e=c.selected,f=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&C(a,"blur");c&&c.blur&&C(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=B(a.container,"mousedown",f);this.unResize=B(a,"resize",f);g(d,b.computeButtonRange);void 0!==e&&d[e]&&this.clickButton(e,!1);B(a,"load",function(){B(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&& +b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,b=a.xAxis[0],c=Math.round(b.max-b.min),e=!b.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||b,f=a.dataMin,h=a.dataMax,a=this.getYTDExtremes(h,f,t),k=a.min,l=a.max,m=this.selected,p=d(m),q=this.options.allButtonsEnabled,r=this.buttons;g(this.buttonOptions,function(a,d){var g=a._range,n=a.type,u=a.count||1;a=r[d];var t=0;d=d===m;var v=g>h-f,x=g=864E5*{month:28,year:365}[n]*u&&c<=864E5*{month:31,year:366}[n]*u?g=!0:"ytd"===n?(g=l-k===c,y=!d):"all"===n&&(g=b.max-b.min>=h-f,w=!d&&p&&g);n=!q&&(v||x||w||e);g=d&&g||g&&!p&&!y;n?t=3:g&&(p=!0,t=2);a.state!==t&&a.setState(t)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if("month"===b||"year"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,b){var c= +this.chart.options.rangeSelector,d=this[a+"Input"];k(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=r(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:r(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];p(this[a+"Input"],{left:b.translateX+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){p(this[a+"Input"],{border:0,width:"1px",height:"1px"}); +this.setInputValue(a)},drawInput:function(a){function c(){var a=r.value,b=(m.inputDateParser||Date.parse)(a),c=f.xAxis[0],g=f.scroller&&f.scroller.xAxis?f.scroller.xAxis:c,h=g.dataMin,g=g.dataMax;b!==r.previousValue&&(r.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(E(b[0]),E(b[1])-1,E(b[2]))),d(b)&&(t||(b+=6E4*(new Date).getTimezoneOffset()),q?b>e.maxInput.HCTime?b=void 0:bg&&(b=g),void 0!==b&&c.setExtremes(q?b:c.min,q?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))} +var e=this,f=e.chart,g=f.renderer.style||{},k=f.renderer,m=f.options.rangeSelector,n=e.div,q="min"===a,r,B,C=this.inputGroup;this[a+"Label"]=B=k.label(w.lang[q?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(C);C.offset+=B.width+5;this[a+"DateBox"]=k=k.label("",C.offset).addClass("highcharts-range-input").attr({padding:2,width:m.inputBoxWidth||90,height:m.inputBoxHeight||17,stroke:m.inputBoxBorderColor||"#cccccc","stroke-width":1, +"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()}).add(C);C.offset+=k.width+(q?10:0);this[a+"Input"]=r=l("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:f.plotTop+"px"},n);B.css(b(g,m.labelStyle));k.css(b({color:"#333333"},g,m.inputStyle));p(r,h({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:g.fontSize,fontFamily:g.fontFamily,left:"-9em"},m.inputStyle));r.onfocus=function(){e.showInput(a)};r.onblur= +function(){e.hideInput(a)};r.onchange=c;r.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=q((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,b,c){var d=new f(a),e=d[f.hcGetFullYear]();c=c?f.UTC(e,0,1):+new f(e,0,1);b=Math.max(b||0,c);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(a,b){var c=this,d=c.chart,e=d.renderer,f=d.container,m=d.options, +n=m.exporting&&!1!==m.exporting.enabled&&m.navigation&&m.navigation.buttonOptions,p=m.rangeSelector,r=c.buttons,m=w.lang,t=c.div,t=c.inputGroup,A=p.buttonTheme,z=p.buttonPosition||{},B=p.inputEnabled,C=A&&A.states,D=d.plotLeft,E,G=this.getPosition(),F=c.group,H=c.rendered;!1!==p.enabled&&(H||(c.group=F=e.g("range-selector-buttons").add(),c.zoomText=e.text(m.rangeSelectorZoom,q(z.x,D),15).css(p.labelStyle).add(F),E=q(z.x,D)+c.zoomText.getBBox().width+5,g(c.buttonOptions,function(a,b){r[b]=e.button(a.text, +E,0,function(){c.clickButton(b);c.isActive=!0},A,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(F);E+=r[b].width+q(p.buttonSpacing,5)}),!1!==B&&(c.div=t=l("div",null,{position:"relative",height:0,zIndex:1}),f.parentNode.insertBefore(t,f),c.inputGroup=t=e.g("input-group").add(),t.offset=0,c.drawInput("min"),c.drawInput("max"))),c.updateButtonStates(),F[H?"animate":"attr"]({translateY:G.buttonTop}),!1!==B&&(t.align(h({y:G.inputTop,width:t.offset,x:n&&G.inputTop<(n.y||0)+n.height- +d.spacing[0]?-40:0},p.inputPosition),!0,d.spacingBox),k(B)||(d=F.getBBox(),t[t.alignAttr.translateXc&&(e?a=b-f:b=a+f);d(a)||(a=b=void 0);return{min:a,max:b}};G.prototype.minFromRange=function(){var a=this.range,b={month:"Month",year:"FullYear"}[a.type],c,e=this.max,f,g,h=function(a,c){var d=new Date(a);d["set"+b](d["get"+ +b]()+c);return d.getTime()-a};d(a)?(c=e-a,g=a):(c=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-c));f=q(this.dataMin,Number.MIN_VALUE);d(c)||(c=f);c<=f&&(c=f,void 0===g&&(g=h(c,a.count)),this.newMax=Math.min(c+g,this.dataMax));d(e)||(c=void 0);return c};F(H.prototype,"init",function(a,b,c){B(this,"init",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});a.call(this,b,c)});a.RangeSelector=D})(N);(function(a){var D=a.addEvent,B=a.isNumber;a.Chart.prototype.callbacks.push(function(a){function G(){p= +a.xAxis[0].getExtremes();B(p.min)&&r.render(p.min,p.max)}var p,l=a.scroller,r=a.rangeSelector,w,t;l&&(p=a.xAxis[0].getExtremes(),l.render(p.min,p.max));r&&(t=D(a.xAxis[0],"afterSetExtremes",function(a){r.render(a.min,a.max)}),w=D(a,"redraw",G),G());D(a,"destroy",function(){r&&(w(),t())})})})(N);(function(a){var D=a.arrayMax,B=a.arrayMin,G=a.Axis,H=a.Chart,p=a.defined,l=a.each,r=a.extend,w=a.format,t=a.inArray,k=a.isNumber,m=a.isString,e=a.map,g=a.merge,h=a.pick,C=a.Point,f=a.Renderer,d=a.Series,b= +a.splat,q=a.stop,E=a.SVGRenderer,c=a.VMLRenderer,F=a.wrap,n=d.prototype,A=n.init,x=n.processData,J=C.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,d,f){var k=m(c)||c.nodeName,l=arguments[k?1:0],n=l.series,p=a.getOptions(),q,r=h(l.navigator&&l.navigator.enabled,!0)?{startOnTick:!1,endOnTick:!1}:null,t={marker:{enabled:!1,radius:2}},u={shadow:!1,borderWidth:0};l.xAxis=e(b(l.xAxis||{}),function(a){return g({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"}, +showLastLabel:!0},p.xAxis,a,{type:"datetime",categories:null},r)});l.yAxis=e(b(l.yAxis||{}),function(a){q=h(a.opposite,!0);return g({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},p.yAxis,a)});l.series=null;l=g({chart:{panning:!0,pinchType:"x"},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null,style:{fontSize:"16px"}},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:t,spline:t,area:t,areaspline:t,arearange:t,areasplinerange:t, +column:u,columnrange:u,candlestick:u,ohlc:u}},l,{_stock:!0,chart:{inverted:!1}});l.series=n;return k?new H(c,l,f):new H(l,d)};F(G.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options._stock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=1,"right"):a.call(this,[].slice.call(arguments,1))});F(G.prototype,"getPlotLinePath",function(a, +b,c,d,f,g){var n=this,q=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=n.chart,u=r.renderer,v=n.left,w=n.top,y,x,A,B,C=[],D=[],E,F;if("colorAxis"===n.coll)return a.apply(this,[].slice.call(arguments,1));D=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=n.options[b];return k(a)?[r[b][a]]:m(a)?[r.get(a)]:e(q,function(a){return a[b]})}(n.coll);l(n.isXAxis?r.yAxis:r.xAxis,function(a){if(p(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=p(a.options[b])? +r[b][a.options[b]]:r[b][0];n===b&&D.push(a)}});E=D.length?[]:[n.isXAxis?r.yAxis[0]:r.xAxis[0]];l(D,function(a){-1===t(a,E)&&E.push(a)});F=h(g,n.translate(b,null,null,d));k(F)&&(n.horiz?l(E,function(a){var b;x=a.pos;B=x+a.len;y=A=Math.round(F+n.transB);if(yv+n.width)f?y=A=Math.min(Math.max(v,y),v+n.width):b=!0;b||C.push("M",y,x,"L",A,B)}):l(E,function(a){var b;y=a.pos;A=y+a.len;x=B=Math.round(w+n.height-F);if(xw+n.height)f?x=B=Math.min(Math.max(w,x),n.top+n.height):b=!0;b||C.push("M",y, +x,"L",A,B)}));return 0=e&&(x=-(l.translateX+b.width-e));l.attr({x:m+x,y:k,anchorX:g?m:this.opposite?0:a.chartWidth,anchorY:g?this.opposite?a.chartHeight:0:k+b.height/2})}});n.init=function(){A.apply(this,arguments);this.setCompare(this.options.compare)};n.setCompare=function(a){this.modifyValue= +"value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b=b/d*100-100,c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};n.processData=function(){var a,b=-1,c,d,e,f;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=t("close",this.pointArrayMap),-1===b&&(b=t(this.pointValKey||"y",this.pointArrayMap))),a=0;a< +e-1;a++)if(f=-1=this.xAxis.min&&0!==f){this.compareValue=f;break}};F(n,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=B(b),this.dataMax=D(b))});G.prototype.setCompare=function(a,b){this.isXAxis||(l(this.series,function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};C.prototype.tooltipFormatter=function(b){b=b.replace("{point.change}",(0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 '; + else + var expandButton = ''; + + return '' + expandButton + '' + ellipsedLabel({ name: item.name, parentClass: "nav-tooltip", childClass: "nav-label" }) + ''; +} + +function menuItemsForGroup(group, level, parent) { + var items = ''; + + if (level > 0) + items += menuItem(group, level - 1, parent, true); + + $.each(group.contents, function (contentName, content) { + if (content.type == 'GROUP') + items += menuItemsForGroup(content, level + 1, group.pathFormatted); + else if (content.type == 'REQUEST') + items += menuItem(content, level, group.pathFormatted); + }); + + return items; +} + +function setDetailsMenu(){ + $('.nav ul').append(menuItemsForGroup(stats, 0)); + $('.nav').expandable(); + $('.nav-tooltip').popover({trigger:'hover'}); +} + +function setGlobalMenu(){ + $('.nav ul') + .append('
  • Ranges
  • ') + .append('
  • Stats
  • ') + .append('
  • Active Users
  • ') + .append('
  • Requests / sec
  • ') + .append('
  • Responses / sec
  • '); +} + +function getLink(link){ + var a = link.split('/'); + return (a.length<=1)? link : a[a.length-1]; +} + +function expandUp(li) { + const parentId = li.attr("data-parent"); + if (parentId != "ROOT") { + const span = $('#' + parentId); + const parentLi = span.parents('li').first(); + span.expand(parentLi, false); + expandUp(parentLi); + } +} + +function setActiveMenu(){ + $('.nav a').each(function() { + const navA = $(this) + if(!navA.hasClass('expand-button') && navA.attr('href') == getLink(window.location.pathname)) { + const li = $(this).parents('li').first(); + li.addClass('on'); + expandUp(li); + return false; + } + }); +} diff --git a/webapp/loadTests/1user/js/stats.js b/webapp/loadTests/1user/js/stats.js new file mode 100644 index 0000000..feb6778 --- /dev/null +++ b/webapp/loadTests/1user/js/stats.js @@ -0,0 +1,3819 @@ +var stats = { + type: "GROUP", +name: "All Requests", +path: "", +pathFormatted: "group_missing-name-b06d1", +stats: { + "name": "All Requests", + "numberOfRequests": { + "total": "45", + "ok": "45", + "ko": "0" + }, + "minResponseTime": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "maxResponseTime": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "meanResponseTime": { + "total": "324", + "ok": "324", + "ko": "-" + }, + "standardDeviation": { + "total": "261", + "ok": "261", + "ko": "-" + }, + "percentiles1": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "percentiles2": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "percentiles3": { + "total": "802", + "ok": "802", + "ko": "-" + }, + "percentiles4": { + "total": "873", + "ok": "873", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 42, + "percentage": 93 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.324", + "ok": "1.324", + "ko": "-" + } +}, +contents: { +"req_request-0-684d2": { + type: "REQUEST", + name: "request_0", +path: "request_0", +pathFormatted: "req_request-0-684d2", +stats: { + "name": "request_0", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "maxResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "meanResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "percentiles2": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "percentiles3": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "percentiles4": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-1-46da4": { + type: "REQUEST", + name: "request_1", +path: "request_1", +pathFormatted: "req_request-1-46da4", +stats: { + "name": "request_1", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "maxResponseTime": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "meanResponseTime": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles3": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles4": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-2-93baf": { + type: "REQUEST", + name: "request_2", +path: "request_2", +pathFormatted: "req_request-2-93baf", +stats: { + "name": "request_2", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "maxResponseTime": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "meanResponseTime": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "percentiles2": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "percentiles3": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "percentiles4": { + "total": "819", + "ok": "819", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 100 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-3-d0973": { + type: "REQUEST", + name: "request_3", +path: "request_3", +pathFormatted: "req_request-3-d0973", +stats: { + "name": "request_3", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "maxResponseTime": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "meanResponseTime": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles2": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles3": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles4": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-4-e7d1b": { + type: "REQUEST", + name: "request_4", +path: "request_4", +pathFormatted: "req_request-4-e7d1b", +stats: { + "name": "request_4", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "maxResponseTime": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "meanResponseTime": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "percentiles2": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "percentiles3": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "percentiles4": { + "total": "454", + "ok": "454", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-5-48829": { + type: "REQUEST", + name: "request_5", +path: "request_5", +pathFormatted: "req_request-5-48829", +stats: { + "name": "request_5", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "maxResponseTime": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "meanResponseTime": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "percentiles2": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "percentiles3": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "percentiles4": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-6-027a9": { + type: "REQUEST", + name: "request_6", +path: "request_6", +pathFormatted: "req_request-6-027a9", +stats: { + "name": "request_6", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "maxResponseTime": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "meanResponseTime": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "percentiles2": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "percentiles3": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "percentiles4": { + "total": "651", + "ok": "651", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-7-f222f": { + type: "REQUEST", + name: "request_7", +path: "request_7", +pathFormatted: "req_request-7-f222f", +stats: { + "name": "request_7", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "maxResponseTime": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "meanResponseTime": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "percentiles2": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "percentiles3": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "percentiles4": { + "total": "408", + "ok": "408", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-5-redir-affb3": { + type: "REQUEST", + name: "request_5 Redirect 1", +path: "request_5 Redirect 1", +pathFormatted: "req_request-5-redir-affb3", +stats: { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "maxResponseTime": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "meanResponseTime": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "percentiles2": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "percentiles3": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "percentiles4": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-8-ef0c8": { + type: "REQUEST", + name: "request_8", +path: "request_8", +pathFormatted: "req_request-8-ef0c8", +stats: { + "name": "request_8", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "maxResponseTime": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "meanResponseTime": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "percentiles2": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "percentiles3": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "percentiles4": { + "total": "413", + "ok": "413", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-8-redir-98b2a": { + type: "REQUEST", + name: "request_8 Redirect 1", +path: "request_8 Redirect 1", +pathFormatted: "req_request-8-redir-98b2a", +stats: { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "maxResponseTime": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "meanResponseTime": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "percentiles2": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "percentiles3": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "percentiles4": { + "total": "398", + "ok": "398", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-8-redir-fc911": { + type: "REQUEST", + name: "request_8 Redirect 2", +path: "request_8 Redirect 2", +pathFormatted: "req_request-8-redir-fc911", +stats: { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "maxResponseTime": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "meanResponseTime": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "percentiles2": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "percentiles3": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "percentiles4": { + "total": "405", + "ok": "405", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-8-redir-e875c": { + type: "REQUEST", + name: "request_8 Redirect 3", +path: "request_8 Redirect 3", +pathFormatted: "req_request-8-redir-e875c", +stats: { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "maxResponseTime": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "meanResponseTime": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "percentiles2": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "percentiles3": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "percentiles4": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-12-61da2": { + type: "REQUEST", + name: "request_12", +path: "request_12", +pathFormatted: "req_request-12-61da2", +stats: { + "name": "request_12", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "maxResponseTime": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "meanResponseTime": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "percentiles2": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "percentiles3": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "percentiles4": { + "total": "110", + "ok": "110", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-14-a0e30": { + type: "REQUEST", + name: "request_14", +path: "request_14", +pathFormatted: "req_request-14-a0e30", +stats: { + "name": "request_14", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "maxResponseTime": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "meanResponseTime": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "percentiles2": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "percentiles3": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "percentiles4": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-22-8ecb1": { + type: "REQUEST", + name: "request_22", +path: "request_22", +pathFormatted: "req_request-22-8ecb1", +stats: { + "name": "request_22", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "maxResponseTime": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "meanResponseTime": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "percentiles2": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "percentiles3": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "percentiles4": { + "total": "139", + "ok": "139", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-21-be4cb": { + type: "REQUEST", + name: "request_21", +path: "request_21", +pathFormatted: "req_request-21-be4cb", +stats: { + "name": "request_21", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "maxResponseTime": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "meanResponseTime": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "percentiles2": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "percentiles3": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "percentiles4": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-24-dd0c9": { + type: "REQUEST", + name: "request_24", +path: "request_24", +pathFormatted: "req_request-24-dd0c9", +stats: { + "name": "request_24", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "maxResponseTime": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "meanResponseTime": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "percentiles2": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "percentiles3": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "percentiles4": { + "total": "173", + "ok": "173", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-200-636fa": { + type: "REQUEST", + name: "request_200", +path: "request_200", +pathFormatted: "req_request-200-636fa", +stats: { + "name": "request_200", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "maxResponseTime": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "meanResponseTime": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "percentiles2": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "percentiles3": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "percentiles4": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-13-5cca6": { + type: "REQUEST", + name: "request_13", +path: "request_13", +pathFormatted: "req_request-13-5cca6", +stats: { + "name": "request_13", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "maxResponseTime": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "meanResponseTime": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "percentiles2": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "percentiles3": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "percentiles4": { + "total": "216", + "ok": "216", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-15-56eac": { + type: "REQUEST", + name: "request_15", +path: "request_15", +pathFormatted: "req_request-15-56eac", +stats: { + "name": "request_15", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "maxResponseTime": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "meanResponseTime": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "percentiles2": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "percentiles3": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "percentiles4": { + "total": "503", + "ok": "503", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-16-24733": { + type: "REQUEST", + name: "request_16", +path: "request_16", +pathFormatted: "req_request-16-24733", +stats: { + "name": "request_16", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "maxResponseTime": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "meanResponseTime": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "percentiles2": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "percentiles3": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "percentiles4": { + "total": "522", + "ok": "522", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-18-f5b64": { + type: "REQUEST", + name: "request_18", +path: "request_18", +pathFormatted: "req_request-18-f5b64", +stats: { + "name": "request_18", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "maxResponseTime": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "meanResponseTime": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "percentiles2": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "percentiles3": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "percentiles4": { + "total": "185", + "ok": "185", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_logo-png-c9c2b": { + type: "REQUEST", + name: "Logo.png", +path: "Logo.png", +pathFormatted: "req_logo-png-c9c2b", +stats: { + "name": "Logo.png", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "maxResponseTime": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "meanResponseTime": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "percentiles2": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "percentiles3": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "percentiles4": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_bundle-js-0b837": { + type: "REQUEST", + name: "bundle.js", +path: "bundle.js", +pathFormatted: "req_bundle-js-0b837", +stats: { + "name": "bundle.js", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "maxResponseTime": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "meanResponseTime": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "percentiles2": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "percentiles3": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "percentiles4": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-9-d127e": { + type: "REQUEST", + name: "request_9", +path: "request_9", +pathFormatted: "req_request-9-d127e", +stats: { + "name": "request_9", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "maxResponseTime": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "meanResponseTime": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "percentiles2": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "percentiles3": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "percentiles4": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-10-1cfbe": { + type: "REQUEST", + name: "request_10", +path: "request_10", +pathFormatted: "req_request-10-1cfbe", +stats: { + "name": "request_10", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "maxResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "meanResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles2": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles3": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles4": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-11-f11e8": { + type: "REQUEST", + name: "request_11", +path: "request_11", +pathFormatted: "req_request-11-f11e8", +stats: { + "name": "request_11", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "maxResponseTime": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "meanResponseTime": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "percentiles2": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "percentiles3": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "percentiles4": { + "total": "168", + "ok": "168", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-242-d6d33": { + type: "REQUEST", + name: "request_242", +path: "request_242", +pathFormatted: "req_request-242-d6d33", +stats: { + "name": "request_242", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "maxResponseTime": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "meanResponseTime": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "percentiles2": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "percentiles3": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "percentiles4": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_css2-family-rob-cf8a9": { + type: "REQUEST", + name: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +path: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +pathFormatted: "req_css2-family-rob-cf8a9", +stats: { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "maxResponseTime": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "meanResponseTime": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "percentiles2": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "percentiles3": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "percentiles4": { + "total": "219", + "ok": "219", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-19-10d85": { + type: "REQUEST", + name: "request_19", +path: "request_19", +pathFormatted: "req_request-19-10d85", +stats: { + "name": "request_19", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "maxResponseTime": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "meanResponseTime": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "percentiles2": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "percentiles3": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "percentiles4": { + "total": "622", + "ok": "622", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-20-6804b": { + type: "REQUEST", + name: "request_20", +path: "request_20", +pathFormatted: "req_request-20-6804b", +stats: { + "name": "request_20", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "maxResponseTime": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "meanResponseTime": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "percentiles2": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "percentiles3": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "percentiles4": { + "total": "481", + "ok": "481", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-23-98f5d": { + type: "REQUEST", + name: "request_23", +path: "request_23", +pathFormatted: "req_request-23-98f5d", +stats: { + "name": "request_23", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "maxResponseTime": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "meanResponseTime": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "percentiles2": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "percentiles3": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "percentiles4": { + "total": "598", + "ok": "598", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-222-24864": { + type: "REQUEST", + name: "request_222", +path: "request_222", +pathFormatted: "req_request-222-24864", +stats: { + "name": "request_222", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "maxResponseTime": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "meanResponseTime": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles2": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles3": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles4": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-227-2507b": { + type: "REQUEST", + name: "request_227", +path: "request_227", +pathFormatted: "req_request-227-2507b", +stats: { + "name": "request_227", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "maxResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "meanResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "percentiles2": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "percentiles3": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "percentiles4": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-240-e27d8": { + type: "REQUEST", + name: "request_240", +path: "request_240", +pathFormatted: "req_request-240-e27d8", +stats: { + "name": "request_240", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "maxResponseTime": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "meanResponseTime": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "percentiles2": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "percentiles3": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "percentiles4": { + "total": "635", + "ok": "635", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-241-2919b": { + type: "REQUEST", + name: "request_241", +path: "request_241", +pathFormatted: "req_request-241-2919b", +stats: { + "name": "request_241", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "maxResponseTime": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "meanResponseTime": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "percentiles2": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "percentiles3": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "percentiles4": { + "total": "733", + "ok": "733", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-243-b078b": { + type: "REQUEST", + name: "request_243", +path: "request_243", +pathFormatted: "req_request-243-b078b", +stats: { + "name": "request_243", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "maxResponseTime": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "meanResponseTime": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles2": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles3": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles4": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-250-8cb1f": { + type: "REQUEST", + name: "request_250", +path: "request_250", +pathFormatted: "req_request-250-8cb1f", +stats: { + "name": "request_250", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "maxResponseTime": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "meanResponseTime": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "percentiles2": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "percentiles3": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "percentiles4": { + "total": "717", + "ok": "717", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-252-38647": { + type: "REQUEST", + name: "request_252", +path: "request_252", +pathFormatted: "req_request-252-38647", +stats: { + "name": "request_252", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "maxResponseTime": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "meanResponseTime": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "percentiles2": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "percentiles3": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "percentiles4": { + "total": "891", + "ok": "891", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 100 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-260-43b5f": { + type: "REQUEST", + name: "request_260", +path: "request_260", +pathFormatted: "req_request-260-43b5f", +stats: { + "name": "request_260", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "maxResponseTime": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "meanResponseTime": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "percentiles2": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "percentiles3": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "percentiles4": { + "total": "721", + "ok": "721", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-265-cf160": { + type: "REQUEST", + name: "request_265", +path: "request_265", +pathFormatted: "req_request-265-cf160", +stats: { + "name": "request_265", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "maxResponseTime": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "meanResponseTime": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "percentiles2": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "percentiles3": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "percentiles4": { + "total": "849", + "ok": "849", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 100 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-270-e02a1": { + type: "REQUEST", + name: "request_270", +path: "request_270", +pathFormatted: "req_request-270-e02a1", +stats: { + "name": "request_270", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "maxResponseTime": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "meanResponseTime": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "percentiles2": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "percentiles3": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "percentiles4": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-322-a2de9": { + type: "REQUEST", + name: "request_322", +path: "request_322", +pathFormatted: "req_request-322-a2de9", +stats: { + "name": "request_322", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "maxResponseTime": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "meanResponseTime": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "percentiles2": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "percentiles3": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "percentiles4": { + "total": "277", + "ok": "277", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + },"req_request-323-2fefc": { + type: "REQUEST", + name: "request_323", +path: "request_323", +pathFormatted: "req_request-323-2fefc", +stats: { + "name": "request_323", + "numberOfRequests": { + "total": "1", + "ok": "1", + "ko": "0" + }, + "minResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "maxResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "meanResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "standardDeviation": { + "total": "0", + "ok": "0", + "ko": "-" + }, + "percentiles1": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles2": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles3": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "percentiles4": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.029", + "ok": "0.029", + "ko": "-" + } +} + } +} + +} + +function fillStats(stat){ + $("#numberOfRequests").append(stat.numberOfRequests.total); + $("#numberOfRequestsOK").append(stat.numberOfRequests.ok); + $("#numberOfRequestsKO").append(stat.numberOfRequests.ko); + + $("#minResponseTime").append(stat.minResponseTime.total); + $("#minResponseTimeOK").append(stat.minResponseTime.ok); + $("#minResponseTimeKO").append(stat.minResponseTime.ko); + + $("#maxResponseTime").append(stat.maxResponseTime.total); + $("#maxResponseTimeOK").append(stat.maxResponseTime.ok); + $("#maxResponseTimeKO").append(stat.maxResponseTime.ko); + + $("#meanResponseTime").append(stat.meanResponseTime.total); + $("#meanResponseTimeOK").append(stat.meanResponseTime.ok); + $("#meanResponseTimeKO").append(stat.meanResponseTime.ko); + + $("#standardDeviation").append(stat.standardDeviation.total); + $("#standardDeviationOK").append(stat.standardDeviation.ok); + $("#standardDeviationKO").append(stat.standardDeviation.ko); + + $("#percentiles1").append(stat.percentiles1.total); + $("#percentiles1OK").append(stat.percentiles1.ok); + $("#percentiles1KO").append(stat.percentiles1.ko); + + $("#percentiles2").append(stat.percentiles2.total); + $("#percentiles2OK").append(stat.percentiles2.ok); + $("#percentiles2KO").append(stat.percentiles2.ko); + + $("#percentiles3").append(stat.percentiles3.total); + $("#percentiles3OK").append(stat.percentiles3.ok); + $("#percentiles3KO").append(stat.percentiles3.ko); + + $("#percentiles4").append(stat.percentiles4.total); + $("#percentiles4OK").append(stat.percentiles4.ok); + $("#percentiles4KO").append(stat.percentiles4.ko); + + $("#meanNumberOfRequestsPerSecond").append(stat.meanNumberOfRequestsPerSecond.total); + $("#meanNumberOfRequestsPerSecondOK").append(stat.meanNumberOfRequestsPerSecond.ok); + $("#meanNumberOfRequestsPerSecondKO").append(stat.meanNumberOfRequestsPerSecond.ko); +} diff --git a/webapp/loadTests/1user/js/stats.json b/webapp/loadTests/1user/js/stats.json new file mode 100644 index 0000000..1d04ca2 --- /dev/null +++ b/webapp/loadTests/1user/js/stats.json @@ -0,0 +1,3777 @@ +{ + "type": "GROUP", +"name": "All Requests", +"path": "", +"pathFormatted": "group_missing-name-b06d1", +"stats": { + "name": "All Requests", + "numberOfRequests": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "minResponseTime": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "maxResponseTime": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "meanResponseTime": { + "total": 324, + "ok": 324, + "ko": 0 + }, + "standardDeviation": { + "total": 261, + "ok": 261, + "ko": 0 + }, + "percentiles1": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "percentiles2": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "percentiles3": { + "total": 802, + "ok": 802, + "ko": 0 + }, + "percentiles4": { + "total": 873, + "ok": 873, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 42, + "percentage": 93 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3235294117647058, + "ok": 1.3235294117647058, + "ko": 0 + } +}, +"contents": { +"req_request-0-684d2": { + "type": "REQUEST", + "name": "request_0", +"path": "request_0", +"pathFormatted": "req_request-0-684d2", +"stats": { + "name": "request_0", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "maxResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "meanResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "percentiles2": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "percentiles3": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "percentiles4": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-1-46da4": { + "type": "REQUEST", + "name": "request_1", +"path": "request_1", +"pathFormatted": "req_request-1-46da4", +"stats": { + "name": "request_1", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "maxResponseTime": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "meanResponseTime": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles3": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles4": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-2-93baf": { + "type": "REQUEST", + "name": "request_2", +"path": "request_2", +"pathFormatted": "req_request-2-93baf", +"stats": { + "name": "request_2", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "maxResponseTime": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "meanResponseTime": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "percentiles2": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "percentiles3": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "percentiles4": { + "total": 819, + "ok": 819, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 100 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-3-d0973": { + "type": "REQUEST", + "name": "request_3", +"path": "request_3", +"pathFormatted": "req_request-3-d0973", +"stats": { + "name": "request_3", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "maxResponseTime": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "meanResponseTime": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles2": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles3": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles4": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-4-e7d1b": { + "type": "REQUEST", + "name": "request_4", +"path": "request_4", +"pathFormatted": "req_request-4-e7d1b", +"stats": { + "name": "request_4", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "maxResponseTime": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "meanResponseTime": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "percentiles2": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "percentiles3": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "percentiles4": { + "total": 454, + "ok": 454, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-5-48829": { + "type": "REQUEST", + "name": "request_5", +"path": "request_5", +"pathFormatted": "req_request-5-48829", +"stats": { + "name": "request_5", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "maxResponseTime": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "meanResponseTime": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "percentiles2": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "percentiles3": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "percentiles4": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-6-027a9": { + "type": "REQUEST", + "name": "request_6", +"path": "request_6", +"pathFormatted": "req_request-6-027a9", +"stats": { + "name": "request_6", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "maxResponseTime": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "meanResponseTime": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "percentiles2": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "percentiles3": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "percentiles4": { + "total": 651, + "ok": 651, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-7-f222f": { + "type": "REQUEST", + "name": "request_7", +"path": "request_7", +"pathFormatted": "req_request-7-f222f", +"stats": { + "name": "request_7", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "maxResponseTime": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "meanResponseTime": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "percentiles2": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "percentiles3": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "percentiles4": { + "total": 408, + "ok": 408, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-5-redir-affb3": { + "type": "REQUEST", + "name": "request_5 Redirect 1", +"path": "request_5 Redirect 1", +"pathFormatted": "req_request-5-redir-affb3", +"stats": { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "maxResponseTime": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "meanResponseTime": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "percentiles2": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "percentiles3": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "percentiles4": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-8-ef0c8": { + "type": "REQUEST", + "name": "request_8", +"path": "request_8", +"pathFormatted": "req_request-8-ef0c8", +"stats": { + "name": "request_8", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "maxResponseTime": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "meanResponseTime": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "percentiles2": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "percentiles3": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "percentiles4": { + "total": 413, + "ok": 413, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-8-redir-98b2a": { + "type": "REQUEST", + "name": "request_8 Redirect 1", +"path": "request_8 Redirect 1", +"pathFormatted": "req_request-8-redir-98b2a", +"stats": { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "maxResponseTime": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "meanResponseTime": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "percentiles2": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "percentiles3": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "percentiles4": { + "total": 398, + "ok": 398, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-8-redir-fc911": { + "type": "REQUEST", + "name": "request_8 Redirect 2", +"path": "request_8 Redirect 2", +"pathFormatted": "req_request-8-redir-fc911", +"stats": { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "maxResponseTime": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "meanResponseTime": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "percentiles2": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "percentiles3": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "percentiles4": { + "total": 405, + "ok": 405, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-8-redir-e875c": { + "type": "REQUEST", + "name": "request_8 Redirect 3", +"path": "request_8 Redirect 3", +"pathFormatted": "req_request-8-redir-e875c", +"stats": { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "maxResponseTime": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "meanResponseTime": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "percentiles2": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "percentiles3": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "percentiles4": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-12-61da2": { + "type": "REQUEST", + "name": "request_12", +"path": "request_12", +"pathFormatted": "req_request-12-61da2", +"stats": { + "name": "request_12", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "maxResponseTime": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "meanResponseTime": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "percentiles2": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "percentiles3": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "percentiles4": { + "total": 110, + "ok": 110, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-14-a0e30": { + "type": "REQUEST", + "name": "request_14", +"path": "request_14", +"pathFormatted": "req_request-14-a0e30", +"stats": { + "name": "request_14", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "maxResponseTime": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "meanResponseTime": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "percentiles2": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "percentiles3": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "percentiles4": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-22-8ecb1": { + "type": "REQUEST", + "name": "request_22", +"path": "request_22", +"pathFormatted": "req_request-22-8ecb1", +"stats": { + "name": "request_22", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "maxResponseTime": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "meanResponseTime": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "percentiles2": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "percentiles3": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "percentiles4": { + "total": 139, + "ok": 139, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-21-be4cb": { + "type": "REQUEST", + "name": "request_21", +"path": "request_21", +"pathFormatted": "req_request-21-be4cb", +"stats": { + "name": "request_21", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "maxResponseTime": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "meanResponseTime": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "percentiles2": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "percentiles3": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "percentiles4": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-24-dd0c9": { + "type": "REQUEST", + "name": "request_24", +"path": "request_24", +"pathFormatted": "req_request-24-dd0c9", +"stats": { + "name": "request_24", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "maxResponseTime": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "meanResponseTime": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "percentiles2": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "percentiles3": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "percentiles4": { + "total": 173, + "ok": 173, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-200-636fa": { + "type": "REQUEST", + "name": "request_200", +"path": "request_200", +"pathFormatted": "req_request-200-636fa", +"stats": { + "name": "request_200", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "maxResponseTime": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "meanResponseTime": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "percentiles2": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "percentiles3": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "percentiles4": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-13-5cca6": { + "type": "REQUEST", + "name": "request_13", +"path": "request_13", +"pathFormatted": "req_request-13-5cca6", +"stats": { + "name": "request_13", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "maxResponseTime": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "meanResponseTime": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "percentiles2": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "percentiles3": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "percentiles4": { + "total": 216, + "ok": 216, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-15-56eac": { + "type": "REQUEST", + "name": "request_15", +"path": "request_15", +"pathFormatted": "req_request-15-56eac", +"stats": { + "name": "request_15", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "maxResponseTime": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "meanResponseTime": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "percentiles2": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "percentiles3": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "percentiles4": { + "total": 503, + "ok": 503, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-16-24733": { + "type": "REQUEST", + "name": "request_16", +"path": "request_16", +"pathFormatted": "req_request-16-24733", +"stats": { + "name": "request_16", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "maxResponseTime": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "meanResponseTime": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "percentiles2": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "percentiles3": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "percentiles4": { + "total": 522, + "ok": 522, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-18-f5b64": { + "type": "REQUEST", + "name": "request_18", +"path": "request_18", +"pathFormatted": "req_request-18-f5b64", +"stats": { + "name": "request_18", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "maxResponseTime": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "meanResponseTime": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "percentiles2": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "percentiles3": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "percentiles4": { + "total": 185, + "ok": 185, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_logo-png-c9c2b": { + "type": "REQUEST", + "name": "Logo.png", +"path": "Logo.png", +"pathFormatted": "req_logo-png-c9c2b", +"stats": { + "name": "Logo.png", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "maxResponseTime": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "meanResponseTime": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "percentiles2": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "percentiles3": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "percentiles4": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_bundle-js-0b837": { + "type": "REQUEST", + "name": "bundle.js", +"path": "bundle.js", +"pathFormatted": "req_bundle-js-0b837", +"stats": { + "name": "bundle.js", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "maxResponseTime": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "meanResponseTime": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "percentiles2": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "percentiles3": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "percentiles4": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-9-d127e": { + "type": "REQUEST", + "name": "request_9", +"path": "request_9", +"pathFormatted": "req_request-9-d127e", +"stats": { + "name": "request_9", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "maxResponseTime": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "meanResponseTime": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "percentiles2": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "percentiles3": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "percentiles4": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-10-1cfbe": { + "type": "REQUEST", + "name": "request_10", +"path": "request_10", +"pathFormatted": "req_request-10-1cfbe", +"stats": { + "name": "request_10", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "maxResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "meanResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles2": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles3": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles4": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-11-f11e8": { + "type": "REQUEST", + "name": "request_11", +"path": "request_11", +"pathFormatted": "req_request-11-f11e8", +"stats": { + "name": "request_11", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "maxResponseTime": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "meanResponseTime": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "percentiles2": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "percentiles3": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "percentiles4": { + "total": 168, + "ok": 168, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-242-d6d33": { + "type": "REQUEST", + "name": "request_242", +"path": "request_242", +"pathFormatted": "req_request-242-d6d33", +"stats": { + "name": "request_242", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "maxResponseTime": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "meanResponseTime": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "percentiles2": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "percentiles3": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "percentiles4": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_css2-family-rob-cf8a9": { + "type": "REQUEST", + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"path": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"pathFormatted": "req_css2-family-rob-cf8a9", +"stats": { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "maxResponseTime": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "meanResponseTime": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "percentiles2": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "percentiles3": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "percentiles4": { + "total": 219, + "ok": 219, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-19-10d85": { + "type": "REQUEST", + "name": "request_19", +"path": "request_19", +"pathFormatted": "req_request-19-10d85", +"stats": { + "name": "request_19", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "maxResponseTime": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "meanResponseTime": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "percentiles2": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "percentiles3": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "percentiles4": { + "total": 622, + "ok": 622, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-20-6804b": { + "type": "REQUEST", + "name": "request_20", +"path": "request_20", +"pathFormatted": "req_request-20-6804b", +"stats": { + "name": "request_20", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "maxResponseTime": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "meanResponseTime": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "percentiles2": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "percentiles3": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "percentiles4": { + "total": 481, + "ok": 481, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-23-98f5d": { + "type": "REQUEST", + "name": "request_23", +"path": "request_23", +"pathFormatted": "req_request-23-98f5d", +"stats": { + "name": "request_23", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "maxResponseTime": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "meanResponseTime": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "percentiles2": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "percentiles3": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "percentiles4": { + "total": 598, + "ok": 598, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-222-24864": { + "type": "REQUEST", + "name": "request_222", +"path": "request_222", +"pathFormatted": "req_request-222-24864", +"stats": { + "name": "request_222", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "maxResponseTime": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "meanResponseTime": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles2": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles3": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles4": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-227-2507b": { + "type": "REQUEST", + "name": "request_227", +"path": "request_227", +"pathFormatted": "req_request-227-2507b", +"stats": { + "name": "request_227", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "maxResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "meanResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "percentiles2": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "percentiles3": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "percentiles4": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-240-e27d8": { + "type": "REQUEST", + "name": "request_240", +"path": "request_240", +"pathFormatted": "req_request-240-e27d8", +"stats": { + "name": "request_240", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "maxResponseTime": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "meanResponseTime": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "percentiles2": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "percentiles3": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "percentiles4": { + "total": 635, + "ok": 635, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-241-2919b": { + "type": "REQUEST", + "name": "request_241", +"path": "request_241", +"pathFormatted": "req_request-241-2919b", +"stats": { + "name": "request_241", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "maxResponseTime": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "meanResponseTime": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "percentiles2": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "percentiles3": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "percentiles4": { + "total": 733, + "ok": 733, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-243-b078b": { + "type": "REQUEST", + "name": "request_243", +"path": "request_243", +"pathFormatted": "req_request-243-b078b", +"stats": { + "name": "request_243", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "maxResponseTime": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "meanResponseTime": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles2": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles3": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles4": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-250-8cb1f": { + "type": "REQUEST", + "name": "request_250", +"path": "request_250", +"pathFormatted": "req_request-250-8cb1f", +"stats": { + "name": "request_250", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "maxResponseTime": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "meanResponseTime": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "percentiles2": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "percentiles3": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "percentiles4": { + "total": 717, + "ok": 717, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-252-38647": { + "type": "REQUEST", + "name": "request_252", +"path": "request_252", +"pathFormatted": "req_request-252-38647", +"stats": { + "name": "request_252", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "maxResponseTime": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "meanResponseTime": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "percentiles2": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "percentiles3": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "percentiles4": { + "total": 891, + "ok": 891, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 100 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-260-43b5f": { + "type": "REQUEST", + "name": "request_260", +"path": "request_260", +"pathFormatted": "req_request-260-43b5f", +"stats": { + "name": "request_260", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "maxResponseTime": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "meanResponseTime": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "percentiles2": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "percentiles3": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "percentiles4": { + "total": 721, + "ok": 721, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-265-cf160": { + "type": "REQUEST", + "name": "request_265", +"path": "request_265", +"pathFormatted": "req_request-265-cf160", +"stats": { + "name": "request_265", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "maxResponseTime": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "meanResponseTime": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "percentiles2": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "percentiles3": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "percentiles4": { + "total": 849, + "ok": 849, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 100 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-270-e02a1": { + "type": "REQUEST", + "name": "request_270", +"path": "request_270", +"pathFormatted": "req_request-270-e02a1", +"stats": { + "name": "request_270", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "maxResponseTime": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "meanResponseTime": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "percentiles2": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "percentiles3": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "percentiles4": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-322-a2de9": { + "type": "REQUEST", + "name": "request_322", +"path": "request_322", +"pathFormatted": "req_request-322-a2de9", +"stats": { + "name": "request_322", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "maxResponseTime": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "meanResponseTime": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "percentiles2": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "percentiles3": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "percentiles4": { + "total": 277, + "ok": 277, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + },"req_request-323-2fefc": { + "type": "REQUEST", + "name": "request_323", +"path": "request_323", +"pathFormatted": "req_request-323-2fefc", +"stats": { + "name": "request_323", + "numberOfRequests": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "minResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "maxResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "meanResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "standardDeviation": { + "total": 0, + "ok": 0, + "ko": 0 + }, + "percentiles1": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles2": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles3": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "percentiles4": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.029411764705882353, + "ok": 0.029411764705882353, + "ko": 0 + } +} + } +} + +} \ No newline at end of file diff --git a/webapp/loadTests/1user/js/theme.js b/webapp/loadTests/1user/js/theme.js new file mode 100644 index 0000000..b95a7b3 --- /dev/null +++ b/webapp/loadTests/1user/js/theme.js @@ -0,0 +1,127 @@ +/* + * Copyright 2011-2022 Gatling Corp + * + * Licensed under the Gatling Highcharts License + */ +Highcharts.theme = { + chart: { + backgroundColor: '#f7f7f7', + borderWidth: 0, + borderRadius: 8, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#666', + tickColor: '#666', + labels: { + style: { + color: '#666' + } + }, + title: { + style: { + color: '#666' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: '#999', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#666', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#666', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + + rangeSelector: { + buttonTheme: { + fill: '#cfc9c6', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#b2b2a9' + }, + states: { + hover: { + fill: '#92918C', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#8b897d' + } + }, + select: { + fill: '#E37400', + stroke: '#000000', + style: { + color: '#FFF' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: '#8b897d' + } + }, + + navigator: { + handles: { + backgroundColor: '#f7f7f7', + borderColor: '#92918C' + }, + outlineColor: '#92918C', + outlineWidth: 1, + maskFill: 'rgba(146, 145, 140, 0.5)', + series: { + color: '#5E7BE2', + lineColor: '#5E7BE2' + } + }, + + scrollbar: { + buttonBackgroundColor: '#f7f7f7', + buttonBorderWidth: 1, + buttonBorderColor: '#92918C', + buttonArrowColor: '#92918C', + buttonBorderRadius: 2, + + barBorderWidth: 1, + barBorderRadius: 0, + barBackgroundColor: '#92918C', + barBorderColor: '#92918C', + + rifleColor: '#92918C', + + trackBackgroundColor: '#b0b0a8', + trackBorderWidth: 1, + trackBorderColor: '#b0b0a8' + } +}; + +Highcharts.setOptions(Highcharts.theme); diff --git a/webapp/loadTests/1user/js/unpack.js b/webapp/loadTests/1user/js/unpack.js new file mode 100644 index 0000000..883c33e --- /dev/null +++ b/webapp/loadTests/1user/js/unpack.js @@ -0,0 +1,38 @@ +'use strict'; + +var unpack = function (array) { + var findNbSeries = function (array) { + var currentPlotPack; + var length = array.length; + + for (var i = 0; i < length; i++) { + currentPlotPack = array[i][1]; + if(currentPlotPack !== null) { + return currentPlotPack.length; + } + } + return 0; + }; + + var i, j; + var nbPlots = array.length; + var nbSeries = findNbSeries(array); + + // Prepare unpacked array + var unpackedArray = new Array(nbSeries); + + for (i = 0; i < nbSeries; i++) { + unpackedArray[i] = new Array(nbPlots); + } + + // Unpack the array + for (i = 0; i < nbPlots; i++) { + var timestamp = array[i][0]; + var values = array[i][1]; + for (j = 0; j < nbSeries; j++) { + unpackedArray[j][i] = [timestamp * 1000, values === null ? null : values[j]]; + } + } + + return unpackedArray; +}; diff --git a/webapp/loadTests/1user/style/arrow_down.png b/webapp/loadTests/1user/style/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdbc86e36d0d025402710734046405455ba300 GIT binary patch literal 983 zcmaJ=U2D@&7>;fZDHd;a3La7~Hn92V+O!GFMw@i5vXs(R?8T6!$!Qz9_ z=Rer5@K(VKz41c*2SY&wuf1>zUd=aM+wH=7NOI13d7tNf-jBSfRqrPg%L#^Il9g?} z4*PX@6IU1DyZip+6KpqWxkVeKLkDJnnW9bF7*$-ei|g35hfhA>b%t5E>oi-mW$Y*x zaXB;g;Ud=uG{dZKM!sqFF-2|Mbv%{*@#Zay99v}{(6Mta8f2H7$2EFFLFYh($vu~ z{_pC#Gw+br@wwiA5{J#9kNG+d$w6R2<2tE0l&@$3HYo|3gzQhNSnCl=!XELF){xMO zVOowC8&<~%!%!+-NKMbe6nl*YcI5V zYJ&NRkF&vr%WU+q2lF1lU?-O^-GZNDskYNBpN`kV!(aPgxlHTT#wqjtmGA&=s};T2 zjE>uT`ju-(hf9m^K6dqQrIXa_+Rv}MM}GwF^TyKc-wTU3m^&*>@7eL=F92dH<*NR& HwDFdgVhf9Ks!(i$ny>OtAWQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyvFlc$Sgh{pM)L8rMG3^=@Q{{O$p`t7BNW1mD+?G!w^;tkj$ z(itxFDR3sIr)^#L`so{%PjmYM-riK)$MRAsEYzTK67RjU>c3}HyQct6WAJqKb6Mw< G&;$UsBSU@w literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/arrow_right.png b/webapp/loadTests/1user/style/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a609f80fe17e6f185e1b6373f668fc1f28baae2c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu@pObhHwBu4M$1`knic~;uxYa zvG@EzE(Qe-<_o&N{>R5n@3?e|Q?{o)*sCe{Y!G9XUG*c;{fmVEy{&lgYDVka)lZ$Q rCit0rf5s|lpJ$-R@IrLOqF~-LT3j-WcUP(c4Q23j^>bP0l+XkKUN$bz literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/arrow_right_black.png b/webapp/loadTests/1user/style/arrow_right_black.png new file mode 100644 index 0000000000000000000000000000000000000000..651bd5d27675d9e92ac8d477f2db9efa89c2b355 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`!T#~#}T5FGAlLHD#mbgZgIOpf)rskC}I2WZRmZYXA zlxLP?D7bt2281{Ai31gRdb&7a_JLSF1VWMQKse&#dLi5wlM1_0 z{FM;Ti|sk&y~DuuWXc=~!vbOZMy|V())CrJpY;0L8wi!QM>m&zYv9kY5B?3u;2c!O zs6ZM%Cwv?}ZUCR5a}lC&3CiHSi?f8KBR+xu!araKY=q^sqfcTxa>ExJ5kHFbN8w@G zFbUZkx(k2U9zdM>;c2eb9<@Vt5POLKHVlK|b%E|Ae7gwwDx3hf9oZ^{qwoRjg6;52 zcpeJLI}f_J>rdS@R>r_B=yd$%s`3!zFD&bhZdZTkLaK?cPhvA2 zKl><4eGxC4a;Mdo*PR{+mo_KQ0&Hlk7(2(YeOGR{yx#iw!sRK{pC^Z_`%&gZIOHn( z0A)|bA46eyt%M^3$D@Q6QTcTUVt9h#E14pioqpnJ5Fv4vueCTp(_y(W_1RLr&f2 zqI)=IL-U*F1Lco^e7uSJ_DHlro5zyo?tjgxFM|B=QxDdXXQn?~UhTf54G*EKdD-|u zWftJKwuxmXUXwQ)-H%*()s8zUXDUnsXPpUz?CyzqH4f0-=E{2#{o&G^u_}`4MWPK| zGcOFrhQ_|B|0!d~OW(w?ZnYrKW>-GtKStgfYlX>^DA8Z$%3n^K?&qG-Jk_EOS}M&~ zSmyKt;kMY&T4m~Q6TU}wa>8Y`&PSBh4?T@@lTT9pxFoTjwOyl|2O4L_#y<(a2I`l( z_!a5jhgQ_TIdUr)8=4RH#^M$;j#_w?Px@py3nrhDhiKc)UU?GZD0>?D-D{Dt(GYo> z{mz&`fvtJyWsiEu#tG^&D6w2!Q}%77YrgU->oD<47@K|3>re}AiN6y)?PZJ&g*E?a zKTsDRQLmTaI&A1ZdIO9NN$rJnU;Z3Adexu2ePcTAeC}{L>Br!2@E6#XfZ{#`%~>X& z=AN$5tsc5kzOxRXr#W;#7#o`Z7J&8>o@2-Hf7Kkm!IjVCzgl^TIpI5AzN#yZ@~41% z3?8H2{p-qO(%6fPB=3LfX@mT$KG1!s`_Axt!dfRxdvzbLVLaRm@%_FltoUKGf*0d+ ziZ5(8A*2esb2%T!qR?L?zjmkbm{QqUbpo+5Y;bl<5@UZ>vksWYd= z)qkY5f?t3sS9McgxSvZB!y4B+m=m1+1HSLY^_yU9NU9HI=MZCKZ1qyBuJVc^sZe8I z76_F!A|Lxc=ickgKD?!mwk6ugVUJ6j9zaj^F=hXOxLKez+Y7DZig(sV+HgH#tq*Fq zv9Xu9c`>~afx=SHJ#wJXPWJ`Nn9dG0~%k(XL|0)b(fP9EKlYB(7M_h zTG8GN*3cg0nE{&5KXv6lO?Vx8{oFR{3;PP4=f?@yR=;-h)v?bYy(tW%oae#4-W?$S z^qDI!&nGH(RS)ppgpSgYFay zfX-0*!FbR*qP1P)#q_s)rf1k8c`Iw)A8G^pRqYAB!v3HiWsHnrp7XVCwx{i$<6HT! z!K7 zY1Mc-Co%a;dLZe6FN_B`E73b>oe7VIDLfDA+(FWyvn4$zdST9EFRHo+DTeofqdI0t$jFNyI9 zQfKTs`+N&tf;p7QOzXUtYC?Dr<*UBkb@qhhywuir2b~Ddgzcd7&O_93j-H`?=(!=j z1?gFE7pUGk$EX0k7tBH43ZtM8*X?+Z>zw&fPHW1kb9TfwXB^HsjQpVUhS`Cj-I%lA zbT_kuk;YD&cxR8!i=aB3BLDon2E1oRHx)XraG zuGLrVtNJ!Ffw11ONMCIBde24Mnv(V`$X}}Klc4h|z4z9q$?+f8KLXj(dr-YU?E^Z0 zGQ{8Gs4Vn;7t=q592Ga@3J|ZeqBAi)wOyY%d;Un91$yUG28$_o1dMi}Gre)7_45VK zryy5>>KlQFNV}f)#`{%;5Wgg*WBl|S?^s%SRRBHNHg(lKdBFpfrT*&$ZriH&9>{dt z=K2vZWlO4UTS4!rZwE8~e1o`0L1ju$=aV`&d?kU6To*82GLSz2>FVD36XXNCt;;{I zvq57=dTunvROdvbqqtd@t<(%LcAKMP`u}6Xp5IFF4xtHY8gr_nyL?^04*8(5sJZc9 zARYN=GpqrfH;SLYgDO|GA*^v_+NFDBKJ!ks?+Q$<858o=!|*N~fnD$zzIX1Wn7u*7 z6@$uGA84*U@1m5j@-ffb9g)8U>8c&l+e%yG?+W#PgfseheRwyb@!A&nt}D_mr@)TC z7vWw~{3ejS!{A3}400?;YTQfqhMu4?q5D~5@d?s2ZnI2#jih|Og|gfGYdK?%wYv*> z*MY{vX>83k`B@9}9YF@Dekyw*>;aXndM*a1KTICC^cUJ%e}<>k`j> z&a;&EIBlRiq{Dc44?=J^+zYuNTOWY-tv!wV36BKrC$tVvQathjI1A5#_IcXhYR{#5 zXuolbqsM-i@OsdmWd=IVH#3CQ?&I(>JPALBr7#E1fa3Ihz4E^RQPBQp13Uv-XFmt6 znG0h~jmgiD_k;5e7^$+h!$Eiow7$Ixs{d=C=Tfb)^3OIn3Ad{L_>Vn;-IVKA(2@G+ z8!hM&P7LH*?Hb7SjjFRsUd%6%NRz+7xKmOnt_Vj9eV__wnvUqALE y@<9iX-XLgKmGb5P*V(C?vZI{Ap0ljoe9iI#Pp2!ETh`m`k}sX$tTjPb`Thqd2I;E+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/little_arrow_right.png b/webapp/loadTests/1user/style/little_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..252abe66d3a92aced2cff2df88e8a23d91459251 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd;O^<-7$PB=oN$2m z-(ru2pAv$OC-6w{28nSzPFOlManYH8W7Z01d5`Q)6p~NiIh8RX*um{#37-cePkG{I i?kCneiZ^N=&|+f{`pw(F`1}WPkkOv5elF{r5}E)*4>EfI literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/logo-enterprise.svg b/webapp/loadTests/1user/style/logo-enterprise.svg new file mode 100644 index 0000000..4a6e1de --- /dev/null +++ b/webapp/loadTests/1user/style/logo-enterprise.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/webapp/loadTests/1user/style/logo.svg b/webapp/loadTests/1user/style/logo.svg new file mode 100644 index 0000000..f519eef --- /dev/null +++ b/webapp/loadTests/1user/style/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/webapp/loadTests/1user/style/sortable.png b/webapp/loadTests/1user/style/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb54f9acddb8848e68b640d416bf959cb18b6a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd5b5dS7$PCr+ka7z zL4e13=24exMiQ@YG*qwKncdI-GfUZ1Rki=vCY#SQRzF`R>17u7PVwr=D?vVeZ+UA{ zG@h@BI20Mdp}F2&UODjiSKfWA%2W&v$1X_F*vS}sO7fVb_47iIWuC5nF6*2Ung9-k BJ)r;q literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/sorted-down.png b/webapp/loadTests/1user/style/sorted-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5100cc8efd490cf534a6186f163143bc59de3036 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVDIVT7$PB=oN$2m z-{GYajXDDFEn-;Il?7IbEN2SgoY1K-S+LB}QlU75b4p`dJwwurrwV2sJj^AGt`0LQ Z7#M<{@}@-BSMLEC>FMg{vd$@?2>{QlDr5iv literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/sorted-up.png b/webapp/loadTests/1user/style/sorted-up.png new file mode 100644 index 0000000000000000000000000000000000000000..340a5f0370f1a74439459179e9c4cf1610de75d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVD0JR7$PB=oN$2m z-(rtihEG!hT@vQ#Ni?%SDB=JB literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/stat-fleche-bas.png b/webapp/loadTests/1user/style/stat-fleche-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b501a37f521fa56ce790b5279b204cf16f275 GIT binary patch literal 625 zcmV-%0*?KOP)X1^@s6HR9gx0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6G=otRCwBaRk3XYF$@$1uayA|xJs2O zh6iw!${V;%XBun$AzDJ_5hsobnt%D0lR{6AC-TZ=qQYNSE%4fZr(r%*U%{3#@fMV-wZ|U32I`2RVTet9ov9a1><;a zc490LC;}x<)W9HSa|@E2D5Q~wPER)4Hd~) z7a}hi*bPEZ3E##6tEpfWilBDoTvc z!^R~Z;5%h77OwQK2sCp1=!WSe*z2u-)=XU8l4MF00000 LNkvXXu0mjfMhXuu literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/stat-l-roue.png b/webapp/loadTests/1user/style/stat-l-roue.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a3aae0169d62a079278f0a6737f3376f1b45ae GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!N$PAIIE<7Cy>LE?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2hb1*QrXELw=S&Tp|1;h*tObeLcA_5DT;cR}8^0f~MUKVSdnX!bNbd8LT)Sw-%(F%_zr0N|UagV3xWgqvH;8K?&n0oOR41jMpR4np z@3~veKIhln&vTy7`M&S_y+s{K$4a+%SBakr4tulXXK%nlnMZA<7fW86CAV}Io#FMZ zJKEZlXuR&E=;dFVn4ON?-myI9m-fc)cdfl=xStxmHlE_%*ZyqH3w8e^yf4K+{I{K9 z7w&AxcaMk7ySZ|)QCy;@Qg`etYuie0o>bqd-!G^vY&6qP5x86+IYoDN%G}3H>wNMj zPL^13>44!EmANYvNU$)%J@GUM4J8`33?}zp?$qRpGv)z8kkP`CHe&Oqvvu;}m~M yv&%5+ugjcD{r&Hid!>2~a6b9iXUJ`u|A%4w{h$p3k*sGyq3h}D=d#Wzp$Py=EVp6+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/stat-l-temps.png b/webapp/loadTests/1user/style/stat-l-temps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce268037f94ef73f56cd658d392ef393d562db3 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^{2w#$-&vQnwtC-_ zkh{O~uCAT`QnSlTzs$^@t=jDWl)1cj-p;w{budGVRji^Z`nX^5u3Kw&?Kk^Y?fZDw zg5!e%<_ApQ}k@w$|KtRPs~#LkYapu zf%*GA`~|UpRDQGRR`SL_+3?i5Es{UA^j&xb|x=ujSRd8$p5V>FVdQ&MBb@04c<~BLDyZ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/1user/style/style.css b/webapp/loadTests/1user/style/style.css new file mode 100644 index 0000000..7f50e1b --- /dev/null +++ b/webapp/loadTests/1user/style/style.css @@ -0,0 +1,988 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --gatling-background-color: #f2f2f2; + --gatling-background-light-color: #f7f7f7; + --gatling-border-color: #dddddd; + --gatling-blue-color: #4a9fe5; + --gatling-dark-blue-color: #24275e; + --gatling-danger-color: #f15b4f; + --gatling-danger-light-color: #f5d1ce; + --gatling-enterprise-color: #6161d6; + --gatling-enterprise-light-color: #c4c4ed; + --gatling-gray-medium-color: #bbb; + --gatling-hover-color: #e6e6e6; + --gatling-light-color: #ffffff; + --gatling-orange-color: #f78557; + --gatling-success-color: #68b65c; + --gatling-text-color: #1f2024; + --gatling-total-color: #ffa900; + + --gatling-border-radius: 2px; + --gatling-spacing-small: 5px; + --gatling-spacing: 10px; + --gatling-spacing-layout: 20px; + + --gatling-font-weight-normal: 400; + --gatling-font-weight-medium: 500; + --gatling-font-weight-bold: 700; + --gatling-font-size-secondary: 12px; + --gatling-font-size-default: 14px; + --gatling-font-size-heading: 16px; + --gatling-font-size-section: 22px; + --gatling-font-size-header: 34px; + + --gatling-media-desktop-large: 1920px; +} + +* { + min-height: 0; + min-width: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + color: var(--gatling-text-color); + font-family: arial; + font-size: var(--gatling-font-size-secondary); + margin: 0; +} + +.app-container { + display: flex; + flex-direction: column; + + height: 100%; + width: 100%; +} + +.head { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + + flex: 1; + + background-color: var(--gatling-light-color); + border-bottom: 1px solid var(--gatling-border-color); + min-height: 69px; + padding: 0 var(--gatling-spacing-layout); +} + +.gatling-open-source { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + gap: var(--gatling-spacing-layout); +} + +.gatling-documentation { + display: flex; + align-items: center; + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-orange-color); + border: 1px solid var(--gatling-orange-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 23px; +} + +.gatling-documentation:hover { + background-color: var(--gatling-orange-color); + color: var(--gatling-light-color); +} + +.gatling-logo { + height: 35px; +} + +.gatling-logo img { + height: 100%; +} + +.container { + display: flex; + align-items: stretch; + height: 100%; +} + +.nav { + min-width: 210px; + width: 210px; + max-height: calc(100vh - var(--gatling-spacing-layout) - var(--gatling-spacing-layout)); + background: var(--gatling-light-color); + border-right: 1px solid var(--gatling-border-color); + overflow-y: auto; +} + +@media print { + .nav { + display: none; + } +} + +@media screen and (min-width: 1920px) { + .nav { + min-width: 310px; + width: 310px; + } +} + +.nav ul { + display: flex; + flex-direction: column; + + padding: 0; + margin: 0; +} + +.nav li { + display: flex; + list-style: none; + width: 100%; + padding: 0; +} + +.nav .item { + display: inline-flex; + align-items: center; + margin: 0 auto; + white-space: nowrap; + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + margin: 0; + width: 100%; +} + +.nav .item .nav-label { + padding: var(--gatling-spacing) var(--gatling-spacing-layout); +} + +.nav .item:hover { + background-color: var(--gatling-hover-color); +} + +.nav .on .item { + background-color: var(--gatling-orange-color); +} + +.nav .on .item span { + color: var(--gatling-light-color); +} + +.cadre { + width: 100%; + height: 100%; + overflow-y: scroll; + scroll-behavior: smooth; +} + +@media print { + .cadre { + overflow-y: unset; + } +} + +.frise { + position: absolute; + top: 60px; + z-index: -1; + + background-color: var(--gatling-background-color); + height: 530px; +} + +.global { + height: 650px +} + +a { + text-decoration: none; +} + +a:hover { + color: var(--gatling-hover-color); +} + +img { + border: 0; +} + +h1 { + color: var(--gatling-dark-blue-color); + font-size: var(--gatling-font-size-section); + font-weight: var(--gatling-font-weight-medium); + text-align: center; + margin: 0; +} + +h1 span { + color: var(--gatling-hover-color); +} + +.enterprise { + display: flex; + align-items: center; + justify-content: center; + gap: var(--gatling-spacing-small); + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-enterprise-color); + color: var(--gatling-enterprise-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 25px; +} + +.enterprise:hover { + background-color: var(--gatling-enterprise-light-color); + color: var(--gatling-enterprise-color); +} + +.enterprise img { + display: block; + width: 160px; +} + +.simulation-card { + display: flex; + flex-direction: column; + align-self: stretch; + flex: 1; + gap: var(--gatling-spacing-layout); + max-height: 375px; +} + +#simulation-information { + flex: 1; +} + +.simulation-version-information { + display: flex; + flex-direction: column; + + gap: var(--gatling-spacing); + font-size: var(--gatling-font-size-default); + + background-color: var(--gatling-background-color); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing); +} + +.simulation-information-container { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing); +} + +.withTooltip .popover-title { + display: none; +} + +.popover-content p { + margin: 0; +} + +.ellipsed-name { + display: block; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.simulation-information-item { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--gatling-spacing-small); +} + +.simulation-information-item.description { + flex-direction: column; +} + +.simulation-information-label { + display: inline-block; + font-weight: var(--gatling-font-weight-bold); + min-width: fit-content; +} + +.simulation-information-title { + display: block; + text-align: center; + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + width: 100%; +} + +.simulation-tooltip span { + display: inline-block; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; +} + +.content { + display: flex; + flex-direction: column; +} + +.content-in { + width: 100%; + height: 100%; + + overflow-x: scroll; +} + +@media print { + .content-in { + overflow-x: unset; + } +} + +.container-article { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + min-width: 1050px; + width: 1050px; + margin: 0 auto; + padding: var(--gatling-spacing-layout); + box-sizing: border-box; +} + +@media screen and (min-width: 1920px) { + .container-article { + min-width: 1350px; + width: 1350px; + } + + #responses * .highcharts-tracker { + transform: translate(400px, 70px); + } +} + +.content-header { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + background-color: var(--gatling-background-light-color); + border-bottom: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-layout) var(--gatling-spacing-layout) 0; +} + +.onglet { + font-size: var(--gatling-font-size-header); + font-weight: var(--gatling-font-weight-medium); + text-align: center; +} + +.sous-menu { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.sous-menu-spacer { + display: flex; + align-items: center; + flex-direction: row; +} + +.sous-menu .item { + margin-bottom: -1px; +} + +.sous-menu a { + display: block; + + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-normal); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border-bottom: 2px solid transparent; + color: var(--gatling-text-color); + text-align: center; + width: 100px; +} + +.sous-menu a:hover { + border-bottom-color: var(--gatling-text-color); +} + +.sous-menu .ouvert a { + border-bottom-color: var(--gatling-orange-color); + font-weight: var(--gatling-font-weight-bold); +} + +.article { + position: relative; + + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); +} + +.infos { + width: 340px; + color: var(--gatling-light-color); +} + +.infos-title { + background-color: var(--gatling-background-light-color); + border: 1px solid var(--gatling-border-color); + border-bottom: 0; + border-top-left-radius: var(--gatling-border-radius); + border-top-right-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.info { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + height: 100%; + margin: 0; +} + +.info table { + margin: auto; + padding-right: 15px; +} + +.alert-danger { + background-color: var(--gatling-danger-light-color); + border: 1px solid var(--gatling-danger-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + padding: var(--gatling-spacing-layout); + font-weight: var(--gatling-font-weight-bold); +} + +.repli { + position: absolute; + bottom: 0; + right: 0; + + background: url('stat-fleche-bas.png') no-repeat top left; + height: 25px; + width: 22px; +} + +.infos h2 { + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + height: 19px; + margin: 0; + padding: 3.5px 0 0 35px; +} + +.infos .first { + background: url('stat-l-roue.png') no-repeat 15px 5px; +} + +.infos .second { + background: url('stat-l-temps.png') no-repeat 15px 3px; + border-top: 1px solid var(--gatling-border-color); +} + +.infos th { + text-align: center; +} + +.infos td { + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing-small); + -webkit-border-radius: var(--gatling-border-radius); + -moz-border-radius: var(--gatling-border-radius); + -ms-border-radius: var(--gatling-border-radius); + -o-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + text-align: right; + width: 50px; +} + +.infos .title { + width: 120px; +} + +.infos .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); +} + +.infos .total { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); +} + +.infos .ko { + background-color: var(--gatling-danger-color); + -webkit-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); +} + +.schema-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--gatling-spacing-layout); +} + +.schema { + background: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); +} + +.ranges { + height: 375px; + width: 500px; +} + +.ranges-large { + height: 375px; + width: 530px; +} + +.geant { + height: 362px; +} + +.extensible-geant { + width: 100%; +} + +.polar { + height: 375px; + width: 230px; +} + +.chart_title { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + padding: 2px var(--gatling-spacing); +} + +.statistics { + display: flex; + flex-direction: column; + + background-color: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border-collapse: collapse; + color: var(--gatling-text-color); + max-height: 100%; +} + +.statistics .title { + display: flex; + text-align: center; + justify-content: space-between; + + min-height: 49.5px; + box-sizing: border-box; + + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing); +} + +.title_base { + display: flex; + align-items: center; + text-align: left; + user-select: none; +} + +.title_base_stats { + color: var(--gatling-text-color); + margin-right: 20px; +} + +.toggle-table { + position: relative; + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: 25px; + width: 40px; + height: 20px; + margin: 0 var(--gatling-spacing-small); +} + +.toggle-table::before { + position: absolute; + top: calc(50% - 9px); + left: 1px; + content: ""; + width: 50%; + height: 18px; + border-radius: 50%; + background-color: var(--gatling-text-color); +} + +.toggle-table.off::before { + left: unset; + right: 1px; +} + +.title_expanded { + cursor: pointer; + color: var(--gatling-text-color); +} + +.expand-table, +.collapse-table { + font-size: var(--gatling-font-size-secondary); + font-weight: var(--gatling-font-weight-normal); +} + +.title_expanded span.expand-table { + color: var(--gatling-gray-medium-color); +} + +.title_collapsed { + cursor: pointer; + color: var(--gatling-text-color); +} + +.title_collapsed span.collapse-table { + color: var(--gatling-gray-medium-color); +} + +#container_statistics_head { + position: sticky; + top: -1px; + + background: var(--gatling-background-light-color); + margin-top: -1px; + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); +} + +#container_statistics_body { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + margin-top: -1px; + padding: 0px var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small); +} + +#container_errors { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); + margin-top: -1px; +} + +#container_assertions { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small); + margin-top: -1px; +} + +.statistics-in { + border-spacing: var(--gatling-spacing-small); + border-collapse: collapse; + margin: 0; +} + +.statistics .scrollable { + max-height: 100%; + overflow-y: auto; +} + +#statistics_table_container .statistics .scrollable { + max-height: 785px; +} + +.statistics-in a { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .header { + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small); +} + +.sortable { + cursor: pointer; +} + +.sortable span { + background: url('sortable.png') no-repeat right 3px; + padding-right: 10px; +} + +.sorted-up span { + background-image: url('sorted-up.png'); +} + +.sorted-down span { + background-image: url('sorted-down.png'); +} + +.executions { + background: url('stat-l-roue.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.response-time { + background: url('stat-l-temps.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.statistics-in td { + background-color: var(--gatling-light-color); + border: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-small); + min-width: 50px; +} + +.statistics-in .col-1 { + width: 175px; + max-width: 175px; +} +@media screen and (min-width: 1200px) { + .statistics-in .col-1 { + width: 50%; + } +} + +.expandable-container { + display: flex; + flex-direction: row; + box-sizing: border-box; + max-width: 100%; +} + +.statistics-in .value { + text-align: right; + width: 50px; +} + +.statistics-in .total { + color: var(--gatling-text-color); +} + +.statistics-in .col-2 { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .error-col-1 { + background-color: var(--gatling-light-color); + color: var(--gatling-text-color); +} + +.statistics-in .error-col-2 { + text-align: center; +} + +.statistics-in .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .ko { + background-color: var(--gatling-danger-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .expand-button { + padding-left: var(--gatling-spacing); + cursor: pointer; +} + +.expand-button.hidden { + background: none; + cursor: default; +} + +.statistics-button { + background-color: var(--gatling-light-color); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); +} + +.statistics-button:hover:not(:disabled) { + cursor: pointer; + background-color: var(--gatling-hover-color); +} + +.statistics-in .expand-button.expand { + background: url('little_arrow_right.png') no-repeat 3px 3px; +} + +.statistics-in .expand-button.collapse { + background: url('sorted-down.png') no-repeat 3px 3px; +} + +.nav .expand-button { + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.nav .expand-button.expand { + background: url('arrow_right_black.png') no-repeat 5px 10px; + cursor: pointer; +} + +.nav .expand-button.collapse { + background: url('arrow_down_black.png') no-repeat 3px 12px; + cursor: pointer; +} + +.nav .on .expand-button.expand { + background-image: url('arrow_right_black.png'); +} + +.nav .on .expand-button.collapse { + background-image: url('arrow_down_black.png'); +} + +.right { + display: flex; + align-items: center; + gap: var(--gatling-spacing); + float: right; + font-size: var(--gatling-font-size-default); +} + +.withTooltip { + outline: none; +} + +.withTooltip:hover { + text-decoration: none; +} + +.withTooltip .tooltipContent { + position: absolute; + z-index: 10; + display: none; + + background: var(--gatling-orange-color); + -webkit-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + -moz-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); + margin-top: -5px; + padding: var(--gatling-spacing-small); +} + +.withTooltip:hover .tooltipContent { + display: inline; +} + +.statistics-table-modal { + height: calc(100% - 60px); + width: calc(100% - 60px); + border-radius: var(--gatling-border-radius); +} + +.statistics-table-modal::backdrop { + position: fixed; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + + background-color: rgba(100, 100, 100, 0.9); +} + +.statistics-table-modal-container { + display: flex; + flex-direction: column; + + width: 100%; + height: calc(100% - 35px); + overflow-x: auto; +} + +.button-modal { + cursor: pointer; + + height: 25px; + width: 25px; + + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); +} + +.button-modal:hover { + background-color: var(--gatling-background-color); +} + +.statistics-table-modal-header { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-bottom: var(--gatling-spacing); +} + +.statistics-table-modal-content { + flex: 1; + overflow-y: auto; + min-width: 1050px; +} + +.statistics-table-modal-footer { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-top: var(--gatling-spacing); +} diff --git a/webapp/loadTests/250UsersIn1Min.html b/webapp/loadTests/250users1minute/250UsersIn1Min.html similarity index 100% rename from webapp/loadTests/250UsersIn1Min.html rename to webapp/loadTests/250users1minute/250UsersIn1Min.html diff --git a/webapp/loadTests/250users1minute/js/all_sessions.js b/webapp/loadTests/250users1minute/js/all_sessions.js new file mode 100644 index 0000000..a05b62b --- /dev/null +++ b/webapp/loadTests/250users1minute/js/all_sessions.js @@ -0,0 +1,11 @@ +allUsersData = { + +color: '#FFA900', +name: 'Active Users', +data: [ + [1682849181000,6],[1682849182000,10],[1682849183000,14],[1682849184000,18],[1682849185000,22],[1682849186000,26],[1682849187000,31],[1682849188000,35],[1682849189000,39],[1682849190000,43],[1682849191000,47],[1682849192000,51],[1682849193000,56],[1682849194000,60],[1682849195000,64],[1682849196000,68],[1682849197000,72],[1682849198000,76],[1682849199000,81],[1682849200000,85],[1682849201000,89],[1682849202000,93],[1682849203000,97],[1682849204000,101],[1682849205000,106],[1682849206000,110],[1682849207000,114],[1682849208000,118],[1682849209000,122],[1682849210000,127],[1682849211000,131],[1682849212000,135],[1682849213000,139],[1682849214000,143],[1682849215000,142],[1682849216000,146],[1682849217000,146],[1682849218000,145],[1682849219000,141],[1682849220000,144],[1682849221000,147],[1682849222000,149],[1682849223000,154],[1682849224000,152],[1682849225000,147],[1682849226000,150],[1682849227000,152],[1682849228000,151],[1682849229000,154],[1682849230000,150],[1682849231000,148],[1682849232000,146],[1682849233000,146],[1682849234000,146],[1682849235000,150],[1682849236000,152],[1682849237000,152],[1682849238000,145],[1682849239000,147],[1682849240000,148],[1682849241000,140],[1682849242000,139],[1682849243000,132],[1682849244000,123],[1682849245000,119],[1682849246000,117],[1682849247000,116],[1682849248000,114],[1682849249000,112],[1682849250000,100],[1682849251000,95],[1682849252000,91],[1682849253000,89],[1682849254000,88],[1682849255000,85],[1682849256000,83],[1682849257000,76],[1682849258000,65],[1682849259000,65],[1682849260000,62],[1682849261000,59],[1682849262000,57],[1682849263000,55],[1682849264000,55],[1682849265000,49],[1682849266000,45],[1682849267000,41],[1682849268000,40],[1682849269000,37],[1682849270000,33],[1682849271000,32],[1682849272000,31],[1682849273000,30],[1682849274000,28],[1682849275000,28],[1682849276000,27],[1682849277000,25],[1682849278000,25],[1682849279000,24],[1682849280000,24],[1682849281000,23],[1682849282000,21],[1682849283000,17],[1682849284000,16],[1682849285000,11],[1682849286000,11],[1682849287000,6],[1682849288000,1] +], +tooltip: { yDecimals: 0, ySuffix: '', valueDecimals: 0 } + , zIndex: 20 + , yAxis: 1 +}; \ No newline at end of file diff --git a/webapp/loadTests/250users1minute/js/assertions.json b/webapp/loadTests/250users1minute/js/assertions.json new file mode 100644 index 0000000..5327575 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/assertions.json @@ -0,0 +1,10 @@ +{ + "simulation": "RecordedSimulation", + "simulationId": "recordedsimulation-20230430100619986", + "start": 1682849180920, + "description": "", + "scenarios": ["RecordedSimulation"], + "assertions": [ + + ] +} \ No newline at end of file diff --git a/webapp/loadTests/250users1minute/js/assertions.xml b/webapp/loadTests/250users1minute/js/assertions.xml new file mode 100644 index 0000000..5e4dbe9 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/assertions.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/webapp/loadTests/250users1minute/js/bootstrap.min.js b/webapp/loadTests/250users1minute/js/bootstrap.min.js new file mode 100644 index 0000000..ea41042 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-tooltip.js, bootstrap-popover.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery) \ No newline at end of file diff --git a/webapp/loadTests/250users1minute/js/ellipsis.js b/webapp/loadTests/250users1minute/js/ellipsis.js new file mode 100644 index 0000000..781d0de --- /dev/null +++ b/webapp/loadTests/250users1minute/js/ellipsis.js @@ -0,0 +1,26 @@ +function parentId(name) { + return "parent-" + name; +} + +function isEllipsed(name) { + const child = document.getElementById(name); + const parent = document.getElementById(parentId(name)); + const emptyData = parent.getAttribute("data-content") === ""; + const hasOverflow = child.clientWidth < child.scrollWidth; + + if (hasOverflow) { + if (emptyData) { + parent.setAttribute("data-content", name); + } + } else { + if (!emptyData) { + parent.setAttribute("data-content", ""); + } + } +} + +function ellipsedLabel ({ name, parentClass = "", childClass = "" }) { + const child = "" + name + ""; + + return "" + child + ""; +} diff --git a/webapp/loadTests/250users1minute/js/gatling.js b/webapp/loadTests/250users1minute/js/gatling.js new file mode 100644 index 0000000..0208f82 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/gatling.js @@ -0,0 +1,137 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function ($) { + $.fn.expandable = function () { + var scope = this; + + this.find('.expand-button:not([class*=hidden])').addClass('collapse').on('click', function () { + var $this = $(this); + + if ($this.hasClass('expand')) + $this.expand(scope); + else + $this.collapse(scope); + }); + + this.find('.expand-all-button').on('click', function () { + $(this).expandAll(scope); + }); + + this.find('.collapse-all-button').on('click', function () { + $(this).collapseAll(scope); + }); + + this.collapseAll(this); + + return this; + }; + + $.fn.expand = function (scope, recursive) { + return this.each(function () { + var $this = $(this); + + if (recursive) { + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + } + + if ($this.hasClass('expand')) { + $('*[data-parent=' + $this.attr('id') + ']').toggle(true); + $this.toggleClass('expand').toggleClass('collapse'); + } + }); + }; + + $.fn.expandAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.expand').expand(scope, true); + $('*[data-parent=ROOT]').find('.expand-button.collapse').expand(scope, true); + }; + + $.fn.collapse = function (scope) { + return this.each(function () { + var $this = $(this); + + scope.find('*[data-parent=' + $this.attr('id') + '] .expand-button.collapse').collapse(scope); + scope.find('*[data-parent=' + $this.attr('id') + ']').toggle(false); + $this.toggleClass('expand').toggleClass('collapse'); + }); + }; + + $.fn.collapseAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.collapse').collapse(scope); + }; + + $.fn.sortable = function (target) { + var table = this; + + this.find('thead .sortable').on('click', function () { + var $this = $(this); + + if ($this.hasClass('sorted-down')) { + var desc = false; + var style = 'sorted-up'; + } + else { + var desc = true; + var style = 'sorted-down'; + } + + $(target).sortTable($this.attr('id'), desc); + + table.find('thead .sortable').removeClass('sorted-up sorted-down'); + $this.addClass(style); + + return false; + }); + + return this; + }; + + $.fn.sortTable = function (col, desc) { + function getValue(line) { + var cell = $(line).find('.' + col); + + if (cell.hasClass('value')) + var value = cell.text(); + else + var value = cell.find('.value').text(); + + return parseFloat(value); + } + + function sortLines (lines, group) { + var notErrorTable = col.search("error") == -1; + var linesToSort = notErrorTable ? lines.filter('*[data-parent=' + group + ']') : lines; + + var sortedLines = linesToSort.sort(function (a, b) { + return desc ? getValue(b) - getValue(a): getValue(a) - getValue(b); + }).toArray(); + + var result = []; + $.each(sortedLines, function (i, line) { + result.push(line); + if (notErrorTable) + result = result.concat(sortLines(lines, $(line).attr('id'))); + }); + + return result; + } + + this.find('tbody').append(sortLines(this.find('tbody tr').detach(), 'ROOT')); + + return this; + }; +})(jQuery); diff --git a/webapp/loadTests/250users1minute/js/global_stats.json b/webapp/loadTests/250users1minute/js/global_stats.json new file mode 100644 index 0000000..e058149 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/global_stats.json @@ -0,0 +1,77 @@ +{ + "name": "All Requests", + "numberOfRequests": { + "total": 5574, + "ok": 4494, + "ko": 1080 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 178 + }, + "maxResponseTime": { + "total": 13013, + "ok": 13013, + "ko": 2710 + }, + "meanResponseTime": { + "total": 695, + "ok": 583, + "ko": 1160 + }, + "standardDeviation": { + "total": 1264, + "ok": 1306, + "ko": 934 + }, + "percentiles1": { + "total": 128, + "ok": 60, + "ko": 819 + }, + "percentiles2": { + "total": 858, + "ok": 661, + "ko": 2044 + }, + "percentiles3": { + "total": 2581, + "ok": 2567, + "ko": 2582 + }, + "percentiles4": { + "total": 6373, + "ok": 7076, + "ko": 2663 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3522, + "percentage": 63 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 333, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 639, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1080, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": 51.611111111111114, + "ok": 41.611111111111114, + "ko": 10.0 + } +} \ No newline at end of file diff --git a/webapp/loadTests/250users1minute/js/highcharts-more.js b/webapp/loadTests/250users1minute/js/highcharts-more.js new file mode 100644 index 0000000..2d78893 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/highcharts-more.js @@ -0,0 +1,60 @@ +/* + Highcharts JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(x){"object"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(b){function r(b,a,d){this.init(b,a,d)}var t=b.each,w=b.extend,m=b.merge,q=b.splat;w(r.prototype,{init:function(b,a,d){var f=this,h=f.defaultOptions;f.chart=a;f.options=b=m(h,a.angular?{background:{}}:void 0,b);(b=b.background)&&t([].concat(q(b)).reverse(),function(a){var c,h=d.userOptions;c=m(f.defaultBackgroundOptions,a);a.backgroundColor&&(c.backgroundColor=a.backgroundColor);c.color=c.backgroundColor; +d.options.plotBands.unshift(c);h.plotBands=h.plotBands||[];h.plotBands!==d.options.plotBands&&h.plotBands.unshift(c)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{className:"highcharts-pane",shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});b.Pane=r})(x);(function(b){var r=b.CenteredSeriesMixin, +t=b.each,w=b.extend,m=b.map,q=b.merge,e=b.noop,a=b.Pane,d=b.pick,f=b.pInt,h=b.splat,u=b.wrap,c,l,k=b.Axis.prototype;b=b.Tick.prototype;c={getOffset:e,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:e,setCategories:e,setTitle:e};l={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2}, +defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);a.plotBands||(a.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= +r.getCenter.call(this.pane)},getLinePath:function(a,g){a=this.center;var c=this.chart,f=d(g,a[2]/2-this.offset);this.isCircular||void 0!==g?g=this.chart.renderer.symbols.arc(this.left+a[0],this.top+a[1],f,f,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(g=this.postTranslate(this.angleRad,f),g=["M",a[0]+c.plotLeft,a[1]+c.plotTop,"L",g.x,g.y]);return g},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/ +(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===d(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.center=this.pane.center=r.getCenter.call(this.pane),this.isCircular&& +(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*d(this.sector,1)/2)},getPosition:function(a,g){return this.postTranslate(this.isCircular?this.translate(a):this.angleRad,d(this.isCircular?g:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,g){var d=this.chart,c=this.center;a=this.startAngleRad+a;return{x:d.plotLeft+c[0]+Math.cos(a)*g,y:d.plotTop+c[1]+Math.sin(a)*g}},getPlotBandPath:function(a,g,c){var h=this.center,p=this.startAngleRad, +k=h[2]/2,n=[d(c.outerRadius,"100%"),c.innerRadius,d(c.thickness,10)],b=Math.min(this.offset,0),l=/%$/,u,e=this.isCircular;"polygon"===this.options.gridLineInterpolation?h=this.getPlotLinePath(a).concat(this.getPlotLinePath(g,!0)):(a=Math.max(a,this.min),g=Math.min(g,this.max),e||(n[0]=this.translate(a),n[1]=this.translate(g)),n=m(n,function(a){l.test(a)&&(a=f(a,10)*k/100);return a}),"circle"!==c.shape&&e?(a=p+this.translate(a),g=p+this.translate(g)):(a=-Math.PI/2,g=1.5*Math.PI,u=!0),n[0]-=b,n[2]-= +b,h=this.chart.renderer.symbols.arc(this.left+h[0],this.top+h[1],n[0],n[0],{start:Math.min(a,g),end:Math.max(a,g),innerR:d(n[1],n[0]-n[2]),open:u}));return h},getPlotLinePath:function(a,g){var d=this,c=d.center,f=d.chart,h=d.getPosition(a),k,b,p;d.isCircular?p=["M",c[0]+f.plotLeft,c[1]+f.plotTop,"L",h.x,h.y]:"circle"===d.options.gridLineInterpolation?(a=d.translate(a))&&(p=d.getLinePath(0,a)):(t(f.xAxis,function(a){a.pane===d.pane&&(k=a)}),p=[],a=d.translate(a),c=k.tickPositions,k.autoConnect&&(c= +c.concat([c[0]])),g&&(c=[].concat(c).reverse()),t(c,function(g,d){b=k.getPosition(g,a);p.push(d?"L":"M",b.x,b.y)}));return p},getTitlePosition:function(){var a=this.center,g=this.chart,d=this.options.title;return{x:g.plotLeft+a[0]+(d.x||0),y:g.plotTop+a[1]-{high:.5,middle:.25,low:0}[d.align]*a[2]+(d.y||0)}}};u(k,"init",function(f,g,k){var b=g.angular,p=g.polar,n=k.isX,u=b&&n,e,A=g.options,m=k.pane||0;if(b){if(w(this,u?c:l),e=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(w(this, +l),this.defaultRadialOptions=(e=n)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions));b||p?(this.isRadial=!0,g.inverted=!1,A.chart.zoomType=null):this.isRadial=!1;f.call(this,g,k);u||!b&&!p||(f=this.options,g.panes||(g.panes=[]),this.pane=g=g.panes[m]=g.panes[m]||new a(h(A.pane)[m],g,this),g=g.options,this.angleRad=(f.angle||0)*Math.PI/180,this.startAngleRad=(g.startAngle-90)*Math.PI/180,this.endAngleRad=(d(g.endAngle,g.startAngle+360)-90)*Math.PI/180,this.offset=f.offset|| +0,this.isCircular=e)});u(k,"autoLabelAlign",function(a){if(!this.isRadial)return a.apply(this,[].slice.call(arguments,1))});u(b,"getPosition",function(a,d,c,f,h){var g=this.axis;return g.getPosition?g.getPosition(c):a.call(this,d,c,f,h)});u(b,"getLabelPosition",function(a,g,c,f,h,k,b,l,u){var n=this.axis,p=k.y,e=20,y=k.align,v=(n.translate(this.pos)+n.startAngleRad+Math.PI/2)/Math.PI*180%360;n.isRadial?(a=n.getPosition(this.pos,n.center[2]/2+d(k.distance,-25)),"auto"===k.rotation?f.attr({rotation:v}): +null===p&&(p=n.chart.renderer.fontMetrics(f.styles.fontSize).b-f.getBBox().height/2),null===y&&(n.isCircular?(this.label.getBBox().width>n.len*n.tickInterval/(n.max-n.min)&&(e=0),y=v>e&&v<180-e?"left":v>180+e&&v<360-e?"right":"center"):y="center",f.attr({align:y})),a.x+=k.x,a.y+=p):a=a.call(this,g,c,f,h,k,b,l,u);return a});u(b,"getMarkPath",function(a,d,c,f,h,k,b){var g=this.axis;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+f),d=["M",d,c,"L",a.x,a.y]):d=a.call(this,d,c,f,h,k,b);return d})})(x); +(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.Series,q=b.seriesType,e=b.seriesTypes;q("arearange","area",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:["low","high"],dataLabelCollections:["dataLabel", +"dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var d=this.chart,f=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=f.x-d.plotLeft;a.plotHigh=f.y-d.plotTop},translate:function(){var a=this,d=a.yAxis,f=!!a.modifyValue;e.area.prototype.translate.apply(a);r(a.points,function(h){var b=h.low,c=h.high,l=h.plotY;null===c||null===b?h.isNull=!0:(h.plotLow=l,h.plotHigh=d.translate(f?a.modifyValue(c,h):c,0,1, +0,1),f&&(h.yBottom=h.plotHigh))});this.chart.polar&&r(this.points,function(d){a.highToXY(d)})},getGraphPath:function(a){var d=[],f=[],h,b=e.area.prototype.getGraphPath,c,l,k;k=this.options;var p=k.step;a=a||this.points;for(h=a.length;h--;)c=a[h],c.isNull||k.connectEnds||a[h+1]&&!a[h+1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),l={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,yBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},f.push(l),d.push(l),c.isNull|| +k.connectEnds||a[h-1]&&!a[h-1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=b.call(this,a);p&&(!0===p&&(p="left"),k.step={left:"right",center:"center",right:"left"}[p]);d=b.call(this,d);f=b.call(this,f);k.step=p;k=[].concat(a,d);this.chart.polar||"M"!==f[0]||(f[0]="L");this.graphPath=k;this.areaPath=this.areaPath.concat(a,f);k.isArea=!0;k.xMap=a.xMap;this.areaPath.xMap=a.xMap;return k},drawDataLabels:function(){var a=this.data,d=a.length,f,h=[],b=m.prototype,c=this.options.dataLabels, +l=c.align,k=c.verticalAlign,p=c.inside,g,n,e=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,h[f]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=n,e?l||(c.align=n?"right":"left"):k||(c.verticalAlign=n?"top":"bottom"),c.x=c.xHigh,c.y=c.yHigh;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.dataLabelUpper= +g.dataLabel,g.dataLabel=h[f],g.y=g.low,g.plotY=g._plotY,g.below=!n,e?l||(c.align=n?"left":"right"):k||(c.verticalAlign=n?"bottom":"top"),c.x=c.xLow,c.y=c.yLow;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}c.align=l;c.verticalAlign=k},alignDataLabel:function(){e.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(x);(function(b){var r=b.seriesType;r("areasplinerange","arearange",null,{getPointSpline:b.seriesTypes.spline.prototype.getPointSpline})})(x); +(function(b){var r=b.defaultPlotOptions,t=b.each,w=b.merge,m=b.noop,q=b.pick,e=b.seriesType,a=b.seriesTypes.column.prototype;e("columnrange","arearange",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var d=this,f=d.yAxis,b=d.xAxis,u=b.startAngleRad,c,l=d.chart,k=d.xAxis.isRadial,p;a.translate.apply(d);t(d.points,function(a){var g=a.shapeArgs,h=d.options.minPointLength,e,v;a.plotHigh=p=f.translate(a.high,0,1,0,1);a.plotLow=a.plotY;v=p;e=q(a.rectPlotY,a.plotY)-p;Math.abs(e)< +h?(h-=e,e+=h,v-=h/2):0>e&&(e*=-1,v-=e);k?(c=a.barX+u,a.shapeType="path",a.shapeArgs={d:d.polarArc(v+e,v,c,c+a.pointWidth)}):(g.height=e,g.y=v,a.tooltipPos=l.inverted?[f.len+f.pos-l.plotLeft-v-e/2,b.len+b.pos-l.plotTop-g.x-g.width/2,e]:[b.left-l.plotLeft+g.x+g.width/2,f.pos-l.plotTop+v+e/2,e])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:m,crispCol:a.crispCol,drawPoints:a.drawPoints,drawTracker:a.drawTracker,getColumnMetrics:a.getColumnMetrics,animate:function(){return a.animate.apply(this, +arguments)},polarArc:function(){return a.polarArc.apply(this,arguments)},pointAttribs:a.pointAttribs})})(x);(function(b){var r=b.each,t=b.isNumber,w=b.merge,m=b.pick,q=b.pInt,e=b.Series,a=b.seriesType,d=b.TrackerMixin;a("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:b.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,d=this.options,b=a.center;this.generatePoints();r(this.points,function(c){var f=w(d.dial,c.dial),k=q(m(f.radius,80))*b[2]/200,h=q(m(f.baseLength,70))*k/100,g=q(m(f.rearLength,10))*k/100,n=f.baseWidth||3,u=f.topWidth||1,e=d.overshoot,v=a.startAngleRad+a.translate(c.y,null,null,null,!0);t(e)?(e=e/180*Math.PI,v=Math.max(a.startAngleRad-e,Math.min(a.endAngleRad+e,v))):!1===d.wrap&&(v=Math.max(a.startAngleRad,Math.min(a.endAngleRad, +v)));v=180*v/Math.PI;c.shapeType="path";c.shapeArgs={d:f.path||["M",-g,-n/2,"L",h,-n/2,k,-u/2,k,u/2,h,n/2,-g,n/2,"z"],translateX:b[0],translateY:b[1],rotation:v};c.plotX=b[0];c.plotY=b[1]})},drawPoints:function(){var a=this,d=a.yAxis.center,b=a.pivot,c=a.options,l=c.pivot,k=a.chart.renderer;r(a.points,function(d){var g=d.graphic,b=d.shapeArgs,f=b.d,h=w(c.dial,d.dial);g?(g.animate(b),b.d=f):(d.graphic=k[d.shapeType](b).attr({rotation:b.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group),d.graphic.attr({stroke:h.borderColor|| +"none","stroke-width":h.borderWidth||0,fill:h.backgroundColor||"#000000"}))});b?b.animate({translateX:d[0],translateY:d[1]}):(a.pivot=k.circle(0,0,m(l.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(d[0],d[1]).add(a.group),a.pivot.attr({"stroke-width":l.borderWidth||0,stroke:l.borderColor||"#cccccc",fill:l.backgroundColor||"#000000"}))},animate:function(a){var d=this;a||(r(d.points,function(a){var c=a.graphic;c&&(c.attr({rotation:180*d.yAxis.startAngleRad/Math.PI}),c.animate({rotation:a.shapeArgs.rotation}, +d.options.animation))}),d.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);e.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,d){e.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();m(d,!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(a){this.state=a}})})(x);(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.seriesType, +q=b.seriesTypes;m("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:["low","q1","median", +"q3","high"],toYData:function(b){return[b.low,b.q1,b.median,b.q3,b.high]},pointValKey:"high",pointAttribs:function(b){var a=this.options,d=b&&b.color||this.color;return{fill:b.fillColor||a.fillColor||d,stroke:a.lineColor||d,"stroke-width":a.lineWidth||0}},drawDataLabels:t,translate:function(){var b=this.yAxis,a=this.pointArrayMap;q.column.prototype.translate.apply(this);r(this.points,function(d){r(a,function(a){null!==d[a]&&(d[a+"Plot"]=b.translate(d[a],0,1,0,1))})})},drawPoints:function(){var b= +this,a=b.options,d=b.chart.renderer,f,h,u,c,l,k,p=0,g,n,m,q,v=!1!==b.doQuartiles,t,x=b.options.whiskerLength;r(b.points,function(e){var r=e.graphic,y=r?"animate":"attr",I=e.shapeArgs,z={},B={},G={},H=e.color||b.color;void 0!==e.plotY&&(g=I.width,n=Math.floor(I.x),m=n+g,q=Math.round(g/2),f=Math.floor(v?e.q1Plot:e.lowPlot),h=Math.floor(v?e.q3Plot:e.lowPlot),u=Math.floor(e.highPlot),c=Math.floor(e.lowPlot),r||(e.graphic=r=d.g("point").add(b.group),e.stem=d.path().addClass("highcharts-boxplot-stem").add(r), +x&&(e.whiskers=d.path().addClass("highcharts-boxplot-whisker").add(r)),v&&(e.box=d.path(void 0).addClass("highcharts-boxplot-box").add(r)),e.medianShape=d.path(void 0).addClass("highcharts-boxplot-median").add(r),z.stroke=e.stemColor||a.stemColor||H,z["stroke-width"]=w(e.stemWidth,a.stemWidth,a.lineWidth),z.dashstyle=e.stemDashStyle||a.stemDashStyle,e.stem.attr(z),x&&(B.stroke=e.whiskerColor||a.whiskerColor||H,B["stroke-width"]=w(e.whiskerWidth,a.whiskerWidth,a.lineWidth),e.whiskers.attr(B)),v&&(r= +b.pointAttribs(e),e.box.attr(r)),G.stroke=e.medianColor||a.medianColor||H,G["stroke-width"]=w(e.medianWidth,a.medianWidth,a.lineWidth),e.medianShape.attr(G)),k=e.stem.strokeWidth()%2/2,p=n+q+k,e.stem[y]({d:["M",p,h,"L",p,u,"M",p,f,"L",p,c]}),v&&(k=e.box.strokeWidth()%2/2,f=Math.floor(f)+k,h=Math.floor(h)+k,n+=k,m+=k,e.box[y]({d:["M",n,h,"L",n,f,"L",m,f,"L",m,h,"L",n,h,"z"]})),x&&(k=e.whiskers.strokeWidth()%2/2,u+=k,c+=k,t=/%$/.test(x)?q*parseFloat(x)/100:x/2,e.whiskers[y]({d:["M",p-t,u,"L",p+t,u, +"M",p-t,c,"L",p+t,c]})),l=Math.round(e.medianPlot),k=e.medianShape.strokeWidth()%2/2,l+=k,e.medianShape[y]({d:["M",n,l,"L",m,l]}))})},setStackedPoints:t})})(x);(function(b){var r=b.each,t=b.noop,w=b.seriesType,m=b.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},whiskerWidth:null},{type:"errorbar", +pointArrayMap:["low","high"],toYData:function(b){return[b.low,b.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:m.arearange?function(){var b=this.pointValKey;m.arearange.prototype.drawDataLabels.call(this);r(this.data,function(e){e.y=e[b]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||m.column.prototype.getColumnMetrics.call(this)}})})(x);(function(b){var r=b.correctFloat,t=b.isNumber,w=b.pick,m=b.Point,q=b.Series,e=b.seriesType,a=b.seriesTypes; +e("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",translate:function(){var d=this.options,b=this.yAxis,h,e,c,l,k,p,g,n,m,q=w(d.minPointLength,5),v=d.threshold,t=d.stacking;a.column.prototype.translate.apply(this);this.minPointLengthOffset=0;g=n=v;e=this.points;h=0;for(d=e.length;hl.height&&(l.y+=l.height,l.height*=-1),c.plotY=l.y=Math.round(l.y)- +this.borderWidth%2/2,l.height=Math.max(Math.round(l.height),.001),c.yBottom=l.y+l.height,l.height<=q&&(l.height=q,this.minPointLengthOffset+=q),l.y-=this.minPointLengthOffset,l=c.plotY+(c.negative?l.height:0)-this.minPointLengthOffset,this.chart.inverted?c.tooltipPos[0]=b.len-l:c.tooltipPos[1]=l},processData:function(a){var b=this.yData,d=this.options.data,e,c=b.length,l,k,p,g,n,m;k=l=p=g=this.options.threshold||0;for(m=0;ma[k-1].y&&(l[2]+=c.height,l[5]+=c.height),e=e.concat(l);return e},drawGraph:function(){q.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},getExtremes:b.noop},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum"); +return a},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(x);(function(b){var r=b.Series,t=b.seriesType,w=b.seriesTypes;t("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var b=r.prototype.getGraphPath.call(this),q=b.length+1;q--;)(q===b.length||"M"===b[q])&&0=this.minPxSize/2?(d.shapeType="circle",d.shapeArgs={x:d.plotX,y:d.plotY,r:c},d.dlBox={x:d.plotX-c,y:d.plotY-c,width:2*c,height:2*c}):d.shapeArgs=d.plotY=d.dlBox=void 0},drawLegendSymbol:function(a,b){var d=this.chart.renderer,c=d.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=d.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker= +!0},drawPoints:l.column.prototype.drawPoints,alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:a,applyZones:a},{haloPath:function(a){return h.prototype.haloPath.call(this,this.shapeArgs.r+a)},ttBelow:!1});w.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,h=0,l=b,u=this.isXAxis,m=u?"xData":"yData",w=this.min,x={},A=Math.min(c.plotWidth,c.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-w,z=b/E,F=[];q(this.series,function(b){var g=b.options;!b.bubblePadding|| +!b.visible&&c.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,F.push(b),u&&(q(["minSize","maxSize"],function(a){var b=g[a],d=/%$/.test(b),b=f(b);x[a]=d?A*b/100:b}),b.minPxSize=x.minSize,b.maxPxSize=Math.max(x.maxSize,x.minSize),b=b.zData,b.length&&(C=d(g.zMin,Math.min(C,Math.max(t(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=d(g.zMax,Math.max(D,r(b))))))});q(F,function(b){var d=b[m],c=d.length,f;u&&b.getRadii(C,D,b.minPxSize,b.maxPxSize);if(0f&&(f+=360),a.clientX=f):a.clientX=a.plotX};m.spline&&q(m.spline.prototype,"getPointSpline",function(a,b,f,h){var d,c,e,k,p,g,n;this.chart.polar?(d=f.plotX, +c=f.plotY,a=b[h-1],e=b[h+1],this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])),a&&e&&(k=a.plotX,p=a.plotY,b=e.plotX,g=e.plotY,k=(1.5*d+k)/2.5,p=(1.5*c+p)/2.5,e=(1.5*d+b)/2.5,n=(1.5*c+g)/2.5,b=Math.sqrt(Math.pow(k-d,2)+Math.pow(p-c,2)),g=Math.sqrt(Math.pow(e-d,2)+Math.pow(n-c,2)),k=Math.atan2(p-c,k-d),p=Math.atan2(n-c,e-d),n=Math.PI/2+(k+p)/2,Math.abs(k-n)>Math.PI/2&&(n-=Math.PI),k=d+Math.cos(n)*b,p=c+Math.sin(n)*b,e=d+Math.cos(Math.PI+n)*g,n=c+Math.sin(Math.PI+n)*g,f.rightContX=e,f.rightContY=n), +h?(f=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,k||d,p||c,d,c],a.rightContX=a.rightContY=null):f=["M",d,c]):f=a.call(this,b,f,h);return f});q(e,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});q(e,"getGraphPath",function(a,b){var d=this,e,m;if(this.chart.polar){b=b||this.points;for(e=0;eb.center[1]}),q(m,"alignDataLabel",function(a,b,f,h,m,c){this.chart.polar?(a=b.rectPlotX/Math.PI*180,null===h.align&&(h.align=20a?"left":200a?"right":"center"),null===h.verticalAlign&&(h.verticalAlign=45>a||315a?"top":"middle"),e.alignDataLabel.call(this,b,f,h,m,c)):a.call(this, +b,f,h,m,c)}));q(b,"getCoordinates",function(a,b){var d=this.chart,e={xAxis:[],yAxis:[]};d.polar?t(d.axes,function(a){var c=a.isXAxis,f=a.center,h=b.chartX-f[0]-d.plotLeft,f=b.chartY-f[1]-d.plotTop;e[c?"xAxis":"yAxis"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,f):Math.sqrt(Math.pow(h,2)+Math.pow(f,2)),!0)})}):e=a.call(this,b);return e})})(x)}); diff --git a/webapp/loadTests/250users1minute/js/highstock.js b/webapp/loadTests/250users1minute/js/highstock.js new file mode 100644 index 0000000..34a3f91 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/highstock.js @@ -0,0 +1,496 @@ +/* + Highstock JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(N,a){"object"===typeof module&&module.exports?module.exports=N.document?a(N):a:N.Highcharts=a(N)})("undefined"!==typeof window?window:this,function(N){N=function(){var a=window,D=a.document,B=a.navigator&&a.navigator.userAgent||"",G=D&&D.createElementNS&&!!D.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,H=/(edge|msie|trident)/i.test(B)&&!window.opera,p=!G,l=/Firefox/.test(B),r=l&&4>parseInt(B.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highstock", +version:"5.0.3",deg2rad:2*Math.PI/360,doc:D,hasBidiBug:r,hasTouch:D&&void 0!==D.documentElement.ontouchstart,isMS:H,isWebKit:/AppleWebKit/.test(B),isFirefox:l,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(B),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:p,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var D=[],B=a.charts,G=a.doc,H=a.win;a.error=function(a,l){a="Highcharts error #"+ +a+": www.highcharts.com/errors/"+a;if(l)throw Error(a);H.console&&console.log(a)};a.Fx=function(a,l,r){this.options=l;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],l=this.paths[1],r=[],w=this.now,t=a.length,k;if(1===w)r=this.toD;else if(t===l.length&&1>w)for(;t--;)k=parseFloat(a[t]),r[t]=isNaN(k)?a[t]:w*parseFloat(l[t]-k)+k;else r=l;this.elem.attr("d",r)},update:function(){var a=this.elem,l=this.prop,r=this.now,w=this.options.step;if(this[l+"Setter"])this[l+"Setter"](); +else a.attr?a.element&&a.attr(l,r):a.style[l]=r+this.unit;w&&w.call(a,r,this)},run:function(a,l,r){var p=this,t=function(a){return t.stopped?!1:p.step(a)},k;this.startTime=+new Date;this.start=a;this.end=l;this.unit=r;this.now=this.start;this.pos=0;t.elem=this.elem;t()&&1===D.push(t)&&(t.timerId=setInterval(function(){for(k=0;k=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=m[this.prop]=!0;for(e in m)!0!==m[e]&&(a=!1);a&&t&&t.call(p);p=!1}else this.pos=w.easing((l-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),p=!0;return p},initPath:function(p,l,r){function w(a){for(b=a.length;b--;)"M"!==a[b]&&"L"!==a[b]||a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function t(a,c){for(;a.lengthm?"AM":"PM",P:12>m?"am":"pm",S:q(t.getSeconds()),L:q(Math.round(l%1E3),3)},a.dateFormats);for(k in w)for(;-1!==p.indexOf("%"+k);)p= +p.replace("%"+k,"function"===typeof w[k]?w[k](l):w[k]);return r?p.substr(0,1).toUpperCase()+p.substr(1):p};a.formatSingle=function(p,l){var r=/\.([0-9])/,w=a.defaultOptions.lang;/f$/.test(p)?(r=(r=p.match(r))?r[1]:-1,null!==l&&(l=a.numberFormat(l,r,w.decimalPoint,-1=r&&(l=[1/r])));for(w=0;w=p||!t&&k<=(l[w]+(l[w+1]||l[w]))/ +2);w++);return m*r};a.stableSort=function(a,l){var r=a.length,p,t;for(t=0;tr&&(r=a[l]);return r};a.destroyObjectProperties=function(a,l){for(var r in a)a[r]&&a[r]!==l&&a[r].destroy&&a[r].destroy(),delete a[r]};a.discardElement=function(p){var l= +a.garbageBin;l||(l=a.createElement("div"));p&&l.appendChild(p);l.innerHTML=""};a.correctFloat=function(a,l){return parseFloat(a.toPrecision(l||14))};a.setAnimation=function(p,l){l.renderer.globalAnimation=a.pick(p,l.options.chart.animation,!0)};a.animObject=function(p){return a.isObject(p)?a.merge(p):{duration:p?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(p,l,r,w){p=+p||0;l=+l;var t=a.defaultOptions.lang, +k=(p.toString().split(".")[1]||"").length,m,e,g=Math.abs(p);-1===l?l=Math.min(k,20):a.isNumber(l)||(l=2);m=String(a.pInt(g.toFixed(l)));e=3p?"-":"")+(e?m.substr(0,e)+w:"");p+=m.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+w);l&&(w=Math.abs(g-m+Math.pow(10,-Math.max(l,k)-1)),p+=r+w.toFixed(l).slice(2));return p};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(p,l){return"width"===l?Math.min(p.offsetWidth, +p.scrollWidth)-a.getStyle(p,"padding-left")-a.getStyle(p,"padding-right"):"height"===l?Math.min(p.offsetHeight,p.scrollHeight)-a.getStyle(p,"padding-top")-a.getStyle(p,"padding-bottom"):(p=H.getComputedStyle(p,void 0))&&a.pInt(p.getPropertyValue(l))};a.inArray=function(a,l){return l.indexOf?l.indexOf(a):[].indexOf.call(l,a)};a.grep=function(a,l){return[].filter.call(a,l)};a.map=function(a,l){for(var r=[],p=0,t=a.length;pl;l++)w[l]+=p(255*a),0>w[l]&&(w[l]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width, +b=z.height,c&&L&&"11px"===L.fontSize&&"16.9"===b.toPrecision(3)&&(z.height=b=14),v&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(g&&0]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,c,v){"string"===typeof a?v.setAttribute(c, +a):a&&this.colorGradient(a,c,v)},visibilitySetter:function(a,c,v){"inherit"===a?v.removeAttribute(c):v.setAttribute(c,a)},zIndexSetter:function(a,c){var v=this.renderer,z=this.parentGroup,b=(z||v).element||v.box,d,n=this.element,f;d=this.added;var e;k(a)&&(n.zIndex=a,a=+a,this[c]===a&&(d=!1),this[c]=a);if(d){(a=this.zIndex)&&z&&(z.handleZ=!0);c=b.childNodes;for(e=0;ea||!k(a)&&k(d)||0>a&&!k(d)&&b!==v.box)&&(b.insertBefore(n,z),f=!0);f||b.appendChild(n)}return f}, +_defaultSetter:function(a,c,v){v.setAttribute(c,a)}};D.prototype.yGetter=D.prototype.xGetter;D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.rotationSetter=D.prototype.verticalAlignSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=function(a,c){this[c]=a;this.doTransform=!0};D.prototype["stroke-widthSetter"]=D.prototype.strokeSetter=function(a,c,v){this[c]=a;this.stroke&&this["stroke-width"]?(D.prototype.fillSetter.call(this,this.stroke,"stroke",v),v.setAttribute("stroke-width", +this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===a&&this.hasStroke&&(v.removeAttribute("stroke"),this.hasStroke=!1)};B=a.SVGRenderer=function(){this.init.apply(this,arguments)};B.prototype={Element:D,SVG_NS:K,init:function(a,c,v,b,d,n){var z;b=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(b));z=b.element;a.appendChild(z);-1===a.innerHTML.indexOf("xmlns")&&p(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=b;this.alignedObjects= +[];this.url=(E||A)&&g.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(g.createTextNode("Created with Highstock 5.0.3"));this.defs=this.createElement("defs").add();this.allowHTML=n;this.forExport=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,v,!1);var f;E&&a.getBoundingClientRect&&(c=function(){w(a,{left:0,top:0});f=a.getBoundingClientRect(); +w(a,{left:Math.ceil(f.left)-f.left+"px",top:Math.ceil(f.top)-f.top+"px"})},c(),this.unSubPixelFix=G(R,"resize",c))},getStyle:function(a){return this.style=C({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients= +null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var c=new this.Element;c.init(this,a);return c},draw:J,getRadialAttr:function(a,c){return{cx:a[0]-a[2]/2+c.cx*a[2],cy:a[1]-a[2]/2+c.cy*a[2],r:c.r*a[2]}},buildText:function(a){for(var c=a.element,z=this,b=z.forExport,n=y(a.textStr,"").toString(),f=-1!==n.indexOf("\x3c"),e=c.childNodes,q,F,x,A,I=p(c,"x"),m=a.styles,k=a.textWidth,C=m&&m.lineHeight,M=m&&m.textOutline,J=m&& +"ellipsis"===m.textOverflow,E=e.length,O=k&&!a.added&&this.box,t=function(a){var v;v=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:m&&m.fontSize||z.style.fontSize||12;return C?u(C):z.fontMetrics(v,a.getAttribute("style")?a:c).h};E--;)c.removeChild(e[E]);f||M||J||k||-1!==n.indexOf(" ")?(q=/<.*class="([^"]+)".*>/,F=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,O&&O.appendChild(c),n=f?n.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[n],n=d(n,function(a){return""!==a}),h(n,function(d,n){var f,e=0;d=d.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");f=d.split("|||");h(f,function(d){if(""!==d||1===f.length){var u={},y=g.createElementNS(z.SVG_NS,"tspan"),L,h;q.test(d)&&(L=d.match(q)[1],p(y,"class",L));F.test(d)&&(h=d.match(F)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),p(y,"style",h));x.test(d)&&!b&&(p(y, +"onclick",'location.href\x3d"'+d.match(x)[1]+'"'),w(y,{cursor:"pointer"}));d=(d.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==d){y.appendChild(g.createTextNode(d));e?u.dx=0:n&&null!==I&&(u.x=I);p(y,u);c.appendChild(y);!e&&n&&(!v&&b&&w(y,{display:"block"}),p(y,"dy",t(y)));if(k){u=d.replace(/([^\^])-/g,"$1- ").split(" ");L="nowrap"===m.whiteSpace;for(var C=1k,void 0===A&&(A=M),J&&A?(Q/=2,""===l||!M&&.5>Q?u=[]:(l=d.substring(0,l.length+(M?-1:1)*Math.ceil(Q)),u=[l+(3k&&(k=P)),u.length&&y.appendChild(g.createTextNode(u.join(" ").replace(/- /g, +"-")));a.rotation=R}e++}}})}),A&&a.attr("title",a.textStr),O&&O.removeChild(c),M&&a.applyTextOutline&&a.applyTextOutline(M)):c.appendChild(g.createTextNode(n.replace(/</g,"\x3c").replace(/>/g,"\x3e")))},getContrast:function(a){a=r(a).rgba;return 510v?d>c+f&&de?d>c+f&&db&&e>a+f&&ed&&e>a+f&&ea?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a, +c,v){var b=a;c&&v&&(b=Math.max(b*Math.cos(c*m),4));return{x:-a/3*Math.sin(c*m),y:b}},label:function(a,c,v,b,d,n,f,e,K){var q=this,u=q.g("button"!==K&&"label"),y=u.text=q.text("",0,0,f).attr({zIndex:1}),g,F,z=0,A=3,L=0,m,M,J,E,O,t={},l,R,r=/^url\((.*?)\)$/.test(b),p=r,P,w,Q,S;K&&u.addClass("highcharts-"+K);p=r;P=function(){return(l||0)%2/2};w=function(){var a=y.element.style,c={};F=(void 0===m||void 0===M||O)&&k(y.textStr)&&y.getBBox();u.width=(m||F.width||0)+2*A+L;u.height=(M||F.height||0)+2*A;R= +A+q.fontMetrics(a&&a.fontSize,y).b;p&&(g||(u.box=g=q.symbols[b]||r?q.symbol(b):q.rect(),g.addClass(("button"===K?"":"highcharts-label-box")+(K?" highcharts-"+K+"-box":"")),g.add(u),a=P(),c.x=a,c.y=(e?-R:0)+a),c.width=Math.round(u.width),c.height=Math.round(u.height),g.attr(C(c,t)),t={})};Q=function(){var a=L+A,c;c=e?0:R;k(m)&&F&&("center"===O||"right"===O)&&(a+={center:.5,right:1}[O]*(m-F.width));if(a!==y.x||c!==y.y)y.attr("x",a),void 0!==c&&y.attr("y",c);y.x=a;y.y=c};S=function(a,c){g?g.attr(a,c): +t[a]=c};u.onAdd=function(){y.add(u);u.attr({text:a||0===a?a:"",x:c,y:v});g&&k(d)&&u.attr({anchorX:d,anchorY:n})};u.widthSetter=function(a){m=a};u.heightSetter=function(a){M=a};u["text-alignSetter"]=function(a){O=a};u.paddingSetter=function(a){k(a)&&a!==A&&(A=u.padding=a,Q())};u.paddingLeftSetter=function(a){k(a)&&a!==L&&(L=a,Q())};u.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,F&&u.attr({x:J}))};u.textSetter=function(a){void 0!==a&&y.textSetter(a);w();Q()};u["stroke-widthSetter"]= +function(a,c){a&&(p=!0);l=this["stroke-width"]=a;S(c,a)};u.strokeSetter=u.fillSetter=u.rSetter=function(a,c){"fill"===c&&a&&(p=!0);S(c,a)};u.anchorXSetter=function(a,c){d=a;S(c,Math.round(a)-P()-J)};u.anchorYSetter=function(a,c){n=a;S(c,a-E)};u.xSetter=function(a){u.x=a;z&&(a-=z*((m||F.width)+2*A));J=Math.round(a);u.attr("translateX",J)};u.ySetter=function(a){E=u.y=Math.round(a);u.attr("translateY",E)};var T=u.css;return C(u,{css:function(a){if(a){var c={};a=x(a);h(u.textProps,function(v){void 0!== +a[v]&&(c[v]=a[v],delete a[v])});y.css(c)}return T.call(u,a)},getBBox:function(){return{width:F.width+2*A,height:F.height+2*A,x:F.x-A,y:F.y-A}},shadow:function(a){a&&(w(),g&&g.shadow(a));return u},destroy:function(){I(u.element,"mouseenter");I(u.element,"mouseleave");y&&(y=y.destroy());g&&(g=g.destroy());D.prototype.destroy.call(u);u=q=w=Q=S=null}})}};a.Renderer=B})(N);(function(a){var D=a.attr,B=a.createElement,G=a.css,H=a.defined,p=a.each,l=a.extend,r=a.isFirefox,w=a.isMS,t=a.isWebKit,k=a.pInt,m= +a.SVGRenderer,e=a.win,g=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var e=this.element;if(e=a&&"SPAN"===e.tagName&&a.width)delete a.width,this.textWidth=e,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a= +this.renderer,e=this.element,f=this.translateX||0,d=this.translateY||0,b=this.x||0,q=this.y||0,g=this.textAlign||"left",c={left:0,center:.5,right:1}[g],F=this.styles;G(e,{marginLeft:f,marginTop:d});this.shadows&&p(this.shadows,function(a){G(a,{marginLeft:f+1,marginTop:d+1})});this.inverted&&p(e.childNodes,function(c){a.invertChild(c,e)});if("SPAN"===e.tagName){var n=this.rotation,A=k(this.textWidth),x=F&&F.whiteSpace,m=[n,g,e.innerHTML,this.textWidth,this.textAlign].join();m!==this.cTT&&(F=a.fontMetrics(e.style.fontSize).b, +H(n)&&this.setSpanRotation(n,c,F),G(e,{width:"",whiteSpace:x||"nowrap"}),e.offsetWidth>A&&/[ \-]/.test(e.textContent||e.innerText)&&G(e,{width:A+"px",display:"block",whiteSpace:x||"normal"}),this.getSpanCorrection(e.offsetWidth,F,c,n,g));G(e,{left:b+(this.xCorr||0)+"px",top:q+(this.yCorr||0)+"px"});t&&(F=e.offsetHeight);this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,g,f){var d={},b=w?"-ms-transform":t?"-webkit-transform":r?"MozTransform":e.opera?"-o-transform":"";d[b]=d.transform= +"rotate("+a+"deg)";d[b+(r?"Origin":"-origin")]=d.transformOrigin=100*g+"% "+f+"px";G(this.element,d)},getSpanCorrection:function(a,e,f){this.xCorr=-a*f;this.yCorr=-e}});l(m.prototype,{html:function(a,e,f){var d=this.createElement("span"),b=d.element,q=d.renderer,h=q.isSVG,c=function(a,c){p(["opacity","visibility"],function(b){g(a,b+"Setter",function(a,b,d,n){a.call(this,b,d,n);c[d]=b})})};d.textSetter=function(a){a!==b.innerHTML&&delete this.bBox;b.innerHTML=this.textStr=a;d.htmlUpdateTransform()}; +h&&c(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,c){"align"===c&&(c="textAlign");d[c]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(e),y:Math.round(f)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});b.style.whiteSpace="nowrap";d.css=d.htmlCss;h&&(d.add=function(a){var n,f=q.box.parentNode,e=[];if(this.parentGroup=a){if(n=a.div,!n){for(;a;)e.push(a),a=a.parentGroup;p(e.reverse(),function(a){var b,d=D(a.element, +"class");d&&(d={className:d});n=a.div=a.div||B("div",d,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},n||f);b=n.style;l(a,{translateXSetter:function(c,d){b.left=c+"px";a[d]=c;a.doTransform=!0},translateYSetter:function(c,d){b.top=c+"px";a[d]=c;a.doTransform=!0}});c(a,b)})}}else n=f;n.appendChild(b);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d});return d}})})(N);(function(a){var D, +B,G=a.createElement,H=a.css,p=a.defined,l=a.deg2rad,r=a.discardElement,w=a.doc,t=a.each,k=a.erase,m=a.extend;D=a.extendClass;var e=a.isArray,g=a.isNumber,h=a.isObject,C=a.merge;B=a.noop;var f=a.pick,d=a.pInt,b=a.SVGElement,q=a.SVGRenderer,E=a.win;a.svg||(B={docMode8:w&&8===w.documentMode,init:function(a,b){var c=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],f="div"===b;("shape"===b||f)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",f?"hidden":"visible"); +c.push(' style\x3d"',d.join(""),'"/\x3e');b&&(c=f||"span"===b||"img"===b?c.join(""):a.prepVML(c),this.element=G(c));this.renderer=a},add:function(a){var c=this.renderer,b=this.element,d=c.box,f=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);f&&c.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},updateTransform:b.prototype.htmlUpdateTransform, +setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*l),d=Math.sin(a*l);H(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,e,q){var c=e?Math.cos(e*l):1,n=e?Math.sin(e*l):0,u=f(this.elemHeight,this.element.offsetHeight),g;this.xCorr=0>c&&-a;this.yCorr=0>n&&-u;g=0>c*n;this.xCorr+=n*b*(g?1-d:d);this.yCorr-=c*b*(e?g?d:1-d:1);q&&"left"!== +q&&(this.xCorr-=a*d*(0>c?-1:1),e&&(this.yCorr-=u*d*(0>n?-1:1)),H(this.element,{textAlign:q}))},pathToVML:function(a){for(var c=a.length,b=[];c--;)g(a[c])?b[c]=Math.round(10*a[c])-5:"Z"===a[c]?b[c]="x":(b[c]=a[c],!a.isArc||"wa"!==a[c]&&"at"!==a[c]||(b[c+5]===b[c+7]&&(b[c+7]+=a[c+7]>a[c+5]?1:-1),b[c+6]===b[c+8]&&(b[c+8]+=a[c+8]>a[c+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var c=this,b;a?(b=a.members,k(b,c),b.push(c),c.destroyClip=function(){k(b,c)},a=a.getCSS(c)):(c.destroyClip&&c.destroyClip(), +a={clip:c.docMode8?"inherit":"rect(auto)"});return c.css(a)},css:b.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&r(a)},destroy:function(){this.destroyClip&&this.destroyClip();return b.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c;a=a.split(/[ ,]/);c=a.length;if(9===c||11===c)a[c-4]=a[c-2]=d(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,e){var c=[],n,q=this.element, +g=this.renderer,u,I=q.style,F,v=q.path,K,h,m,z;v&&"string"!==typeof v.value&&(v="x");h=v;if(a){m=f(a.width,3);z=(a.opacity||.15)/m;for(n=1;3>=n;n++)K=2*m+1-2*n,e&&(h=this.cutOffPath(v.value,K+.5)),F=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',K,'" filled\x3d"false" path\x3d"',h,'" coordsize\x3d"10 10" style\x3d"',q.style.cssText,'" /\x3e'],u=G(g.prepVML(F),null,{left:d(I.left)+f(a.offsetX,1),top:d(I.top)+f(a.offsetY,1)}),e&&(u.cutOff=K+1),F=['\x3cstroke color\x3d"',a.color||"#000000",'" opacity\x3d"', +z*n,'"/\x3e'],G(g.prepVML(F),null,null,u),b?b.element.appendChild(u):q.parentNode.insertBefore(u,q),c.push(u);this.shadows=c}return this},updateShadows:B,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||G(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,b,d){var c=this.shadows; +a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(c)for(d=c.length;d--;)c[d].path=c[d].cutOff?this.cutOffPath(a,c[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var c=d.nodeName;"SPAN"===c?d.style.color=a:"IMG"!==c&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){G(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:B,rotationSetter:function(a,b,d){d= +d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*l)+1)+"px";d.top=Math.round(Math.cos(a*l))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;g(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&t(this.shadows,function(c){c.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===a?"-999em": +0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},B["stroke-opacitySetter"]=B["fill-opacitySetter"],a.VMLElement=B=D(b,B),B.prototype.ySetter=B.prototype.widthSetter=B.prototype.heightSetter=B.prototype.xSetter,B={Element:B,isIE8:-1l[0]&&c.push([1,l[1]]);t(c,function(c,b){q.test(c[1])?(n=a.color(c[1]),v=n.get("rgb"),K=n.get("a")):(v=c[1],K=1);r.push(100*c[0]+"% "+v);b?(m=K,k=v):(z=K,E=v)});if("fill"===d)if("gradient"===g)d=A.x1||A[0]||0,c=A.y1||A[1]||0,F=A.x2||A[2]||0,A=A.y2||A[3]||0,C='angle\x3d"'+(90-180*Math.atan((A-c)/(F-d))/Math.PI)+'"',p();else{var h=A.r,w=2*h,B=2*h,D=A.cx,H=A.cy,V=b.radialReference,U,h=function(){V&&(U=f.getBBox(),D+=(V[0]- +U.x)/U.width-.5,H+=(V[1]-U.y)/U.height-.5,w*=V[2]/U.width,B*=V[2]/U.height);C='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+w+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+D+","+H+'" color2\x3d"'+E+'" ';p()};f.added?h():f.onAdd=h;h=k}else h=v}else q.test(c)&&"IMG"!==b.tagName?(n=a.color(c),f[d+"-opacitySetter"](n.get("a"),d,b),h=n.get("rgb")):(h=b.getElementsByTagName(d),h.length&&(h[0].opacity=1,h[0].type="solid"),h=c);return h},prepVML:function(a){var c=this.isIE8;a=a.join(""); +c?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:q.prototype.html,path:function(a){var c={coordsize:"10 10"};e(a)?c.d=a:h(a)&&m(c,a);return this.createElement("shape").attr(c)},circle:function(a,b,d){var c=this.symbol("circle"); +h(a)&&(d=a.r,b=a.y,a=a.x);c.isCircle=!0;c.r=d;return c.attr({x:a,y:b})},g:function(a){var c;a&&(c={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(c)},image:function(a,b,d,f,e){var c=this.createElement("img").attr({src:a});1f&&m-d*bg&&(F=Math.round((e-m)/Math.cos(f*w)));else if(e=m+(1-d)*b,m-d*bg&&(E=g-a.x+E*d,c=-1),E=Math.min(q, +E),EE||k.autoRotation&&(C.styles||{}).width)F=E;F&&(n.width=F,(k.options.labels.style||{}).textOverflow||(n.textOverflow="ellipsis"),C.css(n))},getPosition:function(a,k,m,e){var g=this.axis,h=g.chart,l=e&&h.oldChartHeight||h.chartHeight;return{x:a?g.translate(k+m,null,null,e)+g.transB:g.left+g.offset+(g.opposite?(e&&h.oldChartWidth||h.chartWidth)-g.right-g.left:0),y:a?l-g.bottom+g.offset-(g.opposite?g.height:0):l-g.translate(k+m,null, +null,e)-g.transB}},getLabelPosition:function(a,k,m,e,g,h,l,f){var d=this.axis,b=d.transA,q=d.reversed,E=d.staggerLines,c=d.tickRotCorr||{x:0,y:0},F=g.y;B(F)||(F=0===d.side?m.rotation?-8:-m.getBBox().height:2===d.side?c.y+8:Math.cos(m.rotation*w)*(c.y-m.getBBox(!1,0).height/2));a=a+g.x+c.x-(h&&e?h*b*(q?-1:1):0);k=k+F-(h&&!e?h*b*(q?1:-1):0);E&&(m=l/(f||1)%E,d.opposite&&(m=E-m-1),k+=d.labelOffset/E*m);return{x:a,y:Math.round(k)}},getMarkPath:function(a,k,m,e,g,h){return h.crispLine(["M",a,k,"L",a+(g? +0:-m),k+(g?m:0)],e)},render:function(a,k,m){var e=this.axis,g=e.options,h=e.chart.renderer,C=e.horiz,f=this.type,d=this.label,b=this.pos,q=g.labels,E=this.gridLine,c=f?f+"Tick":"tick",F=e.tickSize(c),n=this.mark,A=!n,x=q.step,p={},y=!0,u=e.tickmarkOffset,I=this.getPosition(C,b,u,k),M=I.x,I=I.y,v=C&&M===e.pos+e.len||!C&&I===e.pos?-1:1,K=f?f+"Grid":"grid",O=g[K+"LineWidth"],R=g[K+"LineColor"],z=g[K+"LineDashStyle"],K=l(g[c+"Width"],!f&&e.isXAxis?1:0),c=g[c+"Color"];m=l(m,1);this.isActive=!0;E||(p.stroke= +R,p["stroke-width"]=O,z&&(p.dashstyle=z),f||(p.zIndex=1),k&&(p.opacity=0),this.gridLine=E=h.path().attr(p).addClass("highcharts-"+(f?f+"-":"")+"grid-line").add(e.gridGroup));if(!k&&E&&(b=e.getPlotLinePath(b+u,E.strokeWidth()*v,k,!0)))E[this.isNew?"attr":"animate"]({d:b,opacity:m});F&&(e.opposite&&(F[0]=-F[0]),A&&(this.mark=n=h.path().addClass("highcharts-"+(f?f+"-":"")+"tick").add(e.axisGroup),n.attr({stroke:c,"stroke-width":K})),n[A?"attr":"animate"]({d:this.getMarkPath(M,I,F[0],n.strokeWidth()* +v,C,h),opacity:m}));d&&H(M)&&(d.xy=I=this.getLabelPosition(M,I,d,C,q,u,a,x),this.isFirst&&!this.isLast&&!l(g.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(g.showLastLabel,1)?y=!1:!C||e.isRadial||q.step||q.rotation||k||0===m||this.handleOverflow(I),x&&a%x&&(y=!1),y&&H(I.y)?(I.opacity=m,d[this.isNew?"attr":"animate"](I)):(r(d),d.attr("y",-9999)),this.isNew=!1)},destroy:function(){G(this,this.axis)}}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.AxisPlotLineOrBandExtension, +l=a.color,r=a.correctFloat,w=a.defaultOptions,t=a.defined,k=a.deg2rad,m=a.destroyObjectProperties,e=a.each,g=a.error,h=a.extend,C=a.fireEvent,f=a.format,d=a.getMagnitude,b=a.grep,q=a.inArray,E=a.isArray,c=a.isNumber,F=a.isString,n=a.merge,A=a.normalizeTickInterval,x=a.pick,J=a.PlotLineOrBand,y=a.removeEvent,u=a.splat,I=a.syncTimeout,M=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M", +hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb", +lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15}, +title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var b=c.isX;this.chart=a;this.horiz=a.inverted?!b:b;this.isXAxis=b;this.coll=this.coll||(b?"xAxis":"yAxis");this.opposite=c.opposite;this.side=c.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,v=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter; +this.userOptions=c;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===v||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===v;this.isDatetimeAxis="datetime"===v;this.isLinked=t(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom; +this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=x(d.crosshair,u(a.options.tooltip.crosshairs)[b?0:1],!1);var f;c=this.options.events;-1===q(this,a.axes)&&(b?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&b&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in c)D(this,f,c[f]); +this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=n(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],n(w[this.coll],a))},defaultLabelFormatter:function(){var c=this.axis,b=this.value,d=c.categories,e=this.dateTimeLabelFormat,q=w.lang,u=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,n=u&&u.length,g,y=c.options.labels.format, +c=c.isLog?b:c.tickInterval;if(y)g=f(y,this);else if(d)g=b;else if(e)g=a.dateFormat(e,b);else if(n&&1E3<=c)for(;n--&&void 0===g;)d=Math.pow(q,n+1),c>=d&&0===10*b%d&&null!==u[n]&&0!==b&&(g=a.numberFormat(b/d,-1)+u[n]);void 0===g&&(g=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return g},getSeriesExtremes:function(){var a=this,d=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();e(a.series,function(v){if(v.visible|| +!d.options.chart.ignoreHiddenSeries){var f=v.options,e=f.threshold,q;a.hasVisibleSeries=!0;a.isLog&&0>=e&&(e=null);if(a.isXAxis)f=v.xData,f.length&&(v=H(f),c(v)||v instanceof Date||(f=b(f,function(a){return c(a)}),v=H(f)),a.dataMin=Math.min(x(a.dataMin,f[0]),v),a.dataMax=Math.max(x(a.dataMax,f[0]),G(f)));else if(v.getExtremes(),q=v.dataMax,v=v.dataMin,t(v)&&t(q)&&(a.dataMin=Math.min(x(a.dataMin,v),v),a.dataMax=Math.max(x(a.dataMax,q),q)),t(e)&&(a.threshold=e),!f.softThreshold||a.isLog)a.softThreshold= +!1}})},translate:function(a,b,d,f,e,q){var v=this.linkedParent||this,u=1,n=0,g=f?v.oldTransA:v.transA;f=f?v.oldMin:v.min;var K=v.minPixelPadding;e=(v.isOrdinal||v.isBroken||v.isLog&&e)&&v.lin2val;g||(g=v.transA);d&&(u*=-1,n=v.len);v.reversed&&(u*=-1,n-=u*(v.sector||v.len));b?(a=(a*u+n-K)/g+f,e&&(a=v.lin2val(a))):(e&&(a=v.val2lin(a)),a=u*(a-f)*g+n+u*K+(c(q)?g*q:0));return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a- +(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,f,e){var v=this.chart,q=this.left,u=this.top,n,g,K=d&&v.oldChartHeight||v.chartHeight,y=d&&v.oldChartWidth||v.chartWidth,z;n=this.transB;var h=function(a,c,b){if(ab)f?a=Math.min(Math.max(c,a),b):z=!0;return a};e=x(e,this.translate(a,null,null,d));a=d=Math.round(e+n);n=g=Math.round(K-e-n);c(e)?this.horiz?(n=u,g=K-this.bottom,a=d=h(a,q,q+this.width)):(a=q,d=y-this.right,n=g=h(n,u,u+this.height)):z=!0;return z&&!f?null:v.renderer.crispLine(["M", +a,n,"L",d,g],b||1)},getLinearTickPositions:function(a,b,d){var v,f=r(Math.floor(b/a)*a),e=r(Math.ceil(d/a)*a),q=[];if(b===d&&c(b))return[b];for(b=f;b<=e;){q.push(b);b=r(b+a);if(b===v)break;v=b}return q},getMinorTickPositions:function(){var a=this.options,c=this.tickPositions,b=this.minorTickInterval,d=[],f,e=this.pointRangePadding||0;f=this.min-e;var e=this.max+e,q=e-f;if(q&&q/b=this.minRange,q,u,n,g,y,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(t(a.min)||t(a.max)?this.minRange=null:(e(this.series,function(a){g=a.xData;for(u=y=a.xIncrement? +1:g.length-1;0=E?(p=E,m=0):b.dataMax<=E&&(J=E,I=0)),b.min=x(w,p,b.dataMin),b.max=x(B,J,b.dataMax));q&&(!a&&0>=Math.min(b.min, +x(b.dataMin,b.min))&&g(10,1),b.min=r(u(b.min),15),b.max=r(u(b.max),15));b.range&&t(b.max)&&(b.userMin=b.min=w=Math.max(b.min,b.minFromRange()),b.userMax=B=b.max,b.range=null);C(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(l||b.axisPointRange||b.usePercentage||h)&&t(b.min)&&t(b.max)&&(u=b.max-b.min)&&(!t(w)&&m&&(b.min-=u*m),!t(B)&&I&&(b.max+=u*I));c(f.floor)?b.min=Math.max(b.min,f.floor):c(f.softMin)&&(b.min=Math.min(b.min,f.softMin));c(f.ceiling)?b.max=Math.min(b.max, +f.ceiling):c(f.softMax)&&(b.max=Math.max(b.max,f.softMax));M&&t(b.dataMin)&&(E=E||0,!t(w)&&b.min=E?b.min=E:!t(B)&&b.max>E&&b.dataMax<=E&&(b.max=E));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:h&&!k&&F===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:x(k,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*F/Math.max(b.len,F));y&&!a&&e(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); +b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!k&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));a=x(f.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!k&&b.tickIntervalb.tickInterval&&1E3b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval= +b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,f=a.startOnTick,e=a.endOnTick,q;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), +this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.isLinked||(this.trimTicks(b,f,e),this.min===this.max&&t(this.min)&&!this.tickAmount&&(q=!0,this.min-=.5,this.max+=.5),this.single=q,c||d||this.adjustTickAmount())}, +trimTicks:function(a,b,c){var d=a[0],f=a[a.length-1],v=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-v>a[0];)a.shift();if(c)this.max=f;else for(;this.max+vb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,f=b&&b.length;if(fc&&(this.tickInterval*= +2,this.setTickPositions());if(t(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0=f&&(b=f)),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,f=x(b.width,a.plotWidth-c+(b.offsetRight||0)),e=x(b.height,a.plotHeight),q=x(b.top,a.plotTop),b=x(b.left,a.plotLeft+c),c=/%$/;c.test(e)&&(e=Math.round(parseFloat(e)/ +100*a.plotHeight));c.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight+a.plotTop));this.left=b;this.top=q;this.width=f;this.height=e;this.bottom=a.chartHeight-e-q;this.right=a.chartWidth-f-b;this.len=Math.max(d?f:e,0);this.pos=d?b:q},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?r(b(this.min)):this.min,max:a?r(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log, +d=b?c(this.min):this.min,b=b?c(this.max):this.max;null===a?a=d:d>a?a=d:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],d=x(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize, +this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,f=this.len/(((this.categories?1:0)+this.max-this.min)/c),q,u=a.rotation,n=this.labelMetrics(),g,y=Number.MAX_VALUE,h,I=function(a){a/=f||1;a=1=a)g=I(Math.abs(n.h/Math.sin(k*a))),b=g+Math.abs(a/360),b(c.step||0)&&!c.rotation&&(this.staggerLines||1)*a.plotWidth/d||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,f=this.options.labels,q=this.horiz,u=this.getSlotWidth(),g=Math.max(1, +Math.round(u-2*(f.padding||5))),y={},h=this.labelMetrics(),I=f.style&&f.style.textOverflow,A,x=0,m,k;F(f.rotation)||(y.rotation=f.rotation||0);e(c,function(a){(a=d[a])&&a.labelLength>x&&(x=a.labelLength)});this.maxLabelLength=x;if(this.autoRotation)x>g&&x>h.h?y.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(A={width:g+"px"},!I))for(A.textOverflow="clip",m=c.length;!q&&m--;)if(k=c[m],g=d[k].label)g.styles&&"ellipsis"===g.styles.textOverflow?g.css({textOverflow:"clip"}):d[k].labelLength> +u&&g.css({width:u+"px"}),g.getBBox().height>this.len/c.length-(h.h-h.f)&&(g.specCss={textOverflow:"ellipsis"});y.rotation&&(A={width:(x>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},I||(A.textOverflow="ellipsis"));if(this.labelAlign=f.align||this.autoLabelAlign(this.labelRotation))y.align=this.labelAlign;e(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(y),A&&b.css(n(A,b.specCss)),delete b.specCss,a.rotation=y.rotation)});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,0!==this.side)}, +hasData:function(){return this.hasVisibleSeries||t(this.min)&&t(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,f=a.tickPositions,q=a.ticks,u=a.horiz,n=a.side,g=b.inverted?[1,0,3,2][n]:n,y,h,I=0,A,m=0,k=d.title,F=d.labels,E=0,l=a.opposite,C=b.axisOffset,b=b.clipOffset,p=[-1,1,1,-1][n],r,J=d.className,w=a.axisParent,B=this.tickSize("tick");y=a.hasData();a.showAxis=h=y||x(d.showEmpty,!0);a.staggerLines=a.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(J||"")).add(w),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(J||"")).add(w),a.labelGroup=c.g("axis-labels").attr({zIndex:F.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(J||"")).add(w));if(y||a.isLinked)e(f,function(b){q[b]?q[b].addLabel():q[b]=new M(a,b)}),a.renderUnsquish(),!1===F.reserveSpace||0!==n&&2!==n&&{1:"left",3:"right"}[n]!== +a.labelAlign&&"center"!==a.labelAlign||e(f,function(a){E=Math.max(q[a].getLabelSize(),E)}),a.staggerLines&&(E*=a.staggerLines,a.labelOffset=E*(a.opposite?-1:1));else for(r in q)q[r].destroy(),delete q[r];k&&k.text&&!1!==k.enabled&&(a.axisTitle||((r=k.textAlign)||(r=(u?{low:"left",middle:"center",high:"right"}:{low:l?"right":"left",middle:"center",high:l?"left":"right"})[k.align]),a.axisTitle=c.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:r}).addClass("highcharts-axis-title").css(k.style).add(a.axisGroup), +a.axisTitle.isNew=!0),h&&(I=a.axisTitle.getBBox()[u?"height":"width"],A=k.offset,m=t(A)?0:x(k.margin,u?5:10)),a.axisTitle[h?"show":"hide"](!0));a.renderLine();a.offset=p*x(d.offset,C[n]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===n?-a.labelMetrics().h:2===n?a.tickRotCorr.y:0;m=Math.abs(E)+m;E&&(m=m-c+p*(u?x(F.y,a.tickRotCorr.y+8*p):F.x));a.axisTitleMargin=x(A,m);C[n]=Math.max(C[n],a.axisTitleMargin+I+p*a.offset,m,y&&f.length&&B?B[0]:0);d=d.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[g]= +Math.max(b[g],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,f=this.horiz,e=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:e,f?d:this.top,"L",f?b.chartWidth-this.right:e,f?d:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor, +"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,f=this.options.title,e=a?b:c,q=this.opposite,u=this.offset,n=f.x||0,g=f.y||0,y=this.chart.renderer.fontMetrics(f.style&&f.style.fontSize,this.axisTitle).f,d={low:e+(a?0:d),middle:e+d/2,high:e+(a?d:0)}[f.align],b=(a?c+this.height:b)+(a?1:-1)*(q?-1:1)*this.axisTitleMargin+(2===this.side?y:0);return{x:a?d+n:b+(q?this.width:0)+u+n,y:a?b+g-(q?this.height:0)+u:d+g}},render:function(){var a= +this,b=a.chart,d=b.renderer,f=a.options,q=a.isLog,u=a.lin2log,n=a.isLinked,g=a.tickPositions,y=a.axisTitle,h=a.ticks,A=a.minorTicks,x=a.alternateBands,m=f.stackLabels,k=f.alternateGridColor,F=a.tickmarkOffset,E=a.axisLine,l=b.hasRendered&&c(a.oldMin),C=a.showAxis,p=B(d.globalAnimation),r,t;a.labelEdge.length=0;a.overlap=!1;e([h,A,x],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||n)a.minorTickInterval&&!a.categories&&e(a.getMinorTickPositions(),function(b){A[b]||(A[b]=new M(a,b,"minor")); +l&&A[b].isNew&&A[b].render(null,!0);A[b].render(null,!1,1)}),g.length&&(e(g,function(b,c){if(!n||b>=a.min&&b<=a.max)h[b]||(h[b]=new M(a,b)),l&&h[b].isNew&&h[b].render(c,!0,.1),h[b].render(c)}),F&&(0===a.min||a.single)&&(h[-1]||(h[-1]=new M(a,-1,null,!0)),h[-1].render(-1))),k&&e(g,function(c,d){t=void 0!==g[d+1]?g[d+1]+F:a.max-F;0===d%2&&c=e.second?0:A*Math.floor(c.getMilliseconds()/A));if(n>=e.second)c[B.hcSetSeconds](n>=e.minute?0:A*Math.floor(c.getSeconds()/ +A));if(n>=e.minute)c[B.hcSetMinutes](n>=e.hour?0:A*Math.floor(c[B.hcGetMinutes]()/A));if(n>=e.hour)c[B.hcSetHours](n>=e.day?0:A*Math.floor(c[B.hcGetHours]()/A));if(n>=e.day)c[B.hcSetDate](n>=e.month?1:A*Math.floor(c[B.hcGetDate]()/A));n>=e.month&&(c[B.hcSetMonth](n>=e.year?0:A*Math.floor(c[B.hcGetMonth]()/A)),g=c[B.hcGetFullYear]());if(n>=e.year)c[B.hcSetFullYear](g-g%A);if(n===e.week)c[B.hcSetDate](c[B.hcGetDate]()-c[B.hcGetDay]()+m(f,1));g=c[B.hcGetFullYear]();f=c[B.hcGetMonth]();var C=c[B.hcGetDate](), +y=c[B.hcGetHours]();if(B.hcTimezoneOffset||B.hcGetTimezoneOffset)x=(!q||!!B.hcGetTimezoneOffset)&&(k-h>4*e.month||t(h)!==t(k)),c=c.getTime(),c=new B(c+t(c));q=c.getTime();for(h=1;qr&&(!t||b<=w)&&void 0!==b&&h.push(b),b>w&&(q=!0),b=d;else r=e(r),w= +e(w),a=k[t?"minorTickInterval":"tickInterval"],a=p("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(t?5:1)*(w-r)/((t?m/this.tickPositions.length:m)||1)),a=H(a,null,B(a)),h=G(this.getLinearTickPositions(a,r,w),g),t||(this._minorAutoInterval=a/5);t||(this.tickInterval=a);return h};D.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};D.prototype.lin2log=function(a){return Math.pow(10,a)}})(N);(function(a){var D=a.dateFormat,B=a.each,G=a.extend,H=a.format,p=a.isNumber,l=a.map,r= +a.merge,w=a.pick,t=a.splat,k=a.stop,m=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){B(this.chart.series,function(e){var g=e&&e.tt;g&&(!g.isActive||a?e.tt=g.destroy():g.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label|| +(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,r(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart, +!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,m,f){var d=this,b=d.now,q=!1!==d.options.animation&&!d.isHidden&&(1h-q?h:h-q);else if(v)b[a]=Math.max(g,e+q+f>c?e:e+q);else return!1},x=function(a,c,f,e){var q;ec-d?q=!1:b[a]=ec-f/2?c-f-2:e-f/2;return q},k=function(a){var b=c;c=h;h=b;g=a},y=function(){!1!==A.apply(0,c)?!1!==x.apply(0,h)||g||(k(!0),y()):g?b.x=b.y=0:(k(!0),y())};(f.inverted||1y&&(q=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=d.plotTop;f.push({target:e.isHeader?d.plotHeight+c:a,rank:e.isHeader?1:0,size:n.tt.getBBox().height+1,point:e,x:y,tt:A})});this.cleanSplit(); +a.distribute(f,d.plotHeight+c);B(f,function(a){var b=a.point;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:q||b.isHeader?a.x:b.plotX+d.plotLeft+w(m.distance,16),y:a.pos+d.plotTop,anchorX:b.plotX+d.plotLeft,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+d.plotTop})})},updatePosition:function(a){var e=this.chart,g=this.getLabel(),g=(this.options.positioner||this.getPosition).call(this,g.width,g.height,a);this.move(Math.round(g.x),Math.round(g.y||0),a.plotX+e.plotLeft,a.plotY+e.plotTop)}, +getXDateFormat:function(a,h,m){var f;h=h.dateTimeLabelFormats;var d=m&&m.closestPointRange,b,q={millisecond:15,second:12,minute:9,hour:6,day:3},g,c="millisecond";if(d){g=D("%m-%d %H:%M:%S.%L",a.x);for(b in e){if(d===e.week&&+D("%w",a.x)===m.options.startOfWeek&&"00:00:00.000"===g.substr(6)){b="week";break}if(e[b]>d){b=c;break}if(q[b]&&g.substr(q[b])!=="01-01 00:00:00.000".substr(q[b]))break;"week"!==b&&(c=b)}b&&(f=h[b])}else f=h.day;return f||h.year},tooltipFooterHeaderFormatter:function(a,e){var g= +e?"footer":"header";e=a.series;var f=e.tooltipOptions,d=f.xDateFormat,b=e.xAxis,q=b&&"datetime"===b.options.type&&p(a.key),g=f[g+"Format"];q&&!d&&(d=this.getXDateFormat(a,f,b));q&&d&&(g=g.replace("{point.key}","{point.key:"+d+"}"));return H(g,{point:a,series:e})},bodyFormatter:function(a){return l(a,function(a){var e=a.series.tooltipOptions;return(e.pointFormatter||a.point.tooltipFormatter).call(a.point,e.pointFormat)})}}})(N);(function(a){var D=a.addEvent,B=a.attr,G=a.charts,H=a.color,p=a.css,l= +a.defined,r=a.doc,w=a.each,t=a.extend,k=a.fireEvent,m=a.offset,e=a.pick,g=a.removeEvent,h=a.splat,C=a.Tooltip,f=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};C&&b.tooltip.enabled&&(a.tooltip=new C(a,b.tooltip),this.followTouchMove=e(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart, +f=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(f=e(d.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,b){var d,e;a=a||f.event;a.target||(a.target=a.srcElement);e=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));void 0===e.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=e.pageX-b.left,b=e.pageY-b.top);return t(a,{chartX:Math.round(d), +chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};w(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},runPointActions:function(d){var b=this.chart,f=b.series,g=b.tooltip,c=g?g.shared:!1,h=!0,n=b.hoverPoint,m=b.hoverSeries,x,k,y,u=[],I;if(!c&&!m)for(x=0;xb.series.index?-1:1}));if(c)for(x=u.length;x--;)(u[x].x!==u[0].x||u[x].series.noSharedTooltip)&&u.splice(x,1);if(u[0]&&(u[0]!==this.prevKDPoint||g&&g.isHidden)){if(c&& +!u[0].series.noSharedTooltip){for(x=0;xh+k&&(f=h+k),cm+y&&(c=m+y),this.hasDragged=Math.sqrt(Math.pow(l-f,2)+Math.pow(v-c,2)),10x.max&&(l=x.max-c,v=!0);v?(u-=.8*(u-g[f][0]),J||(M-=.8*(M-g[f][1])),p()):g[f]=[u,M];A||(e[f]=F-E,e[q]=c);e=A?1/n:n;m[q]=c;m[f]=l;k[A?a?"scaleY":"scaleX":"scale"+d]=n;k["translate"+d]=e* +E+(u-e*y)},pinch:function(a){var r=this,t=r.chart,k=r.pinchDown,m=a.touches,e=m.length,g=r.lastValidTouch,h=r.hasZoom,C=r.selectionMarker,f={},d=1===e&&(r.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||r.runChartClick),b={};1b-6&&n(u||d.chartWidth- +2*x-v-e.x)&&(this.itemX=v,this.itemY+=p+this.lastLineHeight+I,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,c);this.lastItemY=p+this.itemY+I;this.lastLineHeight=Math.max(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=p+g+I,this.lastLineHeight=g);this.offsetWidth=u||Math.max((f?this.itemX-v-l:c)+x,this.offsetWidth)},getAllItems:function(){var a=[];l(this.chart.series,function(d){var b=d&&d.options;d&&m(b.showInLegend,p(b.linkedTo)? +!1:void 0,!0)&&(a=a.concat(d.legendItems||("point"===b.legendType?d.data:d)))});return a},adjustMargins:function(a,d){var b=this.chart,e=this.options,f=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||l([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(c,g){c.test(f)&&!p(a[g])&&(b[t[g]]=Math.max(b[t[g]],b.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*e[g%2?"x":"y"]+m(e.margin,12)+d[g]))})},render:function(){var a=this,d=a.chart,b=d.renderer, +e=a.group,h,c,m,n,k=a.box,x=a.options,p=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=b.g("legend").attr({zIndex:7}).add(),a.contentGroup=b.g().attr({zIndex:1}).add(e),a.scrollGroup=b.g().add(a.contentGroup));a.renderTitle();h=a.getAllItems();g(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});x.reversed&&h.reverse();a.allItems=h;a.display=c=!!h.length;a.lastLineHeight=0;l(h,function(b){a.renderItem(b)}); +m=(x.width||a.offsetWidth)+p;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=p;k||(a.box=k=b.rect().addClass("highcharts-legend-box").attr({r:x.borderRadius}).add(e),k.isNew=!0);k.attr({stroke:x.borderColor,"stroke-width":x.borderWidth||0,fill:x.backgroundColor||"none"}).shadow(x.shadow);0b&&!1!==h.enabled?(this.clipHeight=g=Math.max(b-20-this.titleHeight-I,0),this.currentPage=m(this.currentPage,1),this.fullHeight=a,l(v,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var d=u.length;if(!d||c-u[d-1]>g&&(r||c)!==u[d-1])u.push(r||c),d++;b===v.length-1&&c+a-u[d-1]>g&&u.push(c);c!==r&&(r=c)}),n||(n=d.clipRect= +e.clipRect(0,I,9999,0),d.contentGroup.clip(n)),t(g),y||(this.nav=y=e.g().attr({zIndex:1}).add(this.group),this.up=e.symbol("triangle",0,0,p,p).on("click",function(){d.scroll(-1,k)}).add(y),this.pager=e.text("",15,10).addClass("highcharts-legend-navigation").css(h.style).add(y),this.down=e.symbol("triangle-down",0,0,p,p).on("click",function(){d.scroll(1,k)}).add(y)),d.scroll(0),a=b):y&&(t(),y.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,d){var b=this.pages, +f=b.length;a=this.currentPage+a;var g=this.clipHeight,c=this.options.navigation,h=this.pager,n=this.padding;a>f&&(a=f);0f&&(g=typeof a[0],"string"===g?e.name=a[0]:"number"===g&&(e.x=a[0]),d++);b=h.value;)h=e[++g];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),H(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this), +this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(g in this)this[g]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,g= +e.tooltipOptions,h=t(g.valueDecimals,""),k=g.valuePrefix||"",f=g.valueSuffix||"";B(e.pointArrayMap||["y"],function(d){d="{point."+d;if(k||f)a=a.replace(d+"}",k+d+"}"+f);a=a.replace(d+"}",d+":,."+h+"f}")});return l(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var h=this,k=this.series.options;(k.point.events[a]||h.options&&h.options.events&&h.options.events[a])&&this.importEvents();"click"===a&&k.allowPointSelect&&(g=function(a){h.select&&h.select(null,a.ctrlKey||a.metaKey||a.shiftKey)}); +p(this,a,e,g)},visible:!0}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.correctFloat,l=a.Date,r=a.defaultOptions,w=a.defaultPlotOptions,t=a.defined,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.fireEvent,C=a.grep,f=a.isArray,d=a.isNumber,b=a.isString,q=a.merge,E=a.pick,c=a.removeEvent,F=a.splat,n=a.stableSort,A=a.SVGElement,x=a.syncTimeout,J=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, +marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1, +marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var c=this,d,e,f=a.series,u,y=function(a,b){return E(a.options.index,a._i)-E(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();g(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0=== +b.selected});e=b.events;for(d in e)D(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();k(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(u=f[f.length-1]);c._i=E(u&&u._i,-1)+1;f.push(c);n(f,y);this.yAxis&&n(this.yAxis.series,y);k(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart, +d;k(a.axisTypes||[],function(f){k(c[f],function(c){d=c.options;if(b[f]===d.index||void 0!==b[f]&&b[f]===d.id||void 0===b[f]&&0===d.index)c.series.push(a),a[f]=c,c.isDirty=!0});a[f]||a.optionalAxis===f||e(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,e=arguments,f=d(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(e,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options, +b=this.xIncrement,c,d=a.pointIntervalUnit,b=E(b,a.pointStart,0);this.pointInterval=c=E(this.pointInterval,a.pointInterval,1);d&&(a=new l(b),"day"===d?a=+a[l.hcSetDate](a[l.hcGetDate]()+c):"month"===d?a=+a[l.hcSetMonth](a[l.hcGetMonth]()+c):"year"===d&&(a=+a[l.hcSetFullYear](a[l.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=q(e,c.series,a);this.tooltipOptions= +q(r.tooltip,r.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===e.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&t(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor}); +return c},getCyclic:function(a,b,c){var d,e=this.userOptions,f=a+"Index",g=a+"Counter",u=c?c.length:E(this.chart.options.chart[a+"Count"],this.chart[a+"Count"]);b||(d=E(e[f],e["_"+f]),t(d)||(e["_"+f]=d=this.chart[g]%u,this.chart[g]+=1),c&&(b=c[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||w[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol, +this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(a,c,g,n){var u=this,q=u.points,h=q&&q.length||0,y,m=u.options,x=u.chart,A=null,I=u.xAxis,l=m.turboThreshold,p=this.xData,r=this.yData,F=(y=u.pointArrayMap)&&y.length;a=a||[];y=a.length;c=E(c,!0);if(!1!==n&&y&&h===y&&!u.cropped&&!u.hasGroupedData&&u.visible)k(a,function(a,b){q[b].update&&a!==m.data[b]&&q[b].update(a,!1,null,!1)});else{u.xIncrement=null;u.colorCounter=0;k(this.parallelArrays,function(a){u[a+ +"Data"].length=0});if(l&&y>l){for(g=0;null===A&&gh||this.forceCrop))if(b[d-1]l)b=[],c=[];else if(b[0]l)f=this.cropData(this.xData,this.yData,A,l),b=f.xData,c=f.yData,f=f.start,g=!0;for(h=b.length||1;--h;)d=x?y(b[h])-y(b[h-1]):b[h]-b[h-1],0d&&this.requireSorting&&e(15);this.cropped=g;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=n},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,n=E(this.cropShoulder,1),u;for(u=0;u=c){f=Math.max(0,u- +n);break}for(c=u;cd){g=c+n;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,n=this.cropStart||0,q,h=this.hasGroupedData,k,m=[],x;b||h||(b=[],b.length=a.length,b=this.data=b);for(x=0;x=q&&(c[x-1]||k)<=h,y&&k)if(y=m.length)for(;y--;)null!==m[y]&&(g[n++]=m[y]);else g[n++]=m;this.dataMin=H(g);this.dataMax=G(g)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,e=c.categories,f=this.yAxis,g=this.points,n=g.length,q=!!this.modifyValue,h=a.pointPlacement,k="between"===h||d(h),m=a.threshold,x=a.startFromThreshold?m:0,A,l,r,F,J=Number.MAX_VALUE;"between"===h&&(h=.5);d(h)&&(h*=E(a.pointRange||c.pointRange)); +for(a=0;a=B&&(C.isNull=!0);C.plotX=A=p(Math.min(Math.max(-1E5,c.translate(w,0,0,0,1,h,"flags"===this.type)),1E5));b&&this.visible&&!C.isNull&&D&&D[w]&&(F=this.getStackIndicator(F,w,this.index),G=D[w],B=G.points[F.key],l=B[0],B=B[1],l===x&&F.key===D[w].base&&(l=E(m,f.min)),f.isLog&&0>=l&&(l=null),C.total=C.stackTotal=G.total,C.percentage=G.total&&C.y/G.total*100,C.stackY= +B,G.setOffset(this.pointXOffset||0,this.barW||0));C.yBottom=t(l)?f.translate(l,0,1,0,1):null;q&&(B=this.modifyValue(B,C));C.plotY=l="number"===typeof B&&Infinity!==B?Math.min(Math.max(-1E5,f.translate(B,0,1,0,1)),1E5):void 0;C.isInside=void 0!==l&&0<=l&&l<=f.len&&0<=A&&A<=c.len;C.clientX=k?p(c.translate(w,0,0,0,1,h)):A;C.negative=C.y<(m||0);C.category=e&&void 0!==e[C.x]?e[C.x]:C.x;C.isNull||(void 0!==r&&(J=Math.min(J,Math.abs(A-r))),r=A)}this.closestPointRangePx=J},getValidPoints:function(a,b){var c= +this.chart;return C(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,n=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(),q=b[n],h=b[n+"m"];q||(a&&(g.width=0,b[n+"m"]=h=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[n]=q=d.clipRect(g),q.count={length:0});a&&!q.count[this.index]&& +(q.count[this.index]=!0,q.count.length+=1);!1!==c.clip&&(this.group.clip(a||f?q:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=n);a||(q.count[this.index]&&(delete q.count[this.index],--q.count.length),0===q.count.length&&n&&b[n]&&(f||(b[n]=b[n].destroy()),b[n+"m"]&&(b[n+"m"]=b[n+"m"].destroy())))},animate:function(a){var b=this.chart,c=B(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+ +99},c),this.animate=null)},afterAnimate:function(){this.setClip();h(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,e,f,g,n=this.options.marker,q,h,k,m,x=this.markerGroup,A=E(n.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>2*n.radius);if(!1!==n.enabled||this._hasPointMarkers)for(e=a.length;e--;)f=a[e],c=f.plotY,g=f.graphic,q=f.marker||{},h=!!f.marker,k=A&&void 0===q.enabled||q.enabled,m=f.isInside,k&&d(c)&&null!==f.y?(c=E(q.symbol,this.symbol),f.hasImage= +0===c.indexOf("url"),k=this.markerAttribs(f,f.selected&&"select"),g?g[m?"show":"hide"](!0).animate(k):m&&(0e&&b.shadow));g&&(g.startX=c.xMap, +g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],n,q=this.graph,h=this.area,m=Math.max(b.chartWidth,b.chartHeight),x=this[(this.zoneAxis||"y")+"Axis"],A,l,p=b.inverted,r,F,C,t,J=!1;d.length&&(q||h)&&x&&void 0!==x.min&&(l=x.reversed,r=x.horiz,q&&q.hide(),h&&h.hide(),A=x.getExtremes(),k(d,function(d,u){e=l?r?b.plotWidth:0:r?0:x.toPixels(A.min);e=Math.min(Math.max(E(f,e),0),m);f=Math.min(Math.max(Math.round(x.toPixels(E(d.value,A.max), +!0)),0),m);J&&(e=f=x.toPixels(A.max));F=Math.abs(e-f);C=Math.min(e,f);t=Math.max(e,f);x.isXAxis?(n={x:p?t:C,y:0,width:F,height:m},r||(n.x=b.plotHeight-n.x)):(n={x:0,y:p?t:C,width:m,height:F},r&&(n.y=b.plotWidth-n.y));p&&c.isVML&&(n=x.isXAxis?{x:0,y:l?C:t,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});g[u]?g[u].animate(n):(g[u]=c.clipRect(n),q&&a["zone-graph-"+u].clip(g[u]),h&&a["zone-area-"+u].clip(g[u]));J=d.value>A.max}),this.clips= +g)},invertGroups:function(a){function b(){var b={width:c.yAxis.len,height:c.xAxis.len};k(["group","markerGroup"],function(d){c[d]&&c[d].attr(b).invert(a)})}var c=this,d;c.xAxis&&(d=D(c.chart,"resize",b),D(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(e),f.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className|| +"")));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=!!a.animate&&b.renderer.isSVG&&B(d.animation).duration,f=a.visible?"inherit":"hidden",g=d.zIndex,n=a.hasRendered,q=b.seriesGroup,h=b.inverted;c=a.plotGroup("group","series",f,g,q);a.markerGroup= +a.plotGroup("markerGroup","markers",f,g,q);e&&a.animate(!0);c.inverted=a.isCartesian?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);!1===d.clip||a.sharedClipKey||n||c.clip(b.clipRect);e&&a.animate();n||(a.animationTimeout=x(function(){a.afterAnimate()},e));a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty|| +this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:E(d&&d.left,a.plotLeft),translateY:E(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)}, +buildKDTree:function(){function a(c,d,e){var f,g;if(g=c&&c.length)return f=b.kdAxisArray[d%e],c.sort(function(a,b){return a[f]-b[f]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,e),right:a(c.slice(g+1),d+1,e)}}var b=this,c=b.kdDimensions;delete b.kdTree;x(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,n,q){var h=b.point,u=d.kdAxisArray[n%q],k,m,x=h;m=t(a[e])&&t(h[e])?Math.pow(a[e]-h[e],2):null;k=t(a[f])&& +t(h[f])?Math.pow(a[f]-h[f],2):null;k=(m||0)+(k||0);h.dist=t(k)?Math.sqrt(k):Number.MAX_VALUE;h.distX=t(m)?Math.sqrt(m):Number.MAX_VALUE;u=a[u]-h[u];k=0>u?"left":"right";m=0>u?"right":"left";b[k]&&(k=c(a,b[k],n+1,q),x=k[g]A;)l--;this.updateParallelArrays(h,"splice",l,0,0);this.updateParallelArrays(h,l);n&&h.name&&(n[A]=h.name);q.splice(l,0,a);m&&(this.data.splice(l,0,null),this.processData());"point"===c.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(h,"shift"),q.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(e)},removePoint:function(a, +b,d){var c=this,e=c.data,f=e[a],g=c.points,n=c.chart,h=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&n.redraw()};q(d,n);b=C(b,!0);f?f.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){e.destroy();f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();C(a,!0)&&f.redraw(b)}var e=this,f=e.chart;!1!==d?k(e,"remove",null,c):c()},update:function(a, +d){var c=this,e=this.chart,f=this.userOptions,g=this.type,q=a.type||f.type||e.options.chart.type,u=b[g].prototype,m=["group","markerGroup","dataLabelsGroup"],k;if(q&&q!==g||void 0!==a.zIndex)m.length=0;r(m,function(a){m[a]=c[a];delete c[a]});a=h(f,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1,null,!1);for(k in u)this[k]=void 0;t(this,b[q||g].prototype);r(m,function(a){c[a]=m[a]});this.init(e,a);e.linkSeries();C(d,!0)&&e.redraw(!1)}});t(G.prototype, +{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,t(a,{events:void 0}));c.isDirtyBox=!0;C(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);w(b.axes,this);w(b[c],this);b.options[c].splice(this.options.index,1);r(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;C(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a}, +b)},setCategories:function(a,b){this.update({categories:a},b)}})})(N);(function(a){var D=a.color,B=a.each,G=a.map,H=a.pick,p=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],l=[],p=this.xAxis,k=this.yAxis,m=k.stacks[this.stackKey],e={},g=this.points,h=this.index,C=k.series,f=C.length,d,b=H(k.options.reversedStacks,!0)?1:-1,q,E;if(this.options.stacking){for(q=0;qa&&t>l?(t=Math.max(a,l),m=2*l-t):tH&& +m>l?(m=Math.max(H,l),t=2*l-m):m=Math.abs(g)&&.5a.closestPointRange*a.xAxis.transA,k=a.borderWidth=r(h.borderWidth,k?0:1),f=a.yAxis,d=a.translatedThreshold=f.getThreshold(h.threshold),b=r(h.minPointLength,5),q=a.getColumnMetrics(),m=q.width,c=a.barW=Math.max(m,1+2*k),l=a.pointXOffset= +q.offset;g.inverted&&(d-=.5);h.pointPadding&&(c=Math.ceil(c));w.prototype.translate.apply(a);G(a.points,function(e){var n=r(e.yBottom,d),q=999+Math.abs(n),q=Math.min(Math.max(-q,e.plotY),f.len+q),h=e.plotX+l,k=c,u=Math.min(q,n),p,t=Math.max(q,n)-u;Math.abs(t)b?n-b:d-(p?b:0));e.barX=h;e.pointWidth=m;e.tooltipPos=g.inverted?[f.len+f.pos-g.plotLeft-q,a.xAxis.len-h-k/2,t]:[h+k/2,q+f.pos-g.plotTop,t];e.shapeType="rect";e.shapeArgs= +a.crispCol.apply(a,e.isNull?[e.plotX,f.len/2,0,0]:[h,u,k,t])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,g){var e=this.options,k=this.pointAttrToOptions||{},f=k.stroke||"borderColor",d=k["stroke-width"]||"borderWidth",b=a&&a.color||this.color,q=a[f]||e[f]||this.color||b,k=e.dashStyle,m;a&&this.zones.length&&(b=(b=a.getZone())&&b.color||a.options.color|| +this.color);g&&(g=e.states[g],m=g.brightness,b=g.color||void 0!==m&&B(b).brighten(g.brightness).get()||b,q=g[f]||q,k=g.dashStyle||k);a={fill:b,stroke:q,"stroke-width":a[d]||e[d]||this[d]||0};e.borderRadius&&(a.r=e.borderRadius);k&&(a.dashstyle=k);return a},drawPoints:function(){var a=this,g=this.chart,h=a.options,m=g.renderer,f=h.animationLimit||250,d;G(a.points,function(b){var e=b.graphic;p(b.plotY)&&null!==b.y?(d=b.shapeArgs,e?(k(e),e[g.pointCountt;++t)k=r[t],a=2>t||2===t&&/%$/.test(k),r[t]=B(k,[l,H,w,r[2]][t])+(a?p:0);r[3]>r[2]&&(r[3]=r[2]);return r}}})(N);(function(a){var D=a.addEvent,B=a.defined,G=a.each,H=a.extend,p=a.inArray,l=a.noop,r=a.pick,w=a.Point,t=a.Series,k=a.seriesType,m=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y? +void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,h=e.points,k=e.startAngleRad;a||(G(h,function(a){var d= +a.graphic,b=a.shapeArgs;d&&(d.attr({r:a.startR||e.center[3]/2,start:k,end:k}),d.animate({r:b.r,start:b.start,end:b.end},e.options.animation))}),e.animate=null)},updateTotals:function(){var a,g=0,h=this.points,k=h.length,f,d=this.options.ignoreHiddenPoint;for(a=0;af.y&&(f.y=null),g+=d&&!f.visible?0:f.y;this.total=g;for(a=0;a1.5*Math.PI?q-=2*Math.PI:q<-Math.PI/2&&(q+=2*Math.PI);t.slicedTranslation={translateX:Math.round(Math.cos(q)*k),translateY:Math.round(Math.sin(q)*k)};d=Math.cos(q)*a[2]/2;b=Math.sin(q)*a[2]/2;t.tooltipPos=[a[0]+.7*d,a[1]+.7*b];t.half=q<-Math.PI/2||q>Math.PI/2?1:0;t.angle=q;f=Math.min(f,n/5);t.labelPos=[a[0]+d+Math.cos(q)*n,a[1]+b+Math.sin(q)*n,a[0]+d+Math.cos(q)*f,a[1]+b+Math.sin(q)* +f,a[0]+d,a[1]+b,0>n?"center":t.half?"right":"left",q]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,h,k,f,d,b=a.options.shadow;b&&!a.shadowGroup&&(a.shadowGroup=g.g("shadow").add(a.group));G(a.points,function(e){if(null!==e.y){k=e.graphic;d=e.shapeArgs;h=e.sliced?e.slicedTranslation:{};var q=e.shadowGroup;b&&!q&&(q=e.shadowGroup=g.g("shadow").add(a.shadowGroup));q&&q.attr(h);f=a.pointAttribs(e,e.selected&&"select");k?k.setRadialReference(a.center).attr(f).animate(H(d,h)):(e.graphic= +k=g[e.shapeType](d).addClass(e.getClassName()).setRadialReference(a.center).attr(h).add(a.group),e.visible||k.attr({visibility:"hidden"}),k.attr(f).attr({"stroke-linejoin":"round"}).shadow(b,q))}})},searchPoint:l,sortByAngle:function(a,g){a.sort(function(a,e){return void 0!==a.angle&&(e.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:l},{init:function(){w.prototype.init.apply(this,arguments);var a=this,g;a.name=r(a.name,"Slice"); +g=function(e){a.slice("select"===e.type)};D(a,"select",g);D(a,"unselect",g);return a},setVisible:function(a,g){var e=this,k=e.series,f=k.chart,d=k.options.ignoreHiddenPoint;g=r(g,d);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,k.options.data[p(e,k.data)]=e.options,G(["graphic","dataLabel","connector","shadowGroup"],function(b){if(e[b])e[b][a?"show":"hide"](!0)}),e.legendItem&&f.legend.colorizeItem(e,a),a||"hover"!==e.state||e.setState(""),d&&(k.isDirty=!0),g&&f.redraw())}, +slice:function(a,g,h){var e=this.series;m(h,e.chart);r(g,!0);this.sliced=this.options.sliced=a=B(a)?a:!this.sliced;e.options.data[p(this,e.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(N);(function(a){var D= +a.addEvent,B=a.arrayMax,G=a.defined,H=a.each,p=a.extend,l=a.format,r=a.map,w=a.merge,t=a.noop,k=a.pick,m=a.relativeLength,e=a.Series,g=a.seriesTypes,h=a.stableSort,C=a.stop;a.distribute=function(a,d){function b(a,b){return a.target-b.target}var e,f=!0,c=a,g=[],n;n=0;for(e=a.length;e--;)n+=a[e].size;if(n>d){h(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(n=e=0;n<=d;)n+=a[e].size,e++;g=a.splice(e-1,a.length)}h(a,b);for(a=r(a,function(a){return{size:a.size,targets:[a.target]}});f;){for(e=a.length;e--;)f= +a[e],n=(Math.min.apply(0,f.targets)+Math.max.apply(0,f.targets))/2,f.pos=Math.min(Math.max(0,n-f.size/2),d-f.size);e=a.length;for(f=!1;e--;)0a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>d&&(a[e-1].pos=d-a[e-1].size),a.splice(e,1),f=!0)}e=0;H(a,function(a){var b=0;H(a.targets,function(){c[e].pos=a.pos+b;b+=c[e].size;e++})});c.push.apply(c,g);h(c,b)};e.prototype.drawDataLabels=function(){var a=this,d=a.options, +b=d.dataLabels,e=a.points,g,c,h=a.hasRendered||0,n,m,x=k(b.defer,!0),r=a.chart.renderer;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),m=a.plotGroup("dataLabelsGroup","data-labels",x&&!h?"hidden":"visible",b.zIndex||6),x&&(m.attr({opacity:+h}),h||D(a,"afterAnimate",function(){a.visible&&m.show(!0);m[d.animation?"animate":"attr"]({opacity:1},{duration:200})})),c=b,H(e,function(e){var f,q=e.dataLabel,h,x,A=e.connector,y=!0,t,z={};g=e.dlOptions||e.options&&e.options.dataLabels; +f=k(g&&g.enabled,c.enabled)&&null!==e.y;if(q&&!f)e.dataLabel=q.destroy();else if(f){b=w(c,g);t=b.style;f=b.rotation;h=e.getLabelConfig();n=b.format?l(b.format,h):b.formatter.call(h,b);t.color=k(b.color,t.color,a.color,"#000000");if(q)G(n)?(q.attr({text:n}),y=!1):(e.dataLabel=q=q.destroy(),A&&(e.connector=A.destroy()));else if(G(n)){q={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:f,padding:b.padding,zIndex:1};"contrast"===t.color&&(z.color=b.inside|| +0>b.distance||d.stacking?r.getContrast(e.color||a.color):"#000000");d.cursor&&(z.cursor=d.cursor);for(x in q)void 0===q[x]&&delete q[x];q=e.dataLabel=r[f?"text":"label"](n,0,-9999,b.shape,null,null,b.useHTML,null,"data-label").attr(q);q.addClass("highcharts-data-label-color-"+e.colorIndex+" "+(b.className||""));q.css(p(t,z));q.add(m);q.shadow(b.shadow)}q&&a.alignDataLabel(e,q,b,null,y)}})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,f=c.inverted,n=k(a.plotX,-9999),q=k(a.plotY, +-9999),h=d.getBBox(),m,l=b.rotation,u=b.align,r=this.visible&&(a.series.forceDL||c.isInsidePlot(n,Math.round(q),f)||e&&c.isInsidePlot(n,f?e.x+1:e.y+e.height-1,f)),t="justify"===k(b.overflow,"justify");r&&(m=b.style.fontSize,m=c.renderer.fontMetrics(m,d).b,e=p({x:f?c.plotWidth-q:n,y:Math.round(f?c.plotHeight-n:q),width:0,height:0},e),p(b,{width:h.width,height:h.height}),l?(t=!1,f=c.renderer.rotCorr(m,l),f={x:e.x+b.x+e.width/2+f.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g? +"attr":"animate"](f).attr({align:u}),n=(l+720)%360,n=180n,"left"===u?f.y-=n?h.height:0:"center"===u?(f.x-=h.width/2,f.y-=h.height/2):"right"===u&&(f.x-=h.width,f.y-=n?0:h.height)):(d.align(b,null,e),f=d.alignAttr),t?this.justifyDataLabel(d,b,f,h,e,g):k(b.crop,!0)&&(r=c.isInsidePlot(f.x,f.y)&&c.isInsidePlot(f.x+h.width,f.y+h.height)),b.shape&&!l&&d.attr({anchorX:a.plotX,anchorY:a.plotY}));r||(C(d),d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,c){var f=this.chart, +n=d.align,h=d.verticalAlign,q,k,m=a.box?0:a.padding||0;q=b.x+m;0>q&&("right"===n?d.align="left":d.x=-q,k=!0);q=b.x+e.width-m;q>f.plotWidth&&("left"===n?d.align="right":d.x=f.plotWidth-q,k=!0);q=b.y+m;0>q&&("bottom"===h?d.verticalAlign="top":d.y=-q,k=!0);q=b.y+e.height-m;q>f.plotHeight&&("top"===h?d.verticalAlign="bottom":d.y=f.plotHeight-q,k=!0);k&&(a.placed=!c,a.align(d,null,g))};g.pie&&(g.pie.prototype.drawDataLabels=function(){var f=this,d=f.data,b,g=f.chart,h=f.options.dataLabels,c=k(h.connectorPadding, +10),m=k(h.connectorWidth,1),n=g.plotWidth,l=g.plotHeight,x,p=h.distance,y=f.center,u=y[2]/2,t=y[1],w=0k-2?A:P,e),v._attr={visibility:S,align:D[6]},v._pos={x:L+h.x+({left:c,right:-c}[D[6]]||0),y:P+h.y-10},D.x=L,D.y=P,null===f.options.size&&(C=v.width,L-Cn-c&&(T[1]=Math.max(Math.round(L+ +C-n+c),T[1])),0>P-G/2?T[0]=Math.max(Math.round(-P+G/2),T[0]):P+G/2>l&&(T[2]=Math.max(Math.round(P+G/2-l),T[2])))}),0===B(T)||this.verifyDataLabelOverflow(T))&&(this.placeDataLabels(),w&&m&&H(this.points,function(a){var b;x=a.connector;if((v=a.dataLabel)&&v._pos&&a.visible){S=v._attr.visibility;if(b=!x)a.connector=x=g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(f.dataLabelsGroup),x.attr({"stroke-width":m,stroke:h.connectorColor||a.color||"#666666"}); +x[b?"attr":"animate"]({d:f.connectorPath(a.labelPos)});x.attr("visibility",S)}else x&&(a.connector=x.destroy())}))},g.pie.prototype.connectorPath=function(a){var d=a.x,b=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",d+("left"===a[6]?5:-5),b,"C",d,b,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",d+("left"===a[6]?5:-5),b,"L",a[2],a[3],"L",a[4],a[5]]},g.pie.prototype.placeDataLabels=function(){H(this.points,function(a){var d=a.dataLabel;d&&a.visible&&((a=d._pos)?(d.attr(d._attr), +d[d.moved?"animate":"attr"](a),d.moved=!0):d&&d.attr({y:-9999}))})},g.pie.prototype.alignDataLabel=t,g.pie.prototype.verifyDataLabelOverflow=function(a){var d=this.center,b=this.options,e=b.center,f=b.minSize||80,c,g;null!==e[0]?c=Math.max(d[2]-Math.max(a[1],a[3]),f):(c=Math.max(d[2]-a[1]-a[3],f),d[0]+=(a[3]-a[1])/2);null!==e[1]?c=Math.max(Math.min(c,d[2]-Math.max(a[0],a[2])),f):(c=Math.max(Math.min(c,d[2]-a[0]-a[2]),f),d[1]+=(a[0]-a[2])/2);ck(this.translatedThreshold,f.yAxis.len)),m=k(b.inside,!!this.options.stacking);n&&(g=w(n),0>g.y&&(g.height+=g.y,g.y=0),n=g.y+g.height-f.yAxis.len,0a+e||c+nb+f||g+hthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&r(d,function(a){a.setState()});r("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",g=c[d],n=(b.pointRange||0)/2,h=b.getExtremes(),q=b.toValue(g-f,!0)+n,n=b.toValue(g+b.len-f,!0)-n,g=g>f;b.series.length&&(g||q>Math.min(h.dataMin,h.min))&&(!g||n=p(k.minWidth,0)&&this.chartHeight>=p(k.minHeight,0)};void 0===l._id&&(l._id=a.uniqueKey());m=m.call(this);!r[l._id]&&m?l.chartOptions&&(r[l._id]=this.currentOptions(l.chartOptions),this.update(l.chartOptions,w)):r[l._id]&&!m&&(this.update(r[l._id],w),delete r[l._id])};D.prototype.currentOptions=function(a){function p(a,m,e){var g,h;for(g in a)if(-1< +G(g,["series","xAxis","yAxis"]))for(a[g]=l(a[g]),e[g]=[],h=0;hd.length||void 0===h)return a.call(this,g,h,k,f);x=d.length;for(c=0;ck;d[c]5*b||w){if(d[c]>u){for(r=a.call(this,g,d[e],d[c],f);r.length&&r[0]<=u;)r.shift();r.length&&(u=r[r.length-1]);y=y.concat(r)}e=c+1}if(w)break}a= +r.info;if(q&&a.unitRange<=m.hour){c=y.length-1;for(e=1;ek?a-1:a;for(M=void 0;q--;)e=c[q],k=M-e,M&&k<.8*C&&(null===t||k<.8*t)?(n[y[q]]&&!n[y[q+1]]?(k=q+1,M=e):k=q,y.splice(k,1)):M=e}return y});w(B.prototype,{beforeSetTickPositions:function(){var a, +g=[],h=!1,k,f=this.getExtremes(),d=f.min,b=f.max,q,m=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,c=this.chart.options.chart.ignoreHiddenSeries;if(f||m){r(this.series,function(b,d){if(!(c&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(g=g.concat(b.processedXData),a=g.length,g.sort(function(a,b){return a-b}),a))for(d=a-1;d--;)g[d]===g[d+1]&&g.splice(d,1)});a=g.length;if(2k||b-g[g.length- +1]>k)&&(h=!0)}h?(this.ordinalPositions=g,k=this.val2lin(Math.max(d,g[0]),!0),q=Math.max(this.val2lin(Math.min(b,g[g.length-1]),!0),1),this.ordinalSlope=b=(b-d)/(q-k),this.ordinalOffset=d-k*b):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=f&&h;this.groupIntervalFactor=null},val2lin:function(a,g){var e=this.ordinalPositions;if(e){var k=e.length,f,d;for(f=k;f--;)if(e[f]===a){d=f;break}for(f=k-1;f--;)if(a>e[f]||0===f){a=(a-e[f])/(e[f+1]-e[f]);d=f+a;break}g=g?d:this.ordinalSlope* +(d||0)+this.ordinalOffset}else g=a;return g},lin2val:function(a,g){var e=this.ordinalPositions;if(e){var k=this.ordinalSlope,f=this.ordinalOffset,d=e.length-1,b;if(g)0>a?a=e[0]:a>d?a=e[d]:(d=Math.floor(a),b=a-d);else for(;d--;)if(g=k*d+f,a>=g){k=k*(d+1)+f;b=(a-g)/(k-g);break}return void 0!==b&&void 0!==e[d]?e[d]+(b?b*(e[d+1]-e[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,g=this.series[0].currentDataGrouping,h=this.ordinalIndex,k=g?g.count+g.unitName:"raw",f=this.getExtremes(), +d,b;h||(h=this.ordinalIndex={});h[k]||(d={series:[],chart:a,getExtremes:function(){return{min:f.dataMin,max:f.dataMax}},options:{ordinal:!0},val2lin:B.prototype.val2lin},r(this.series,function(e){b={xAxis:d,xData:e.xData,chart:a,destroyGroupedData:t};b.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:"open",units:[[g.unitName,[g.count]]]}:{enabled:!1}};e.processData.apply(b);d.series.push(b)}),this.beforeSetTickPositions.apply(d),h[k]=d.ordinalPositions);return h[k]},getGroupIntervalFactor:function(a, +g,h){var e;h=h.processedXData;var f=h.length,d=[];e=this.groupIntervalFactor;if(!e){for(e=0;ed?(l=p,t=e.ordinalPositions?e:p):(l=e.ordinalPositions?e:p,t=p),p=t.ordinalPositions,q>p[p.length-1]&&p.push(q),this.fixedRange=c-m,d=e.toFixedRange(null,null,n.apply(l,[x.apply(l,[m,!0])+d,!0]),n.apply(t,[x.apply(t, +[c,!0])+d,!0])),d.min>=Math.min(b.dataMin,m)&&d.max<=Math.max(q,c)&&e.setExtremes(d.min,d.max,!0,!1,{trigger:"pan"}),this.mouseDownX=k,H(this.container,{cursor:"move"})):f=!0}else f=!0;f&&a.apply(this,Array.prototype.slice.call(arguments,1))});k.prototype.gappedPath=function(){var a=this.options.gapSize,g=this.points.slice(),h=g.length-1;if(a&&0this.closestPointRange*a&&g.splice(h+1,0,{isNull:!0});return this.getGraphPath(g)}})(N);(function(a){function D(){return Array.prototype.slice.call(arguments, +1)}function B(a){a.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,G(this.pointArrayMap,["y"]))}var G=a.pick,H=a.wrap,p=a.each,l=a.extend,r=a.fireEvent,w=a.Axis,t=a.Series;l(w.prototype,{isInBreak:function(a,m){var e=a.repeat||Infinity,g=a.from,h=a.to-a.from;m=m>=g?(m-g)%e:e-(g-m)%e;return a.inclusive?m<=h:m=a)break;else if(g.isInBreak(f,a)){e-=a-f.from;break}return e};this.lin2val=function(a){var e,f;for(f=0;f=a);f++)e.toh;)m-=b;for(;mb.to||l>b.from&&db.from&&db.from&&d>b.to&&d=c[0]);A++);for(A;A<=q;A++){for(;(void 0!==c[w+1]&&a[A]>=c[w+1]||A===q)&&(l=c[w],this.dataGroupInfo={start:p,length:t[0].length},p=d.apply(this,t),void 0!==p&&(g.push(l),h.push(p),m.push(this.dataGroupInfo)),p=A,t[0]=[],t[1]=[],t[2]=[],t[3]=[],w+=1,A!==q););if(A===q)break;if(x){l=this.cropStart+A;l=e&&e[l]|| +this.pointClass.prototype.applyOptions.apply({series:this},[f[l]]);var E,C;for(E=0;Ethis.chart.plotSizeX/d||b&&f.forced)&&(e=!0);return e?d:0};G.prototype.setDataGrouping=function(a,b){var c;b=e(b,!0);a||(a={forced:!1,units:null});if(this instanceof G)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else l(this.chart.options.series,function(b){b.dataGrouping=a},!1);b&&this.chart.redraw()}})(N);(function(a){var D=a.each,B=a.Point,G=a.seriesType,H=a.seriesTypes;G("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'}, +threshold:null,states:{hover:{lineWidth:3}}},{pointArrayMap:["open","high","low","close"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:"high",pointAttribs:function(a,l){l=H.column.prototype.pointAttribs.call(this,a,l);var p=this.options;delete l.fill;l["stroke-width"]=p.lineWidth;l.stroke=a.options.color||(a.openk)););B(g,function(a,b){var d;void 0===a.plotY&&(a.x>=c.min&&a.x<=c.max?a.plotY=e.chartHeight-p.bottom-(p.opposite?p.height:0)+p.offset-e.plotTop:a.shapeArgs={});a.plotX+=t;(f=g[b-1])&&f.plotX===a.plotX&&(void 0===f.stackIndex&&(f.stackIndex=0),d=f.stackIndex+1);a.stackIndex=d})},drawPoints:function(){var a=this.points,e=this.chart,g=e.renderer,k,l,f=this.options,d=f.y,b,q,p,c,r,n,t,x=this.yAxis;for(q=a.length;q--;)p=a[q],t=p.plotX>this.xAxis.len,k=p.plotX,c=p.stackIndex,b= +p.options.shape||f.shape,l=p.plotY,void 0!==l&&(l=p.plotY+d-(void 0!==c&&c*f.stackDistance)),r=c?void 0:p.plotX,n=c?void 0:p.plotY,c=p.graphic,void 0!==l&&0<=k&&!t?(c||(c=p.graphic=g.label("",null,null,b,null,null,f.useHTML).attr(this.pointAttribs(p)).css(G(f.style,p.style)).attr({align:"flag"===b?"left":"center",width:f.width,height:f.height,"text-align":f.textAlign}).addClass("highcharts-point").add(this.markerGroup),c.shadow(f.shadow)),0h&&(e-=Math.round((l-h)/2),h=l);e=k[a](e,g,h,l);d&&f&&e.push("M",d,g>f?g:g+l,"L",d,f);return e}});p===t&&B(["flag","circlepin","squarepin"],function(a){t.prototype.symbols[a]=k[a]})})(N);(function(a){function D(a,d,e){this.init(a,d,e)}var B=a.addEvent,G=a.Axis,H=a.correctFloat,p=a.defaultOptions, +l=a.defined,r=a.destroyObjectProperties,w=a.doc,t=a.each,k=a.fireEvent,m=a.hasTouch,e=a.isTouchDevice,g=a.merge,h=a.pick,C=a.removeEvent,f=a.wrap,d={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2", +trackBorderWidth:1};p.scrollbar=g(!0,d,p.scrollbar);D.prototype={init:function(a,e,f){this.scrollbarButtons=[];this.renderer=a;this.userOptions=e;this.options=g(d,e);this.chart=f;this.size=h(this.options.size,this.options.height);e.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,d=this.options,e=this.size,c;this.group=c=a.g("scrollbar").attr({zIndex:d.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0, +r:d.trackBorderRadius||0,height:e,width:e}).add(c);this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(this.swapXY(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L", +0,2*e/3,"M",3,e/4,"L",3,2*e/3],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth});this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a, +d,e,c){var b=this.options.vertical,f=0,g=this.rendered?"animate":"attr";this.x=a;this.y=d+this.trackBorderWidth;this.width=e;this.xOffset=this.height=c;this.yOffset=f;b?(this.width=this.yOffset=e=f=this.size,this.xOffset=d=0,this.barWidth=c-2*e,this.x=a+=this.options.margin):(this.height=this.xOffset=c=d=this.size,this.barWidth=e-2*c,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:e,height:c});this.scrollbarButtons[1].attr({translateX:b?0:e-d,translateY:b? +c-f:0})},drawScrollbarButton:function(a){var b=this.renderer,d=this.scrollbarButtons,c=this.options,e=this.size,f;f=b.g().add(this.group);d.push(f);f=b.rect().addClass("highcharts-scrollbar-button").add(f);f.attr({stroke:c.buttonBorderColor,"stroke-width":c.buttonBorderWidth,fill:c.buttonBackgroundColor});f.attr(f.crisp({x:-.5,y:-.5,width:e+1,height:e+1,r:c.buttonBorderRadius},f.strokeWidth()));f=b.path(this.swapXY(["M",e/2+(a?-1:1),e/2-3,"L",e/2+(a?-1:1),e/2+3,"L",e/2+(a?2:-2),e/2],c.vertical)).addClass("highcharts-scrollbar-arrow").add(d[a]); +f.attr({fill:c.buttonArrowColor})},swapXY:function(a,d){var b=a.length,c;if(d)for(d=0;d=k?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),c=a.options.vertical? +"chartY":"chartX",e=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][c]||(d=a.cursorToScrollbarPosition(d)[c],c=a[c],c=d-c,a.hasDragged=!0,a.updatePosition(e[0]+c,e[1]+c),a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b); +b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=H(a.to-a.from)*a.options.step;a.updatePosition(H(a.from-d),H(a.to-d));k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b), +c=a.to-a.from,e=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>e||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+c,a.to+c):a.updatePosition(a.from-c,a.to-c);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a, +d){1a&&(d=H(d-a),a=0);this.from=a;this.to=d},update:function(a){this.destroy();this.init(this.chart.renderer,g(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],d=this.scrollbarButtons,e=this.scrollbarGroup.element,c=this.mouseDownHandler,f=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[d[a[0]].element,"click",this.buttonToMinClick],[d[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e, +"mousedown",c],[w,"mousemove",f],[w,"mouseup",g]];m&&a.push([e,"touchstart",c],[w,"touchmove",f],[w,"touchend",g]);t(a,function(a){B.apply(null,a)});this._events=a},removeEvents:function(){t(this._events,function(a){C.apply(null,a)});this._events=void 0},destroy:function(){var a=this.chart.scroller;this.removeEvents();t(["track","scrollbarRifles","scrollbar","scrollbarGroup","group"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&(a.scrollbar=null,r(a.scrollbarButtons))}}; +f(G.prototype,"init",function(a){var b=this;a.apply(b,[].slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new D(b.chart.renderer,b.options.scrollbar,b.chart),B(b.scrollbar,"changed",function(a){var c=Math.min(h(b.options.min,b.min),b.min,b.dataMin),d=Math.max(h(b.options.max,b.max),b.max,b.dataMax)-c,e;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(e=c+d*this.to,c+=d*this.from):(e= +c+d*(1-this.from),c+=d*(1-this.to));b.setExtremes(c,e,!0,!1,a)}))});f(G.prototype,"render",function(a){var b=Math.min(h(this.options.min,this.min),this.min,this.dataMin),d=Math.max(h(this.options.max,this.max),this.max,this.dataMax),c=this.scrollbar,e;a.apply(this,[].slice.call(arguments,1));c&&(this.horiz?c.position(this.left,this.top+this.height+this.offset+2+(this.opposite?0:this.axisTitleMargin),this.width,this.height):c.position(this.left+this.width+2+this.offset+(this.opposite?this.axisTitleMargin: +0),this.top,this.width,this.height),isNaN(b)||isNaN(d)||!l(this.min)||!l(this.max)?c.setRange(0,0):(e=(this.min-b)/(d-b),b=(this.max-b)/(d-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(e,b):c.setRange(1-b,1-e)))});f(G.prototype,"getOffset",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,[].slice.call(arguments,1));d&&(this.chart.axisOffset[b]+=d.size+d.options.margin)});f(G.prototype,"destroy",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy()); +a.apply(this,[].slice.call(arguments,1))});a.Scrollbar=D})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.color,l=a.defaultOptions,r=a.defined,w=a.destroyObjectProperties,t=a.doc,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.grep,C=a.hasTouch,f=a.isNumber,d=a.isObject,b=a.isTouchDevice,q=a.merge,E=a.pick,c=a.removeEvent,F=a.Scrollbar,n=a.Series,A=a.seriesTypes,x=a.wrap,J=[].concat(a.defaultDataGroupingUnits),y=function(a){var b=h(arguments,f);if(b.length)return Math[a].apply(0, +b)};J[4]=["day",[1,2,3,4]];J[5]=["week",[1,2,3]];A=void 0===A.areaspline?"line":"areaspline";g(l,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:p("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",outlineWidth:1,series:{type:A,color:"#335cad",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:J},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series", +className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}}); +D.prototype={drawHandle:function(a,b){var c=this.chart.renderer,d=this.handles;this.rendered||(d[b]=c.path(["M",-4.5,.5,"L",3.5,.5,3.5,15.5,-4.5,15.5,-4.5,.5,"M",-1.5,4,"L",-1.5,12,"M",.5,4,"L",.5,12]).attr({zIndex:10-b}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][b]).add(),c=this.navigatorOptions.handles,d[b].attr({fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":1}).css({cursor:"ew-resize"}));d[b][this.rendered&&!this.hasDragged?"animate":"attr"]({translateX:Math.round(this.scrollerLeft+ +this.scrollbarHeight+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},update:function(a){this.destroy();q(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var e=this.chart,g=e.renderer,k,h,l,n;n=this.scrollbarHeight;var m=this.xAxis,p=this.navigatorOptions,u=p.maskInside,q=this.height,v=this.top,t=this.navigatorEnabled,x=this.outlineHeight,y;y=this.rendered;if(f(a)&&f(b)&&(!this.hasDragged||r(c))&&(this.navigatorLeft=k=E(m.left,e.plotLeft+ +n),this.navigatorWidth=h=E(m.len,e.plotWidth-2*n),this.scrollerLeft=l=k-n,this.scrollerWidth=n=n=h+2*n,c=E(c,m.translate(a)),d=E(d,m.translate(b)),f(c)&&Infinity!==Math.abs(c)||(c=0,d=n),!(m.translate(d,!0)-m.translate(c,!0)f&&tp+d-u&&rk&&re?e=0:e+v>=q&&(e=q-v,x=h.getUnionExtremes().dataMax),e!==d&&(h.fixedWidth=v,d=l.toFixedRange(e, +e+v,null,x),c.setExtremes(d.min,d.max,!0,null,{trigger:"navigator"}))))};h.mouseMoveHandler=function(b){var c=h.scrollbarHeight,d=h.navigatorLeft,e=h.navigatorWidth,f=h.scrollerLeft,g=h.scrollerWidth,k=h.range,l;b.touches&&0===b.touches[0].pageX||(b=a.pointer.normalize(b),l=b.chartX,lf+g-c&&(l=f+g-c),h.grabbedLeft?(h.hasDragged=!0,h.render(0,0,l-d,h.otherHandlePos)):h.grabbedRight?(h.hasDragged=!0,h.render(0,0,h.otherHandlePos,l-d)):h.grabbedCenter&&(h.hasDragged=!0,le+n-k&&(l=e+ +n-k),h.render(0,0,l-n,l-n+k)),h.hasDragged&&h.scrollbar&&h.scrollbar.options.liveRedraw&&(b.DOMType=b.type,setTimeout(function(){h.mouseUpHandler(b)},0)))};h.mouseUpHandler=function(b){var c,d,e=b.DOMEvent||b;if(h.hasDragged||"scrollbar"===b.trigger)h.zoomedMin===h.otherHandlePos?c=h.fixedExtreme:h.zoomedMax===h.otherHandlePos&&(d=h.fixedExtreme),h.zoomedMax===h.navigatorWidth&&(d=h.getUnionExtremes().dataMax),c=l.toFixedRange(h.zoomedMin,h.zoomedMax,c,d),r(c.min)&&a.xAxis[0].setExtremes(c.min,c.max, +!0,h.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:e});"mousemove"!==b.DOMType&&(h.grabbedLeft=h.grabbedRight=h.grabbedCenter=h.fixedWidth=h.fixedExtreme=h.otherHandlePos=h.hasDragged=n=null)};var c=a.xAxis.length,f=a.yAxis.length,m=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraBottomMargin=h.outlineHeight+d.margin;a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=l=new G(a,q({breaks:m.options.breaks,ordinal:m.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis", +isX:!0,type:"datetime",index:c,height:g,offset:0,offsetLeft:k,offsetRight:-k,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1})),h.yAxis=new G(a,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,height:g,offset:0,index:f,zoomEnabled:!1})),e||d.series.data?h.addBaseSeries():0===a.series.length&&x(a,"redraw",function(b,c){0=Math.round(a.navigatorWidth);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},destroy:function(){this.removeEvents();this.xAxis&&(m(this.chart.xAxis,this.xAxis),m(this.chart.axes,this.xAxis));this.yAxis&&(m(this.chart.yAxis,this.yAxis),m(this.chart.axes,this.yAxis));k(this.series||[],function(a){a.destroy&&a.destroy()});k("series xAxis yAxis leftShade rightShade outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" "), +function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);k([this.handles,this.elementsToDestroy],function(a){w(a)},this)}};a.Navigator=D;x(G.prototype,"zoom",function(a,b,c){var d=this.chart,e=d.options,f=e.chart.zoomType,g=e.navigator,e=e.rangeSelector,h;this.isXAxis&&(g&&g.enabled||e&&e.enabled)&&("x"===f?d.resetZoomButton="blocked":"y"===f?h=!1:"xy"===f&&(d=this.previousZoom,r(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!== +h?h:a.call(this,b,c)});x(H.prototype,"init",function(a,b,c){B(this,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});a.call(this,b,c)});x(H.prototype,"getMargins",function(a){var b=this.legend,c=b.options,d=this.scroller,e,f;a.apply(this,[].slice.call(arguments,1));d&&(e=d.xAxis,f=d.yAxis,d.top=d.navigatorOptions.top||this.chartHeight-d.height-d.scrollbarHeight-this.spacing[2]-("bottom"===c.verticalAlign&&c.enabled&& +!c.floating?b.legendHeight+E(c.margin,10):0),e&&f&&(e.options.top=f.options.top=d.top,e.setAxisSize(),f.setAxisSize()))});x(n.prototype,"addPoint",function(a,b,c,f,g){var h=this.options.turboThreshold;h&&this.xData.length>h&&d(b,!0)&&this.chart.scroller&&e(20,!0);a.call(this,b,c,f,g)});x(H.prototype,"addSeries",function(a,b,c,d){a=a.call(this,b,!1,d);this.scroller&&this.scroller.setBaseSeries();E(c,!0)&&this.redraw();return a});x(n.prototype,"update",function(a,b,c){a.call(this,b,!1);this.chart.scroller&& +this.chart.scroller.setBaseSeries();E(c,!0)&&this.chart.redraw()})})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.css,l=a.createElement,r=a.dateFormat,w=a.defaultOptions,t=w.global.useUTC,k=a.defined,m=a.destroyObjectProperties,e=a.discardElement,g=a.each,h=a.extend,C=a.fireEvent,f=a.Date,d=a.isNumber,b=a.merge,q=a.pick,E=a.pInt,c=a.splat,F=a.wrap;h(w,{rangeSelector:{buttonTheme:{"stroke-width":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:"right"}, +labelStyle:{color:"#666666"}}});w.lang=b(w.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(a,b){var e=this,f=e.chart,h=e.buttonOptions[a],k=f.xAxis[0],l=f.scroller&&f.scroller.getUnionExtremes()||k||{},n=l.dataMin,m=l.dataMax,p,r=k&&Math.round(Math.min(k.max,q(m,k.max))),w=h.type,z,l=h._range,A,C,D,E=h.dataGrouping;if(null!==n&&null!==m){f.fixedRange=l;E&&(this.forcedDataGrouping=!0,G.prototype.setDataGrouping.call(k||{chart:this.chart}, +E,!1));if("month"===w||"year"===w)k?(w={range:h,max:r,dataMin:n,dataMax:m},p=k.minFromRange.call(w),d(w.newMax)&&(r=w.newMax)):l=h;else if(l)p=Math.max(r-l,n),r=Math.min(p+l,m);else if("ytd"===w)if(k)void 0===m&&(n=Number.MAX_VALUE,m=Number.MIN_VALUE,g(f.series,function(a){a=a.xData;n=Math.min(a[0],n);m=Math.max(a[a.length-1],m)}),b=!1),r=e.getYTDExtremes(m,n,t),p=A=r.min,r=r.max;else{B(f,"beforeRender",function(){e.clickButton(a)});return}else"all"===w&&k&&(p=n,r=m);e.setSelected(a);k?k.setExtremes(p, +r,q(b,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:h}):(z=c(f.options.xAxis)[0],D=z.range,z.range=l,C=z.min,z.min=A,B(f,"load",function(){z.range=D;z.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons|| +[].concat(b.defaultButtons),e=c.selected,f=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&C(a,"blur");c&&c.blur&&C(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=B(a.container,"mousedown",f);this.unResize=B(a,"resize",f);g(d,b.computeButtonRange);void 0!==e&&d[e]&&this.clickButton(e,!1);B(a,"load",function(){B(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&& +b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,b=a.xAxis[0],c=Math.round(b.max-b.min),e=!b.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||b,f=a.dataMin,h=a.dataMax,a=this.getYTDExtremes(h,f,t),k=a.min,l=a.max,m=this.selected,p=d(m),q=this.options.allButtonsEnabled,r=this.buttons;g(this.buttonOptions,function(a,d){var g=a._range,n=a.type,u=a.count||1;a=r[d];var t=0;d=d===m;var v=g>h-f,x=g=864E5*{month:28,year:365}[n]*u&&c<=864E5*{month:31,year:366}[n]*u?g=!0:"ytd"===n?(g=l-k===c,y=!d):"all"===n&&(g=b.max-b.min>=h-f,w=!d&&p&&g);n=!q&&(v||x||w||e);g=d&&g||g&&!p&&!y;n?t=3:g&&(p=!0,t=2);a.state!==t&&a.setState(t)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if("month"===b||"year"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,b){var c= +this.chart.options.rangeSelector,d=this[a+"Input"];k(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=r(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:r(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];p(this[a+"Input"],{left:b.translateX+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){p(this[a+"Input"],{border:0,width:"1px",height:"1px"}); +this.setInputValue(a)},drawInput:function(a){function c(){var a=r.value,b=(m.inputDateParser||Date.parse)(a),c=f.xAxis[0],g=f.scroller&&f.scroller.xAxis?f.scroller.xAxis:c,h=g.dataMin,g=g.dataMax;b!==r.previousValue&&(r.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(E(b[0]),E(b[1])-1,E(b[2]))),d(b)&&(t||(b+=6E4*(new Date).getTimezoneOffset()),q?b>e.maxInput.HCTime?b=void 0:bg&&(b=g),void 0!==b&&c.setExtremes(q?b:c.min,q?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))} +var e=this,f=e.chart,g=f.renderer.style||{},k=f.renderer,m=f.options.rangeSelector,n=e.div,q="min"===a,r,B,C=this.inputGroup;this[a+"Label"]=B=k.label(w.lang[q?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(C);C.offset+=B.width+5;this[a+"DateBox"]=k=k.label("",C.offset).addClass("highcharts-range-input").attr({padding:2,width:m.inputBoxWidth||90,height:m.inputBoxHeight||17,stroke:m.inputBoxBorderColor||"#cccccc","stroke-width":1, +"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()}).add(C);C.offset+=k.width+(q?10:0);this[a+"Input"]=r=l("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:f.plotTop+"px"},n);B.css(b(g,m.labelStyle));k.css(b({color:"#333333"},g,m.inputStyle));p(r,h({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:g.fontSize,fontFamily:g.fontFamily,left:"-9em"},m.inputStyle));r.onfocus=function(){e.showInput(a)};r.onblur= +function(){e.hideInput(a)};r.onchange=c;r.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=q((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,b,c){var d=new f(a),e=d[f.hcGetFullYear]();c=c?f.UTC(e,0,1):+new f(e,0,1);b=Math.max(b||0,c);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(a,b){var c=this,d=c.chart,e=d.renderer,f=d.container,m=d.options, +n=m.exporting&&!1!==m.exporting.enabled&&m.navigation&&m.navigation.buttonOptions,p=m.rangeSelector,r=c.buttons,m=w.lang,t=c.div,t=c.inputGroup,A=p.buttonTheme,z=p.buttonPosition||{},B=p.inputEnabled,C=A&&A.states,D=d.plotLeft,E,G=this.getPosition(),F=c.group,H=c.rendered;!1!==p.enabled&&(H||(c.group=F=e.g("range-selector-buttons").add(),c.zoomText=e.text(m.rangeSelectorZoom,q(z.x,D),15).css(p.labelStyle).add(F),E=q(z.x,D)+c.zoomText.getBBox().width+5,g(c.buttonOptions,function(a,b){r[b]=e.button(a.text, +E,0,function(){c.clickButton(b);c.isActive=!0},A,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(F);E+=r[b].width+q(p.buttonSpacing,5)}),!1!==B&&(c.div=t=l("div",null,{position:"relative",height:0,zIndex:1}),f.parentNode.insertBefore(t,f),c.inputGroup=t=e.g("input-group").add(),t.offset=0,c.drawInput("min"),c.drawInput("max"))),c.updateButtonStates(),F[H?"animate":"attr"]({translateY:G.buttonTop}),!1!==B&&(t.align(h({y:G.inputTop,width:t.offset,x:n&&G.inputTop<(n.y||0)+n.height- +d.spacing[0]?-40:0},p.inputPosition),!0,d.spacingBox),k(B)||(d=F.getBBox(),t[t.alignAttr.translateXc&&(e?a=b-f:b=a+f);d(a)||(a=b=void 0);return{min:a,max:b}};G.prototype.minFromRange=function(){var a=this.range,b={month:"Month",year:"FullYear"}[a.type],c,e=this.max,f,g,h=function(a,c){var d=new Date(a);d["set"+b](d["get"+ +b]()+c);return d.getTime()-a};d(a)?(c=e-a,g=a):(c=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-c));f=q(this.dataMin,Number.MIN_VALUE);d(c)||(c=f);c<=f&&(c=f,void 0===g&&(g=h(c,a.count)),this.newMax=Math.min(c+g,this.dataMax));d(e)||(c=void 0);return c};F(H.prototype,"init",function(a,b,c){B(this,"init",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});a.call(this,b,c)});a.RangeSelector=D})(N);(function(a){var D=a.addEvent,B=a.isNumber;a.Chart.prototype.callbacks.push(function(a){function G(){p= +a.xAxis[0].getExtremes();B(p.min)&&r.render(p.min,p.max)}var p,l=a.scroller,r=a.rangeSelector,w,t;l&&(p=a.xAxis[0].getExtremes(),l.render(p.min,p.max));r&&(t=D(a.xAxis[0],"afterSetExtremes",function(a){r.render(a.min,a.max)}),w=D(a,"redraw",G),G());D(a,"destroy",function(){r&&(w(),t())})})})(N);(function(a){var D=a.arrayMax,B=a.arrayMin,G=a.Axis,H=a.Chart,p=a.defined,l=a.each,r=a.extend,w=a.format,t=a.inArray,k=a.isNumber,m=a.isString,e=a.map,g=a.merge,h=a.pick,C=a.Point,f=a.Renderer,d=a.Series,b= +a.splat,q=a.stop,E=a.SVGRenderer,c=a.VMLRenderer,F=a.wrap,n=d.prototype,A=n.init,x=n.processData,J=C.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,d,f){var k=m(c)||c.nodeName,l=arguments[k?1:0],n=l.series,p=a.getOptions(),q,r=h(l.navigator&&l.navigator.enabled,!0)?{startOnTick:!1,endOnTick:!1}:null,t={marker:{enabled:!1,radius:2}},u={shadow:!1,borderWidth:0};l.xAxis=e(b(l.xAxis||{}),function(a){return g({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"}, +showLastLabel:!0},p.xAxis,a,{type:"datetime",categories:null},r)});l.yAxis=e(b(l.yAxis||{}),function(a){q=h(a.opposite,!0);return g({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},p.yAxis,a)});l.series=null;l=g({chart:{panning:!0,pinchType:"x"},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null,style:{fontSize:"16px"}},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:t,spline:t,area:t,areaspline:t,arearange:t,areasplinerange:t, +column:u,columnrange:u,candlestick:u,ohlc:u}},l,{_stock:!0,chart:{inverted:!1}});l.series=n;return k?new H(c,l,f):new H(l,d)};F(G.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options._stock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=1,"right"):a.call(this,[].slice.call(arguments,1))});F(G.prototype,"getPlotLinePath",function(a, +b,c,d,f,g){var n=this,q=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=n.chart,u=r.renderer,v=n.left,w=n.top,y,x,A,B,C=[],D=[],E,F;if("colorAxis"===n.coll)return a.apply(this,[].slice.call(arguments,1));D=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=n.options[b];return k(a)?[r[b][a]]:m(a)?[r.get(a)]:e(q,function(a){return a[b]})}(n.coll);l(n.isXAxis?r.yAxis:r.xAxis,function(a){if(p(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=p(a.options[b])? +r[b][a.options[b]]:r[b][0];n===b&&D.push(a)}});E=D.length?[]:[n.isXAxis?r.yAxis[0]:r.xAxis[0]];l(D,function(a){-1===t(a,E)&&E.push(a)});F=h(g,n.translate(b,null,null,d));k(F)&&(n.horiz?l(E,function(a){var b;x=a.pos;B=x+a.len;y=A=Math.round(F+n.transB);if(yv+n.width)f?y=A=Math.min(Math.max(v,y),v+n.width):b=!0;b||C.push("M",y,x,"L",A,B)}):l(E,function(a){var b;y=a.pos;A=y+a.len;x=B=Math.round(w+n.height-F);if(xw+n.height)f?x=B=Math.min(Math.max(w,x),n.top+n.height):b=!0;b||C.push("M",y, +x,"L",A,B)}));return 0=e&&(x=-(l.translateX+b.width-e));l.attr({x:m+x,y:k,anchorX:g?m:this.opposite?0:a.chartWidth,anchorY:g?this.opposite?a.chartHeight:0:k+b.height/2})}});n.init=function(){A.apply(this,arguments);this.setCompare(this.options.compare)};n.setCompare=function(a){this.modifyValue= +"value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b=b/d*100-100,c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};n.processData=function(){var a,b=-1,c,d,e,f;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=t("close",this.pointArrayMap),-1===b&&(b=t(this.pointValKey||"y",this.pointArrayMap))),a=0;a< +e-1;a++)if(f=-1=this.xAxis.min&&0!==f){this.compareValue=f;break}};F(n,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=B(b),this.dataMax=D(b))});G.prototype.setCompare=function(a,b){this.isXAxis||(l(this.series,function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};C.prototype.tooltipFormatter=function(b){b=b.replace("{point.change}",(0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 '; + else + var expandButton = ''; + + return '' + expandButton + '' + ellipsedLabel({ name: item.name, parentClass: "nav-tooltip", childClass: "nav-label" }) + ''; +} + +function menuItemsForGroup(group, level, parent) { + var items = ''; + + if (level > 0) + items += menuItem(group, level - 1, parent, true); + + $.each(group.contents, function (contentName, content) { + if (content.type == 'GROUP') + items += menuItemsForGroup(content, level + 1, group.pathFormatted); + else if (content.type == 'REQUEST') + items += menuItem(content, level, group.pathFormatted); + }); + + return items; +} + +function setDetailsMenu(){ + $('.nav ul').append(menuItemsForGroup(stats, 0)); + $('.nav').expandable(); + $('.nav-tooltip').popover({trigger:'hover'}); +} + +function setGlobalMenu(){ + $('.nav ul') + .append('
  • Ranges
  • ') + .append('
  • Stats
  • ') + .append('
  • Active Users
  • ') + .append('
  • Requests / sec
  • ') + .append('
  • Responses / sec
  • '); +} + +function getLink(link){ + var a = link.split('/'); + return (a.length<=1)? link : a[a.length-1]; +} + +function expandUp(li) { + const parentId = li.attr("data-parent"); + if (parentId != "ROOT") { + const span = $('#' + parentId); + const parentLi = span.parents('li').first(); + span.expand(parentLi, false); + expandUp(parentLi); + } +} + +function setActiveMenu(){ + $('.nav a').each(function() { + const navA = $(this) + if(!navA.hasClass('expand-button') && navA.attr('href') == getLink(window.location.pathname)) { + const li = $(this).parents('li').first(); + li.addClass('on'); + expandUp(li); + return false; + } + }); +} diff --git a/webapp/loadTests/250users1minute/js/stats.js b/webapp/loadTests/250users1minute/js/stats.js new file mode 100644 index 0000000..0a14e9b --- /dev/null +++ b/webapp/loadTests/250users1minute/js/stats.js @@ -0,0 +1,4065 @@ +var stats = { + type: "GROUP", +name: "All Requests", +path: "", +pathFormatted: "group_missing-name-b06d1", +stats: { + "name": "All Requests", + "numberOfRequests": { + "total": "5574", + "ok": "4494", + "ko": "1080" + }, + "minResponseTime": { + "total": "1", + "ok": "1", + "ko": "178" + }, + "maxResponseTime": { + "total": "13013", + "ok": "13013", + "ko": "2710" + }, + "meanResponseTime": { + "total": "695", + "ok": "583", + "ko": "1160" + }, + "standardDeviation": { + "total": "1264", + "ok": "1306", + "ko": "934" + }, + "percentiles1": { + "total": "128", + "ok": "60", + "ko": "819" + }, + "percentiles2": { + "total": "858", + "ok": "661", + "ko": "2044" + }, + "percentiles3": { + "total": "2581", + "ok": "2567", + "ko": "2582" + }, + "percentiles4": { + "total": "6373", + "ok": "7076", + "ko": "2663" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3522, + "percentage": 63 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 333, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 639, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1080, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": "51.611", + "ok": "41.611", + "ko": "10" + } +}, +contents: { +"req_request-0-684d2": { + type: "REQUEST", + name: "request_0", +path: "request_0", +pathFormatted: "req_request-0-684d2", +stats: { + "name": "request_0", + "numberOfRequests": { + "total": "250", + "ok": "250", + "ko": "0" + }, + "minResponseTime": { + "total": "1", + "ok": "1", + "ko": "-" + }, + "maxResponseTime": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "meanResponseTime": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "standardDeviation": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "percentiles1": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "percentiles2": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles3": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles4": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "2.315", + "ok": "2.315", + "ko": "-" + } +} + },"req_request-1-46da4": { + type: "REQUEST", + name: "request_1", +path: "request_1", +pathFormatted: "req_request-1-46da4", +stats: { + "name": "request_1", + "numberOfRequests": { + "total": "250", + "ok": "250", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "47", + "ok": "47", + "ko": "-" + }, + "meanResponseTime": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "standardDeviation": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles3": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles4": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "2.315", + "ok": "2.315", + "ko": "-" + } +} + },"req_request-2-93baf": { + type: "REQUEST", + name: "request_2", +path: "request_2", +pathFormatted: "req_request-2-93baf", +stats: { + "name": "request_2", + "numberOfRequests": { + "total": "250", + "ok": "149", + "ko": "101" + }, + "minResponseTime": { + "total": "178", + "ok": "413", + "ko": "178" + }, + "maxResponseTime": { + "total": "4136", + "ok": "4136", + "ko": "2635" + }, + "meanResponseTime": { + "total": "1181", + "ok": "1142", + "ko": "1237" + }, + "standardDeviation": { + "total": "814", + "ok": "755", + "ko": "891" + }, + "percentiles1": { + "total": "826", + "ok": "825", + "ko": "827" + }, + "percentiles2": { + "total": "1780", + "ok": "1642", + "ko": "2029" + }, + "percentiles3": { + "total": "2598", + "ok": "2765", + "ko": "2580" + }, + "percentiles4": { + "total": "2990", + "ok": "3074", + "ko": "2602" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 70, + "percentage": 28 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 31, + "percentage": 12 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 48, + "percentage": 19 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 101, + "percentage": 40 +}, + "meanNumberOfRequestsPerSecond": { + "total": "2.315", + "ok": "1.38", + "ko": "0.935" + } +} + },"req_request-3-d0973": { + type: "REQUEST", + name: "request_3", +path: "request_3", +pathFormatted: "req_request-3-d0973", +stats: { + "name": "request_3", + "numberOfRequests": { + "total": "149", + "ok": "149", + "ko": "0" + }, + "minResponseTime": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "maxResponseTime": { + "total": "837", + "ok": "837", + "ko": "-" + }, + "meanResponseTime": { + "total": "242", + "ok": "242", + "ko": "-" + }, + "standardDeviation": { + "total": "157", + "ok": "157", + "ko": "-" + }, + "percentiles1": { + "total": "186", + "ok": "186", + "ko": "-" + }, + "percentiles2": { + "total": "343", + "ok": "343", + "ko": "-" + }, + "percentiles3": { + "total": "569", + "ok": "569", + "ko": "-" + }, + "percentiles4": { + "total": "694", + "ok": "694", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 148, + "percentage": 99 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 1 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.38", + "ok": "1.38", + "ko": "-" + } +} + },"req_request-5-48829": { + type: "REQUEST", + name: "request_5", +path: "request_5", +pathFormatted: "req_request-5-48829", +stats: { + "name": "request_5", + "numberOfRequests": { + "total": "149", + "ok": "82", + "ko": "67" + }, + "minResponseTime": { + "total": "178", + "ok": "385", + "ko": "178" + }, + "maxResponseTime": { + "total": "2865", + "ok": "2865", + "ko": "2556" + }, + "meanResponseTime": { + "total": "945", + "ok": "948", + "ko": "942" + }, + "standardDeviation": { + "total": "703", + "ok": "497", + "ko": "892" + }, + "percentiles1": { + "total": "800", + "ok": "867", + "ko": "542" + }, + "percentiles2": { + "total": "1325", + "ok": "1257", + "ko": "1426" + }, + "percentiles3": { + "total": "2495", + "ok": "1766", + "ko": "2501" + }, + "percentiles4": { + "total": "2548", + "ok": "2199", + "ko": "2545" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 38, + "percentage": 26 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 23, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 21, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 67, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.38", + "ok": "0.759", + "ko": "0.62" + } +} + },"req_request-4-e7d1b": { + type: "REQUEST", + name: "request_4", +path: "request_4", +pathFormatted: "req_request-4-e7d1b", +stats: { + "name": "request_4", + "numberOfRequests": { + "total": "149", + "ok": "77", + "ko": "72" + }, + "minResponseTime": { + "total": "179", + "ok": "410", + "ko": "179" + }, + "maxResponseTime": { + "total": "2573", + "ok": "2004", + "ko": "2573" + }, + "meanResponseTime": { + "total": "884", + "ok": "850", + "ko": "921" + }, + "standardDeviation": { + "total": "660", + "ok": "398", + "ko": "855" + }, + "percentiles1": { + "total": "672", + "ok": "684", + "ko": "567" + }, + "percentiles2": { + "total": "1156", + "ok": "1087", + "ko": "1243" + }, + "percentiles3": { + "total": "2489", + "ok": "1751", + "ko": "2493" + }, + "percentiles4": { + "total": "2523", + "ok": "1944", + "ko": "2543" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 20, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 13, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 72, + "percentage": 48 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.38", + "ok": "0.713", + "ko": "0.667" + } +} + },"req_request-6-027a9": { + type: "REQUEST", + name: "request_6", +path: "request_6", +pathFormatted: "req_request-6-027a9", +stats: { + "name": "request_6", + "numberOfRequests": { + "total": "149", + "ok": "86", + "ko": "63" + }, + "minResponseTime": { + "total": "178", + "ok": "548", + "ko": "178" + }, + "maxResponseTime": { + "total": "3021", + "ok": "3021", + "ko": "2616" + }, + "meanResponseTime": { + "total": "1096", + "ok": "1164", + "ko": "1004" + }, + "standardDeviation": { + "total": "708", + "ok": "529", + "ko": "889" + }, + "percentiles1": { + "total": "909", + "ok": "1127", + "ko": "785" + }, + "percentiles2": { + "total": "1488", + "ok": "1524", + "ko": "1416" + }, + "percentiles3": { + "total": "2509", + "ok": "2052", + "ko": "2538" + }, + "percentiles4": { + "total": "2653", + "ok": "2737", + "ko": "2582" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 35, + "percentage": 23 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 63, + "percentage": 42 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.38", + "ok": "0.796", + "ko": "0.583" + } +} + },"req_request-7-f222f": { + type: "REQUEST", + name: "request_7", +path: "request_7", +pathFormatted: "req_request-7-f222f", +stats: { + "name": "request_7", + "numberOfRequests": { + "total": "149", + "ok": "83", + "ko": "66" + }, + "minResponseTime": { + "total": "178", + "ok": "364", + "ko": "178" + }, + "maxResponseTime": { + "total": "2663", + "ok": "2406", + "ko": "2663" + }, + "meanResponseTime": { + "total": "901", + "ok": "907", + "ko": "894" + }, + "standardDeviation": { + "total": "690", + "ok": "466", + "ko": "896" + }, + "percentiles1": { + "total": "757", + "ok": "837", + "ko": "549" + }, + "percentiles2": { + "total": "1188", + "ok": "1167", + "ko": "1195" + }, + "percentiles3": { + "total": "2500", + "ok": "1644", + "ko": "2539" + }, + "percentiles4": { + "total": "2605", + "ok": "2287", + "ko": "2658" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 41, + "percentage": 28 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 23, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 19, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 66, + "percentage": 44 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.38", + "ok": "0.769", + "ko": "0.611" + } +} + },"req_request-5-redir-affb3": { + type: "REQUEST", + name: "request_5 Redirect 1", +path: "request_5 Redirect 1", +pathFormatted: "req_request-5-redir-affb3", +stats: { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": "82", + "ok": "82", + "ko": "0" + }, + "minResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "maxResponseTime": { + "total": "1449", + "ok": "1449", + "ko": "-" + }, + "meanResponseTime": { + "total": "453", + "ok": "453", + "ko": "-" + }, + "standardDeviation": { + "total": "376", + "ok": "376", + "ko": "-" + }, + "percentiles1": { + "total": "334", + "ok": "334", + "ko": "-" + }, + "percentiles2": { + "total": "729", + "ok": "729", + "ko": "-" + }, + "percentiles3": { + "total": "1173", + "ok": "1173", + "ko": "-" + }, + "percentiles4": { + "total": "1437", + "ok": "1437", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 65, + "percentage": 79 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 16 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 5 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.759", + "ok": "0.759", + "ko": "-" + } +} + },"req_request-8-ef0c8": { + type: "REQUEST", + name: "request_8", +path: "request_8", +pathFormatted: "req_request-8-ef0c8", +stats: { + "name": "request_8", + "numberOfRequests": { + "total": "250", + "ok": "137", + "ko": "113" + }, + "minResponseTime": { + "total": "178", + "ok": "458", + "ko": "178" + }, + "maxResponseTime": { + "total": "4207", + "ok": "4207", + "ko": "2649" + }, + "meanResponseTime": { + "total": "1376", + "ok": "1510", + "ko": "1213" + }, + "standardDeviation": { + "total": "887", + "ok": "831", + "ko": "926" + }, + "percentiles1": { + "total": "1248", + "ok": "1286", + "ko": "820" + }, + "percentiles2": { + "total": "1989", + "ok": "1800", + "ko": "2039" + }, + "percentiles3": { + "total": "2807", + "ok": "3556", + "ko": "2577" + }, + "percentiles4": { + "total": "3801", + "ok": "3844", + "ko": "2628" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 27, + "percentage": 11 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 33, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 77, + "percentage": 31 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 113, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": "2.315", + "ok": "1.269", + "ko": "1.046" + } +} + },"req_request-8-redir-98b2a": { + type: "REQUEST", + name: "request_8 Redirect 1", +path: "request_8 Redirect 1", +pathFormatted: "req_request-8-redir-98b2a", +stats: { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": "137", + "ok": "116", + "ko": "21" + }, + "minResponseTime": { + "total": "181", + "ok": "194", + "ko": "181" + }, + "maxResponseTime": { + "total": "10490", + "ok": "10490", + "ko": "2575" + }, + "meanResponseTime": { + "total": "2060", + "ok": "2200", + "ko": "1283" + }, + "standardDeviation": { + "total": "2713", + "ok": "2890", + "ko": "1072" + }, + "percentiles1": { + "total": "989", + "ok": "1001", + "ko": "800" + }, + "percentiles2": { + "total": "1980", + "ok": "1726", + "ko": "2510" + }, + "percentiles3": { + "total": "9136", + "ok": "9637", + "ko": "2558" + }, + "percentiles4": { + "total": "10430", + "ok": "10454", + "ko": "2572" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 45, + "percentage": 33 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 24, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 47, + "percentage": 34 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 21, + "percentage": 15 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.269", + "ok": "1.074", + "ko": "0.194" + } +} + },"req_request-8-redir-fc911": { + type: "REQUEST", + name: "request_8 Redirect 2", +path: "request_8 Redirect 2", +pathFormatted: "req_request-8-redir-fc911", +stats: { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": "116", + "ok": "94", + "ko": "22" + }, + "minResponseTime": { + "total": "190", + "ok": "235", + "ko": "190" + }, + "maxResponseTime": { + "total": "3668", + "ok": "3668", + "ko": "2677" + }, + "meanResponseTime": { + "total": "1213", + "ok": "1081", + "ko": "1773" + }, + "standardDeviation": { + "total": "892", + "ok": "840", + "ko": "888" + }, + "percentiles1": { + "total": "870", + "ok": "814", + "ko": "1952" + }, + "percentiles2": { + "total": "1614", + "ok": "1375", + "ko": "2565" + }, + "percentiles3": { + "total": "3137", + "ok": "3188", + "ko": "2658" + }, + "percentiles4": { + "total": "3572", + "ok": "3620", + "ko": "2673" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 45, + "percentage": 39 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 19 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 27, + "percentage": 23 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 22, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": "1.074", + "ok": "0.87", + "ko": "0.204" + } +} + },"req_request-8-redir-e875c": { + type: "REQUEST", + name: "request_8 Redirect 3", +path: "request_8 Redirect 3", +pathFormatted: "req_request-8-redir-e875c", +stats: { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "maxResponseTime": { + "total": "31", + "ok": "31", + "ko": "-" + }, + "meanResponseTime": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "standardDeviation": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles1": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "percentiles2": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles3": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "percentiles4": { + "total": "30", + "ok": "30", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-12-61da2": { + type: "REQUEST", + name: "request_12", +path: "request_12", +pathFormatted: "req_request-12-61da2", +stats: { + "name": "request_12", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "maxResponseTime": { + "total": "53", + "ok": "53", + "ko": "-" + }, + "meanResponseTime": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles3": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "percentiles4": { + "total": "36", + "ok": "36", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-22-8ecb1": { + type: "REQUEST", + name: "request_22", +path: "request_22", +pathFormatted: "req_request-22-8ecb1", +stats: { + "name": "request_22", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "maxResponseTime": { + "total": "94", + "ok": "94", + "ko": "-" + }, + "meanResponseTime": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles2": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "percentiles3": { + "total": "77", + "ok": "77", + "ko": "-" + }, + "percentiles4": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-14-a0e30": { + type: "REQUEST", + name: "request_14", +path: "request_14", +pathFormatted: "req_request-14-a0e30", +stats: { + "name": "request_14", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "meanResponseTime": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles2": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "percentiles3": { + "total": "29", + "ok": "29", + "ko": "-" + }, + "percentiles4": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-21-be4cb": { + type: "REQUEST", + name: "request_21", +path: "request_21", +pathFormatted: "req_request-21-be4cb", +stats: { + "name": "request_21", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "maxResponseTime": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "meanResponseTime": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "percentiles2": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "percentiles3": { + "total": "74", + "ok": "74", + "ko": "-" + }, + "percentiles4": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-24-dd0c9": { + type: "REQUEST", + name: "request_24", +path: "request_24", +pathFormatted: "req_request-24-dd0c9", +stats: { + "name": "request_24", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "maxResponseTime": { + "total": "95", + "ok": "95", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles1": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles2": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "percentiles3": { + "total": "82", + "ok": "82", + "ko": "-" + }, + "percentiles4": { + "total": "94", + "ok": "94", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-200-636fa": { + type: "REQUEST", + name: "request_200", +path: "request_200", +pathFormatted: "req_request-200-636fa", +stats: { + "name": "request_200", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "maxResponseTime": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles1": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles2": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "percentiles3": { + "total": "81", + "ok": "81", + "ko": "-" + }, + "percentiles4": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-13-5cca6": { + type: "REQUEST", + name: "request_13", +path: "request_13", +pathFormatted: "req_request-13-5cca6", +stats: { + "name": "request_13", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "maxResponseTime": { + "total": "144", + "ok": "144", + "ko": "-" + }, + "meanResponseTime": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "standardDeviation": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles1": { + "total": "83", + "ok": "83", + "ko": "-" + }, + "percentiles2": { + "total": "101", + "ok": "101", + "ko": "-" + }, + "percentiles3": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "percentiles4": { + "total": "144", + "ok": "144", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-16-24733": { + type: "REQUEST", + name: "request_16", +path: "request_16", +pathFormatted: "req_request-16-24733", +stats: { + "name": "request_16", + "numberOfRequests": { + "total": "94", + "ok": "36", + "ko": "58" + }, + "minResponseTime": { + "total": "110", + "ok": "110", + "ko": "183" + }, + "maxResponseTime": { + "total": "3526", + "ok": "3526", + "ko": "2657" + }, + "meanResponseTime": { + "total": "1177", + "ok": "1121", + "ko": "1212" + }, + "standardDeviation": { + "total": "923", + "ok": "924", + "ko": "920" + }, + "percentiles1": { + "total": "811", + "ok": "780", + "ko": "811" + }, + "percentiles2": { + "total": "1993", + "ok": "1601", + "ko": "2015" + }, + "percentiles3": { + "total": "2615", + "ok": "2907", + "ko": "2583" + }, + "percentiles4": { + "total": "2964", + "ok": "3315", + "ko": "2642" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 15 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 58, + "percentage": 62 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.333", + "ko": "0.537" + } +} + },"req_request-15-56eac": { + type: "REQUEST", + name: "request_15", +path: "request_15", +pathFormatted: "req_request-15-56eac", +stats: { + "name": "request_15", + "numberOfRequests": { + "total": "94", + "ok": "80", + "ko": "14" + }, + "minResponseTime": { + "total": "95", + "ok": "95", + "ko": "183" + }, + "maxResponseTime": { + "total": "2564", + "ok": "1963", + "ko": "2564" + }, + "meanResponseTime": { + "total": "507", + "ok": "398", + "ko": "1126" + }, + "standardDeviation": { + "total": "533", + "ok": "314", + "ko": "947" + }, + "percentiles1": { + "total": "346", + "ok": "317", + "ko": "805" + }, + "percentiles2": { + "total": "652", + "ok": "535", + "ko": "2228" + }, + "percentiles3": { + "total": "1609", + "ok": "967", + "ko": "2538" + }, + "percentiles4": { + "total": "2527", + "ok": "1323", + "ko": "2559" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 73, + "percentage": 78 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 1 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 14, + "percentage": 15 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.741", + "ko": "0.13" + } +} + },"req_logo-png-c9c2b": { + type: "REQUEST", + name: "Logo.png", +path: "Logo.png", +pathFormatted: "req_logo-png-c9c2b", +stats: { + "name": "Logo.png", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "maxResponseTime": { + "total": "80", + "ok": "80", + "ko": "-" + }, + "meanResponseTime": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles2": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles3": { + "total": "28", + "ok": "28", + "ko": "-" + }, + "percentiles4": { + "total": "36", + "ok": "36", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-18-f5b64": { + type: "REQUEST", + name: "request_18", +path: "request_18", +pathFormatted: "req_request-18-f5b64", +stats: { + "name": "request_18", + "numberOfRequests": { + "total": "94", + "ok": "39", + "ko": "55" + }, + "minResponseTime": { + "total": "180", + "ok": "189", + "ko": "180" + }, + "maxResponseTime": { + "total": "3839", + "ok": "3839", + "ko": "2639" + }, + "meanResponseTime": { + "total": "1113", + "ok": "1156", + "ko": "1083" + }, + "standardDeviation": { + "total": "949", + "ok": "967", + "ko": "935" + }, + "percentiles1": { + "total": "794", + "ok": "699", + "ko": "796" + }, + "percentiles2": { + "total": "1985", + "ok": "1609", + "ko": "1991" + }, + "percentiles3": { + "total": "2630", + "ok": "2755", + "ko": "2586" + }, + "percentiles4": { + "total": "3239", + "ok": "3594", + "ko": "2634" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 21, + "percentage": 22 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 1 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 55, + "percentage": 59 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.361", + "ko": "0.509" + } +} + },"req_bundle-js-0b837": { + type: "REQUEST", + name: "bundle.js", +path: "bundle.js", +pathFormatted: "req_bundle-js-0b837", +stats: { + "name": "bundle.js", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "maxResponseTime": { + "total": "72", + "ok": "72", + "ko": "-" + }, + "meanResponseTime": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "standardDeviation": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles1": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles2": { + "total": "18", + "ok": "18", + "ko": "-" + }, + "percentiles3": { + "total": "29", + "ok": "29", + "ko": "-" + }, + "percentiles4": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-9-d127e": { + type: "REQUEST", + name: "request_9", +path: "request_9", +pathFormatted: "req_request-9-d127e", +stats: { + "name": "request_9", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "maxResponseTime": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "meanResponseTime": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles2": { + "total": "24", + "ok": "24", + "ko": "-" + }, + "percentiles3": { + "total": "38", + "ok": "38", + "ko": "-" + }, + "percentiles4": { + "total": "83", + "ok": "83", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-10-1cfbe": { + type: "REQUEST", + name: "request_10", +path: "request_10", +pathFormatted: "req_request-10-1cfbe", +stats: { + "name": "request_10", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "maxResponseTime": { + "total": "85", + "ok": "85", + "ko": "-" + }, + "meanResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "percentiles2": { + "total": "24", + "ok": "24", + "ko": "-" + }, + "percentiles3": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "percentiles4": { + "total": "84", + "ok": "84", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-11-f11e8": { + type: "REQUEST", + name: "request_11", +path: "request_11", +pathFormatted: "req_request-11-f11e8", +stats: { + "name": "request_11", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "maxResponseTime": { + "total": "146", + "ok": "146", + "ko": "-" + }, + "meanResponseTime": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "standardDeviation": { + "total": "25", + "ok": "25", + "ko": "-" + }, + "percentiles1": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "percentiles2": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles3": { + "total": "102", + "ok": "102", + "ko": "-" + }, + "percentiles4": { + "total": "142", + "ok": "142", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-242-d6d33": { + type: "REQUEST", + name: "request_242", +path: "request_242", +pathFormatted: "req_request-242-d6d33", +stats: { + "name": "request_242", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "maxResponseTime": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "meanResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles2": { + "total": "25", + "ok": "25", + "ko": "-" + }, + "percentiles3": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "percentiles4": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_css2-family-rob-cf8a9": { + type: "REQUEST", + name: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +path: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +pathFormatted: "req_css2-family-rob-cf8a9", +stats: { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "maxResponseTime": { + "total": "156", + "ok": "156", + "ko": "-" + }, + "meanResponseTime": { + "total": "119", + "ok": "119", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "118", + "ok": "118", + "ko": "-" + }, + "percentiles2": { + "total": "128", + "ok": "128", + "ko": "-" + }, + "percentiles3": { + "total": "138", + "ok": "138", + "ko": "-" + }, + "percentiles4": { + "total": "153", + "ok": "153", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-19-10d85": { + type: "REQUEST", + name: "request_19", +path: "request_19", +pathFormatted: "req_request-19-10d85", +stats: { + "name": "request_19", + "numberOfRequests": { + "total": "94", + "ok": "25", + "ko": "69" + }, + "minResponseTime": { + "total": "182", + "ok": "1025", + "ko": "182" + }, + "maxResponseTime": { + "total": "12796", + "ok": "12796", + "ko": "2630" + }, + "meanResponseTime": { + "total": "1875", + "ok": "3931", + "ko": "1130" + }, + "standardDeviation": { + "total": "2298", + "ok": "3407", + "ko": "950" + }, + "percentiles1": { + "total": "1404", + "ok": "2475", + "ko": "810" + }, + "percentiles2": { + "total": "2526", + "ok": "4683", + "ko": "2032" + }, + "percentiles3": { + "total": "5825", + "ok": "12229", + "ko": "2566" + }, + "percentiles4": { + "total": "12463", + "ok": "12710", + "ko": "2612" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 23, + "percentage": 24 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 69, + "percentage": 73 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.231", + "ko": "0.639" + } +} + },"req_request-23-98f5d": { + type: "REQUEST", + name: "request_23", +path: "request_23", +pathFormatted: "req_request-23-98f5d", +stats: { + "name": "request_23", + "numberOfRequests": { + "total": "94", + "ok": "23", + "ko": "71" + }, + "minResponseTime": { + "total": "182", + "ok": "1041", + "ko": "182" + }, + "maxResponseTime": { + "total": "7554", + "ok": "7554", + "ko": "2663" + }, + "meanResponseTime": { + "total": "1536", + "ok": "2829", + "ko": "1117" + }, + "standardDeviation": { + "total": "1300", + "ok": "1480", + "ko": "900" + }, + "percentiles1": { + "total": "1394", + "ok": "2466", + "ko": "822" + }, + "percentiles2": { + "total": "2483", + "ok": "3430", + "ko": "2011" + }, + "percentiles3": { + "total": "3725", + "ok": "5024", + "ko": "2590" + }, + "percentiles4": { + "total": "5254", + "ok": "7010", + "ko": "2629" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 21, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 71, + "percentage": 76 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.213", + "ko": "0.657" + } +} + },"req_request-20-6804b": { + type: "REQUEST", + name: "request_20", +path: "request_20", +pathFormatted: "req_request-20-6804b", +stats: { + "name": "request_20", + "numberOfRequests": { + "total": "94", + "ok": "25", + "ko": "69" + }, + "minResponseTime": { + "total": "182", + "ok": "513", + "ko": "182" + }, + "maxResponseTime": { + "total": "3841", + "ok": "3841", + "ko": "2627" + }, + "meanResponseTime": { + "total": "1229", + "ok": "1615", + "ko": "1089" + }, + "standardDeviation": { + "total": "919", + "ok": "801", + "ko": "919" + }, + "percentiles1": { + "total": "991", + "ok": "1553", + "ko": "806" + }, + "percentiles2": { + "total": "2003", + "ok": "1832", + "ko": "2008" + }, + "percentiles3": { + "total": "2613", + "ok": "2945", + "ko": "2572" + }, + "percentiles4": { + "total": "3024", + "ok": "3630", + "ko": "2613" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 4, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 69, + "percentage": 73 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.231", + "ko": "0.639" + } +} + },"req_request-222-24864": { + type: "REQUEST", + name: "request_222", +path: "request_222", +pathFormatted: "req_request-222-24864", +stats: { + "name": "request_222", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "31", + "ok": "31", + "ko": "-" + }, + "maxResponseTime": { + "total": "93", + "ok": "93", + "ko": "-" + }, + "meanResponseTime": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "percentiles2": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles3": { + "total": "70", + "ok": "70", + "ko": "-" + }, + "percentiles4": { + "total": "92", + "ok": "92", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-227-2507b": { + type: "REQUEST", + name: "request_227", +path: "request_227", +pathFormatted: "req_request-227-2507b", +stats: { + "name": "request_227", + "numberOfRequests": { + "total": "94", + "ok": "94", + "ko": "0" + }, + "minResponseTime": { + "total": "35", + "ok": "35", + "ko": "-" + }, + "maxResponseTime": { + "total": "80", + "ok": "80", + "ko": "-" + }, + "meanResponseTime": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "percentiles2": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "percentiles3": { + "total": "64", + "ok": "64", + "ko": "-" + }, + "percentiles4": { + "total": "72", + "ok": "72", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.87", + "ko": "-" + } +} + },"req_request-241-2919b": { + type: "REQUEST", + name: "request_241", +path: "request_241", +pathFormatted: "req_request-241-2919b", +stats: { + "name": "request_241", + "numberOfRequests": { + "total": "94", + "ok": "74", + "ko": "20" + }, + "minResponseTime": { + "total": "219", + "ok": "440", + "ko": "219" + }, + "maxResponseTime": { + "total": "4694", + "ok": "4694", + "ko": "2710" + }, + "meanResponseTime": { + "total": "1431", + "ok": "1452", + "ko": "1355" + }, + "standardDeviation": { + "total": "962", + "ok": "951", + "ko": "998" + }, + "percentiles1": { + "total": "1027", + "ok": "1144", + "ko": "853" + }, + "percentiles2": { + "total": "2041", + "ok": "1789", + "ko": "2528" + }, + "percentiles3": { + "total": "3317", + "ok": "3436", + "ko": "2694" + }, + "percentiles4": { + "total": "3957", + "ok": "4115", + "ko": "2707" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 23 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 34, + "percentage": 36 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 20, + "percentage": 21 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.685", + "ko": "0.185" + } +} + },"req_request-240-e27d8": { + type: "REQUEST", + name: "request_240", +path: "request_240", +pathFormatted: "req_request-240-e27d8", +stats: { + "name": "request_240", + "numberOfRequests": { + "total": "94", + "ok": "65", + "ko": "29" + }, + "minResponseTime": { + "total": "227", + "ok": "336", + "ko": "227" + }, + "maxResponseTime": { + "total": "11330", + "ok": "11330", + "ko": "2702" + }, + "meanResponseTime": { + "total": "2223", + "ok": "2602", + "ko": "1373" + }, + "standardDeviation": { + "total": "2417", + "ok": "2747", + "ko": "989" + }, + "percentiles1": { + "total": "1379", + "ok": "1404", + "ko": "869" + }, + "percentiles2": { + "total": "2592", + "ok": "3821", + "ko": "2528" + }, + "percentiles3": { + "total": "7591", + "ok": "9645", + "ko": "2587" + }, + "percentiles4": { + "total": "10441", + "ok": "10718", + "ko": "2673" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 16, + "percentage": 17 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 36, + "percentage": 38 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 29, + "percentage": 31 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.602", + "ko": "0.269" + } +} + },"req_request-243-b078b": { + type: "REQUEST", + name: "request_243", +path: "request_243", +pathFormatted: "req_request-243-b078b", +stats: { + "name": "request_243", + "numberOfRequests": { + "total": "81", + "ok": "81", + "ko": "0" + }, + "minResponseTime": { + "total": "33", + "ok": "33", + "ko": "-" + }, + "maxResponseTime": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "meanResponseTime": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "standardDeviation": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles1": { + "total": "38", + "ok": "38", + "ko": "-" + }, + "percentiles2": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "percentiles3": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "percentiles4": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 81, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.75", + "ok": "0.75", + "ko": "-" + } +} + },"req_request-244-416e5": { + type: "REQUEST", + name: "request_244", +path: "request_244", +pathFormatted: "req_request-244-416e5", +stats: { + "name": "request_244", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "33", + "ok": "33", + "ko": "-" + }, + "maxResponseTime": { + "total": "126", + "ok": "126", + "ko": "-" + }, + "meanResponseTime": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "standardDeviation": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "percentiles1": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "percentiles2": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "percentiles3": { + "total": "61", + "ok": "61", + "ko": "-" + }, + "percentiles4": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.463", + "ok": "0.463", + "ko": "-" + } +} + },"req_request-250-8cb1f": { + type: "REQUEST", + name: "request_250", +path: "request_250", +pathFormatted: "req_request-250-8cb1f", +stats: { + "name": "request_250", + "numberOfRequests": { + "total": "94", + "ok": "65", + "ko": "29" + }, + "minResponseTime": { + "total": "221", + "ok": "278", + "ko": "221" + }, + "maxResponseTime": { + "total": "5085", + "ok": "5085", + "ko": "2709" + }, + "meanResponseTime": { + "total": "1500", + "ok": "1520", + "ko": "1454" + }, + "standardDeviation": { + "total": "1029", + "ok": "1058", + "ko": "957" + }, + "percentiles1": { + "total": "1124", + "ok": "1058", + "ko": "1467" + }, + "percentiles2": { + "total": "2089", + "ok": "2063", + "ko": "2526" + }, + "percentiles3": { + "total": "3443", + "ok": "3465", + "ko": "2657" + }, + "percentiles4": { + "total": "4136", + "ok": "4432", + "ko": "2703" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 18, + "percentage": 19 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 29, + "percentage": 31 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 29, + "percentage": 31 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.602", + "ko": "0.269" + } +} + },"req_request-252-38647": { + type: "REQUEST", + name: "request_252", +path: "request_252", +pathFormatted: "req_request-252-38647", +stats: { + "name": "request_252", + "numberOfRequests": { + "total": "94", + "ok": "58", + "ko": "36" + }, + "minResponseTime": { + "total": "230", + "ok": "433", + "ko": "230" + }, + "maxResponseTime": { + "total": "11384", + "ok": "11384", + "ko": "2635" + }, + "meanResponseTime": { + "total": "2156", + "ok": "2743", + "ko": "1211" + }, + "standardDeviation": { + "total": "2472", + "ok": "2921", + "ko": "869" + }, + "percentiles1": { + "total": "1355", + "ok": "1497", + "ko": "852" + }, + "percentiles2": { + "total": "2554", + "ok": "3198", + "ko": "2076" + }, + "percentiles3": { + "total": "9386", + "ok": "9960", + "ko": "2563" + }, + "percentiles4": { + "total": "11362", + "ok": "11370", + "ko": "2616" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 13, + "percentage": 14 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 10, + "percentage": 11 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 35, + "percentage": 37 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 36, + "percentage": 38 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.537", + "ko": "0.333" + } +} + },"req_request-260-43b5f": { + type: "REQUEST", + name: "request_260", +path: "request_260", +pathFormatted: "req_request-260-43b5f", +stats: { + "name": "request_260", + "numberOfRequests": { + "total": "94", + "ok": "57", + "ko": "37" + }, + "minResponseTime": { + "total": "219", + "ok": "432", + "ko": "219" + }, + "maxResponseTime": { + "total": "4607", + "ok": "4607", + "ko": "2687" + }, + "meanResponseTime": { + "total": "1452", + "ok": "1533", + "ko": "1326" + }, + "standardDeviation": { + "total": "988", + "ok": "1008", + "ko": "944" + }, + "percentiles1": { + "total": "1011", + "ok": "1034", + "ko": "855" + }, + "percentiles2": { + "total": "2107", + "ok": "2081", + "ko": "2115" + }, + "percentiles3": { + "total": "3290", + "ok": "3593", + "ko": "2630" + }, + "percentiles4": { + "total": "3940", + "ok": "4205", + "ko": "2684" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 16, + "percentage": 17 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 14, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 27, + "percentage": 29 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 37, + "percentage": 39 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.528", + "ko": "0.343" + } +} + },"req_request-265-cf160": { + type: "REQUEST", + name: "request_265", +path: "request_265", +pathFormatted: "req_request-265-cf160", +stats: { + "name": "request_265", + "numberOfRequests": { + "total": "94", + "ok": "52", + "ko": "42" + }, + "minResponseTime": { + "total": "218", + "ok": "460", + "ko": "218" + }, + "maxResponseTime": { + "total": "12114", + "ok": "12114", + "ko": "2594" + }, + "meanResponseTime": { + "total": "2290", + "ok": "3070", + "ko": "1325" + }, + "standardDeviation": { + "total": "2497", + "ok": "3030", + "ko": "948" + }, + "percentiles1": { + "total": "1439", + "ok": "1716", + "ko": "1127" + }, + "percentiles2": { + "total": "2585", + "ok": "3506", + "ko": "2534" + }, + "percentiles3": { + "total": "8321", + "ok": "10157", + "ko": "2587" + }, + "percentiles4": { + "total": "11386", + "ok": "11715", + "ko": "2592" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 11 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 35, + "percentage": 37 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 42, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.87", + "ok": "0.481", + "ko": "0.389" + } +} + },"req_request-270-e02a1": { + type: "REQUEST", + name: "request_270", +path: "request_270", +pathFormatted: "req_request-270-e02a1", +stats: { + "name": "request_270", + "numberOfRequests": { + "total": "41", + "ok": "29", + "ko": "12" + }, + "minResponseTime": { + "total": "226", + "ok": "301", + "ko": "226" + }, + "maxResponseTime": { + "total": "4500", + "ok": "4500", + "ko": "2598" + }, + "meanResponseTime": { + "total": "1704", + "ok": "1857", + "ko": "1333" + }, + "standardDeviation": { + "total": "1055", + "ok": "1100", + "ko": "828" + }, + "percentiles1": { + "total": "1453", + "ok": "1451", + "ko": "1454" + }, + "percentiles2": { + "total": "2569", + "ok": "2678", + "ko": "2019" + }, + "percentiles3": { + "total": "3499", + "ok": "3758", + "ko": "2586" + }, + "percentiles4": { + "total": "4272", + "ok": "4340", + "ko": "2596" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 15 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 5 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 21, + "percentage": 51 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 12, + "percentage": 29 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.38", + "ok": "0.269", + "ko": "0.111" + } +} + },"req_request-273-0cd3c": { + type: "REQUEST", + name: "request_273", +path: "request_273", +pathFormatted: "req_request-273-0cd3c", +stats: { + "name": "request_273", + "numberOfRequests": { + "total": "57", + "ok": "50", + "ko": "7" + }, + "minResponseTime": { + "total": "227", + "ok": "326", + "ko": "227" + }, + "maxResponseTime": { + "total": "13013", + "ok": "13013", + "ko": "2685" + }, + "meanResponseTime": { + "total": "2685", + "ok": "2803", + "ko": "1838" + }, + "standardDeviation": { + "total": "3006", + "ok": "3177", + "ko": "817" + }, + "percentiles1": { + "total": "1277", + "ok": "1171", + "ko": "2031" + }, + "percentiles2": { + "total": "4207", + "ok": "4342", + "ko": "2537" + }, + "percentiles3": { + "total": "9435", + "ok": "9504", + "ko": "2645" + }, + "percentiles4": { + "total": "11426", + "ok": "11624", + "ko": "2677" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 17, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 9, + "percentage": 16 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 24, + "percentage": 42 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.528", + "ok": "0.463", + "ko": "0.065" + } +} + },"req_request-277-d0ec5": { + type: "REQUEST", + name: "request_277", +path: "request_277", +pathFormatted: "req_request-277-d0ec5", +stats: { + "name": "request_277", + "numberOfRequests": { + "total": "39", + "ok": "32", + "ko": "7" + }, + "minResponseTime": { + "total": "218", + "ok": "400", + "ko": "218" + }, + "maxResponseTime": { + "total": "13007", + "ok": "13007", + "ko": "2559" + }, + "meanResponseTime": { + "total": "2698", + "ok": "3000", + "ko": "1319" + }, + "standardDeviation": { + "total": "3297", + "ok": "3542", + "ko": "952" + }, + "percentiles1": { + "total": "948", + "ok": "949", + "ko": "844" + }, + "percentiles2": { + "total": "3764", + "ok": "4315", + "ko": "2278" + }, + "percentiles3": { + "total": "9774", + "ok": "10938", + "ko": "2547" + }, + "percentiles4": { + "total": "12916", + "ok": "12933", + "ko": "2557" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 11, + "percentage": 28 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 36 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 18 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.361", + "ok": "0.296", + "ko": "0.065" + } +} + },"req_request-322-a2de9": { + type: "REQUEST", + name: "request_322", +path: "request_322", +pathFormatted: "req_request-322-a2de9", +stats: { + "name": "request_322", + "numberOfRequests": { + "total": "250", + "ok": "250", + "ko": "0" + }, + "minResponseTime": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "maxResponseTime": { + "total": "241", + "ok": "241", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "percentiles1": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "percentiles2": { + "total": "60", + "ok": "60", + "ko": "-" + }, + "percentiles3": { + "total": "78", + "ok": "78", + "ko": "-" + }, + "percentiles4": { + "total": "106", + "ok": "106", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "2.315", + "ok": "2.315", + "ko": "-" + } +} + },"req_request-323-2fefc": { + type: "REQUEST", + name: "request_323", +path: "request_323", +pathFormatted: "req_request-323-2fefc", +stats: { + "name": "request_323", + "numberOfRequests": { + "total": "250", + "ok": "250", + "ko": "0" + }, + "minResponseTime": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "maxResponseTime": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "meanResponseTime": { + "total": "61", + "ok": "61", + "ko": "-" + }, + "standardDeviation": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "percentiles1": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "percentiles2": { + "total": "68", + "ok": "68", + "ko": "-" + }, + "percentiles3": { + "total": "86", + "ok": "86", + "ko": "-" + }, + "percentiles4": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "2.315", + "ok": "2.315", + "ko": "-" + } +} + } +} + +} + +function fillStats(stat){ + $("#numberOfRequests").append(stat.numberOfRequests.total); + $("#numberOfRequestsOK").append(stat.numberOfRequests.ok); + $("#numberOfRequestsKO").append(stat.numberOfRequests.ko); + + $("#minResponseTime").append(stat.minResponseTime.total); + $("#minResponseTimeOK").append(stat.minResponseTime.ok); + $("#minResponseTimeKO").append(stat.minResponseTime.ko); + + $("#maxResponseTime").append(stat.maxResponseTime.total); + $("#maxResponseTimeOK").append(stat.maxResponseTime.ok); + $("#maxResponseTimeKO").append(stat.maxResponseTime.ko); + + $("#meanResponseTime").append(stat.meanResponseTime.total); + $("#meanResponseTimeOK").append(stat.meanResponseTime.ok); + $("#meanResponseTimeKO").append(stat.meanResponseTime.ko); + + $("#standardDeviation").append(stat.standardDeviation.total); + $("#standardDeviationOK").append(stat.standardDeviation.ok); + $("#standardDeviationKO").append(stat.standardDeviation.ko); + + $("#percentiles1").append(stat.percentiles1.total); + $("#percentiles1OK").append(stat.percentiles1.ok); + $("#percentiles1KO").append(stat.percentiles1.ko); + + $("#percentiles2").append(stat.percentiles2.total); + $("#percentiles2OK").append(stat.percentiles2.ok); + $("#percentiles2KO").append(stat.percentiles2.ko); + + $("#percentiles3").append(stat.percentiles3.total); + $("#percentiles3OK").append(stat.percentiles3.ok); + $("#percentiles3KO").append(stat.percentiles3.ko); + + $("#percentiles4").append(stat.percentiles4.total); + $("#percentiles4OK").append(stat.percentiles4.ok); + $("#percentiles4KO").append(stat.percentiles4.ko); + + $("#meanNumberOfRequestsPerSecond").append(stat.meanNumberOfRequestsPerSecond.total); + $("#meanNumberOfRequestsPerSecondOK").append(stat.meanNumberOfRequestsPerSecond.ok); + $("#meanNumberOfRequestsPerSecondKO").append(stat.meanNumberOfRequestsPerSecond.ko); +} diff --git a/webapp/loadTests/250users1minute/js/stats.json b/webapp/loadTests/250users1minute/js/stats.json new file mode 100644 index 0000000..406e659 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/stats.json @@ -0,0 +1,4023 @@ +{ + "type": "GROUP", +"name": "All Requests", +"path": "", +"pathFormatted": "group_missing-name-b06d1", +"stats": { + "name": "All Requests", + "numberOfRequests": { + "total": 5574, + "ok": 4494, + "ko": 1080 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 178 + }, + "maxResponseTime": { + "total": 13013, + "ok": 13013, + "ko": 2710 + }, + "meanResponseTime": { + "total": 695, + "ok": 583, + "ko": 1160 + }, + "standardDeviation": { + "total": 1264, + "ok": 1306, + "ko": 934 + }, + "percentiles1": { + "total": 128, + "ok": 60, + "ko": 819 + }, + "percentiles2": { + "total": 858, + "ok": 661, + "ko": 2044 + }, + "percentiles3": { + "total": 2581, + "ok": 2567, + "ko": 2582 + }, + "percentiles4": { + "total": 6373, + "ok": 7076, + "ko": 2663 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3522, + "percentage": 63 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 333, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 639, + "percentage": 11 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1080, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": 51.611111111111114, + "ok": 41.611111111111114, + "ko": 10.0 + } +}, +"contents": { +"req_request-0-684d2": { + "type": "REQUEST", + "name": "request_0", +"path": "request_0", +"pathFormatted": "req_request-0-684d2", +"stats": { + "name": "request_0", + "numberOfRequests": { + "total": 250, + "ok": 250, + "ko": 0 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "maxResponseTime": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "meanResponseTime": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "standardDeviation": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "percentiles1": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "percentiles2": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles3": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles4": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 2.314814814814815, + "ok": 2.314814814814815, + "ko": 0 + } +} + },"req_request-1-46da4": { + "type": "REQUEST", + "name": "request_1", +"path": "request_1", +"pathFormatted": "req_request-1-46da4", +"stats": { + "name": "request_1", + "numberOfRequests": { + "total": 250, + "ok": 250, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 47, + "ok": 47, + "ko": 0 + }, + "meanResponseTime": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "standardDeviation": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles3": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles4": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 2.314814814814815, + "ok": 2.314814814814815, + "ko": 0 + } +} + },"req_request-2-93baf": { + "type": "REQUEST", + "name": "request_2", +"path": "request_2", +"pathFormatted": "req_request-2-93baf", +"stats": { + "name": "request_2", + "numberOfRequests": { + "total": 250, + "ok": 149, + "ko": 101 + }, + "minResponseTime": { + "total": 178, + "ok": 413, + "ko": 178 + }, + "maxResponseTime": { + "total": 4136, + "ok": 4136, + "ko": 2635 + }, + "meanResponseTime": { + "total": 1181, + "ok": 1142, + "ko": 1237 + }, + "standardDeviation": { + "total": 814, + "ok": 755, + "ko": 891 + }, + "percentiles1": { + "total": 826, + "ok": 825, + "ko": 827 + }, + "percentiles2": { + "total": 1780, + "ok": 1642, + "ko": 2029 + }, + "percentiles3": { + "total": 2598, + "ok": 2765, + "ko": 2580 + }, + "percentiles4": { + "total": 2990, + "ok": 3074, + "ko": 2602 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 70, + "percentage": 28 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 31, + "percentage": 12 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 48, + "percentage": 19 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 101, + "percentage": 40 +}, + "meanNumberOfRequestsPerSecond": { + "total": 2.314814814814815, + "ok": 1.3796296296296295, + "ko": 0.9351851851851852 + } +} + },"req_request-3-d0973": { + "type": "REQUEST", + "name": "request_3", +"path": "request_3", +"pathFormatted": "req_request-3-d0973", +"stats": { + "name": "request_3", + "numberOfRequests": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "minResponseTime": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "maxResponseTime": { + "total": 837, + "ok": 837, + "ko": 0 + }, + "meanResponseTime": { + "total": 242, + "ok": 242, + "ko": 0 + }, + "standardDeviation": { + "total": 157, + "ok": 157, + "ko": 0 + }, + "percentiles1": { + "total": 186, + "ok": 186, + "ko": 0 + }, + "percentiles2": { + "total": 343, + "ok": 343, + "ko": 0 + }, + "percentiles3": { + "total": 569, + "ok": 569, + "ko": 0 + }, + "percentiles4": { + "total": 694, + "ok": 694, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 148, + "percentage": 99 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 1 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3796296296296295, + "ok": 1.3796296296296295, + "ko": 0 + } +} + },"req_request-5-48829": { + "type": "REQUEST", + "name": "request_5", +"path": "request_5", +"pathFormatted": "req_request-5-48829", +"stats": { + "name": "request_5", + "numberOfRequests": { + "total": 149, + "ok": 82, + "ko": 67 + }, + "minResponseTime": { + "total": 178, + "ok": 385, + "ko": 178 + }, + "maxResponseTime": { + "total": 2865, + "ok": 2865, + "ko": 2556 + }, + "meanResponseTime": { + "total": 945, + "ok": 948, + "ko": 942 + }, + "standardDeviation": { + "total": 703, + "ok": 497, + "ko": 892 + }, + "percentiles1": { + "total": 800, + "ok": 867, + "ko": 542 + }, + "percentiles2": { + "total": 1325, + "ok": 1257, + "ko": 1426 + }, + "percentiles3": { + "total": 2495, + "ok": 1766, + "ko": 2501 + }, + "percentiles4": { + "total": 2548, + "ok": 2199, + "ko": 2545 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 38, + "percentage": 26 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 23, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 21, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 67, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3796296296296295, + "ok": 0.7592592592592593, + "ko": 0.6203703703703703 + } +} + },"req_request-4-e7d1b": { + "type": "REQUEST", + "name": "request_4", +"path": "request_4", +"pathFormatted": "req_request-4-e7d1b", +"stats": { + "name": "request_4", + "numberOfRequests": { + "total": 149, + "ok": 77, + "ko": 72 + }, + "minResponseTime": { + "total": 179, + "ok": 410, + "ko": 179 + }, + "maxResponseTime": { + "total": 2573, + "ok": 2004, + "ko": 2573 + }, + "meanResponseTime": { + "total": 884, + "ok": 850, + "ko": 921 + }, + "standardDeviation": { + "total": 660, + "ok": 398, + "ko": 855 + }, + "percentiles1": { + "total": 672, + "ok": 684, + "ko": 567 + }, + "percentiles2": { + "total": 1156, + "ok": 1087, + "ko": 1243 + }, + "percentiles3": { + "total": 2489, + "ok": 1751, + "ko": 2493 + }, + "percentiles4": { + "total": 2523, + "ok": 1944, + "ko": 2543 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 20, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 13, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 72, + "percentage": 48 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3796296296296295, + "ok": 0.7129629629629629, + "ko": 0.6666666666666666 + } +} + },"req_request-6-027a9": { + "type": "REQUEST", + "name": "request_6", +"path": "request_6", +"pathFormatted": "req_request-6-027a9", +"stats": { + "name": "request_6", + "numberOfRequests": { + "total": 149, + "ok": 86, + "ko": 63 + }, + "minResponseTime": { + "total": 178, + "ok": 548, + "ko": 178 + }, + "maxResponseTime": { + "total": 3021, + "ok": 3021, + "ko": 2616 + }, + "meanResponseTime": { + "total": 1096, + "ok": 1164, + "ko": 1004 + }, + "standardDeviation": { + "total": 708, + "ok": 529, + "ko": 889 + }, + "percentiles1": { + "total": 909, + "ok": 1127, + "ko": 785 + }, + "percentiles2": { + "total": 1488, + "ok": 1524, + "ko": 1416 + }, + "percentiles3": { + "total": 2509, + "ok": 2052, + "ko": 2538 + }, + "percentiles4": { + "total": 2653, + "ok": 2737, + "ko": 2582 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 35, + "percentage": 23 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 63, + "percentage": 42 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3796296296296295, + "ok": 0.7962962962962963, + "ko": 0.5833333333333334 + } +} + },"req_request-7-f222f": { + "type": "REQUEST", + "name": "request_7", +"path": "request_7", +"pathFormatted": "req_request-7-f222f", +"stats": { + "name": "request_7", + "numberOfRequests": { + "total": 149, + "ok": 83, + "ko": 66 + }, + "minResponseTime": { + "total": 178, + "ok": 364, + "ko": 178 + }, + "maxResponseTime": { + "total": 2663, + "ok": 2406, + "ko": 2663 + }, + "meanResponseTime": { + "total": 901, + "ok": 907, + "ko": 894 + }, + "standardDeviation": { + "total": 690, + "ok": 466, + "ko": 896 + }, + "percentiles1": { + "total": 757, + "ok": 837, + "ko": 549 + }, + "percentiles2": { + "total": 1188, + "ok": 1167, + "ko": 1195 + }, + "percentiles3": { + "total": 2500, + "ok": 1644, + "ko": 2539 + }, + "percentiles4": { + "total": 2605, + "ok": 2287, + "ko": 2658 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 41, + "percentage": 28 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 23, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 19, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 66, + "percentage": 44 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.3796296296296295, + "ok": 0.7685185185185185, + "ko": 0.6111111111111112 + } +} + },"req_request-5-redir-affb3": { + "type": "REQUEST", + "name": "request_5 Redirect 1", +"path": "request_5 Redirect 1", +"pathFormatted": "req_request-5-redir-affb3", +"stats": { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": 82, + "ok": 82, + "ko": 0 + }, + "minResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "maxResponseTime": { + "total": 1449, + "ok": 1449, + "ko": 0 + }, + "meanResponseTime": { + "total": 453, + "ok": 453, + "ko": 0 + }, + "standardDeviation": { + "total": 376, + "ok": 376, + "ko": 0 + }, + "percentiles1": { + "total": 334, + "ok": 334, + "ko": 0 + }, + "percentiles2": { + "total": 729, + "ok": 729, + "ko": 0 + }, + "percentiles3": { + "total": 1173, + "ok": 1173, + "ko": 0 + }, + "percentiles4": { + "total": 1437, + "ok": 1437, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 65, + "percentage": 79 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 16 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 5 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.7592592592592593, + "ok": 0.7592592592592593, + "ko": 0 + } +} + },"req_request-8-ef0c8": { + "type": "REQUEST", + "name": "request_8", +"path": "request_8", +"pathFormatted": "req_request-8-ef0c8", +"stats": { + "name": "request_8", + "numberOfRequests": { + "total": 250, + "ok": 137, + "ko": 113 + }, + "minResponseTime": { + "total": 178, + "ok": 458, + "ko": 178 + }, + "maxResponseTime": { + "total": 4207, + "ok": 4207, + "ko": 2649 + }, + "meanResponseTime": { + "total": 1376, + "ok": 1510, + "ko": 1213 + }, + "standardDeviation": { + "total": 887, + "ok": 831, + "ko": 926 + }, + "percentiles1": { + "total": 1248, + "ok": 1286, + "ko": 820 + }, + "percentiles2": { + "total": 1989, + "ok": 1800, + "ko": 2039 + }, + "percentiles3": { + "total": 2807, + "ok": 3556, + "ko": 2577 + }, + "percentiles4": { + "total": 3801, + "ok": 3844, + "ko": 2628 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 27, + "percentage": 11 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 33, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 77, + "percentage": 31 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 113, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": 2.314814814814815, + "ok": 1.2685185185185186, + "ko": 1.0462962962962963 + } +} + },"req_request-8-redir-98b2a": { + "type": "REQUEST", + "name": "request_8 Redirect 1", +"path": "request_8 Redirect 1", +"pathFormatted": "req_request-8-redir-98b2a", +"stats": { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": 137, + "ok": 116, + "ko": 21 + }, + "minResponseTime": { + "total": 181, + "ok": 194, + "ko": 181 + }, + "maxResponseTime": { + "total": 10490, + "ok": 10490, + "ko": 2575 + }, + "meanResponseTime": { + "total": 2060, + "ok": 2200, + "ko": 1283 + }, + "standardDeviation": { + "total": 2713, + "ok": 2890, + "ko": 1072 + }, + "percentiles1": { + "total": 989, + "ok": 1001, + "ko": 800 + }, + "percentiles2": { + "total": 1980, + "ok": 1726, + "ko": 2510 + }, + "percentiles3": { + "total": 9136, + "ok": 9637, + "ko": 2558 + }, + "percentiles4": { + "total": 10430, + "ok": 10454, + "ko": 2572 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 45, + "percentage": 33 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 24, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 47, + "percentage": 34 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 21, + "percentage": 15 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.2685185185185186, + "ok": 1.0740740740740742, + "ko": 0.19444444444444445 + } +} + },"req_request-8-redir-fc911": { + "type": "REQUEST", + "name": "request_8 Redirect 2", +"path": "request_8 Redirect 2", +"pathFormatted": "req_request-8-redir-fc911", +"stats": { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": 116, + "ok": 94, + "ko": 22 + }, + "minResponseTime": { + "total": 190, + "ok": 235, + "ko": 190 + }, + "maxResponseTime": { + "total": 3668, + "ok": 3668, + "ko": 2677 + }, + "meanResponseTime": { + "total": 1213, + "ok": 1081, + "ko": 1773 + }, + "standardDeviation": { + "total": 892, + "ok": 840, + "ko": 888 + }, + "percentiles1": { + "total": 870, + "ok": 814, + "ko": 1952 + }, + "percentiles2": { + "total": 1614, + "ok": 1375, + "ko": 2565 + }, + "percentiles3": { + "total": 3137, + "ok": 3188, + "ko": 2658 + }, + "percentiles4": { + "total": 3572, + "ok": 3620, + "ko": 2673 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 45, + "percentage": 39 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 19 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 27, + "percentage": 23 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 22, + "percentage": 19 +}, + "meanNumberOfRequestsPerSecond": { + "total": 1.0740740740740742, + "ok": 0.8703703703703703, + "ko": 0.2037037037037037 + } +} + },"req_request-8-redir-e875c": { + "type": "REQUEST", + "name": "request_8 Redirect 3", +"path": "request_8 Redirect 3", +"pathFormatted": "req_request-8-redir-e875c", +"stats": { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "maxResponseTime": { + "total": 31, + "ok": 31, + "ko": 0 + }, + "meanResponseTime": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "standardDeviation": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles1": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "percentiles2": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles3": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "percentiles4": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-12-61da2": { + "type": "REQUEST", + "name": "request_12", +"path": "request_12", +"pathFormatted": "req_request-12-61da2", +"stats": { + "name": "request_12", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "maxResponseTime": { + "total": 53, + "ok": 53, + "ko": 0 + }, + "meanResponseTime": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles3": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "percentiles4": { + "total": 36, + "ok": 36, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-22-8ecb1": { + "type": "REQUEST", + "name": "request_22", +"path": "request_22", +"pathFormatted": "req_request-22-8ecb1", +"stats": { + "name": "request_22", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "maxResponseTime": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "meanResponseTime": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles2": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "percentiles3": { + "total": 77, + "ok": 77, + "ko": 0 + }, + "percentiles4": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-14-a0e30": { + "type": "REQUEST", + "name": "request_14", +"path": "request_14", +"pathFormatted": "req_request-14-a0e30", +"stats": { + "name": "request_14", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "meanResponseTime": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles2": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "percentiles3": { + "total": 29, + "ok": 29, + "ko": 0 + }, + "percentiles4": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-21-be4cb": { + "type": "REQUEST", + "name": "request_21", +"path": "request_21", +"pathFormatted": "req_request-21-be4cb", +"stats": { + "name": "request_21", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "maxResponseTime": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "meanResponseTime": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "percentiles2": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "percentiles3": { + "total": 74, + "ok": 74, + "ko": 0 + }, + "percentiles4": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-24-dd0c9": { + "type": "REQUEST", + "name": "request_24", +"path": "request_24", +"pathFormatted": "req_request-24-dd0c9", +"stats": { + "name": "request_24", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "maxResponseTime": { + "total": 95, + "ok": 95, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles1": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles2": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "percentiles3": { + "total": 82, + "ok": 82, + "ko": 0 + }, + "percentiles4": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-200-636fa": { + "type": "REQUEST", + "name": "request_200", +"path": "request_200", +"pathFormatted": "req_request-200-636fa", +"stats": { + "name": "request_200", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "maxResponseTime": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles1": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles2": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "percentiles3": { + "total": 81, + "ok": 81, + "ko": 0 + }, + "percentiles4": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-13-5cca6": { + "type": "REQUEST", + "name": "request_13", +"path": "request_13", +"pathFormatted": "req_request-13-5cca6", +"stats": { + "name": "request_13", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "maxResponseTime": { + "total": 144, + "ok": 144, + "ko": 0 + }, + "meanResponseTime": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "standardDeviation": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles1": { + "total": 83, + "ok": 83, + "ko": 0 + }, + "percentiles2": { + "total": 101, + "ok": 101, + "ko": 0 + }, + "percentiles3": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "percentiles4": { + "total": 144, + "ok": 144, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-16-24733": { + "type": "REQUEST", + "name": "request_16", +"path": "request_16", +"pathFormatted": "req_request-16-24733", +"stats": { + "name": "request_16", + "numberOfRequests": { + "total": 94, + "ok": 36, + "ko": 58 + }, + "minResponseTime": { + "total": 110, + "ok": 110, + "ko": 183 + }, + "maxResponseTime": { + "total": 3526, + "ok": 3526, + "ko": 2657 + }, + "meanResponseTime": { + "total": 1177, + "ok": 1121, + "ko": 1212 + }, + "standardDeviation": { + "total": 923, + "ok": 924, + "ko": 920 + }, + "percentiles1": { + "total": 811, + "ok": 780, + "ko": 811 + }, + "percentiles2": { + "total": 1993, + "ok": 1601, + "ko": 2015 + }, + "percentiles3": { + "total": 2615, + "ok": 2907, + "ko": 2583 + }, + "percentiles4": { + "total": 2964, + "ok": 3315, + "ko": 2642 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 15 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 58, + "percentage": 62 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.3333333333333333, + "ko": 0.5370370370370371 + } +} + },"req_request-15-56eac": { + "type": "REQUEST", + "name": "request_15", +"path": "request_15", +"pathFormatted": "req_request-15-56eac", +"stats": { + "name": "request_15", + "numberOfRequests": { + "total": 94, + "ok": 80, + "ko": 14 + }, + "minResponseTime": { + "total": 95, + "ok": 95, + "ko": 183 + }, + "maxResponseTime": { + "total": 2564, + "ok": 1963, + "ko": 2564 + }, + "meanResponseTime": { + "total": 507, + "ok": 398, + "ko": 1126 + }, + "standardDeviation": { + "total": 533, + "ok": 314, + "ko": 947 + }, + "percentiles1": { + "total": 346, + "ok": 317, + "ko": 805 + }, + "percentiles2": { + "total": 652, + "ok": 535, + "ko": 2228 + }, + "percentiles3": { + "total": 1609, + "ok": 967, + "ko": 2538 + }, + "percentiles4": { + "total": 2527, + "ok": 1323, + "ko": 2559 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 73, + "percentage": 78 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 6 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 1 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 14, + "percentage": 15 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.7407407407407407, + "ko": 0.12962962962962962 + } +} + },"req_logo-png-c9c2b": { + "type": "REQUEST", + "name": "Logo.png", +"path": "Logo.png", +"pathFormatted": "req_logo-png-c9c2b", +"stats": { + "name": "Logo.png", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "maxResponseTime": { + "total": 80, + "ok": 80, + "ko": 0 + }, + "meanResponseTime": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles2": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles3": { + "total": 28, + "ok": 28, + "ko": 0 + }, + "percentiles4": { + "total": 36, + "ok": 36, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-18-f5b64": { + "type": "REQUEST", + "name": "request_18", +"path": "request_18", +"pathFormatted": "req_request-18-f5b64", +"stats": { + "name": "request_18", + "numberOfRequests": { + "total": 94, + "ok": 39, + "ko": 55 + }, + "minResponseTime": { + "total": 180, + "ok": 189, + "ko": 180 + }, + "maxResponseTime": { + "total": 3839, + "ok": 3839, + "ko": 2639 + }, + "meanResponseTime": { + "total": 1113, + "ok": 1156, + "ko": 1083 + }, + "standardDeviation": { + "total": 949, + "ok": 967, + "ko": 935 + }, + "percentiles1": { + "total": 794, + "ok": 699, + "ko": 796 + }, + "percentiles2": { + "total": 1985, + "ok": 1609, + "ko": 1991 + }, + "percentiles3": { + "total": 2630, + "ok": 2755, + "ko": 2586 + }, + "percentiles4": { + "total": 3239, + "ok": 3594, + "ko": 2634 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 21, + "percentage": 22 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 1 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 55, + "percentage": 59 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.3611111111111111, + "ko": 0.5092592592592593 + } +} + },"req_bundle-js-0b837": { + "type": "REQUEST", + "name": "bundle.js", +"path": "bundle.js", +"pathFormatted": "req_bundle-js-0b837", +"stats": { + "name": "bundle.js", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "maxResponseTime": { + "total": 72, + "ok": 72, + "ko": 0 + }, + "meanResponseTime": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "standardDeviation": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles1": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles2": { + "total": 18, + "ok": 18, + "ko": 0 + }, + "percentiles3": { + "total": 29, + "ok": 29, + "ko": 0 + }, + "percentiles4": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-9-d127e": { + "type": "REQUEST", + "name": "request_9", +"path": "request_9", +"pathFormatted": "req_request-9-d127e", +"stats": { + "name": "request_9", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "maxResponseTime": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "meanResponseTime": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles2": { + "total": 24, + "ok": 24, + "ko": 0 + }, + "percentiles3": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "percentiles4": { + "total": 83, + "ok": 83, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-10-1cfbe": { + "type": "REQUEST", + "name": "request_10", +"path": "request_10", +"pathFormatted": "req_request-10-1cfbe", +"stats": { + "name": "request_10", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "maxResponseTime": { + "total": 85, + "ok": 85, + "ko": 0 + }, + "meanResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "percentiles2": { + "total": 24, + "ok": 24, + "ko": 0 + }, + "percentiles3": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "percentiles4": { + "total": 84, + "ok": 84, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-11-f11e8": { + "type": "REQUEST", + "name": "request_11", +"path": "request_11", +"pathFormatted": "req_request-11-f11e8", +"stats": { + "name": "request_11", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "maxResponseTime": { + "total": 146, + "ok": 146, + "ko": 0 + }, + "meanResponseTime": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "standardDeviation": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "percentiles1": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "percentiles2": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles3": { + "total": 102, + "ok": 102, + "ko": 0 + }, + "percentiles4": { + "total": 142, + "ok": 142, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-242-d6d33": { + "type": "REQUEST", + "name": "request_242", +"path": "request_242", +"pathFormatted": "req_request-242-d6d33", +"stats": { + "name": "request_242", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "maxResponseTime": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "meanResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles2": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "percentiles3": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "percentiles4": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_css2-family-rob-cf8a9": { + "type": "REQUEST", + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"path": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"pathFormatted": "req_css2-family-rob-cf8a9", +"stats": { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "maxResponseTime": { + "total": 156, + "ok": 156, + "ko": 0 + }, + "meanResponseTime": { + "total": 119, + "ok": 119, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 118, + "ok": 118, + "ko": 0 + }, + "percentiles2": { + "total": 128, + "ok": 128, + "ko": 0 + }, + "percentiles3": { + "total": 138, + "ok": 138, + "ko": 0 + }, + "percentiles4": { + "total": 153, + "ok": 153, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-19-10d85": { + "type": "REQUEST", + "name": "request_19", +"path": "request_19", +"pathFormatted": "req_request-19-10d85", +"stats": { + "name": "request_19", + "numberOfRequests": { + "total": 94, + "ok": 25, + "ko": 69 + }, + "minResponseTime": { + "total": 182, + "ok": 1025, + "ko": 182 + }, + "maxResponseTime": { + "total": 12796, + "ok": 12796, + "ko": 2630 + }, + "meanResponseTime": { + "total": 1875, + "ok": 3931, + "ko": 1130 + }, + "standardDeviation": { + "total": 2298, + "ok": 3407, + "ko": 950 + }, + "percentiles1": { + "total": 1404, + "ok": 2475, + "ko": 810 + }, + "percentiles2": { + "total": 2526, + "ok": 4683, + "ko": 2032 + }, + "percentiles3": { + "total": 5825, + "ok": 12229, + "ko": 2566 + }, + "percentiles4": { + "total": 12463, + "ok": 12710, + "ko": 2612 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 23, + "percentage": 24 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 69, + "percentage": 73 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.23148148148148148, + "ko": 0.6388888888888888 + } +} + },"req_request-23-98f5d": { + "type": "REQUEST", + "name": "request_23", +"path": "request_23", +"pathFormatted": "req_request-23-98f5d", +"stats": { + "name": "request_23", + "numberOfRequests": { + "total": 94, + "ok": 23, + "ko": 71 + }, + "minResponseTime": { + "total": 182, + "ok": 1041, + "ko": 182 + }, + "maxResponseTime": { + "total": 7554, + "ok": 7554, + "ko": 2663 + }, + "meanResponseTime": { + "total": 1536, + "ok": 2829, + "ko": 1117 + }, + "standardDeviation": { + "total": 1300, + "ok": 1480, + "ko": 900 + }, + "percentiles1": { + "total": 1394, + "ok": 2466, + "ko": 822 + }, + "percentiles2": { + "total": 2483, + "ok": 3430, + "ko": 2011 + }, + "percentiles3": { + "total": 3725, + "ok": 5024, + "ko": 2590 + }, + "percentiles4": { + "total": 5254, + "ok": 7010, + "ko": 2629 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 21, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 71, + "percentage": 76 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.21296296296296297, + "ko": 0.6574074074074074 + } +} + },"req_request-20-6804b": { + "type": "REQUEST", + "name": "request_20", +"path": "request_20", +"pathFormatted": "req_request-20-6804b", +"stats": { + "name": "request_20", + "numberOfRequests": { + "total": 94, + "ok": 25, + "ko": 69 + }, + "minResponseTime": { + "total": 182, + "ok": 513, + "ko": 182 + }, + "maxResponseTime": { + "total": 3841, + "ok": 3841, + "ko": 2627 + }, + "meanResponseTime": { + "total": 1229, + "ok": 1615, + "ko": 1089 + }, + "standardDeviation": { + "total": 919, + "ok": 801, + "ko": 919 + }, + "percentiles1": { + "total": 991, + "ok": 1553, + "ko": 806 + }, + "percentiles2": { + "total": 2003, + "ok": 1832, + "ko": 2008 + }, + "percentiles3": { + "total": 2613, + "ok": 2945, + "ko": 2572 + }, + "percentiles4": { + "total": 3024, + "ok": 3630, + "ko": 2613 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 4, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 17, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 69, + "percentage": 73 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.23148148148148148, + "ko": 0.6388888888888888 + } +} + },"req_request-222-24864": { + "type": "REQUEST", + "name": "request_222", +"path": "request_222", +"pathFormatted": "req_request-222-24864", +"stats": { + "name": "request_222", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 31, + "ok": 31, + "ko": 0 + }, + "maxResponseTime": { + "total": 93, + "ok": 93, + "ko": 0 + }, + "meanResponseTime": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "percentiles2": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles3": { + "total": 70, + "ok": 70, + "ko": 0 + }, + "percentiles4": { + "total": 92, + "ok": 92, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-227-2507b": { + "type": "REQUEST", + "name": "request_227", +"path": "request_227", +"pathFormatted": "req_request-227-2507b", +"stats": { + "name": "request_227", + "numberOfRequests": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "minResponseTime": { + "total": 35, + "ok": 35, + "ko": 0 + }, + "maxResponseTime": { + "total": 80, + "ok": 80, + "ko": 0 + }, + "meanResponseTime": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "percentiles2": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "percentiles3": { + "total": 64, + "ok": 64, + "ko": 0 + }, + "percentiles4": { + "total": 72, + "ok": 72, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 94, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.8703703703703703, + "ko": 0 + } +} + },"req_request-241-2919b": { + "type": "REQUEST", + "name": "request_241", +"path": "request_241", +"pathFormatted": "req_request-241-2919b", +"stats": { + "name": "request_241", + "numberOfRequests": { + "total": 94, + "ok": 74, + "ko": 20 + }, + "minResponseTime": { + "total": 219, + "ok": 440, + "ko": 219 + }, + "maxResponseTime": { + "total": 4694, + "ok": 4694, + "ko": 2710 + }, + "meanResponseTime": { + "total": 1431, + "ok": 1452, + "ko": 1355 + }, + "standardDeviation": { + "total": 962, + "ok": 951, + "ko": 998 + }, + "percentiles1": { + "total": 1027, + "ok": 1144, + "ko": 853 + }, + "percentiles2": { + "total": 2041, + "ok": 1789, + "ko": 2528 + }, + "percentiles3": { + "total": 3317, + "ok": 3436, + "ko": 2694 + }, + "percentiles4": { + "total": 3957, + "ok": 4115, + "ko": 2707 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 22, + "percentage": 23 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 34, + "percentage": 36 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 20, + "percentage": 21 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.6851851851851852, + "ko": 0.18518518518518517 + } +} + },"req_request-240-e27d8": { + "type": "REQUEST", + "name": "request_240", +"path": "request_240", +"pathFormatted": "req_request-240-e27d8", +"stats": { + "name": "request_240", + "numberOfRequests": { + "total": 94, + "ok": 65, + "ko": 29 + }, + "minResponseTime": { + "total": 227, + "ok": 336, + "ko": 227 + }, + "maxResponseTime": { + "total": 11330, + "ok": 11330, + "ko": 2702 + }, + "meanResponseTime": { + "total": 2223, + "ok": 2602, + "ko": 1373 + }, + "standardDeviation": { + "total": 2417, + "ok": 2747, + "ko": 989 + }, + "percentiles1": { + "total": 1379, + "ok": 1404, + "ko": 869 + }, + "percentiles2": { + "total": 2592, + "ok": 3821, + "ko": 2528 + }, + "percentiles3": { + "total": 7591, + "ok": 9645, + "ko": 2587 + }, + "percentiles4": { + "total": 10441, + "ok": 10718, + "ko": 2673 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 16, + "percentage": 17 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 36, + "percentage": 38 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 29, + "percentage": 31 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.6018518518518519, + "ko": 0.26851851851851855 + } +} + },"req_request-243-b078b": { + "type": "REQUEST", + "name": "request_243", +"path": "request_243", +"pathFormatted": "req_request-243-b078b", +"stats": { + "name": "request_243", + "numberOfRequests": { + "total": 81, + "ok": 81, + "ko": 0 + }, + "minResponseTime": { + "total": 33, + "ok": 33, + "ko": 0 + }, + "maxResponseTime": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "meanResponseTime": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "standardDeviation": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles1": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "percentiles2": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "percentiles3": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "percentiles4": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 81, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.75, + "ok": 0.75, + "ko": 0 + } +} + },"req_request-244-416e5": { + "type": "REQUEST", + "name": "request_244", +"path": "request_244", +"pathFormatted": "req_request-244-416e5", +"stats": { + "name": "request_244", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 33, + "ok": 33, + "ko": 0 + }, + "maxResponseTime": { + "total": 126, + "ok": 126, + "ko": 0 + }, + "meanResponseTime": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "standardDeviation": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "percentiles1": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "percentiles2": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "percentiles3": { + "total": 61, + "ok": 61, + "ko": 0 + }, + "percentiles4": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.46296296296296297, + "ok": 0.46296296296296297, + "ko": 0 + } +} + },"req_request-250-8cb1f": { + "type": "REQUEST", + "name": "request_250", +"path": "request_250", +"pathFormatted": "req_request-250-8cb1f", +"stats": { + "name": "request_250", + "numberOfRequests": { + "total": 94, + "ok": 65, + "ko": 29 + }, + "minResponseTime": { + "total": 221, + "ok": 278, + "ko": 221 + }, + "maxResponseTime": { + "total": 5085, + "ok": 5085, + "ko": 2709 + }, + "meanResponseTime": { + "total": 1500, + "ok": 1520, + "ko": 1454 + }, + "standardDeviation": { + "total": 1029, + "ok": 1058, + "ko": 957 + }, + "percentiles1": { + "total": 1124, + "ok": 1058, + "ko": 1467 + }, + "percentiles2": { + "total": 2089, + "ok": 2063, + "ko": 2526 + }, + "percentiles3": { + "total": 3443, + "ok": 3465, + "ko": 2657 + }, + "percentiles4": { + "total": 4136, + "ok": 4432, + "ko": 2703 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 19 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 18, + "percentage": 19 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 29, + "percentage": 31 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 29, + "percentage": 31 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.6018518518518519, + "ko": 0.26851851851851855 + } +} + },"req_request-252-38647": { + "type": "REQUEST", + "name": "request_252", +"path": "request_252", +"pathFormatted": "req_request-252-38647", +"stats": { + "name": "request_252", + "numberOfRequests": { + "total": 94, + "ok": 58, + "ko": 36 + }, + "minResponseTime": { + "total": 230, + "ok": 433, + "ko": 230 + }, + "maxResponseTime": { + "total": 11384, + "ok": 11384, + "ko": 2635 + }, + "meanResponseTime": { + "total": 2156, + "ok": 2743, + "ko": 1211 + }, + "standardDeviation": { + "total": 2472, + "ok": 2921, + "ko": 869 + }, + "percentiles1": { + "total": 1355, + "ok": 1497, + "ko": 852 + }, + "percentiles2": { + "total": 2554, + "ok": 3198, + "ko": 2076 + }, + "percentiles3": { + "total": 9386, + "ok": 9960, + "ko": 2563 + }, + "percentiles4": { + "total": 11362, + "ok": 11370, + "ko": 2616 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 13, + "percentage": 14 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 10, + "percentage": 11 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 35, + "percentage": 37 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 36, + "percentage": 38 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.5370370370370371, + "ko": 0.3333333333333333 + } +} + },"req_request-260-43b5f": { + "type": "REQUEST", + "name": "request_260", +"path": "request_260", +"pathFormatted": "req_request-260-43b5f", +"stats": { + "name": "request_260", + "numberOfRequests": { + "total": 94, + "ok": 57, + "ko": 37 + }, + "minResponseTime": { + "total": 219, + "ok": 432, + "ko": 219 + }, + "maxResponseTime": { + "total": 4607, + "ok": 4607, + "ko": 2687 + }, + "meanResponseTime": { + "total": 1452, + "ok": 1533, + "ko": 1326 + }, + "standardDeviation": { + "total": 988, + "ok": 1008, + "ko": 944 + }, + "percentiles1": { + "total": 1011, + "ok": 1034, + "ko": 855 + }, + "percentiles2": { + "total": 2107, + "ok": 2081, + "ko": 2115 + }, + "percentiles3": { + "total": 3290, + "ok": 3593, + "ko": 2630 + }, + "percentiles4": { + "total": 3940, + "ok": 4205, + "ko": 2684 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 16, + "percentage": 17 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 14, + "percentage": 15 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 27, + "percentage": 29 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 37, + "percentage": 39 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.5277777777777778, + "ko": 0.3425925925925926 + } +} + },"req_request-265-cf160": { + "type": "REQUEST", + "name": "request_265", +"path": "request_265", +"pathFormatted": "req_request-265-cf160", +"stats": { + "name": "request_265", + "numberOfRequests": { + "total": 94, + "ok": 52, + "ko": 42 + }, + "minResponseTime": { + "total": 218, + "ok": 460, + "ko": 218 + }, + "maxResponseTime": { + "total": 12114, + "ok": 12114, + "ko": 2594 + }, + "meanResponseTime": { + "total": 2290, + "ok": 3070, + "ko": 1325 + }, + "standardDeviation": { + "total": 2497, + "ok": 3030, + "ko": 948 + }, + "percentiles1": { + "total": 1439, + "ok": 1716, + "ko": 1127 + }, + "percentiles2": { + "total": 2585, + "ok": 3506, + "ko": 2534 + }, + "percentiles3": { + "total": 8321, + "ok": 10157, + "ko": 2587 + }, + "percentiles4": { + "total": 11386, + "ok": 11715, + "ko": 2592 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 11 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 35, + "percentage": 37 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 42, + "percentage": 45 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.8703703703703703, + "ok": 0.48148148148148145, + "ko": 0.3888888888888889 + } +} + },"req_request-270-e02a1": { + "type": "REQUEST", + "name": "request_270", +"path": "request_270", +"pathFormatted": "req_request-270-e02a1", +"stats": { + "name": "request_270", + "numberOfRequests": { + "total": 41, + "ok": 29, + "ko": 12 + }, + "minResponseTime": { + "total": 226, + "ok": 301, + "ko": 226 + }, + "maxResponseTime": { + "total": 4500, + "ok": 4500, + "ko": 2598 + }, + "meanResponseTime": { + "total": 1704, + "ok": 1857, + "ko": 1333 + }, + "standardDeviation": { + "total": 1055, + "ok": 1100, + "ko": 828 + }, + "percentiles1": { + "total": 1453, + "ok": 1451, + "ko": 1454 + }, + "percentiles2": { + "total": 2569, + "ok": 2678, + "ko": 2019 + }, + "percentiles3": { + "total": 3499, + "ok": 3758, + "ko": 2586 + }, + "percentiles4": { + "total": 4272, + "ok": 4340, + "ko": 2596 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 15 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 5 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 21, + "percentage": 51 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 12, + "percentage": 29 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.37962962962962965, + "ok": 0.26851851851851855, + "ko": 0.1111111111111111 + } +} + },"req_request-273-0cd3c": { + "type": "REQUEST", + "name": "request_273", +"path": "request_273", +"pathFormatted": "req_request-273-0cd3c", +"stats": { + "name": "request_273", + "numberOfRequests": { + "total": 57, + "ok": 50, + "ko": 7 + }, + "minResponseTime": { + "total": 227, + "ok": 326, + "ko": 227 + }, + "maxResponseTime": { + "total": 13013, + "ok": 13013, + "ko": 2685 + }, + "meanResponseTime": { + "total": 2685, + "ok": 2803, + "ko": 1838 + }, + "standardDeviation": { + "total": 3006, + "ok": 3177, + "ko": 817 + }, + "percentiles1": { + "total": 1277, + "ok": 1171, + "ko": 2031 + }, + "percentiles2": { + "total": 4207, + "ok": 4342, + "ko": 2537 + }, + "percentiles3": { + "total": 9435, + "ok": 9504, + "ko": 2645 + }, + "percentiles4": { + "total": 11426, + "ok": 11624, + "ko": 2677 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 17, + "percentage": 30 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 9, + "percentage": 16 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 24, + "percentage": 42 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5277777777777778, + "ok": 0.46296296296296297, + "ko": 0.06481481481481481 + } +} + },"req_request-277-d0ec5": { + "type": "REQUEST", + "name": "request_277", +"path": "request_277", +"pathFormatted": "req_request-277-d0ec5", +"stats": { + "name": "request_277", + "numberOfRequests": { + "total": 39, + "ok": 32, + "ko": 7 + }, + "minResponseTime": { + "total": 218, + "ok": 400, + "ko": 218 + }, + "maxResponseTime": { + "total": 13007, + "ok": 13007, + "ko": 2559 + }, + "meanResponseTime": { + "total": 2698, + "ok": 3000, + "ko": 1319 + }, + "standardDeviation": { + "total": 3297, + "ok": 3542, + "ko": 952 + }, + "percentiles1": { + "total": 948, + "ok": 949, + "ko": 844 + }, + "percentiles2": { + "total": 3764, + "ok": 4315, + "ko": 2278 + }, + "percentiles3": { + "total": 9774, + "ok": 10938, + "ko": 2547 + }, + "percentiles4": { + "total": 12916, + "ok": 12933, + "ko": 2557 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 11, + "percentage": 28 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 36 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 18 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.3611111111111111, + "ok": 0.2962962962962963, + "ko": 0.06481481481481481 + } +} + },"req_request-322-a2de9": { + "type": "REQUEST", + "name": "request_322", +"path": "request_322", +"pathFormatted": "req_request-322-a2de9", +"stats": { + "name": "request_322", + "numberOfRequests": { + "total": 250, + "ok": 250, + "ko": 0 + }, + "minResponseTime": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "maxResponseTime": { + "total": 241, + "ok": 241, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "percentiles1": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "percentiles2": { + "total": 60, + "ok": 60, + "ko": 0 + }, + "percentiles3": { + "total": 78, + "ok": 78, + "ko": 0 + }, + "percentiles4": { + "total": 106, + "ok": 106, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 2.314814814814815, + "ok": 2.314814814814815, + "ko": 0 + } +} + },"req_request-323-2fefc": { + "type": "REQUEST", + "name": "request_323", +"path": "request_323", +"pathFormatted": "req_request-323-2fefc", +"stats": { + "name": "request_323", + "numberOfRequests": { + "total": 250, + "ok": 250, + "ko": 0 + }, + "minResponseTime": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "maxResponseTime": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "meanResponseTime": { + "total": 61, + "ok": 61, + "ko": 0 + }, + "standardDeviation": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "percentiles1": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "percentiles2": { + "total": 68, + "ok": 68, + "ko": 0 + }, + "percentiles3": { + "total": 86, + "ok": 86, + "ko": 0 + }, + "percentiles4": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 250, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 2.314814814814815, + "ok": 2.314814814814815, + "ko": 0 + } +} + } +} + +} \ No newline at end of file diff --git a/webapp/loadTests/250users1minute/js/theme.js b/webapp/loadTests/250users1minute/js/theme.js new file mode 100644 index 0000000..b95a7b3 --- /dev/null +++ b/webapp/loadTests/250users1minute/js/theme.js @@ -0,0 +1,127 @@ +/* + * Copyright 2011-2022 Gatling Corp + * + * Licensed under the Gatling Highcharts License + */ +Highcharts.theme = { + chart: { + backgroundColor: '#f7f7f7', + borderWidth: 0, + borderRadius: 8, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#666', + tickColor: '#666', + labels: { + style: { + color: '#666' + } + }, + title: { + style: { + color: '#666' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: '#999', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#666', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#666', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + + rangeSelector: { + buttonTheme: { + fill: '#cfc9c6', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#b2b2a9' + }, + states: { + hover: { + fill: '#92918C', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#8b897d' + } + }, + select: { + fill: '#E37400', + stroke: '#000000', + style: { + color: '#FFF' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: '#8b897d' + } + }, + + navigator: { + handles: { + backgroundColor: '#f7f7f7', + borderColor: '#92918C' + }, + outlineColor: '#92918C', + outlineWidth: 1, + maskFill: 'rgba(146, 145, 140, 0.5)', + series: { + color: '#5E7BE2', + lineColor: '#5E7BE2' + } + }, + + scrollbar: { + buttonBackgroundColor: '#f7f7f7', + buttonBorderWidth: 1, + buttonBorderColor: '#92918C', + buttonArrowColor: '#92918C', + buttonBorderRadius: 2, + + barBorderWidth: 1, + barBorderRadius: 0, + barBackgroundColor: '#92918C', + barBorderColor: '#92918C', + + rifleColor: '#92918C', + + trackBackgroundColor: '#b0b0a8', + trackBorderWidth: 1, + trackBorderColor: '#b0b0a8' + } +}; + +Highcharts.setOptions(Highcharts.theme); diff --git a/webapp/loadTests/250users1minute/js/unpack.js b/webapp/loadTests/250users1minute/js/unpack.js new file mode 100644 index 0000000..883c33e --- /dev/null +++ b/webapp/loadTests/250users1minute/js/unpack.js @@ -0,0 +1,38 @@ +'use strict'; + +var unpack = function (array) { + var findNbSeries = function (array) { + var currentPlotPack; + var length = array.length; + + for (var i = 0; i < length; i++) { + currentPlotPack = array[i][1]; + if(currentPlotPack !== null) { + return currentPlotPack.length; + } + } + return 0; + }; + + var i, j; + var nbPlots = array.length; + var nbSeries = findNbSeries(array); + + // Prepare unpacked array + var unpackedArray = new Array(nbSeries); + + for (i = 0; i < nbSeries; i++) { + unpackedArray[i] = new Array(nbPlots); + } + + // Unpack the array + for (i = 0; i < nbPlots; i++) { + var timestamp = array[i][0]; + var values = array[i][1]; + for (j = 0; j < nbSeries; j++) { + unpackedArray[j][i] = [timestamp * 1000, values === null ? null : values[j]]; + } + } + + return unpackedArray; +}; diff --git a/webapp/loadTests/250users1minute/style/arrow_down.png b/webapp/loadTests/250users1minute/style/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdbc86e36d0d025402710734046405455ba300 GIT binary patch literal 983 zcmaJ=U2D@&7>;fZDHd;a3La7~Hn92V+O!GFMw@i5vXs(R?8T6!$!Qz9_ z=Rer5@K(VKz41c*2SY&wuf1>zUd=aM+wH=7NOI13d7tNf-jBSfRqrPg%L#^Il9g?} z4*PX@6IU1DyZip+6KpqWxkVeKLkDJnnW9bF7*$-ei|g35hfhA>b%t5E>oi-mW$Y*x zaXB;g;Ud=uG{dZKM!sqFF-2|Mbv%{*@#Zay99v}{(6Mta8f2H7$2EFFLFYh($vu~ z{_pC#Gw+br@wwiA5{J#9kNG+d$w6R2<2tE0l&@$3HYo|3gzQhNSnCl=!XELF){xMO zVOowC8&<~%!%!+-NKMbe6nl*YcI5V zYJ&NRkF&vr%WU+q2lF1lU?-O^-GZNDskYNBpN`kV!(aPgxlHTT#wqjtmGA&=s};T2 zjE>uT`ju-(hf9m^K6dqQrIXa_+Rv}MM}GwF^TyKc-wTU3m^&*>@7eL=F92dH<*NR& HwDFdgVhf9Ks!(i$ny>OtAWQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyvFlc$Sgh{pM)L8rMG3^=@Q{{O$p`t7BNW1mD+?G!w^;tkj$ z(itxFDR3sIr)^#L`so{%PjmYM-riK)$MRAsEYzTK67RjU>c3}HyQct6WAJqKb6Mw< G&;$UsBSU@w literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/arrow_right.png b/webapp/loadTests/250users1minute/style/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a609f80fe17e6f185e1b6373f668fc1f28baae2c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu@pObhHwBu4M$1`knic~;uxYa zvG@EzE(Qe-<_o&N{>R5n@3?e|Q?{o)*sCe{Y!G9XUG*c;{fmVEy{&lgYDVka)lZ$Q rCit0rf5s|lpJ$-R@IrLOqF~-LT3j-WcUP(c4Q23j^>bP0l+XkKUN$bz literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/arrow_right_black.png b/webapp/loadTests/250users1minute/style/arrow_right_black.png new file mode 100644 index 0000000000000000000000000000000000000000..651bd5d27675d9e92ac8d477f2db9efa89c2b355 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`!T#~#}T5FGAlLHD#mbgZgIOpf)rskC}I2WZRmZYXA zlxLP?D7bt2281{Ai31gRdb&7a_JLSF1VWMQKse&#dLi5wlM1_0 z{FM;Ti|sk&y~DuuWXc=~!vbOZMy|V())CrJpY;0L8wi!QM>m&zYv9kY5B?3u;2c!O zs6ZM%Cwv?}ZUCR5a}lC&3CiHSi?f8KBR+xu!araKY=q^sqfcTxa>ExJ5kHFbN8w@G zFbUZkx(k2U9zdM>;c2eb9<@Vt5POLKHVlK|b%E|Ae7gwwDx3hf9oZ^{qwoRjg6;52 zcpeJLI}f_J>rdS@R>r_B=yd$%s`3!zFD&bhZdZTkLaK?cPhvA2 zKl><4eGxC4a;Mdo*PR{+mo_KQ0&Hlk7(2(YeOGR{yx#iw!sRK{pC^Z_`%&gZIOHn( z0A)|bA46eyt%M^3$D@Q6QTcTUVt9h#E14pioqpnJ5Fv4vueCTp(_y(W_1RLr&f2 zqI)=IL-U*F1Lco^e7uSJ_DHlro5zyo?tjgxFM|B=QxDdXXQn?~UhTf54G*EKdD-|u zWftJKwuxmXUXwQ)-H%*()s8zUXDUnsXPpUz?CyzqH4f0-=E{2#{o&G^u_}`4MWPK| zGcOFrhQ_|B|0!d~OW(w?ZnYrKW>-GtKStgfYlX>^DA8Z$%3n^K?&qG-Jk_EOS}M&~ zSmyKt;kMY&T4m~Q6TU}wa>8Y`&PSBh4?T@@lTT9pxFoTjwOyl|2O4L_#y<(a2I`l( z_!a5jhgQ_TIdUr)8=4RH#^M$;j#_w?Px@py3nrhDhiKc)UU?GZD0>?D-D{Dt(GYo> z{mz&`fvtJyWsiEu#tG^&D6w2!Q}%77YrgU->oD<47@K|3>re}AiN6y)?PZJ&g*E?a zKTsDRQLmTaI&A1ZdIO9NN$rJnU;Z3Adexu2ePcTAeC}{L>Br!2@E6#XfZ{#`%~>X& z=AN$5tsc5kzOxRXr#W;#7#o`Z7J&8>o@2-Hf7Kkm!IjVCzgl^TIpI5AzN#yZ@~41% z3?8H2{p-qO(%6fPB=3LfX@mT$KG1!s`_Axt!dfRxdvzbLVLaRm@%_FltoUKGf*0d+ ziZ5(8A*2esb2%T!qR?L?zjmkbm{QqUbpo+5Y;bl<5@UZ>vksWYd= z)qkY5f?t3sS9McgxSvZB!y4B+m=m1+1HSLY^_yU9NU9HI=MZCKZ1qyBuJVc^sZe8I z76_F!A|Lxc=ickgKD?!mwk6ugVUJ6j9zaj^F=hXOxLKez+Y7DZig(sV+HgH#tq*Fq zv9Xu9c`>~afx=SHJ#wJXPWJ`Nn9dG0~%k(XL|0)b(fP9EKlYB(7M_h zTG8GN*3cg0nE{&5KXv6lO?Vx8{oFR{3;PP4=f?@yR=;-h)v?bYy(tW%oae#4-W?$S z^qDI!&nGH(RS)ppgpSgYFay zfX-0*!FbR*qP1P)#q_s)rf1k8c`Iw)A8G^pRqYAB!v3HiWsHnrp7XVCwx{i$<6HT! z!K7 zY1Mc-Co%a;dLZe6FN_B`E73b>oe7VIDLfDA+(FWyvn4$zdST9EFRHo+DTeofqdI0t$jFNyI9 zQfKTs`+N&tf;p7QOzXUtYC?Dr<*UBkb@qhhywuir2b~Ddgzcd7&O_93j-H`?=(!=j z1?gFE7pUGk$EX0k7tBH43ZtM8*X?+Z>zw&fPHW1kb9TfwXB^HsjQpVUhS`Cj-I%lA zbT_kuk;YD&cxR8!i=aB3BLDon2E1oRHx)XraG zuGLrVtNJ!Ffw11ONMCIBde24Mnv(V`$X}}Klc4h|z4z9q$?+f8KLXj(dr-YU?E^Z0 zGQ{8Gs4Vn;7t=q592Ga@3J|ZeqBAi)wOyY%d;Un91$yUG28$_o1dMi}Gre)7_45VK zryy5>>KlQFNV}f)#`{%;5Wgg*WBl|S?^s%SRRBHNHg(lKdBFpfrT*&$ZriH&9>{dt z=K2vZWlO4UTS4!rZwE8~e1o`0L1ju$=aV`&d?kU6To*82GLSz2>FVD36XXNCt;;{I zvq57=dTunvROdvbqqtd@t<(%LcAKMP`u}6Xp5IFF4xtHY8gr_nyL?^04*8(5sJZc9 zARYN=GpqrfH;SLYgDO|GA*^v_+NFDBKJ!ks?+Q$<858o=!|*N~fnD$zzIX1Wn7u*7 z6@$uGA84*U@1m5j@-ffb9g)8U>8c&l+e%yG?+W#PgfseheRwyb@!A&nt}D_mr@)TC z7vWw~{3ejS!{A3}400?;YTQfqhMu4?q5D~5@d?s2ZnI2#jih|Og|gfGYdK?%wYv*> z*MY{vX>83k`B@9}9YF@Dekyw*>;aXndM*a1KTICC^cUJ%e}<>k`j> z&a;&EIBlRiq{Dc44?=J^+zYuNTOWY-tv!wV36BKrC$tVvQathjI1A5#_IcXhYR{#5 zXuolbqsM-i@OsdmWd=IVH#3CQ?&I(>JPALBr7#E1fa3Ihz4E^RQPBQp13Uv-XFmt6 znG0h~jmgiD_k;5e7^$+h!$Eiow7$Ixs{d=C=Tfb)^3OIn3Ad{L_>Vn;-IVKA(2@G+ z8!hM&P7LH*?Hb7SjjFRsUd%6%NRz+7xKmOnt_Vj9eV__wnvUqALE y@<9iX-XLgKmGb5P*V(C?vZI{Ap0ljoe9iI#Pp2!ETh`m`k}sX$tTjPb`Thqd2I;E+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/little_arrow_right.png b/webapp/loadTests/250users1minute/style/little_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..252abe66d3a92aced2cff2df88e8a23d91459251 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd;O^<-7$PB=oN$2m z-(ru2pAv$OC-6w{28nSzPFOlManYH8W7Z01d5`Q)6p~NiIh8RX*um{#37-cePkG{I i?kCneiZ^N=&|+f{`pw(F`1}WPkkOv5elF{r5}E)*4>EfI literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/logo-enterprise.svg b/webapp/loadTests/250users1minute/style/logo-enterprise.svg new file mode 100644 index 0000000..4a6e1de --- /dev/null +++ b/webapp/loadTests/250users1minute/style/logo-enterprise.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/webapp/loadTests/250users1minute/style/logo.svg b/webapp/loadTests/250users1minute/style/logo.svg new file mode 100644 index 0000000..f519eef --- /dev/null +++ b/webapp/loadTests/250users1minute/style/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/webapp/loadTests/250users1minute/style/sortable.png b/webapp/loadTests/250users1minute/style/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb54f9acddb8848e68b640d416bf959cb18b6a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd5b5dS7$PCr+ka7z zL4e13=24exMiQ@YG*qwKncdI-GfUZ1Rki=vCY#SQRzF`R>17u7PVwr=D?vVeZ+UA{ zG@h@BI20Mdp}F2&UODjiSKfWA%2W&v$1X_F*vS}sO7fVb_47iIWuC5nF6*2Ung9-k BJ)r;q literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/sorted-down.png b/webapp/loadTests/250users1minute/style/sorted-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5100cc8efd490cf534a6186f163143bc59de3036 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVDIVT7$PB=oN$2m z-{GYajXDDFEn-;Il?7IbEN2SgoY1K-S+LB}QlU75b4p`dJwwurrwV2sJj^AGt`0LQ Z7#M<{@}@-BSMLEC>FMg{vd$@?2>{QlDr5iv literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/sorted-up.png b/webapp/loadTests/250users1minute/style/sorted-up.png new file mode 100644 index 0000000000000000000000000000000000000000..340a5f0370f1a74439459179e9c4cf1610de75d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVD0JR7$PB=oN$2m z-(rtihEG!hT@vQ#Ni?%SDB=JB literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/stat-fleche-bas.png b/webapp/loadTests/250users1minute/style/stat-fleche-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b501a37f521fa56ce790b5279b204cf16f275 GIT binary patch literal 625 zcmV-%0*?KOP)X1^@s6HR9gx0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6G=otRCwBaRk3XYF$@$1uayA|xJs2O zh6iw!${V;%XBun$AzDJ_5hsobnt%D0lR{6AC-TZ=qQYNSE%4fZr(r%*U%{3#@fMV-wZ|U32I`2RVTet9ov9a1><;a zc490LC;}x<)W9HSa|@E2D5Q~wPER)4Hd~) z7a}hi*bPEZ3E##6tEpfWilBDoTvc z!^R~Z;5%h77OwQK2sCp1=!WSe*z2u-)=XU8l4MF00000 LNkvXXu0mjfMhXuu literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/stat-l-roue.png b/webapp/loadTests/250users1minute/style/stat-l-roue.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a3aae0169d62a079278f0a6737f3376f1b45ae GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!N$PAIIE<7Cy>LE?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2hb1*QrXELw=S&Tp|1;h*tObeLcA_5DT;cR}8^0f~MUKVSdnX!bNbd8LT)Sw-%(F%_zr0N|UagV3xWgqvH;8K?&n0oOR41jMpR4np z@3~veKIhln&vTy7`M&S_y+s{K$4a+%SBakr4tulXXK%nlnMZA<7fW86CAV}Io#FMZ zJKEZlXuR&E=;dFVn4ON?-myI9m-fc)cdfl=xStxmHlE_%*ZyqH3w8e^yf4K+{I{K9 z7w&AxcaMk7ySZ|)QCy;@Qg`etYuie0o>bqd-!G^vY&6qP5x86+IYoDN%G}3H>wNMj zPL^13>44!EmANYvNU$)%J@GUM4J8`33?}zp?$qRpGv)z8kkP`CHe&Oqvvu;}m~M yv&%5+ugjcD{r&Hid!>2~a6b9iXUJ`u|A%4w{h$p3k*sGyq3h}D=d#Wzp$Py=EVp6+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/stat-l-temps.png b/webapp/loadTests/250users1minute/style/stat-l-temps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce268037f94ef73f56cd658d392ef393d562db3 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^{2w#$-&vQnwtC-_ zkh{O~uCAT`QnSlTzs$^@t=jDWl)1cj-p;w{budGVRji^Z`nX^5u3Kw&?Kk^Y?fZDw zg5!e%<_ApQ}k@w$|KtRPs~#LkYapu zf%*GA`~|UpRDQGRR`SL_+3?i5Es{UA^j&xb|x=ujSRd8$p5V>FVdQ&MBb@04c<~BLDyZ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/250users1minute/style/style.css b/webapp/loadTests/250users1minute/style/style.css new file mode 100644 index 0000000..7f50e1b --- /dev/null +++ b/webapp/loadTests/250users1minute/style/style.css @@ -0,0 +1,988 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --gatling-background-color: #f2f2f2; + --gatling-background-light-color: #f7f7f7; + --gatling-border-color: #dddddd; + --gatling-blue-color: #4a9fe5; + --gatling-dark-blue-color: #24275e; + --gatling-danger-color: #f15b4f; + --gatling-danger-light-color: #f5d1ce; + --gatling-enterprise-color: #6161d6; + --gatling-enterprise-light-color: #c4c4ed; + --gatling-gray-medium-color: #bbb; + --gatling-hover-color: #e6e6e6; + --gatling-light-color: #ffffff; + --gatling-orange-color: #f78557; + --gatling-success-color: #68b65c; + --gatling-text-color: #1f2024; + --gatling-total-color: #ffa900; + + --gatling-border-radius: 2px; + --gatling-spacing-small: 5px; + --gatling-spacing: 10px; + --gatling-spacing-layout: 20px; + + --gatling-font-weight-normal: 400; + --gatling-font-weight-medium: 500; + --gatling-font-weight-bold: 700; + --gatling-font-size-secondary: 12px; + --gatling-font-size-default: 14px; + --gatling-font-size-heading: 16px; + --gatling-font-size-section: 22px; + --gatling-font-size-header: 34px; + + --gatling-media-desktop-large: 1920px; +} + +* { + min-height: 0; + min-width: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + color: var(--gatling-text-color); + font-family: arial; + font-size: var(--gatling-font-size-secondary); + margin: 0; +} + +.app-container { + display: flex; + flex-direction: column; + + height: 100%; + width: 100%; +} + +.head { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + + flex: 1; + + background-color: var(--gatling-light-color); + border-bottom: 1px solid var(--gatling-border-color); + min-height: 69px; + padding: 0 var(--gatling-spacing-layout); +} + +.gatling-open-source { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + gap: var(--gatling-spacing-layout); +} + +.gatling-documentation { + display: flex; + align-items: center; + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-orange-color); + border: 1px solid var(--gatling-orange-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 23px; +} + +.gatling-documentation:hover { + background-color: var(--gatling-orange-color); + color: var(--gatling-light-color); +} + +.gatling-logo { + height: 35px; +} + +.gatling-logo img { + height: 100%; +} + +.container { + display: flex; + align-items: stretch; + height: 100%; +} + +.nav { + min-width: 210px; + width: 210px; + max-height: calc(100vh - var(--gatling-spacing-layout) - var(--gatling-spacing-layout)); + background: var(--gatling-light-color); + border-right: 1px solid var(--gatling-border-color); + overflow-y: auto; +} + +@media print { + .nav { + display: none; + } +} + +@media screen and (min-width: 1920px) { + .nav { + min-width: 310px; + width: 310px; + } +} + +.nav ul { + display: flex; + flex-direction: column; + + padding: 0; + margin: 0; +} + +.nav li { + display: flex; + list-style: none; + width: 100%; + padding: 0; +} + +.nav .item { + display: inline-flex; + align-items: center; + margin: 0 auto; + white-space: nowrap; + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + margin: 0; + width: 100%; +} + +.nav .item .nav-label { + padding: var(--gatling-spacing) var(--gatling-spacing-layout); +} + +.nav .item:hover { + background-color: var(--gatling-hover-color); +} + +.nav .on .item { + background-color: var(--gatling-orange-color); +} + +.nav .on .item span { + color: var(--gatling-light-color); +} + +.cadre { + width: 100%; + height: 100%; + overflow-y: scroll; + scroll-behavior: smooth; +} + +@media print { + .cadre { + overflow-y: unset; + } +} + +.frise { + position: absolute; + top: 60px; + z-index: -1; + + background-color: var(--gatling-background-color); + height: 530px; +} + +.global { + height: 650px +} + +a { + text-decoration: none; +} + +a:hover { + color: var(--gatling-hover-color); +} + +img { + border: 0; +} + +h1 { + color: var(--gatling-dark-blue-color); + font-size: var(--gatling-font-size-section); + font-weight: var(--gatling-font-weight-medium); + text-align: center; + margin: 0; +} + +h1 span { + color: var(--gatling-hover-color); +} + +.enterprise { + display: flex; + align-items: center; + justify-content: center; + gap: var(--gatling-spacing-small); + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-enterprise-color); + color: var(--gatling-enterprise-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 25px; +} + +.enterprise:hover { + background-color: var(--gatling-enterprise-light-color); + color: var(--gatling-enterprise-color); +} + +.enterprise img { + display: block; + width: 160px; +} + +.simulation-card { + display: flex; + flex-direction: column; + align-self: stretch; + flex: 1; + gap: var(--gatling-spacing-layout); + max-height: 375px; +} + +#simulation-information { + flex: 1; +} + +.simulation-version-information { + display: flex; + flex-direction: column; + + gap: var(--gatling-spacing); + font-size: var(--gatling-font-size-default); + + background-color: var(--gatling-background-color); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing); +} + +.simulation-information-container { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing); +} + +.withTooltip .popover-title { + display: none; +} + +.popover-content p { + margin: 0; +} + +.ellipsed-name { + display: block; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.simulation-information-item { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--gatling-spacing-small); +} + +.simulation-information-item.description { + flex-direction: column; +} + +.simulation-information-label { + display: inline-block; + font-weight: var(--gatling-font-weight-bold); + min-width: fit-content; +} + +.simulation-information-title { + display: block; + text-align: center; + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + width: 100%; +} + +.simulation-tooltip span { + display: inline-block; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; +} + +.content { + display: flex; + flex-direction: column; +} + +.content-in { + width: 100%; + height: 100%; + + overflow-x: scroll; +} + +@media print { + .content-in { + overflow-x: unset; + } +} + +.container-article { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + min-width: 1050px; + width: 1050px; + margin: 0 auto; + padding: var(--gatling-spacing-layout); + box-sizing: border-box; +} + +@media screen and (min-width: 1920px) { + .container-article { + min-width: 1350px; + width: 1350px; + } + + #responses * .highcharts-tracker { + transform: translate(400px, 70px); + } +} + +.content-header { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + background-color: var(--gatling-background-light-color); + border-bottom: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-layout) var(--gatling-spacing-layout) 0; +} + +.onglet { + font-size: var(--gatling-font-size-header); + font-weight: var(--gatling-font-weight-medium); + text-align: center; +} + +.sous-menu { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.sous-menu-spacer { + display: flex; + align-items: center; + flex-direction: row; +} + +.sous-menu .item { + margin-bottom: -1px; +} + +.sous-menu a { + display: block; + + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-normal); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border-bottom: 2px solid transparent; + color: var(--gatling-text-color); + text-align: center; + width: 100px; +} + +.sous-menu a:hover { + border-bottom-color: var(--gatling-text-color); +} + +.sous-menu .ouvert a { + border-bottom-color: var(--gatling-orange-color); + font-weight: var(--gatling-font-weight-bold); +} + +.article { + position: relative; + + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); +} + +.infos { + width: 340px; + color: var(--gatling-light-color); +} + +.infos-title { + background-color: var(--gatling-background-light-color); + border: 1px solid var(--gatling-border-color); + border-bottom: 0; + border-top-left-radius: var(--gatling-border-radius); + border-top-right-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.info { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + height: 100%; + margin: 0; +} + +.info table { + margin: auto; + padding-right: 15px; +} + +.alert-danger { + background-color: var(--gatling-danger-light-color); + border: 1px solid var(--gatling-danger-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + padding: var(--gatling-spacing-layout); + font-weight: var(--gatling-font-weight-bold); +} + +.repli { + position: absolute; + bottom: 0; + right: 0; + + background: url('stat-fleche-bas.png') no-repeat top left; + height: 25px; + width: 22px; +} + +.infos h2 { + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + height: 19px; + margin: 0; + padding: 3.5px 0 0 35px; +} + +.infos .first { + background: url('stat-l-roue.png') no-repeat 15px 5px; +} + +.infos .second { + background: url('stat-l-temps.png') no-repeat 15px 3px; + border-top: 1px solid var(--gatling-border-color); +} + +.infos th { + text-align: center; +} + +.infos td { + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing-small); + -webkit-border-radius: var(--gatling-border-radius); + -moz-border-radius: var(--gatling-border-radius); + -ms-border-radius: var(--gatling-border-radius); + -o-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + text-align: right; + width: 50px; +} + +.infos .title { + width: 120px; +} + +.infos .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); +} + +.infos .total { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); +} + +.infos .ko { + background-color: var(--gatling-danger-color); + -webkit-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); +} + +.schema-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--gatling-spacing-layout); +} + +.schema { + background: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); +} + +.ranges { + height: 375px; + width: 500px; +} + +.ranges-large { + height: 375px; + width: 530px; +} + +.geant { + height: 362px; +} + +.extensible-geant { + width: 100%; +} + +.polar { + height: 375px; + width: 230px; +} + +.chart_title { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + padding: 2px var(--gatling-spacing); +} + +.statistics { + display: flex; + flex-direction: column; + + background-color: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border-collapse: collapse; + color: var(--gatling-text-color); + max-height: 100%; +} + +.statistics .title { + display: flex; + text-align: center; + justify-content: space-between; + + min-height: 49.5px; + box-sizing: border-box; + + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing); +} + +.title_base { + display: flex; + align-items: center; + text-align: left; + user-select: none; +} + +.title_base_stats { + color: var(--gatling-text-color); + margin-right: 20px; +} + +.toggle-table { + position: relative; + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: 25px; + width: 40px; + height: 20px; + margin: 0 var(--gatling-spacing-small); +} + +.toggle-table::before { + position: absolute; + top: calc(50% - 9px); + left: 1px; + content: ""; + width: 50%; + height: 18px; + border-radius: 50%; + background-color: var(--gatling-text-color); +} + +.toggle-table.off::before { + left: unset; + right: 1px; +} + +.title_expanded { + cursor: pointer; + color: var(--gatling-text-color); +} + +.expand-table, +.collapse-table { + font-size: var(--gatling-font-size-secondary); + font-weight: var(--gatling-font-weight-normal); +} + +.title_expanded span.expand-table { + color: var(--gatling-gray-medium-color); +} + +.title_collapsed { + cursor: pointer; + color: var(--gatling-text-color); +} + +.title_collapsed span.collapse-table { + color: var(--gatling-gray-medium-color); +} + +#container_statistics_head { + position: sticky; + top: -1px; + + background: var(--gatling-background-light-color); + margin-top: -1px; + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); +} + +#container_statistics_body { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + margin-top: -1px; + padding: 0px var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small); +} + +#container_errors { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); + margin-top: -1px; +} + +#container_assertions { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small); + margin-top: -1px; +} + +.statistics-in { + border-spacing: var(--gatling-spacing-small); + border-collapse: collapse; + margin: 0; +} + +.statistics .scrollable { + max-height: 100%; + overflow-y: auto; +} + +#statistics_table_container .statistics .scrollable { + max-height: 785px; +} + +.statistics-in a { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .header { + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small); +} + +.sortable { + cursor: pointer; +} + +.sortable span { + background: url('sortable.png') no-repeat right 3px; + padding-right: 10px; +} + +.sorted-up span { + background-image: url('sorted-up.png'); +} + +.sorted-down span { + background-image: url('sorted-down.png'); +} + +.executions { + background: url('stat-l-roue.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.response-time { + background: url('stat-l-temps.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.statistics-in td { + background-color: var(--gatling-light-color); + border: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-small); + min-width: 50px; +} + +.statistics-in .col-1 { + width: 175px; + max-width: 175px; +} +@media screen and (min-width: 1200px) { + .statistics-in .col-1 { + width: 50%; + } +} + +.expandable-container { + display: flex; + flex-direction: row; + box-sizing: border-box; + max-width: 100%; +} + +.statistics-in .value { + text-align: right; + width: 50px; +} + +.statistics-in .total { + color: var(--gatling-text-color); +} + +.statistics-in .col-2 { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .error-col-1 { + background-color: var(--gatling-light-color); + color: var(--gatling-text-color); +} + +.statistics-in .error-col-2 { + text-align: center; +} + +.statistics-in .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .ko { + background-color: var(--gatling-danger-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .expand-button { + padding-left: var(--gatling-spacing); + cursor: pointer; +} + +.expand-button.hidden { + background: none; + cursor: default; +} + +.statistics-button { + background-color: var(--gatling-light-color); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); +} + +.statistics-button:hover:not(:disabled) { + cursor: pointer; + background-color: var(--gatling-hover-color); +} + +.statistics-in .expand-button.expand { + background: url('little_arrow_right.png') no-repeat 3px 3px; +} + +.statistics-in .expand-button.collapse { + background: url('sorted-down.png') no-repeat 3px 3px; +} + +.nav .expand-button { + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.nav .expand-button.expand { + background: url('arrow_right_black.png') no-repeat 5px 10px; + cursor: pointer; +} + +.nav .expand-button.collapse { + background: url('arrow_down_black.png') no-repeat 3px 12px; + cursor: pointer; +} + +.nav .on .expand-button.expand { + background-image: url('arrow_right_black.png'); +} + +.nav .on .expand-button.collapse { + background-image: url('arrow_down_black.png'); +} + +.right { + display: flex; + align-items: center; + gap: var(--gatling-spacing); + float: right; + font-size: var(--gatling-font-size-default); +} + +.withTooltip { + outline: none; +} + +.withTooltip:hover { + text-decoration: none; +} + +.withTooltip .tooltipContent { + position: absolute; + z-index: 10; + display: none; + + background: var(--gatling-orange-color); + -webkit-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + -moz-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); + margin-top: -5px; + padding: var(--gatling-spacing-small); +} + +.withTooltip:hover .tooltipContent { + display: inline; +} + +.statistics-table-modal { + height: calc(100% - 60px); + width: calc(100% - 60px); + border-radius: var(--gatling-border-radius); +} + +.statistics-table-modal::backdrop { + position: fixed; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + + background-color: rgba(100, 100, 100, 0.9); +} + +.statistics-table-modal-container { + display: flex; + flex-direction: column; + + width: 100%; + height: calc(100% - 35px); + overflow-x: auto; +} + +.button-modal { + cursor: pointer; + + height: 25px; + width: 25px; + + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); +} + +.button-modal:hover { + background-color: var(--gatling-background-color); +} + +.statistics-table-modal-header { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-bottom: var(--gatling-spacing); +} + +.statistics-table-modal-content { + flex: 1; + overflow-y: auto; + min-width: 1050px; +} + +.statistics-table-modal-footer { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-top: var(--gatling-spacing); +} diff --git a/webapp/loadTests/25usersAtOnce.html b/webapp/loadTests/25users/25usersAtOnce.html similarity index 100% rename from webapp/loadTests/25usersAtOnce.html rename to webapp/loadTests/25users/25usersAtOnce.html diff --git a/webapp/loadTests/25users/js/all_sessions.js b/webapp/loadTests/25users/js/all_sessions.js new file mode 100644 index 0000000..dacea19 --- /dev/null +++ b/webapp/loadTests/25users/js/all_sessions.js @@ -0,0 +1,11 @@ +allUsersData = { + +color: '#FFA900', +name: 'Active Users', +data: [ + [1682848468000,25],[1682848469000,25],[1682848470000,25],[1682848471000,25],[1682848472000,25],[1682848473000,25],[1682848474000,25],[1682848475000,25],[1682848476000,25],[1682848477000,25],[1682848478000,25],[1682848479000,25],[1682848480000,25],[1682848481000,25],[1682848482000,25],[1682848483000,25],[1682848484000,25],[1682848485000,25],[1682848486000,25],[1682848487000,25],[1682848488000,25],[1682848489000,25],[1682848490000,25],[1682848491000,25],[1682848492000,25],[1682848493000,25],[1682848494000,25],[1682848495000,25],[1682848496000,25],[1682848497000,25],[1682848498000,25],[1682848499000,25],[1682848500000,25],[1682848501000,25],[1682848502000,25],[1682848503000,25],[1682848504000,25],[1682848505000,25],[1682848506000,16],[1682848507000,10],[1682848508000,4] +], +tooltip: { yDecimals: 0, ySuffix: '', valueDecimals: 0 } + , zIndex: 20 + , yAxis: 1 +}; \ No newline at end of file diff --git a/webapp/loadTests/25users/js/assertions.json b/webapp/loadTests/25users/js/assertions.json new file mode 100644 index 0000000..aaed31b --- /dev/null +++ b/webapp/loadTests/25users/js/assertions.json @@ -0,0 +1,10 @@ +{ + "simulation": "RecordedSimulation", + "simulationId": "recordedsimulation-20230430095427073", + "start": 1682848468072, + "description": "", + "scenarios": ["RecordedSimulation"], + "assertions": [ + + ] +} \ No newline at end of file diff --git a/webapp/loadTests/25users/js/assertions.xml b/webapp/loadTests/25users/js/assertions.xml new file mode 100644 index 0000000..5e4dbe9 --- /dev/null +++ b/webapp/loadTests/25users/js/assertions.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/webapp/loadTests/25users/js/bootstrap.min.js b/webapp/loadTests/25users/js/bootstrap.min.js new file mode 100644 index 0000000..ea41042 --- /dev/null +++ b/webapp/loadTests/25users/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-tooltip.js, bootstrap-popover.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery) \ No newline at end of file diff --git a/webapp/loadTests/25users/js/ellipsis.js b/webapp/loadTests/25users/js/ellipsis.js new file mode 100644 index 0000000..781d0de --- /dev/null +++ b/webapp/loadTests/25users/js/ellipsis.js @@ -0,0 +1,26 @@ +function parentId(name) { + return "parent-" + name; +} + +function isEllipsed(name) { + const child = document.getElementById(name); + const parent = document.getElementById(parentId(name)); + const emptyData = parent.getAttribute("data-content") === ""; + const hasOverflow = child.clientWidth < child.scrollWidth; + + if (hasOverflow) { + if (emptyData) { + parent.setAttribute("data-content", name); + } + } else { + if (!emptyData) { + parent.setAttribute("data-content", ""); + } + } +} + +function ellipsedLabel ({ name, parentClass = "", childClass = "" }) { + const child = "" + name + ""; + + return "" + child + ""; +} diff --git a/webapp/loadTests/25users/js/gatling.js b/webapp/loadTests/25users/js/gatling.js new file mode 100644 index 0000000..0208f82 --- /dev/null +++ b/webapp/loadTests/25users/js/gatling.js @@ -0,0 +1,137 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function ($) { + $.fn.expandable = function () { + var scope = this; + + this.find('.expand-button:not([class*=hidden])').addClass('collapse').on('click', function () { + var $this = $(this); + + if ($this.hasClass('expand')) + $this.expand(scope); + else + $this.collapse(scope); + }); + + this.find('.expand-all-button').on('click', function () { + $(this).expandAll(scope); + }); + + this.find('.collapse-all-button').on('click', function () { + $(this).collapseAll(scope); + }); + + this.collapseAll(this); + + return this; + }; + + $.fn.expand = function (scope, recursive) { + return this.each(function () { + var $this = $(this); + + if (recursive) { + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + } + + if ($this.hasClass('expand')) { + $('*[data-parent=' + $this.attr('id') + ']').toggle(true); + $this.toggleClass('expand').toggleClass('collapse'); + } + }); + }; + + $.fn.expandAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.expand').expand(scope, true); + $('*[data-parent=ROOT]').find('.expand-button.collapse').expand(scope, true); + }; + + $.fn.collapse = function (scope) { + return this.each(function () { + var $this = $(this); + + scope.find('*[data-parent=' + $this.attr('id') + '] .expand-button.collapse').collapse(scope); + scope.find('*[data-parent=' + $this.attr('id') + ']').toggle(false); + $this.toggleClass('expand').toggleClass('collapse'); + }); + }; + + $.fn.collapseAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.collapse').collapse(scope); + }; + + $.fn.sortable = function (target) { + var table = this; + + this.find('thead .sortable').on('click', function () { + var $this = $(this); + + if ($this.hasClass('sorted-down')) { + var desc = false; + var style = 'sorted-up'; + } + else { + var desc = true; + var style = 'sorted-down'; + } + + $(target).sortTable($this.attr('id'), desc); + + table.find('thead .sortable').removeClass('sorted-up sorted-down'); + $this.addClass(style); + + return false; + }); + + return this; + }; + + $.fn.sortTable = function (col, desc) { + function getValue(line) { + var cell = $(line).find('.' + col); + + if (cell.hasClass('value')) + var value = cell.text(); + else + var value = cell.find('.value').text(); + + return parseFloat(value); + } + + function sortLines (lines, group) { + var notErrorTable = col.search("error") == -1; + var linesToSort = notErrorTable ? lines.filter('*[data-parent=' + group + ']') : lines; + + var sortedLines = linesToSort.sort(function (a, b) { + return desc ? getValue(b) - getValue(a): getValue(a) - getValue(b); + }).toArray(); + + var result = []; + $.each(sortedLines, function (i, line) { + result.push(line); + if (notErrorTable) + result = result.concat(sortLines(lines, $(line).attr('id'))); + }); + + return result; + } + + this.find('tbody').append(sortLines(this.find('tbody tr').detach(), 'ROOT')); + + return this; + }; +})(jQuery); diff --git a/webapp/loadTests/25users/js/global_stats.json b/webapp/loadTests/25users/js/global_stats.json new file mode 100644 index 0000000..97eeb1c --- /dev/null +++ b/webapp/loadTests/25users/js/global_stats.json @@ -0,0 +1,77 @@ +{ + "name": "All Requests", + "numberOfRequests": { + "total": 1051, + "ok": 805, + "ko": 246 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 183 + }, + "maxResponseTime": { + "total": 4787, + "ok": 4787, + "ko": 3455 + }, + "meanResponseTime": { + "total": 901, + "ok": 527, + "ko": 2126 + }, + "standardDeviation": { + "total": 1023, + "ok": 672, + "ko": 1015 + }, + "percentiles1": { + "total": 492, + "ok": 348, + "ko": 2519 + }, + "percentiles2": { + "total": 1100, + "ok": 694, + "ko": 3016 + }, + "percentiles3": { + "total": 3211, + "ok": 1684, + "ko": 3344 + }, + "percentiles4": { + "total": 3770, + "ok": 4025, + "ko": 3416 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 659, + "percentage": 63 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 80, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 66, + "percentage": 6 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 246, + "percentage": 23 +}, + "meanNumberOfRequestsPerSecond": { + "total": 25.634146341463413, + "ok": 19.634146341463413, + "ko": 6.0 + } +} \ No newline at end of file diff --git a/webapp/loadTests/25users/js/highcharts-more.js b/webapp/loadTests/25users/js/highcharts-more.js new file mode 100644 index 0000000..2d78893 --- /dev/null +++ b/webapp/loadTests/25users/js/highcharts-more.js @@ -0,0 +1,60 @@ +/* + Highcharts JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(x){"object"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(b){function r(b,a,d){this.init(b,a,d)}var t=b.each,w=b.extend,m=b.merge,q=b.splat;w(r.prototype,{init:function(b,a,d){var f=this,h=f.defaultOptions;f.chart=a;f.options=b=m(h,a.angular?{background:{}}:void 0,b);(b=b.background)&&t([].concat(q(b)).reverse(),function(a){var c,h=d.userOptions;c=m(f.defaultBackgroundOptions,a);a.backgroundColor&&(c.backgroundColor=a.backgroundColor);c.color=c.backgroundColor; +d.options.plotBands.unshift(c);h.plotBands=h.plotBands||[];h.plotBands!==d.options.plotBands&&h.plotBands.unshift(c)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{className:"highcharts-pane",shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});b.Pane=r})(x);(function(b){var r=b.CenteredSeriesMixin, +t=b.each,w=b.extend,m=b.map,q=b.merge,e=b.noop,a=b.Pane,d=b.pick,f=b.pInt,h=b.splat,u=b.wrap,c,l,k=b.Axis.prototype;b=b.Tick.prototype;c={getOffset:e,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:e,setCategories:e,setTitle:e};l={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2}, +defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);a.plotBands||(a.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= +r.getCenter.call(this.pane)},getLinePath:function(a,g){a=this.center;var c=this.chart,f=d(g,a[2]/2-this.offset);this.isCircular||void 0!==g?g=this.chart.renderer.symbols.arc(this.left+a[0],this.top+a[1],f,f,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(g=this.postTranslate(this.angleRad,f),g=["M",a[0]+c.plotLeft,a[1]+c.plotTop,"L",g.x,g.y]);return g},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/ +(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===d(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.center=this.pane.center=r.getCenter.call(this.pane),this.isCircular&& +(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*d(this.sector,1)/2)},getPosition:function(a,g){return this.postTranslate(this.isCircular?this.translate(a):this.angleRad,d(this.isCircular?g:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,g){var d=this.chart,c=this.center;a=this.startAngleRad+a;return{x:d.plotLeft+c[0]+Math.cos(a)*g,y:d.plotTop+c[1]+Math.sin(a)*g}},getPlotBandPath:function(a,g,c){var h=this.center,p=this.startAngleRad, +k=h[2]/2,n=[d(c.outerRadius,"100%"),c.innerRadius,d(c.thickness,10)],b=Math.min(this.offset,0),l=/%$/,u,e=this.isCircular;"polygon"===this.options.gridLineInterpolation?h=this.getPlotLinePath(a).concat(this.getPlotLinePath(g,!0)):(a=Math.max(a,this.min),g=Math.min(g,this.max),e||(n[0]=this.translate(a),n[1]=this.translate(g)),n=m(n,function(a){l.test(a)&&(a=f(a,10)*k/100);return a}),"circle"!==c.shape&&e?(a=p+this.translate(a),g=p+this.translate(g)):(a=-Math.PI/2,g=1.5*Math.PI,u=!0),n[0]-=b,n[2]-= +b,h=this.chart.renderer.symbols.arc(this.left+h[0],this.top+h[1],n[0],n[0],{start:Math.min(a,g),end:Math.max(a,g),innerR:d(n[1],n[0]-n[2]),open:u}));return h},getPlotLinePath:function(a,g){var d=this,c=d.center,f=d.chart,h=d.getPosition(a),k,b,p;d.isCircular?p=["M",c[0]+f.plotLeft,c[1]+f.plotTop,"L",h.x,h.y]:"circle"===d.options.gridLineInterpolation?(a=d.translate(a))&&(p=d.getLinePath(0,a)):(t(f.xAxis,function(a){a.pane===d.pane&&(k=a)}),p=[],a=d.translate(a),c=k.tickPositions,k.autoConnect&&(c= +c.concat([c[0]])),g&&(c=[].concat(c).reverse()),t(c,function(g,d){b=k.getPosition(g,a);p.push(d?"L":"M",b.x,b.y)}));return p},getTitlePosition:function(){var a=this.center,g=this.chart,d=this.options.title;return{x:g.plotLeft+a[0]+(d.x||0),y:g.plotTop+a[1]-{high:.5,middle:.25,low:0}[d.align]*a[2]+(d.y||0)}}};u(k,"init",function(f,g,k){var b=g.angular,p=g.polar,n=k.isX,u=b&&n,e,A=g.options,m=k.pane||0;if(b){if(w(this,u?c:l),e=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(w(this, +l),this.defaultRadialOptions=(e=n)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions));b||p?(this.isRadial=!0,g.inverted=!1,A.chart.zoomType=null):this.isRadial=!1;f.call(this,g,k);u||!b&&!p||(f=this.options,g.panes||(g.panes=[]),this.pane=g=g.panes[m]=g.panes[m]||new a(h(A.pane)[m],g,this),g=g.options,this.angleRad=(f.angle||0)*Math.PI/180,this.startAngleRad=(g.startAngle-90)*Math.PI/180,this.endAngleRad=(d(g.endAngle,g.startAngle+360)-90)*Math.PI/180,this.offset=f.offset|| +0,this.isCircular=e)});u(k,"autoLabelAlign",function(a){if(!this.isRadial)return a.apply(this,[].slice.call(arguments,1))});u(b,"getPosition",function(a,d,c,f,h){var g=this.axis;return g.getPosition?g.getPosition(c):a.call(this,d,c,f,h)});u(b,"getLabelPosition",function(a,g,c,f,h,k,b,l,u){var n=this.axis,p=k.y,e=20,y=k.align,v=(n.translate(this.pos)+n.startAngleRad+Math.PI/2)/Math.PI*180%360;n.isRadial?(a=n.getPosition(this.pos,n.center[2]/2+d(k.distance,-25)),"auto"===k.rotation?f.attr({rotation:v}): +null===p&&(p=n.chart.renderer.fontMetrics(f.styles.fontSize).b-f.getBBox().height/2),null===y&&(n.isCircular?(this.label.getBBox().width>n.len*n.tickInterval/(n.max-n.min)&&(e=0),y=v>e&&v<180-e?"left":v>180+e&&v<360-e?"right":"center"):y="center",f.attr({align:y})),a.x+=k.x,a.y+=p):a=a.call(this,g,c,f,h,k,b,l,u);return a});u(b,"getMarkPath",function(a,d,c,f,h,k,b){var g=this.axis;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+f),d=["M",d,c,"L",a.x,a.y]):d=a.call(this,d,c,f,h,k,b);return d})})(x); +(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.Series,q=b.seriesType,e=b.seriesTypes;q("arearange","area",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:["low","high"],dataLabelCollections:["dataLabel", +"dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var d=this.chart,f=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=f.x-d.plotLeft;a.plotHigh=f.y-d.plotTop},translate:function(){var a=this,d=a.yAxis,f=!!a.modifyValue;e.area.prototype.translate.apply(a);r(a.points,function(h){var b=h.low,c=h.high,l=h.plotY;null===c||null===b?h.isNull=!0:(h.plotLow=l,h.plotHigh=d.translate(f?a.modifyValue(c,h):c,0,1, +0,1),f&&(h.yBottom=h.plotHigh))});this.chart.polar&&r(this.points,function(d){a.highToXY(d)})},getGraphPath:function(a){var d=[],f=[],h,b=e.area.prototype.getGraphPath,c,l,k;k=this.options;var p=k.step;a=a||this.points;for(h=a.length;h--;)c=a[h],c.isNull||k.connectEnds||a[h+1]&&!a[h+1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),l={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,yBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},f.push(l),d.push(l),c.isNull|| +k.connectEnds||a[h-1]&&!a[h-1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=b.call(this,a);p&&(!0===p&&(p="left"),k.step={left:"right",center:"center",right:"left"}[p]);d=b.call(this,d);f=b.call(this,f);k.step=p;k=[].concat(a,d);this.chart.polar||"M"!==f[0]||(f[0]="L");this.graphPath=k;this.areaPath=this.areaPath.concat(a,f);k.isArea=!0;k.xMap=a.xMap;this.areaPath.xMap=a.xMap;return k},drawDataLabels:function(){var a=this.data,d=a.length,f,h=[],b=m.prototype,c=this.options.dataLabels, +l=c.align,k=c.verticalAlign,p=c.inside,g,n,e=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,h[f]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=n,e?l||(c.align=n?"right":"left"):k||(c.verticalAlign=n?"top":"bottom"),c.x=c.xHigh,c.y=c.yHigh;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.dataLabelUpper= +g.dataLabel,g.dataLabel=h[f],g.y=g.low,g.plotY=g._plotY,g.below=!n,e?l||(c.align=n?"left":"right"):k||(c.verticalAlign=n?"bottom":"top"),c.x=c.xLow,c.y=c.yLow;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}c.align=l;c.verticalAlign=k},alignDataLabel:function(){e.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(x);(function(b){var r=b.seriesType;r("areasplinerange","arearange",null,{getPointSpline:b.seriesTypes.spline.prototype.getPointSpline})})(x); +(function(b){var r=b.defaultPlotOptions,t=b.each,w=b.merge,m=b.noop,q=b.pick,e=b.seriesType,a=b.seriesTypes.column.prototype;e("columnrange","arearange",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var d=this,f=d.yAxis,b=d.xAxis,u=b.startAngleRad,c,l=d.chart,k=d.xAxis.isRadial,p;a.translate.apply(d);t(d.points,function(a){var g=a.shapeArgs,h=d.options.minPointLength,e,v;a.plotHigh=p=f.translate(a.high,0,1,0,1);a.plotLow=a.plotY;v=p;e=q(a.rectPlotY,a.plotY)-p;Math.abs(e)< +h?(h-=e,e+=h,v-=h/2):0>e&&(e*=-1,v-=e);k?(c=a.barX+u,a.shapeType="path",a.shapeArgs={d:d.polarArc(v+e,v,c,c+a.pointWidth)}):(g.height=e,g.y=v,a.tooltipPos=l.inverted?[f.len+f.pos-l.plotLeft-v-e/2,b.len+b.pos-l.plotTop-g.x-g.width/2,e]:[b.left-l.plotLeft+g.x+g.width/2,f.pos-l.plotTop+v+e/2,e])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:m,crispCol:a.crispCol,drawPoints:a.drawPoints,drawTracker:a.drawTracker,getColumnMetrics:a.getColumnMetrics,animate:function(){return a.animate.apply(this, +arguments)},polarArc:function(){return a.polarArc.apply(this,arguments)},pointAttribs:a.pointAttribs})})(x);(function(b){var r=b.each,t=b.isNumber,w=b.merge,m=b.pick,q=b.pInt,e=b.Series,a=b.seriesType,d=b.TrackerMixin;a("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:b.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,d=this.options,b=a.center;this.generatePoints();r(this.points,function(c){var f=w(d.dial,c.dial),k=q(m(f.radius,80))*b[2]/200,h=q(m(f.baseLength,70))*k/100,g=q(m(f.rearLength,10))*k/100,n=f.baseWidth||3,u=f.topWidth||1,e=d.overshoot,v=a.startAngleRad+a.translate(c.y,null,null,null,!0);t(e)?(e=e/180*Math.PI,v=Math.max(a.startAngleRad-e,Math.min(a.endAngleRad+e,v))):!1===d.wrap&&(v=Math.max(a.startAngleRad,Math.min(a.endAngleRad, +v)));v=180*v/Math.PI;c.shapeType="path";c.shapeArgs={d:f.path||["M",-g,-n/2,"L",h,-n/2,k,-u/2,k,u/2,h,n/2,-g,n/2,"z"],translateX:b[0],translateY:b[1],rotation:v};c.plotX=b[0];c.plotY=b[1]})},drawPoints:function(){var a=this,d=a.yAxis.center,b=a.pivot,c=a.options,l=c.pivot,k=a.chart.renderer;r(a.points,function(d){var g=d.graphic,b=d.shapeArgs,f=b.d,h=w(c.dial,d.dial);g?(g.animate(b),b.d=f):(d.graphic=k[d.shapeType](b).attr({rotation:b.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group),d.graphic.attr({stroke:h.borderColor|| +"none","stroke-width":h.borderWidth||0,fill:h.backgroundColor||"#000000"}))});b?b.animate({translateX:d[0],translateY:d[1]}):(a.pivot=k.circle(0,0,m(l.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(d[0],d[1]).add(a.group),a.pivot.attr({"stroke-width":l.borderWidth||0,stroke:l.borderColor||"#cccccc",fill:l.backgroundColor||"#000000"}))},animate:function(a){var d=this;a||(r(d.points,function(a){var c=a.graphic;c&&(c.attr({rotation:180*d.yAxis.startAngleRad/Math.PI}),c.animate({rotation:a.shapeArgs.rotation}, +d.options.animation))}),d.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);e.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,d){e.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();m(d,!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(a){this.state=a}})})(x);(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.seriesType, +q=b.seriesTypes;m("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:["low","q1","median", +"q3","high"],toYData:function(b){return[b.low,b.q1,b.median,b.q3,b.high]},pointValKey:"high",pointAttribs:function(b){var a=this.options,d=b&&b.color||this.color;return{fill:b.fillColor||a.fillColor||d,stroke:a.lineColor||d,"stroke-width":a.lineWidth||0}},drawDataLabels:t,translate:function(){var b=this.yAxis,a=this.pointArrayMap;q.column.prototype.translate.apply(this);r(this.points,function(d){r(a,function(a){null!==d[a]&&(d[a+"Plot"]=b.translate(d[a],0,1,0,1))})})},drawPoints:function(){var b= +this,a=b.options,d=b.chart.renderer,f,h,u,c,l,k,p=0,g,n,m,q,v=!1!==b.doQuartiles,t,x=b.options.whiskerLength;r(b.points,function(e){var r=e.graphic,y=r?"animate":"attr",I=e.shapeArgs,z={},B={},G={},H=e.color||b.color;void 0!==e.plotY&&(g=I.width,n=Math.floor(I.x),m=n+g,q=Math.round(g/2),f=Math.floor(v?e.q1Plot:e.lowPlot),h=Math.floor(v?e.q3Plot:e.lowPlot),u=Math.floor(e.highPlot),c=Math.floor(e.lowPlot),r||(e.graphic=r=d.g("point").add(b.group),e.stem=d.path().addClass("highcharts-boxplot-stem").add(r), +x&&(e.whiskers=d.path().addClass("highcharts-boxplot-whisker").add(r)),v&&(e.box=d.path(void 0).addClass("highcharts-boxplot-box").add(r)),e.medianShape=d.path(void 0).addClass("highcharts-boxplot-median").add(r),z.stroke=e.stemColor||a.stemColor||H,z["stroke-width"]=w(e.stemWidth,a.stemWidth,a.lineWidth),z.dashstyle=e.stemDashStyle||a.stemDashStyle,e.stem.attr(z),x&&(B.stroke=e.whiskerColor||a.whiskerColor||H,B["stroke-width"]=w(e.whiskerWidth,a.whiskerWidth,a.lineWidth),e.whiskers.attr(B)),v&&(r= +b.pointAttribs(e),e.box.attr(r)),G.stroke=e.medianColor||a.medianColor||H,G["stroke-width"]=w(e.medianWidth,a.medianWidth,a.lineWidth),e.medianShape.attr(G)),k=e.stem.strokeWidth()%2/2,p=n+q+k,e.stem[y]({d:["M",p,h,"L",p,u,"M",p,f,"L",p,c]}),v&&(k=e.box.strokeWidth()%2/2,f=Math.floor(f)+k,h=Math.floor(h)+k,n+=k,m+=k,e.box[y]({d:["M",n,h,"L",n,f,"L",m,f,"L",m,h,"L",n,h,"z"]})),x&&(k=e.whiskers.strokeWidth()%2/2,u+=k,c+=k,t=/%$/.test(x)?q*parseFloat(x)/100:x/2,e.whiskers[y]({d:["M",p-t,u,"L",p+t,u, +"M",p-t,c,"L",p+t,c]})),l=Math.round(e.medianPlot),k=e.medianShape.strokeWidth()%2/2,l+=k,e.medianShape[y]({d:["M",n,l,"L",m,l]}))})},setStackedPoints:t})})(x);(function(b){var r=b.each,t=b.noop,w=b.seriesType,m=b.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},whiskerWidth:null},{type:"errorbar", +pointArrayMap:["low","high"],toYData:function(b){return[b.low,b.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:m.arearange?function(){var b=this.pointValKey;m.arearange.prototype.drawDataLabels.call(this);r(this.data,function(e){e.y=e[b]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||m.column.prototype.getColumnMetrics.call(this)}})})(x);(function(b){var r=b.correctFloat,t=b.isNumber,w=b.pick,m=b.Point,q=b.Series,e=b.seriesType,a=b.seriesTypes; +e("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",translate:function(){var d=this.options,b=this.yAxis,h,e,c,l,k,p,g,n,m,q=w(d.minPointLength,5),v=d.threshold,t=d.stacking;a.column.prototype.translate.apply(this);this.minPointLengthOffset=0;g=n=v;e=this.points;h=0;for(d=e.length;hl.height&&(l.y+=l.height,l.height*=-1),c.plotY=l.y=Math.round(l.y)- +this.borderWidth%2/2,l.height=Math.max(Math.round(l.height),.001),c.yBottom=l.y+l.height,l.height<=q&&(l.height=q,this.minPointLengthOffset+=q),l.y-=this.minPointLengthOffset,l=c.plotY+(c.negative?l.height:0)-this.minPointLengthOffset,this.chart.inverted?c.tooltipPos[0]=b.len-l:c.tooltipPos[1]=l},processData:function(a){var b=this.yData,d=this.options.data,e,c=b.length,l,k,p,g,n,m;k=l=p=g=this.options.threshold||0;for(m=0;ma[k-1].y&&(l[2]+=c.height,l[5]+=c.height),e=e.concat(l);return e},drawGraph:function(){q.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},getExtremes:b.noop},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum"); +return a},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(x);(function(b){var r=b.Series,t=b.seriesType,w=b.seriesTypes;t("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var b=r.prototype.getGraphPath.call(this),q=b.length+1;q--;)(q===b.length||"M"===b[q])&&0=this.minPxSize/2?(d.shapeType="circle",d.shapeArgs={x:d.plotX,y:d.plotY,r:c},d.dlBox={x:d.plotX-c,y:d.plotY-c,width:2*c,height:2*c}):d.shapeArgs=d.plotY=d.dlBox=void 0},drawLegendSymbol:function(a,b){var d=this.chart.renderer,c=d.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=d.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker= +!0},drawPoints:l.column.prototype.drawPoints,alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:a,applyZones:a},{haloPath:function(a){return h.prototype.haloPath.call(this,this.shapeArgs.r+a)},ttBelow:!1});w.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,h=0,l=b,u=this.isXAxis,m=u?"xData":"yData",w=this.min,x={},A=Math.min(c.plotWidth,c.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-w,z=b/E,F=[];q(this.series,function(b){var g=b.options;!b.bubblePadding|| +!b.visible&&c.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,F.push(b),u&&(q(["minSize","maxSize"],function(a){var b=g[a],d=/%$/.test(b),b=f(b);x[a]=d?A*b/100:b}),b.minPxSize=x.minSize,b.maxPxSize=Math.max(x.maxSize,x.minSize),b=b.zData,b.length&&(C=d(g.zMin,Math.min(C,Math.max(t(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=d(g.zMax,Math.max(D,r(b))))))});q(F,function(b){var d=b[m],c=d.length,f;u&&b.getRadii(C,D,b.minPxSize,b.maxPxSize);if(0f&&(f+=360),a.clientX=f):a.clientX=a.plotX};m.spline&&q(m.spline.prototype,"getPointSpline",function(a,b,f,h){var d,c,e,k,p,g,n;this.chart.polar?(d=f.plotX, +c=f.plotY,a=b[h-1],e=b[h+1],this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])),a&&e&&(k=a.plotX,p=a.plotY,b=e.plotX,g=e.plotY,k=(1.5*d+k)/2.5,p=(1.5*c+p)/2.5,e=(1.5*d+b)/2.5,n=(1.5*c+g)/2.5,b=Math.sqrt(Math.pow(k-d,2)+Math.pow(p-c,2)),g=Math.sqrt(Math.pow(e-d,2)+Math.pow(n-c,2)),k=Math.atan2(p-c,k-d),p=Math.atan2(n-c,e-d),n=Math.PI/2+(k+p)/2,Math.abs(k-n)>Math.PI/2&&(n-=Math.PI),k=d+Math.cos(n)*b,p=c+Math.sin(n)*b,e=d+Math.cos(Math.PI+n)*g,n=c+Math.sin(Math.PI+n)*g,f.rightContX=e,f.rightContY=n), +h?(f=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,k||d,p||c,d,c],a.rightContX=a.rightContY=null):f=["M",d,c]):f=a.call(this,b,f,h);return f});q(e,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});q(e,"getGraphPath",function(a,b){var d=this,e,m;if(this.chart.polar){b=b||this.points;for(e=0;eb.center[1]}),q(m,"alignDataLabel",function(a,b,f,h,m,c){this.chart.polar?(a=b.rectPlotX/Math.PI*180,null===h.align&&(h.align=20a?"left":200a?"right":"center"),null===h.verticalAlign&&(h.verticalAlign=45>a||315a?"top":"middle"),e.alignDataLabel.call(this,b,f,h,m,c)):a.call(this, +b,f,h,m,c)}));q(b,"getCoordinates",function(a,b){var d=this.chart,e={xAxis:[],yAxis:[]};d.polar?t(d.axes,function(a){var c=a.isXAxis,f=a.center,h=b.chartX-f[0]-d.plotLeft,f=b.chartY-f[1]-d.plotTop;e[c?"xAxis":"yAxis"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,f):Math.sqrt(Math.pow(h,2)+Math.pow(f,2)),!0)})}):e=a.call(this,b);return e})})(x)}); diff --git a/webapp/loadTests/25users/js/highstock.js b/webapp/loadTests/25users/js/highstock.js new file mode 100644 index 0000000..34a3f91 --- /dev/null +++ b/webapp/loadTests/25users/js/highstock.js @@ -0,0 +1,496 @@ +/* + Highstock JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(N,a){"object"===typeof module&&module.exports?module.exports=N.document?a(N):a:N.Highcharts=a(N)})("undefined"!==typeof window?window:this,function(N){N=function(){var a=window,D=a.document,B=a.navigator&&a.navigator.userAgent||"",G=D&&D.createElementNS&&!!D.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,H=/(edge|msie|trident)/i.test(B)&&!window.opera,p=!G,l=/Firefox/.test(B),r=l&&4>parseInt(B.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highstock", +version:"5.0.3",deg2rad:2*Math.PI/360,doc:D,hasBidiBug:r,hasTouch:D&&void 0!==D.documentElement.ontouchstart,isMS:H,isWebKit:/AppleWebKit/.test(B),isFirefox:l,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(B),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:p,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var D=[],B=a.charts,G=a.doc,H=a.win;a.error=function(a,l){a="Highcharts error #"+ +a+": www.highcharts.com/errors/"+a;if(l)throw Error(a);H.console&&console.log(a)};a.Fx=function(a,l,r){this.options=l;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],l=this.paths[1],r=[],w=this.now,t=a.length,k;if(1===w)r=this.toD;else if(t===l.length&&1>w)for(;t--;)k=parseFloat(a[t]),r[t]=isNaN(k)?a[t]:w*parseFloat(l[t]-k)+k;else r=l;this.elem.attr("d",r)},update:function(){var a=this.elem,l=this.prop,r=this.now,w=this.options.step;if(this[l+"Setter"])this[l+"Setter"](); +else a.attr?a.element&&a.attr(l,r):a.style[l]=r+this.unit;w&&w.call(a,r,this)},run:function(a,l,r){var p=this,t=function(a){return t.stopped?!1:p.step(a)},k;this.startTime=+new Date;this.start=a;this.end=l;this.unit=r;this.now=this.start;this.pos=0;t.elem=this.elem;t()&&1===D.push(t)&&(t.timerId=setInterval(function(){for(k=0;k=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=m[this.prop]=!0;for(e in m)!0!==m[e]&&(a=!1);a&&t&&t.call(p);p=!1}else this.pos=w.easing((l-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),p=!0;return p},initPath:function(p,l,r){function w(a){for(b=a.length;b--;)"M"!==a[b]&&"L"!==a[b]||a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function t(a,c){for(;a.lengthm?"AM":"PM",P:12>m?"am":"pm",S:q(t.getSeconds()),L:q(Math.round(l%1E3),3)},a.dateFormats);for(k in w)for(;-1!==p.indexOf("%"+k);)p= +p.replace("%"+k,"function"===typeof w[k]?w[k](l):w[k]);return r?p.substr(0,1).toUpperCase()+p.substr(1):p};a.formatSingle=function(p,l){var r=/\.([0-9])/,w=a.defaultOptions.lang;/f$/.test(p)?(r=(r=p.match(r))?r[1]:-1,null!==l&&(l=a.numberFormat(l,r,w.decimalPoint,-1=r&&(l=[1/r])));for(w=0;w=p||!t&&k<=(l[w]+(l[w+1]||l[w]))/ +2);w++);return m*r};a.stableSort=function(a,l){var r=a.length,p,t;for(t=0;tr&&(r=a[l]);return r};a.destroyObjectProperties=function(a,l){for(var r in a)a[r]&&a[r]!==l&&a[r].destroy&&a[r].destroy(),delete a[r]};a.discardElement=function(p){var l= +a.garbageBin;l||(l=a.createElement("div"));p&&l.appendChild(p);l.innerHTML=""};a.correctFloat=function(a,l){return parseFloat(a.toPrecision(l||14))};a.setAnimation=function(p,l){l.renderer.globalAnimation=a.pick(p,l.options.chart.animation,!0)};a.animObject=function(p){return a.isObject(p)?a.merge(p):{duration:p?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(p,l,r,w){p=+p||0;l=+l;var t=a.defaultOptions.lang, +k=(p.toString().split(".")[1]||"").length,m,e,g=Math.abs(p);-1===l?l=Math.min(k,20):a.isNumber(l)||(l=2);m=String(a.pInt(g.toFixed(l)));e=3p?"-":"")+(e?m.substr(0,e)+w:"");p+=m.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+w);l&&(w=Math.abs(g-m+Math.pow(10,-Math.max(l,k)-1)),p+=r+w.toFixed(l).slice(2));return p};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(p,l){return"width"===l?Math.min(p.offsetWidth, +p.scrollWidth)-a.getStyle(p,"padding-left")-a.getStyle(p,"padding-right"):"height"===l?Math.min(p.offsetHeight,p.scrollHeight)-a.getStyle(p,"padding-top")-a.getStyle(p,"padding-bottom"):(p=H.getComputedStyle(p,void 0))&&a.pInt(p.getPropertyValue(l))};a.inArray=function(a,l){return l.indexOf?l.indexOf(a):[].indexOf.call(l,a)};a.grep=function(a,l){return[].filter.call(a,l)};a.map=function(a,l){for(var r=[],p=0,t=a.length;pl;l++)w[l]+=p(255*a),0>w[l]&&(w[l]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width, +b=z.height,c&&L&&"11px"===L.fontSize&&"16.9"===b.toPrecision(3)&&(z.height=b=14),v&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(g&&0]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,c,v){"string"===typeof a?v.setAttribute(c, +a):a&&this.colorGradient(a,c,v)},visibilitySetter:function(a,c,v){"inherit"===a?v.removeAttribute(c):v.setAttribute(c,a)},zIndexSetter:function(a,c){var v=this.renderer,z=this.parentGroup,b=(z||v).element||v.box,d,n=this.element,f;d=this.added;var e;k(a)&&(n.zIndex=a,a=+a,this[c]===a&&(d=!1),this[c]=a);if(d){(a=this.zIndex)&&z&&(z.handleZ=!0);c=b.childNodes;for(e=0;ea||!k(a)&&k(d)||0>a&&!k(d)&&b!==v.box)&&(b.insertBefore(n,z),f=!0);f||b.appendChild(n)}return f}, +_defaultSetter:function(a,c,v){v.setAttribute(c,a)}};D.prototype.yGetter=D.prototype.xGetter;D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.rotationSetter=D.prototype.verticalAlignSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=function(a,c){this[c]=a;this.doTransform=!0};D.prototype["stroke-widthSetter"]=D.prototype.strokeSetter=function(a,c,v){this[c]=a;this.stroke&&this["stroke-width"]?(D.prototype.fillSetter.call(this,this.stroke,"stroke",v),v.setAttribute("stroke-width", +this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===a&&this.hasStroke&&(v.removeAttribute("stroke"),this.hasStroke=!1)};B=a.SVGRenderer=function(){this.init.apply(this,arguments)};B.prototype={Element:D,SVG_NS:K,init:function(a,c,v,b,d,n){var z;b=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(b));z=b.element;a.appendChild(z);-1===a.innerHTML.indexOf("xmlns")&&p(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=b;this.alignedObjects= +[];this.url=(E||A)&&g.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(g.createTextNode("Created with Highstock 5.0.3"));this.defs=this.createElement("defs").add();this.allowHTML=n;this.forExport=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,v,!1);var f;E&&a.getBoundingClientRect&&(c=function(){w(a,{left:0,top:0});f=a.getBoundingClientRect(); +w(a,{left:Math.ceil(f.left)-f.left+"px",top:Math.ceil(f.top)-f.top+"px"})},c(),this.unSubPixelFix=G(R,"resize",c))},getStyle:function(a){return this.style=C({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients= +null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var c=new this.Element;c.init(this,a);return c},draw:J,getRadialAttr:function(a,c){return{cx:a[0]-a[2]/2+c.cx*a[2],cy:a[1]-a[2]/2+c.cy*a[2],r:c.r*a[2]}},buildText:function(a){for(var c=a.element,z=this,b=z.forExport,n=y(a.textStr,"").toString(),f=-1!==n.indexOf("\x3c"),e=c.childNodes,q,F,x,A,I=p(c,"x"),m=a.styles,k=a.textWidth,C=m&&m.lineHeight,M=m&&m.textOutline,J=m&& +"ellipsis"===m.textOverflow,E=e.length,O=k&&!a.added&&this.box,t=function(a){var v;v=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:m&&m.fontSize||z.style.fontSize||12;return C?u(C):z.fontMetrics(v,a.getAttribute("style")?a:c).h};E--;)c.removeChild(e[E]);f||M||J||k||-1!==n.indexOf(" ")?(q=/<.*class="([^"]+)".*>/,F=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,O&&O.appendChild(c),n=f?n.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[n],n=d(n,function(a){return""!==a}),h(n,function(d,n){var f,e=0;d=d.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");f=d.split("|||");h(f,function(d){if(""!==d||1===f.length){var u={},y=g.createElementNS(z.SVG_NS,"tspan"),L,h;q.test(d)&&(L=d.match(q)[1],p(y,"class",L));F.test(d)&&(h=d.match(F)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),p(y,"style",h));x.test(d)&&!b&&(p(y, +"onclick",'location.href\x3d"'+d.match(x)[1]+'"'),w(y,{cursor:"pointer"}));d=(d.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==d){y.appendChild(g.createTextNode(d));e?u.dx=0:n&&null!==I&&(u.x=I);p(y,u);c.appendChild(y);!e&&n&&(!v&&b&&w(y,{display:"block"}),p(y,"dy",t(y)));if(k){u=d.replace(/([^\^])-/g,"$1- ").split(" ");L="nowrap"===m.whiteSpace;for(var C=1k,void 0===A&&(A=M),J&&A?(Q/=2,""===l||!M&&.5>Q?u=[]:(l=d.substring(0,l.length+(M?-1:1)*Math.ceil(Q)),u=[l+(3k&&(k=P)),u.length&&y.appendChild(g.createTextNode(u.join(" ").replace(/- /g, +"-")));a.rotation=R}e++}}})}),A&&a.attr("title",a.textStr),O&&O.removeChild(c),M&&a.applyTextOutline&&a.applyTextOutline(M)):c.appendChild(g.createTextNode(n.replace(/</g,"\x3c").replace(/>/g,"\x3e")))},getContrast:function(a){a=r(a).rgba;return 510v?d>c+f&&de?d>c+f&&db&&e>a+f&&ed&&e>a+f&&ea?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a, +c,v){var b=a;c&&v&&(b=Math.max(b*Math.cos(c*m),4));return{x:-a/3*Math.sin(c*m),y:b}},label:function(a,c,v,b,d,n,f,e,K){var q=this,u=q.g("button"!==K&&"label"),y=u.text=q.text("",0,0,f).attr({zIndex:1}),g,F,z=0,A=3,L=0,m,M,J,E,O,t={},l,R,r=/^url\((.*?)\)$/.test(b),p=r,P,w,Q,S;K&&u.addClass("highcharts-"+K);p=r;P=function(){return(l||0)%2/2};w=function(){var a=y.element.style,c={};F=(void 0===m||void 0===M||O)&&k(y.textStr)&&y.getBBox();u.width=(m||F.width||0)+2*A+L;u.height=(M||F.height||0)+2*A;R= +A+q.fontMetrics(a&&a.fontSize,y).b;p&&(g||(u.box=g=q.symbols[b]||r?q.symbol(b):q.rect(),g.addClass(("button"===K?"":"highcharts-label-box")+(K?" highcharts-"+K+"-box":"")),g.add(u),a=P(),c.x=a,c.y=(e?-R:0)+a),c.width=Math.round(u.width),c.height=Math.round(u.height),g.attr(C(c,t)),t={})};Q=function(){var a=L+A,c;c=e?0:R;k(m)&&F&&("center"===O||"right"===O)&&(a+={center:.5,right:1}[O]*(m-F.width));if(a!==y.x||c!==y.y)y.attr("x",a),void 0!==c&&y.attr("y",c);y.x=a;y.y=c};S=function(a,c){g?g.attr(a,c): +t[a]=c};u.onAdd=function(){y.add(u);u.attr({text:a||0===a?a:"",x:c,y:v});g&&k(d)&&u.attr({anchorX:d,anchorY:n})};u.widthSetter=function(a){m=a};u.heightSetter=function(a){M=a};u["text-alignSetter"]=function(a){O=a};u.paddingSetter=function(a){k(a)&&a!==A&&(A=u.padding=a,Q())};u.paddingLeftSetter=function(a){k(a)&&a!==L&&(L=a,Q())};u.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,F&&u.attr({x:J}))};u.textSetter=function(a){void 0!==a&&y.textSetter(a);w();Q()};u["stroke-widthSetter"]= +function(a,c){a&&(p=!0);l=this["stroke-width"]=a;S(c,a)};u.strokeSetter=u.fillSetter=u.rSetter=function(a,c){"fill"===c&&a&&(p=!0);S(c,a)};u.anchorXSetter=function(a,c){d=a;S(c,Math.round(a)-P()-J)};u.anchorYSetter=function(a,c){n=a;S(c,a-E)};u.xSetter=function(a){u.x=a;z&&(a-=z*((m||F.width)+2*A));J=Math.round(a);u.attr("translateX",J)};u.ySetter=function(a){E=u.y=Math.round(a);u.attr("translateY",E)};var T=u.css;return C(u,{css:function(a){if(a){var c={};a=x(a);h(u.textProps,function(v){void 0!== +a[v]&&(c[v]=a[v],delete a[v])});y.css(c)}return T.call(u,a)},getBBox:function(){return{width:F.width+2*A,height:F.height+2*A,x:F.x-A,y:F.y-A}},shadow:function(a){a&&(w(),g&&g.shadow(a));return u},destroy:function(){I(u.element,"mouseenter");I(u.element,"mouseleave");y&&(y=y.destroy());g&&(g=g.destroy());D.prototype.destroy.call(u);u=q=w=Q=S=null}})}};a.Renderer=B})(N);(function(a){var D=a.attr,B=a.createElement,G=a.css,H=a.defined,p=a.each,l=a.extend,r=a.isFirefox,w=a.isMS,t=a.isWebKit,k=a.pInt,m= +a.SVGRenderer,e=a.win,g=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var e=this.element;if(e=a&&"SPAN"===e.tagName&&a.width)delete a.width,this.textWidth=e,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a= +this.renderer,e=this.element,f=this.translateX||0,d=this.translateY||0,b=this.x||0,q=this.y||0,g=this.textAlign||"left",c={left:0,center:.5,right:1}[g],F=this.styles;G(e,{marginLeft:f,marginTop:d});this.shadows&&p(this.shadows,function(a){G(a,{marginLeft:f+1,marginTop:d+1})});this.inverted&&p(e.childNodes,function(c){a.invertChild(c,e)});if("SPAN"===e.tagName){var n=this.rotation,A=k(this.textWidth),x=F&&F.whiteSpace,m=[n,g,e.innerHTML,this.textWidth,this.textAlign].join();m!==this.cTT&&(F=a.fontMetrics(e.style.fontSize).b, +H(n)&&this.setSpanRotation(n,c,F),G(e,{width:"",whiteSpace:x||"nowrap"}),e.offsetWidth>A&&/[ \-]/.test(e.textContent||e.innerText)&&G(e,{width:A+"px",display:"block",whiteSpace:x||"normal"}),this.getSpanCorrection(e.offsetWidth,F,c,n,g));G(e,{left:b+(this.xCorr||0)+"px",top:q+(this.yCorr||0)+"px"});t&&(F=e.offsetHeight);this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,g,f){var d={},b=w?"-ms-transform":t?"-webkit-transform":r?"MozTransform":e.opera?"-o-transform":"";d[b]=d.transform= +"rotate("+a+"deg)";d[b+(r?"Origin":"-origin")]=d.transformOrigin=100*g+"% "+f+"px";G(this.element,d)},getSpanCorrection:function(a,e,f){this.xCorr=-a*f;this.yCorr=-e}});l(m.prototype,{html:function(a,e,f){var d=this.createElement("span"),b=d.element,q=d.renderer,h=q.isSVG,c=function(a,c){p(["opacity","visibility"],function(b){g(a,b+"Setter",function(a,b,d,n){a.call(this,b,d,n);c[d]=b})})};d.textSetter=function(a){a!==b.innerHTML&&delete this.bBox;b.innerHTML=this.textStr=a;d.htmlUpdateTransform()}; +h&&c(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,c){"align"===c&&(c="textAlign");d[c]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(e),y:Math.round(f)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});b.style.whiteSpace="nowrap";d.css=d.htmlCss;h&&(d.add=function(a){var n,f=q.box.parentNode,e=[];if(this.parentGroup=a){if(n=a.div,!n){for(;a;)e.push(a),a=a.parentGroup;p(e.reverse(),function(a){var b,d=D(a.element, +"class");d&&(d={className:d});n=a.div=a.div||B("div",d,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},n||f);b=n.style;l(a,{translateXSetter:function(c,d){b.left=c+"px";a[d]=c;a.doTransform=!0},translateYSetter:function(c,d){b.top=c+"px";a[d]=c;a.doTransform=!0}});c(a,b)})}}else n=f;n.appendChild(b);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d});return d}})})(N);(function(a){var D, +B,G=a.createElement,H=a.css,p=a.defined,l=a.deg2rad,r=a.discardElement,w=a.doc,t=a.each,k=a.erase,m=a.extend;D=a.extendClass;var e=a.isArray,g=a.isNumber,h=a.isObject,C=a.merge;B=a.noop;var f=a.pick,d=a.pInt,b=a.SVGElement,q=a.SVGRenderer,E=a.win;a.svg||(B={docMode8:w&&8===w.documentMode,init:function(a,b){var c=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],f="div"===b;("shape"===b||f)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",f?"hidden":"visible"); +c.push(' style\x3d"',d.join(""),'"/\x3e');b&&(c=f||"span"===b||"img"===b?c.join(""):a.prepVML(c),this.element=G(c));this.renderer=a},add:function(a){var c=this.renderer,b=this.element,d=c.box,f=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);f&&c.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},updateTransform:b.prototype.htmlUpdateTransform, +setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*l),d=Math.sin(a*l);H(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,e,q){var c=e?Math.cos(e*l):1,n=e?Math.sin(e*l):0,u=f(this.elemHeight,this.element.offsetHeight),g;this.xCorr=0>c&&-a;this.yCorr=0>n&&-u;g=0>c*n;this.xCorr+=n*b*(g?1-d:d);this.yCorr-=c*b*(e?g?d:1-d:1);q&&"left"!== +q&&(this.xCorr-=a*d*(0>c?-1:1),e&&(this.yCorr-=u*d*(0>n?-1:1)),H(this.element,{textAlign:q}))},pathToVML:function(a){for(var c=a.length,b=[];c--;)g(a[c])?b[c]=Math.round(10*a[c])-5:"Z"===a[c]?b[c]="x":(b[c]=a[c],!a.isArc||"wa"!==a[c]&&"at"!==a[c]||(b[c+5]===b[c+7]&&(b[c+7]+=a[c+7]>a[c+5]?1:-1),b[c+6]===b[c+8]&&(b[c+8]+=a[c+8]>a[c+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var c=this,b;a?(b=a.members,k(b,c),b.push(c),c.destroyClip=function(){k(b,c)},a=a.getCSS(c)):(c.destroyClip&&c.destroyClip(), +a={clip:c.docMode8?"inherit":"rect(auto)"});return c.css(a)},css:b.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&r(a)},destroy:function(){this.destroyClip&&this.destroyClip();return b.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c;a=a.split(/[ ,]/);c=a.length;if(9===c||11===c)a[c-4]=a[c-2]=d(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,e){var c=[],n,q=this.element, +g=this.renderer,u,I=q.style,F,v=q.path,K,h,m,z;v&&"string"!==typeof v.value&&(v="x");h=v;if(a){m=f(a.width,3);z=(a.opacity||.15)/m;for(n=1;3>=n;n++)K=2*m+1-2*n,e&&(h=this.cutOffPath(v.value,K+.5)),F=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',K,'" filled\x3d"false" path\x3d"',h,'" coordsize\x3d"10 10" style\x3d"',q.style.cssText,'" /\x3e'],u=G(g.prepVML(F),null,{left:d(I.left)+f(a.offsetX,1),top:d(I.top)+f(a.offsetY,1)}),e&&(u.cutOff=K+1),F=['\x3cstroke color\x3d"',a.color||"#000000",'" opacity\x3d"', +z*n,'"/\x3e'],G(g.prepVML(F),null,null,u),b?b.element.appendChild(u):q.parentNode.insertBefore(u,q),c.push(u);this.shadows=c}return this},updateShadows:B,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||G(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,b,d){var c=this.shadows; +a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(c)for(d=c.length;d--;)c[d].path=c[d].cutOff?this.cutOffPath(a,c[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var c=d.nodeName;"SPAN"===c?d.style.color=a:"IMG"!==c&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){G(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:B,rotationSetter:function(a,b,d){d= +d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*l)+1)+"px";d.top=Math.round(Math.cos(a*l))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;g(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&t(this.shadows,function(c){c.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===a?"-999em": +0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},B["stroke-opacitySetter"]=B["fill-opacitySetter"],a.VMLElement=B=D(b,B),B.prototype.ySetter=B.prototype.widthSetter=B.prototype.heightSetter=B.prototype.xSetter,B={Element:B,isIE8:-1l[0]&&c.push([1,l[1]]);t(c,function(c,b){q.test(c[1])?(n=a.color(c[1]),v=n.get("rgb"),K=n.get("a")):(v=c[1],K=1);r.push(100*c[0]+"% "+v);b?(m=K,k=v):(z=K,E=v)});if("fill"===d)if("gradient"===g)d=A.x1||A[0]||0,c=A.y1||A[1]||0,F=A.x2||A[2]||0,A=A.y2||A[3]||0,C='angle\x3d"'+(90-180*Math.atan((A-c)/(F-d))/Math.PI)+'"',p();else{var h=A.r,w=2*h,B=2*h,D=A.cx,H=A.cy,V=b.radialReference,U,h=function(){V&&(U=f.getBBox(),D+=(V[0]- +U.x)/U.width-.5,H+=(V[1]-U.y)/U.height-.5,w*=V[2]/U.width,B*=V[2]/U.height);C='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+w+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+D+","+H+'" color2\x3d"'+E+'" ';p()};f.added?h():f.onAdd=h;h=k}else h=v}else q.test(c)&&"IMG"!==b.tagName?(n=a.color(c),f[d+"-opacitySetter"](n.get("a"),d,b),h=n.get("rgb")):(h=b.getElementsByTagName(d),h.length&&(h[0].opacity=1,h[0].type="solid"),h=c);return h},prepVML:function(a){var c=this.isIE8;a=a.join(""); +c?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:q.prototype.html,path:function(a){var c={coordsize:"10 10"};e(a)?c.d=a:h(a)&&m(c,a);return this.createElement("shape").attr(c)},circle:function(a,b,d){var c=this.symbol("circle"); +h(a)&&(d=a.r,b=a.y,a=a.x);c.isCircle=!0;c.r=d;return c.attr({x:a,y:b})},g:function(a){var c;a&&(c={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(c)},image:function(a,b,d,f,e){var c=this.createElement("img").attr({src:a});1f&&m-d*bg&&(F=Math.round((e-m)/Math.cos(f*w)));else if(e=m+(1-d)*b,m-d*bg&&(E=g-a.x+E*d,c=-1),E=Math.min(q, +E),EE||k.autoRotation&&(C.styles||{}).width)F=E;F&&(n.width=F,(k.options.labels.style||{}).textOverflow||(n.textOverflow="ellipsis"),C.css(n))},getPosition:function(a,k,m,e){var g=this.axis,h=g.chart,l=e&&h.oldChartHeight||h.chartHeight;return{x:a?g.translate(k+m,null,null,e)+g.transB:g.left+g.offset+(g.opposite?(e&&h.oldChartWidth||h.chartWidth)-g.right-g.left:0),y:a?l-g.bottom+g.offset-(g.opposite?g.height:0):l-g.translate(k+m,null, +null,e)-g.transB}},getLabelPosition:function(a,k,m,e,g,h,l,f){var d=this.axis,b=d.transA,q=d.reversed,E=d.staggerLines,c=d.tickRotCorr||{x:0,y:0},F=g.y;B(F)||(F=0===d.side?m.rotation?-8:-m.getBBox().height:2===d.side?c.y+8:Math.cos(m.rotation*w)*(c.y-m.getBBox(!1,0).height/2));a=a+g.x+c.x-(h&&e?h*b*(q?-1:1):0);k=k+F-(h&&!e?h*b*(q?1:-1):0);E&&(m=l/(f||1)%E,d.opposite&&(m=E-m-1),k+=d.labelOffset/E*m);return{x:a,y:Math.round(k)}},getMarkPath:function(a,k,m,e,g,h){return h.crispLine(["M",a,k,"L",a+(g? +0:-m),k+(g?m:0)],e)},render:function(a,k,m){var e=this.axis,g=e.options,h=e.chart.renderer,C=e.horiz,f=this.type,d=this.label,b=this.pos,q=g.labels,E=this.gridLine,c=f?f+"Tick":"tick",F=e.tickSize(c),n=this.mark,A=!n,x=q.step,p={},y=!0,u=e.tickmarkOffset,I=this.getPosition(C,b,u,k),M=I.x,I=I.y,v=C&&M===e.pos+e.len||!C&&I===e.pos?-1:1,K=f?f+"Grid":"grid",O=g[K+"LineWidth"],R=g[K+"LineColor"],z=g[K+"LineDashStyle"],K=l(g[c+"Width"],!f&&e.isXAxis?1:0),c=g[c+"Color"];m=l(m,1);this.isActive=!0;E||(p.stroke= +R,p["stroke-width"]=O,z&&(p.dashstyle=z),f||(p.zIndex=1),k&&(p.opacity=0),this.gridLine=E=h.path().attr(p).addClass("highcharts-"+(f?f+"-":"")+"grid-line").add(e.gridGroup));if(!k&&E&&(b=e.getPlotLinePath(b+u,E.strokeWidth()*v,k,!0)))E[this.isNew?"attr":"animate"]({d:b,opacity:m});F&&(e.opposite&&(F[0]=-F[0]),A&&(this.mark=n=h.path().addClass("highcharts-"+(f?f+"-":"")+"tick").add(e.axisGroup),n.attr({stroke:c,"stroke-width":K})),n[A?"attr":"animate"]({d:this.getMarkPath(M,I,F[0],n.strokeWidth()* +v,C,h),opacity:m}));d&&H(M)&&(d.xy=I=this.getLabelPosition(M,I,d,C,q,u,a,x),this.isFirst&&!this.isLast&&!l(g.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(g.showLastLabel,1)?y=!1:!C||e.isRadial||q.step||q.rotation||k||0===m||this.handleOverflow(I),x&&a%x&&(y=!1),y&&H(I.y)?(I.opacity=m,d[this.isNew?"attr":"animate"](I)):(r(d),d.attr("y",-9999)),this.isNew=!1)},destroy:function(){G(this,this.axis)}}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.AxisPlotLineOrBandExtension, +l=a.color,r=a.correctFloat,w=a.defaultOptions,t=a.defined,k=a.deg2rad,m=a.destroyObjectProperties,e=a.each,g=a.error,h=a.extend,C=a.fireEvent,f=a.format,d=a.getMagnitude,b=a.grep,q=a.inArray,E=a.isArray,c=a.isNumber,F=a.isString,n=a.merge,A=a.normalizeTickInterval,x=a.pick,J=a.PlotLineOrBand,y=a.removeEvent,u=a.splat,I=a.syncTimeout,M=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M", +hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb", +lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15}, +title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var b=c.isX;this.chart=a;this.horiz=a.inverted?!b:b;this.isXAxis=b;this.coll=this.coll||(b?"xAxis":"yAxis");this.opposite=c.opposite;this.side=c.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,v=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter; +this.userOptions=c;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===v||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===v;this.isDatetimeAxis="datetime"===v;this.isLinked=t(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom; +this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=x(d.crosshair,u(a.options.tooltip.crosshairs)[b?0:1],!1);var f;c=this.options.events;-1===q(this,a.axes)&&(b?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&b&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in c)D(this,f,c[f]); +this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=n(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],n(w[this.coll],a))},defaultLabelFormatter:function(){var c=this.axis,b=this.value,d=c.categories,e=this.dateTimeLabelFormat,q=w.lang,u=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,n=u&&u.length,g,y=c.options.labels.format, +c=c.isLog?b:c.tickInterval;if(y)g=f(y,this);else if(d)g=b;else if(e)g=a.dateFormat(e,b);else if(n&&1E3<=c)for(;n--&&void 0===g;)d=Math.pow(q,n+1),c>=d&&0===10*b%d&&null!==u[n]&&0!==b&&(g=a.numberFormat(b/d,-1)+u[n]);void 0===g&&(g=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return g},getSeriesExtremes:function(){var a=this,d=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();e(a.series,function(v){if(v.visible|| +!d.options.chart.ignoreHiddenSeries){var f=v.options,e=f.threshold,q;a.hasVisibleSeries=!0;a.isLog&&0>=e&&(e=null);if(a.isXAxis)f=v.xData,f.length&&(v=H(f),c(v)||v instanceof Date||(f=b(f,function(a){return c(a)}),v=H(f)),a.dataMin=Math.min(x(a.dataMin,f[0]),v),a.dataMax=Math.max(x(a.dataMax,f[0]),G(f)));else if(v.getExtremes(),q=v.dataMax,v=v.dataMin,t(v)&&t(q)&&(a.dataMin=Math.min(x(a.dataMin,v),v),a.dataMax=Math.max(x(a.dataMax,q),q)),t(e)&&(a.threshold=e),!f.softThreshold||a.isLog)a.softThreshold= +!1}})},translate:function(a,b,d,f,e,q){var v=this.linkedParent||this,u=1,n=0,g=f?v.oldTransA:v.transA;f=f?v.oldMin:v.min;var K=v.minPixelPadding;e=(v.isOrdinal||v.isBroken||v.isLog&&e)&&v.lin2val;g||(g=v.transA);d&&(u*=-1,n=v.len);v.reversed&&(u*=-1,n-=u*(v.sector||v.len));b?(a=(a*u+n-K)/g+f,e&&(a=v.lin2val(a))):(e&&(a=v.val2lin(a)),a=u*(a-f)*g+n+u*K+(c(q)?g*q:0));return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a- +(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,f,e){var v=this.chart,q=this.left,u=this.top,n,g,K=d&&v.oldChartHeight||v.chartHeight,y=d&&v.oldChartWidth||v.chartWidth,z;n=this.transB;var h=function(a,c,b){if(ab)f?a=Math.min(Math.max(c,a),b):z=!0;return a};e=x(e,this.translate(a,null,null,d));a=d=Math.round(e+n);n=g=Math.round(K-e-n);c(e)?this.horiz?(n=u,g=K-this.bottom,a=d=h(a,q,q+this.width)):(a=q,d=y-this.right,n=g=h(n,u,u+this.height)):z=!0;return z&&!f?null:v.renderer.crispLine(["M", +a,n,"L",d,g],b||1)},getLinearTickPositions:function(a,b,d){var v,f=r(Math.floor(b/a)*a),e=r(Math.ceil(d/a)*a),q=[];if(b===d&&c(b))return[b];for(b=f;b<=e;){q.push(b);b=r(b+a);if(b===v)break;v=b}return q},getMinorTickPositions:function(){var a=this.options,c=this.tickPositions,b=this.minorTickInterval,d=[],f,e=this.pointRangePadding||0;f=this.min-e;var e=this.max+e,q=e-f;if(q&&q/b=this.minRange,q,u,n,g,y,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(t(a.min)||t(a.max)?this.minRange=null:(e(this.series,function(a){g=a.xData;for(u=y=a.xIncrement? +1:g.length-1;0=E?(p=E,m=0):b.dataMax<=E&&(J=E,I=0)),b.min=x(w,p,b.dataMin),b.max=x(B,J,b.dataMax));q&&(!a&&0>=Math.min(b.min, +x(b.dataMin,b.min))&&g(10,1),b.min=r(u(b.min),15),b.max=r(u(b.max),15));b.range&&t(b.max)&&(b.userMin=b.min=w=Math.max(b.min,b.minFromRange()),b.userMax=B=b.max,b.range=null);C(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(l||b.axisPointRange||b.usePercentage||h)&&t(b.min)&&t(b.max)&&(u=b.max-b.min)&&(!t(w)&&m&&(b.min-=u*m),!t(B)&&I&&(b.max+=u*I));c(f.floor)?b.min=Math.max(b.min,f.floor):c(f.softMin)&&(b.min=Math.min(b.min,f.softMin));c(f.ceiling)?b.max=Math.min(b.max, +f.ceiling):c(f.softMax)&&(b.max=Math.max(b.max,f.softMax));M&&t(b.dataMin)&&(E=E||0,!t(w)&&b.min=E?b.min=E:!t(B)&&b.max>E&&b.dataMax<=E&&(b.max=E));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:h&&!k&&F===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:x(k,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*F/Math.max(b.len,F));y&&!a&&e(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); +b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!k&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));a=x(f.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!k&&b.tickIntervalb.tickInterval&&1E3b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval= +b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,f=a.startOnTick,e=a.endOnTick,q;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), +this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.isLinked||(this.trimTicks(b,f,e),this.min===this.max&&t(this.min)&&!this.tickAmount&&(q=!0,this.min-=.5,this.max+=.5),this.single=q,c||d||this.adjustTickAmount())}, +trimTicks:function(a,b,c){var d=a[0],f=a[a.length-1],v=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-v>a[0];)a.shift();if(c)this.max=f;else for(;this.max+vb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,f=b&&b.length;if(fc&&(this.tickInterval*= +2,this.setTickPositions());if(t(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0=f&&(b=f)),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,f=x(b.width,a.plotWidth-c+(b.offsetRight||0)),e=x(b.height,a.plotHeight),q=x(b.top,a.plotTop),b=x(b.left,a.plotLeft+c),c=/%$/;c.test(e)&&(e=Math.round(parseFloat(e)/ +100*a.plotHeight));c.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight+a.plotTop));this.left=b;this.top=q;this.width=f;this.height=e;this.bottom=a.chartHeight-e-q;this.right=a.chartWidth-f-b;this.len=Math.max(d?f:e,0);this.pos=d?b:q},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?r(b(this.min)):this.min,max:a?r(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log, +d=b?c(this.min):this.min,b=b?c(this.max):this.max;null===a?a=d:d>a?a=d:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],d=x(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize, +this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,f=this.len/(((this.categories?1:0)+this.max-this.min)/c),q,u=a.rotation,n=this.labelMetrics(),g,y=Number.MAX_VALUE,h,I=function(a){a/=f||1;a=1=a)g=I(Math.abs(n.h/Math.sin(k*a))),b=g+Math.abs(a/360),b(c.step||0)&&!c.rotation&&(this.staggerLines||1)*a.plotWidth/d||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,f=this.options.labels,q=this.horiz,u=this.getSlotWidth(),g=Math.max(1, +Math.round(u-2*(f.padding||5))),y={},h=this.labelMetrics(),I=f.style&&f.style.textOverflow,A,x=0,m,k;F(f.rotation)||(y.rotation=f.rotation||0);e(c,function(a){(a=d[a])&&a.labelLength>x&&(x=a.labelLength)});this.maxLabelLength=x;if(this.autoRotation)x>g&&x>h.h?y.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(A={width:g+"px"},!I))for(A.textOverflow="clip",m=c.length;!q&&m--;)if(k=c[m],g=d[k].label)g.styles&&"ellipsis"===g.styles.textOverflow?g.css({textOverflow:"clip"}):d[k].labelLength> +u&&g.css({width:u+"px"}),g.getBBox().height>this.len/c.length-(h.h-h.f)&&(g.specCss={textOverflow:"ellipsis"});y.rotation&&(A={width:(x>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},I||(A.textOverflow="ellipsis"));if(this.labelAlign=f.align||this.autoLabelAlign(this.labelRotation))y.align=this.labelAlign;e(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(y),A&&b.css(n(A,b.specCss)),delete b.specCss,a.rotation=y.rotation)});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,0!==this.side)}, +hasData:function(){return this.hasVisibleSeries||t(this.min)&&t(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,f=a.tickPositions,q=a.ticks,u=a.horiz,n=a.side,g=b.inverted?[1,0,3,2][n]:n,y,h,I=0,A,m=0,k=d.title,F=d.labels,E=0,l=a.opposite,C=b.axisOffset,b=b.clipOffset,p=[-1,1,1,-1][n],r,J=d.className,w=a.axisParent,B=this.tickSize("tick");y=a.hasData();a.showAxis=h=y||x(d.showEmpty,!0);a.staggerLines=a.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(J||"")).add(w),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(J||"")).add(w),a.labelGroup=c.g("axis-labels").attr({zIndex:F.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(J||"")).add(w));if(y||a.isLinked)e(f,function(b){q[b]?q[b].addLabel():q[b]=new M(a,b)}),a.renderUnsquish(),!1===F.reserveSpace||0!==n&&2!==n&&{1:"left",3:"right"}[n]!== +a.labelAlign&&"center"!==a.labelAlign||e(f,function(a){E=Math.max(q[a].getLabelSize(),E)}),a.staggerLines&&(E*=a.staggerLines,a.labelOffset=E*(a.opposite?-1:1));else for(r in q)q[r].destroy(),delete q[r];k&&k.text&&!1!==k.enabled&&(a.axisTitle||((r=k.textAlign)||(r=(u?{low:"left",middle:"center",high:"right"}:{low:l?"right":"left",middle:"center",high:l?"left":"right"})[k.align]),a.axisTitle=c.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:r}).addClass("highcharts-axis-title").css(k.style).add(a.axisGroup), +a.axisTitle.isNew=!0),h&&(I=a.axisTitle.getBBox()[u?"height":"width"],A=k.offset,m=t(A)?0:x(k.margin,u?5:10)),a.axisTitle[h?"show":"hide"](!0));a.renderLine();a.offset=p*x(d.offset,C[n]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===n?-a.labelMetrics().h:2===n?a.tickRotCorr.y:0;m=Math.abs(E)+m;E&&(m=m-c+p*(u?x(F.y,a.tickRotCorr.y+8*p):F.x));a.axisTitleMargin=x(A,m);C[n]=Math.max(C[n],a.axisTitleMargin+I+p*a.offset,m,y&&f.length&&B?B[0]:0);d=d.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[g]= +Math.max(b[g],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,f=this.horiz,e=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:e,f?d:this.top,"L",f?b.chartWidth-this.right:e,f?d:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor, +"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,f=this.options.title,e=a?b:c,q=this.opposite,u=this.offset,n=f.x||0,g=f.y||0,y=this.chart.renderer.fontMetrics(f.style&&f.style.fontSize,this.axisTitle).f,d={low:e+(a?0:d),middle:e+d/2,high:e+(a?d:0)}[f.align],b=(a?c+this.height:b)+(a?1:-1)*(q?-1:1)*this.axisTitleMargin+(2===this.side?y:0);return{x:a?d+n:b+(q?this.width:0)+u+n,y:a?b+g-(q?this.height:0)+u:d+g}},render:function(){var a= +this,b=a.chart,d=b.renderer,f=a.options,q=a.isLog,u=a.lin2log,n=a.isLinked,g=a.tickPositions,y=a.axisTitle,h=a.ticks,A=a.minorTicks,x=a.alternateBands,m=f.stackLabels,k=f.alternateGridColor,F=a.tickmarkOffset,E=a.axisLine,l=b.hasRendered&&c(a.oldMin),C=a.showAxis,p=B(d.globalAnimation),r,t;a.labelEdge.length=0;a.overlap=!1;e([h,A,x],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||n)a.minorTickInterval&&!a.categories&&e(a.getMinorTickPositions(),function(b){A[b]||(A[b]=new M(a,b,"minor")); +l&&A[b].isNew&&A[b].render(null,!0);A[b].render(null,!1,1)}),g.length&&(e(g,function(b,c){if(!n||b>=a.min&&b<=a.max)h[b]||(h[b]=new M(a,b)),l&&h[b].isNew&&h[b].render(c,!0,.1),h[b].render(c)}),F&&(0===a.min||a.single)&&(h[-1]||(h[-1]=new M(a,-1,null,!0)),h[-1].render(-1))),k&&e(g,function(c,d){t=void 0!==g[d+1]?g[d+1]+F:a.max-F;0===d%2&&c=e.second?0:A*Math.floor(c.getMilliseconds()/A));if(n>=e.second)c[B.hcSetSeconds](n>=e.minute?0:A*Math.floor(c.getSeconds()/ +A));if(n>=e.minute)c[B.hcSetMinutes](n>=e.hour?0:A*Math.floor(c[B.hcGetMinutes]()/A));if(n>=e.hour)c[B.hcSetHours](n>=e.day?0:A*Math.floor(c[B.hcGetHours]()/A));if(n>=e.day)c[B.hcSetDate](n>=e.month?1:A*Math.floor(c[B.hcGetDate]()/A));n>=e.month&&(c[B.hcSetMonth](n>=e.year?0:A*Math.floor(c[B.hcGetMonth]()/A)),g=c[B.hcGetFullYear]());if(n>=e.year)c[B.hcSetFullYear](g-g%A);if(n===e.week)c[B.hcSetDate](c[B.hcGetDate]()-c[B.hcGetDay]()+m(f,1));g=c[B.hcGetFullYear]();f=c[B.hcGetMonth]();var C=c[B.hcGetDate](), +y=c[B.hcGetHours]();if(B.hcTimezoneOffset||B.hcGetTimezoneOffset)x=(!q||!!B.hcGetTimezoneOffset)&&(k-h>4*e.month||t(h)!==t(k)),c=c.getTime(),c=new B(c+t(c));q=c.getTime();for(h=1;qr&&(!t||b<=w)&&void 0!==b&&h.push(b),b>w&&(q=!0),b=d;else r=e(r),w= +e(w),a=k[t?"minorTickInterval":"tickInterval"],a=p("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(t?5:1)*(w-r)/((t?m/this.tickPositions.length:m)||1)),a=H(a,null,B(a)),h=G(this.getLinearTickPositions(a,r,w),g),t||(this._minorAutoInterval=a/5);t||(this.tickInterval=a);return h};D.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};D.prototype.lin2log=function(a){return Math.pow(10,a)}})(N);(function(a){var D=a.dateFormat,B=a.each,G=a.extend,H=a.format,p=a.isNumber,l=a.map,r= +a.merge,w=a.pick,t=a.splat,k=a.stop,m=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){B(this.chart.series,function(e){var g=e&&e.tt;g&&(!g.isActive||a?e.tt=g.destroy():g.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label|| +(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,r(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart, +!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,m,f){var d=this,b=d.now,q=!1!==d.options.animation&&!d.isHidden&&(1h-q?h:h-q);else if(v)b[a]=Math.max(g,e+q+f>c?e:e+q);else return!1},x=function(a,c,f,e){var q;ec-d?q=!1:b[a]=ec-f/2?c-f-2:e-f/2;return q},k=function(a){var b=c;c=h;h=b;g=a},y=function(){!1!==A.apply(0,c)?!1!==x.apply(0,h)||g||(k(!0),y()):g?b.x=b.y=0:(k(!0),y())};(f.inverted||1y&&(q=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=d.plotTop;f.push({target:e.isHeader?d.plotHeight+c:a,rank:e.isHeader?1:0,size:n.tt.getBBox().height+1,point:e,x:y,tt:A})});this.cleanSplit(); +a.distribute(f,d.plotHeight+c);B(f,function(a){var b=a.point;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:q||b.isHeader?a.x:b.plotX+d.plotLeft+w(m.distance,16),y:a.pos+d.plotTop,anchorX:b.plotX+d.plotLeft,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+d.plotTop})})},updatePosition:function(a){var e=this.chart,g=this.getLabel(),g=(this.options.positioner||this.getPosition).call(this,g.width,g.height,a);this.move(Math.round(g.x),Math.round(g.y||0),a.plotX+e.plotLeft,a.plotY+e.plotTop)}, +getXDateFormat:function(a,h,m){var f;h=h.dateTimeLabelFormats;var d=m&&m.closestPointRange,b,q={millisecond:15,second:12,minute:9,hour:6,day:3},g,c="millisecond";if(d){g=D("%m-%d %H:%M:%S.%L",a.x);for(b in e){if(d===e.week&&+D("%w",a.x)===m.options.startOfWeek&&"00:00:00.000"===g.substr(6)){b="week";break}if(e[b]>d){b=c;break}if(q[b]&&g.substr(q[b])!=="01-01 00:00:00.000".substr(q[b]))break;"week"!==b&&(c=b)}b&&(f=h[b])}else f=h.day;return f||h.year},tooltipFooterHeaderFormatter:function(a,e){var g= +e?"footer":"header";e=a.series;var f=e.tooltipOptions,d=f.xDateFormat,b=e.xAxis,q=b&&"datetime"===b.options.type&&p(a.key),g=f[g+"Format"];q&&!d&&(d=this.getXDateFormat(a,f,b));q&&d&&(g=g.replace("{point.key}","{point.key:"+d+"}"));return H(g,{point:a,series:e})},bodyFormatter:function(a){return l(a,function(a){var e=a.series.tooltipOptions;return(e.pointFormatter||a.point.tooltipFormatter).call(a.point,e.pointFormat)})}}})(N);(function(a){var D=a.addEvent,B=a.attr,G=a.charts,H=a.color,p=a.css,l= +a.defined,r=a.doc,w=a.each,t=a.extend,k=a.fireEvent,m=a.offset,e=a.pick,g=a.removeEvent,h=a.splat,C=a.Tooltip,f=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};C&&b.tooltip.enabled&&(a.tooltip=new C(a,b.tooltip),this.followTouchMove=e(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart, +f=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(f=e(d.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,b){var d,e;a=a||f.event;a.target||(a.target=a.srcElement);e=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));void 0===e.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=e.pageX-b.left,b=e.pageY-b.top);return t(a,{chartX:Math.round(d), +chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};w(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},runPointActions:function(d){var b=this.chart,f=b.series,g=b.tooltip,c=g?g.shared:!1,h=!0,n=b.hoverPoint,m=b.hoverSeries,x,k,y,u=[],I;if(!c&&!m)for(x=0;xb.series.index?-1:1}));if(c)for(x=u.length;x--;)(u[x].x!==u[0].x||u[x].series.noSharedTooltip)&&u.splice(x,1);if(u[0]&&(u[0]!==this.prevKDPoint||g&&g.isHidden)){if(c&& +!u[0].series.noSharedTooltip){for(x=0;xh+k&&(f=h+k),cm+y&&(c=m+y),this.hasDragged=Math.sqrt(Math.pow(l-f,2)+Math.pow(v-c,2)),10x.max&&(l=x.max-c,v=!0);v?(u-=.8*(u-g[f][0]),J||(M-=.8*(M-g[f][1])),p()):g[f]=[u,M];A||(e[f]=F-E,e[q]=c);e=A?1/n:n;m[q]=c;m[f]=l;k[A?a?"scaleY":"scaleX":"scale"+d]=n;k["translate"+d]=e* +E+(u-e*y)},pinch:function(a){var r=this,t=r.chart,k=r.pinchDown,m=a.touches,e=m.length,g=r.lastValidTouch,h=r.hasZoom,C=r.selectionMarker,f={},d=1===e&&(r.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||r.runChartClick),b={};1b-6&&n(u||d.chartWidth- +2*x-v-e.x)&&(this.itemX=v,this.itemY+=p+this.lastLineHeight+I,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,c);this.lastItemY=p+this.itemY+I;this.lastLineHeight=Math.max(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=p+g+I,this.lastLineHeight=g);this.offsetWidth=u||Math.max((f?this.itemX-v-l:c)+x,this.offsetWidth)},getAllItems:function(){var a=[];l(this.chart.series,function(d){var b=d&&d.options;d&&m(b.showInLegend,p(b.linkedTo)? +!1:void 0,!0)&&(a=a.concat(d.legendItems||("point"===b.legendType?d.data:d)))});return a},adjustMargins:function(a,d){var b=this.chart,e=this.options,f=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||l([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(c,g){c.test(f)&&!p(a[g])&&(b[t[g]]=Math.max(b[t[g]],b.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*e[g%2?"x":"y"]+m(e.margin,12)+d[g]))})},render:function(){var a=this,d=a.chart,b=d.renderer, +e=a.group,h,c,m,n,k=a.box,x=a.options,p=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=b.g("legend").attr({zIndex:7}).add(),a.contentGroup=b.g().attr({zIndex:1}).add(e),a.scrollGroup=b.g().add(a.contentGroup));a.renderTitle();h=a.getAllItems();g(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});x.reversed&&h.reverse();a.allItems=h;a.display=c=!!h.length;a.lastLineHeight=0;l(h,function(b){a.renderItem(b)}); +m=(x.width||a.offsetWidth)+p;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=p;k||(a.box=k=b.rect().addClass("highcharts-legend-box").attr({r:x.borderRadius}).add(e),k.isNew=!0);k.attr({stroke:x.borderColor,"stroke-width":x.borderWidth||0,fill:x.backgroundColor||"none"}).shadow(x.shadow);0b&&!1!==h.enabled?(this.clipHeight=g=Math.max(b-20-this.titleHeight-I,0),this.currentPage=m(this.currentPage,1),this.fullHeight=a,l(v,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var d=u.length;if(!d||c-u[d-1]>g&&(r||c)!==u[d-1])u.push(r||c),d++;b===v.length-1&&c+a-u[d-1]>g&&u.push(c);c!==r&&(r=c)}),n||(n=d.clipRect= +e.clipRect(0,I,9999,0),d.contentGroup.clip(n)),t(g),y||(this.nav=y=e.g().attr({zIndex:1}).add(this.group),this.up=e.symbol("triangle",0,0,p,p).on("click",function(){d.scroll(-1,k)}).add(y),this.pager=e.text("",15,10).addClass("highcharts-legend-navigation").css(h.style).add(y),this.down=e.symbol("triangle-down",0,0,p,p).on("click",function(){d.scroll(1,k)}).add(y)),d.scroll(0),a=b):y&&(t(),y.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,d){var b=this.pages, +f=b.length;a=this.currentPage+a;var g=this.clipHeight,c=this.options.navigation,h=this.pager,n=this.padding;a>f&&(a=f);0f&&(g=typeof a[0],"string"===g?e.name=a[0]:"number"===g&&(e.x=a[0]),d++);b=h.value;)h=e[++g];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),H(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this), +this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(g in this)this[g]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,g= +e.tooltipOptions,h=t(g.valueDecimals,""),k=g.valuePrefix||"",f=g.valueSuffix||"";B(e.pointArrayMap||["y"],function(d){d="{point."+d;if(k||f)a=a.replace(d+"}",k+d+"}"+f);a=a.replace(d+"}",d+":,."+h+"f}")});return l(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var h=this,k=this.series.options;(k.point.events[a]||h.options&&h.options.events&&h.options.events[a])&&this.importEvents();"click"===a&&k.allowPointSelect&&(g=function(a){h.select&&h.select(null,a.ctrlKey||a.metaKey||a.shiftKey)}); +p(this,a,e,g)},visible:!0}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.correctFloat,l=a.Date,r=a.defaultOptions,w=a.defaultPlotOptions,t=a.defined,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.fireEvent,C=a.grep,f=a.isArray,d=a.isNumber,b=a.isString,q=a.merge,E=a.pick,c=a.removeEvent,F=a.splat,n=a.stableSort,A=a.SVGElement,x=a.syncTimeout,J=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, +marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1, +marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var c=this,d,e,f=a.series,u,y=function(a,b){return E(a.options.index,a._i)-E(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();g(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0=== +b.selected});e=b.events;for(d in e)D(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();k(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(u=f[f.length-1]);c._i=E(u&&u._i,-1)+1;f.push(c);n(f,y);this.yAxis&&n(this.yAxis.series,y);k(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart, +d;k(a.axisTypes||[],function(f){k(c[f],function(c){d=c.options;if(b[f]===d.index||void 0!==b[f]&&b[f]===d.id||void 0===b[f]&&0===d.index)c.series.push(a),a[f]=c,c.isDirty=!0});a[f]||a.optionalAxis===f||e(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,e=arguments,f=d(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(e,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options, +b=this.xIncrement,c,d=a.pointIntervalUnit,b=E(b,a.pointStart,0);this.pointInterval=c=E(this.pointInterval,a.pointInterval,1);d&&(a=new l(b),"day"===d?a=+a[l.hcSetDate](a[l.hcGetDate]()+c):"month"===d?a=+a[l.hcSetMonth](a[l.hcGetMonth]()+c):"year"===d&&(a=+a[l.hcSetFullYear](a[l.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=q(e,c.series,a);this.tooltipOptions= +q(r.tooltip,r.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===e.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&t(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor}); +return c},getCyclic:function(a,b,c){var d,e=this.userOptions,f=a+"Index",g=a+"Counter",u=c?c.length:E(this.chart.options.chart[a+"Count"],this.chart[a+"Count"]);b||(d=E(e[f],e["_"+f]),t(d)||(e["_"+f]=d=this.chart[g]%u,this.chart[g]+=1),c&&(b=c[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||w[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol, +this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(a,c,g,n){var u=this,q=u.points,h=q&&q.length||0,y,m=u.options,x=u.chart,A=null,I=u.xAxis,l=m.turboThreshold,p=this.xData,r=this.yData,F=(y=u.pointArrayMap)&&y.length;a=a||[];y=a.length;c=E(c,!0);if(!1!==n&&y&&h===y&&!u.cropped&&!u.hasGroupedData&&u.visible)k(a,function(a,b){q[b].update&&a!==m.data[b]&&q[b].update(a,!1,null,!1)});else{u.xIncrement=null;u.colorCounter=0;k(this.parallelArrays,function(a){u[a+ +"Data"].length=0});if(l&&y>l){for(g=0;null===A&&gh||this.forceCrop))if(b[d-1]l)b=[],c=[];else if(b[0]l)f=this.cropData(this.xData,this.yData,A,l),b=f.xData,c=f.yData,f=f.start,g=!0;for(h=b.length||1;--h;)d=x?y(b[h])-y(b[h-1]):b[h]-b[h-1],0d&&this.requireSorting&&e(15);this.cropped=g;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=n},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,n=E(this.cropShoulder,1),u;for(u=0;u=c){f=Math.max(0,u- +n);break}for(c=u;cd){g=c+n;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,n=this.cropStart||0,q,h=this.hasGroupedData,k,m=[],x;b||h||(b=[],b.length=a.length,b=this.data=b);for(x=0;x=q&&(c[x-1]||k)<=h,y&&k)if(y=m.length)for(;y--;)null!==m[y]&&(g[n++]=m[y]);else g[n++]=m;this.dataMin=H(g);this.dataMax=G(g)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,e=c.categories,f=this.yAxis,g=this.points,n=g.length,q=!!this.modifyValue,h=a.pointPlacement,k="between"===h||d(h),m=a.threshold,x=a.startFromThreshold?m:0,A,l,r,F,J=Number.MAX_VALUE;"between"===h&&(h=.5);d(h)&&(h*=E(a.pointRange||c.pointRange)); +for(a=0;a=B&&(C.isNull=!0);C.plotX=A=p(Math.min(Math.max(-1E5,c.translate(w,0,0,0,1,h,"flags"===this.type)),1E5));b&&this.visible&&!C.isNull&&D&&D[w]&&(F=this.getStackIndicator(F,w,this.index),G=D[w],B=G.points[F.key],l=B[0],B=B[1],l===x&&F.key===D[w].base&&(l=E(m,f.min)),f.isLog&&0>=l&&(l=null),C.total=C.stackTotal=G.total,C.percentage=G.total&&C.y/G.total*100,C.stackY= +B,G.setOffset(this.pointXOffset||0,this.barW||0));C.yBottom=t(l)?f.translate(l,0,1,0,1):null;q&&(B=this.modifyValue(B,C));C.plotY=l="number"===typeof B&&Infinity!==B?Math.min(Math.max(-1E5,f.translate(B,0,1,0,1)),1E5):void 0;C.isInside=void 0!==l&&0<=l&&l<=f.len&&0<=A&&A<=c.len;C.clientX=k?p(c.translate(w,0,0,0,1,h)):A;C.negative=C.y<(m||0);C.category=e&&void 0!==e[C.x]?e[C.x]:C.x;C.isNull||(void 0!==r&&(J=Math.min(J,Math.abs(A-r))),r=A)}this.closestPointRangePx=J},getValidPoints:function(a,b){var c= +this.chart;return C(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,n=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(),q=b[n],h=b[n+"m"];q||(a&&(g.width=0,b[n+"m"]=h=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[n]=q=d.clipRect(g),q.count={length:0});a&&!q.count[this.index]&& +(q.count[this.index]=!0,q.count.length+=1);!1!==c.clip&&(this.group.clip(a||f?q:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=n);a||(q.count[this.index]&&(delete q.count[this.index],--q.count.length),0===q.count.length&&n&&b[n]&&(f||(b[n]=b[n].destroy()),b[n+"m"]&&(b[n+"m"]=b[n+"m"].destroy())))},animate:function(a){var b=this.chart,c=B(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+ +99},c),this.animate=null)},afterAnimate:function(){this.setClip();h(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,e,f,g,n=this.options.marker,q,h,k,m,x=this.markerGroup,A=E(n.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>2*n.radius);if(!1!==n.enabled||this._hasPointMarkers)for(e=a.length;e--;)f=a[e],c=f.plotY,g=f.graphic,q=f.marker||{},h=!!f.marker,k=A&&void 0===q.enabled||q.enabled,m=f.isInside,k&&d(c)&&null!==f.y?(c=E(q.symbol,this.symbol),f.hasImage= +0===c.indexOf("url"),k=this.markerAttribs(f,f.selected&&"select"),g?g[m?"show":"hide"](!0).animate(k):m&&(0e&&b.shadow));g&&(g.startX=c.xMap, +g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],n,q=this.graph,h=this.area,m=Math.max(b.chartWidth,b.chartHeight),x=this[(this.zoneAxis||"y")+"Axis"],A,l,p=b.inverted,r,F,C,t,J=!1;d.length&&(q||h)&&x&&void 0!==x.min&&(l=x.reversed,r=x.horiz,q&&q.hide(),h&&h.hide(),A=x.getExtremes(),k(d,function(d,u){e=l?r?b.plotWidth:0:r?0:x.toPixels(A.min);e=Math.min(Math.max(E(f,e),0),m);f=Math.min(Math.max(Math.round(x.toPixels(E(d.value,A.max), +!0)),0),m);J&&(e=f=x.toPixels(A.max));F=Math.abs(e-f);C=Math.min(e,f);t=Math.max(e,f);x.isXAxis?(n={x:p?t:C,y:0,width:F,height:m},r||(n.x=b.plotHeight-n.x)):(n={x:0,y:p?t:C,width:m,height:F},r&&(n.y=b.plotWidth-n.y));p&&c.isVML&&(n=x.isXAxis?{x:0,y:l?C:t,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});g[u]?g[u].animate(n):(g[u]=c.clipRect(n),q&&a["zone-graph-"+u].clip(g[u]),h&&a["zone-area-"+u].clip(g[u]));J=d.value>A.max}),this.clips= +g)},invertGroups:function(a){function b(){var b={width:c.yAxis.len,height:c.xAxis.len};k(["group","markerGroup"],function(d){c[d]&&c[d].attr(b).invert(a)})}var c=this,d;c.xAxis&&(d=D(c.chart,"resize",b),D(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(e),f.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className|| +"")));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=!!a.animate&&b.renderer.isSVG&&B(d.animation).duration,f=a.visible?"inherit":"hidden",g=d.zIndex,n=a.hasRendered,q=b.seriesGroup,h=b.inverted;c=a.plotGroup("group","series",f,g,q);a.markerGroup= +a.plotGroup("markerGroup","markers",f,g,q);e&&a.animate(!0);c.inverted=a.isCartesian?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);!1===d.clip||a.sharedClipKey||n||c.clip(b.clipRect);e&&a.animate();n||(a.animationTimeout=x(function(){a.afterAnimate()},e));a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty|| +this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:E(d&&d.left,a.plotLeft),translateY:E(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)}, +buildKDTree:function(){function a(c,d,e){var f,g;if(g=c&&c.length)return f=b.kdAxisArray[d%e],c.sort(function(a,b){return a[f]-b[f]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,e),right:a(c.slice(g+1),d+1,e)}}var b=this,c=b.kdDimensions;delete b.kdTree;x(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,n,q){var h=b.point,u=d.kdAxisArray[n%q],k,m,x=h;m=t(a[e])&&t(h[e])?Math.pow(a[e]-h[e],2):null;k=t(a[f])&& +t(h[f])?Math.pow(a[f]-h[f],2):null;k=(m||0)+(k||0);h.dist=t(k)?Math.sqrt(k):Number.MAX_VALUE;h.distX=t(m)?Math.sqrt(m):Number.MAX_VALUE;u=a[u]-h[u];k=0>u?"left":"right";m=0>u?"right":"left";b[k]&&(k=c(a,b[k],n+1,q),x=k[g]A;)l--;this.updateParallelArrays(h,"splice",l,0,0);this.updateParallelArrays(h,l);n&&h.name&&(n[A]=h.name);q.splice(l,0,a);m&&(this.data.splice(l,0,null),this.processData());"point"===c.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(h,"shift"),q.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(e)},removePoint:function(a, +b,d){var c=this,e=c.data,f=e[a],g=c.points,n=c.chart,h=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&n.redraw()};q(d,n);b=C(b,!0);f?f.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){e.destroy();f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();C(a,!0)&&f.redraw(b)}var e=this,f=e.chart;!1!==d?k(e,"remove",null,c):c()},update:function(a, +d){var c=this,e=this.chart,f=this.userOptions,g=this.type,q=a.type||f.type||e.options.chart.type,u=b[g].prototype,m=["group","markerGroup","dataLabelsGroup"],k;if(q&&q!==g||void 0!==a.zIndex)m.length=0;r(m,function(a){m[a]=c[a];delete c[a]});a=h(f,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1,null,!1);for(k in u)this[k]=void 0;t(this,b[q||g].prototype);r(m,function(a){c[a]=m[a]});this.init(e,a);e.linkSeries();C(d,!0)&&e.redraw(!1)}});t(G.prototype, +{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,t(a,{events:void 0}));c.isDirtyBox=!0;C(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);w(b.axes,this);w(b[c],this);b.options[c].splice(this.options.index,1);r(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;C(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a}, +b)},setCategories:function(a,b){this.update({categories:a},b)}})})(N);(function(a){var D=a.color,B=a.each,G=a.map,H=a.pick,p=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],l=[],p=this.xAxis,k=this.yAxis,m=k.stacks[this.stackKey],e={},g=this.points,h=this.index,C=k.series,f=C.length,d,b=H(k.options.reversedStacks,!0)?1:-1,q,E;if(this.options.stacking){for(q=0;qa&&t>l?(t=Math.max(a,l),m=2*l-t):tH&& +m>l?(m=Math.max(H,l),t=2*l-m):m=Math.abs(g)&&.5a.closestPointRange*a.xAxis.transA,k=a.borderWidth=r(h.borderWidth,k?0:1),f=a.yAxis,d=a.translatedThreshold=f.getThreshold(h.threshold),b=r(h.minPointLength,5),q=a.getColumnMetrics(),m=q.width,c=a.barW=Math.max(m,1+2*k),l=a.pointXOffset= +q.offset;g.inverted&&(d-=.5);h.pointPadding&&(c=Math.ceil(c));w.prototype.translate.apply(a);G(a.points,function(e){var n=r(e.yBottom,d),q=999+Math.abs(n),q=Math.min(Math.max(-q,e.plotY),f.len+q),h=e.plotX+l,k=c,u=Math.min(q,n),p,t=Math.max(q,n)-u;Math.abs(t)b?n-b:d-(p?b:0));e.barX=h;e.pointWidth=m;e.tooltipPos=g.inverted?[f.len+f.pos-g.plotLeft-q,a.xAxis.len-h-k/2,t]:[h+k/2,q+f.pos-g.plotTop,t];e.shapeType="rect";e.shapeArgs= +a.crispCol.apply(a,e.isNull?[e.plotX,f.len/2,0,0]:[h,u,k,t])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,g){var e=this.options,k=this.pointAttrToOptions||{},f=k.stroke||"borderColor",d=k["stroke-width"]||"borderWidth",b=a&&a.color||this.color,q=a[f]||e[f]||this.color||b,k=e.dashStyle,m;a&&this.zones.length&&(b=(b=a.getZone())&&b.color||a.options.color|| +this.color);g&&(g=e.states[g],m=g.brightness,b=g.color||void 0!==m&&B(b).brighten(g.brightness).get()||b,q=g[f]||q,k=g.dashStyle||k);a={fill:b,stroke:q,"stroke-width":a[d]||e[d]||this[d]||0};e.borderRadius&&(a.r=e.borderRadius);k&&(a.dashstyle=k);return a},drawPoints:function(){var a=this,g=this.chart,h=a.options,m=g.renderer,f=h.animationLimit||250,d;G(a.points,function(b){var e=b.graphic;p(b.plotY)&&null!==b.y?(d=b.shapeArgs,e?(k(e),e[g.pointCountt;++t)k=r[t],a=2>t||2===t&&/%$/.test(k),r[t]=B(k,[l,H,w,r[2]][t])+(a?p:0);r[3]>r[2]&&(r[3]=r[2]);return r}}})(N);(function(a){var D=a.addEvent,B=a.defined,G=a.each,H=a.extend,p=a.inArray,l=a.noop,r=a.pick,w=a.Point,t=a.Series,k=a.seriesType,m=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y? +void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,h=e.points,k=e.startAngleRad;a||(G(h,function(a){var d= +a.graphic,b=a.shapeArgs;d&&(d.attr({r:a.startR||e.center[3]/2,start:k,end:k}),d.animate({r:b.r,start:b.start,end:b.end},e.options.animation))}),e.animate=null)},updateTotals:function(){var a,g=0,h=this.points,k=h.length,f,d=this.options.ignoreHiddenPoint;for(a=0;af.y&&(f.y=null),g+=d&&!f.visible?0:f.y;this.total=g;for(a=0;a1.5*Math.PI?q-=2*Math.PI:q<-Math.PI/2&&(q+=2*Math.PI);t.slicedTranslation={translateX:Math.round(Math.cos(q)*k),translateY:Math.round(Math.sin(q)*k)};d=Math.cos(q)*a[2]/2;b=Math.sin(q)*a[2]/2;t.tooltipPos=[a[0]+.7*d,a[1]+.7*b];t.half=q<-Math.PI/2||q>Math.PI/2?1:0;t.angle=q;f=Math.min(f,n/5);t.labelPos=[a[0]+d+Math.cos(q)*n,a[1]+b+Math.sin(q)*n,a[0]+d+Math.cos(q)*f,a[1]+b+Math.sin(q)* +f,a[0]+d,a[1]+b,0>n?"center":t.half?"right":"left",q]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,h,k,f,d,b=a.options.shadow;b&&!a.shadowGroup&&(a.shadowGroup=g.g("shadow").add(a.group));G(a.points,function(e){if(null!==e.y){k=e.graphic;d=e.shapeArgs;h=e.sliced?e.slicedTranslation:{};var q=e.shadowGroup;b&&!q&&(q=e.shadowGroup=g.g("shadow").add(a.shadowGroup));q&&q.attr(h);f=a.pointAttribs(e,e.selected&&"select");k?k.setRadialReference(a.center).attr(f).animate(H(d,h)):(e.graphic= +k=g[e.shapeType](d).addClass(e.getClassName()).setRadialReference(a.center).attr(h).add(a.group),e.visible||k.attr({visibility:"hidden"}),k.attr(f).attr({"stroke-linejoin":"round"}).shadow(b,q))}})},searchPoint:l,sortByAngle:function(a,g){a.sort(function(a,e){return void 0!==a.angle&&(e.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:l},{init:function(){w.prototype.init.apply(this,arguments);var a=this,g;a.name=r(a.name,"Slice"); +g=function(e){a.slice("select"===e.type)};D(a,"select",g);D(a,"unselect",g);return a},setVisible:function(a,g){var e=this,k=e.series,f=k.chart,d=k.options.ignoreHiddenPoint;g=r(g,d);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,k.options.data[p(e,k.data)]=e.options,G(["graphic","dataLabel","connector","shadowGroup"],function(b){if(e[b])e[b][a?"show":"hide"](!0)}),e.legendItem&&f.legend.colorizeItem(e,a),a||"hover"!==e.state||e.setState(""),d&&(k.isDirty=!0),g&&f.redraw())}, +slice:function(a,g,h){var e=this.series;m(h,e.chart);r(g,!0);this.sliced=this.options.sliced=a=B(a)?a:!this.sliced;e.options.data[p(this,e.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(N);(function(a){var D= +a.addEvent,B=a.arrayMax,G=a.defined,H=a.each,p=a.extend,l=a.format,r=a.map,w=a.merge,t=a.noop,k=a.pick,m=a.relativeLength,e=a.Series,g=a.seriesTypes,h=a.stableSort,C=a.stop;a.distribute=function(a,d){function b(a,b){return a.target-b.target}var e,f=!0,c=a,g=[],n;n=0;for(e=a.length;e--;)n+=a[e].size;if(n>d){h(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(n=e=0;n<=d;)n+=a[e].size,e++;g=a.splice(e-1,a.length)}h(a,b);for(a=r(a,function(a){return{size:a.size,targets:[a.target]}});f;){for(e=a.length;e--;)f= +a[e],n=(Math.min.apply(0,f.targets)+Math.max.apply(0,f.targets))/2,f.pos=Math.min(Math.max(0,n-f.size/2),d-f.size);e=a.length;for(f=!1;e--;)0a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>d&&(a[e-1].pos=d-a[e-1].size),a.splice(e,1),f=!0)}e=0;H(a,function(a){var b=0;H(a.targets,function(){c[e].pos=a.pos+b;b+=c[e].size;e++})});c.push.apply(c,g);h(c,b)};e.prototype.drawDataLabels=function(){var a=this,d=a.options, +b=d.dataLabels,e=a.points,g,c,h=a.hasRendered||0,n,m,x=k(b.defer,!0),r=a.chart.renderer;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),m=a.plotGroup("dataLabelsGroup","data-labels",x&&!h?"hidden":"visible",b.zIndex||6),x&&(m.attr({opacity:+h}),h||D(a,"afterAnimate",function(){a.visible&&m.show(!0);m[d.animation?"animate":"attr"]({opacity:1},{duration:200})})),c=b,H(e,function(e){var f,q=e.dataLabel,h,x,A=e.connector,y=!0,t,z={};g=e.dlOptions||e.options&&e.options.dataLabels; +f=k(g&&g.enabled,c.enabled)&&null!==e.y;if(q&&!f)e.dataLabel=q.destroy();else if(f){b=w(c,g);t=b.style;f=b.rotation;h=e.getLabelConfig();n=b.format?l(b.format,h):b.formatter.call(h,b);t.color=k(b.color,t.color,a.color,"#000000");if(q)G(n)?(q.attr({text:n}),y=!1):(e.dataLabel=q=q.destroy(),A&&(e.connector=A.destroy()));else if(G(n)){q={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:f,padding:b.padding,zIndex:1};"contrast"===t.color&&(z.color=b.inside|| +0>b.distance||d.stacking?r.getContrast(e.color||a.color):"#000000");d.cursor&&(z.cursor=d.cursor);for(x in q)void 0===q[x]&&delete q[x];q=e.dataLabel=r[f?"text":"label"](n,0,-9999,b.shape,null,null,b.useHTML,null,"data-label").attr(q);q.addClass("highcharts-data-label-color-"+e.colorIndex+" "+(b.className||""));q.css(p(t,z));q.add(m);q.shadow(b.shadow)}q&&a.alignDataLabel(e,q,b,null,y)}})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,f=c.inverted,n=k(a.plotX,-9999),q=k(a.plotY, +-9999),h=d.getBBox(),m,l=b.rotation,u=b.align,r=this.visible&&(a.series.forceDL||c.isInsidePlot(n,Math.round(q),f)||e&&c.isInsidePlot(n,f?e.x+1:e.y+e.height-1,f)),t="justify"===k(b.overflow,"justify");r&&(m=b.style.fontSize,m=c.renderer.fontMetrics(m,d).b,e=p({x:f?c.plotWidth-q:n,y:Math.round(f?c.plotHeight-n:q),width:0,height:0},e),p(b,{width:h.width,height:h.height}),l?(t=!1,f=c.renderer.rotCorr(m,l),f={x:e.x+b.x+e.width/2+f.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g? +"attr":"animate"](f).attr({align:u}),n=(l+720)%360,n=180n,"left"===u?f.y-=n?h.height:0:"center"===u?(f.x-=h.width/2,f.y-=h.height/2):"right"===u&&(f.x-=h.width,f.y-=n?0:h.height)):(d.align(b,null,e),f=d.alignAttr),t?this.justifyDataLabel(d,b,f,h,e,g):k(b.crop,!0)&&(r=c.isInsidePlot(f.x,f.y)&&c.isInsidePlot(f.x+h.width,f.y+h.height)),b.shape&&!l&&d.attr({anchorX:a.plotX,anchorY:a.plotY}));r||(C(d),d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,c){var f=this.chart, +n=d.align,h=d.verticalAlign,q,k,m=a.box?0:a.padding||0;q=b.x+m;0>q&&("right"===n?d.align="left":d.x=-q,k=!0);q=b.x+e.width-m;q>f.plotWidth&&("left"===n?d.align="right":d.x=f.plotWidth-q,k=!0);q=b.y+m;0>q&&("bottom"===h?d.verticalAlign="top":d.y=-q,k=!0);q=b.y+e.height-m;q>f.plotHeight&&("top"===h?d.verticalAlign="bottom":d.y=f.plotHeight-q,k=!0);k&&(a.placed=!c,a.align(d,null,g))};g.pie&&(g.pie.prototype.drawDataLabels=function(){var f=this,d=f.data,b,g=f.chart,h=f.options.dataLabels,c=k(h.connectorPadding, +10),m=k(h.connectorWidth,1),n=g.plotWidth,l=g.plotHeight,x,p=h.distance,y=f.center,u=y[2]/2,t=y[1],w=0k-2?A:P,e),v._attr={visibility:S,align:D[6]},v._pos={x:L+h.x+({left:c,right:-c}[D[6]]||0),y:P+h.y-10},D.x=L,D.y=P,null===f.options.size&&(C=v.width,L-Cn-c&&(T[1]=Math.max(Math.round(L+ +C-n+c),T[1])),0>P-G/2?T[0]=Math.max(Math.round(-P+G/2),T[0]):P+G/2>l&&(T[2]=Math.max(Math.round(P+G/2-l),T[2])))}),0===B(T)||this.verifyDataLabelOverflow(T))&&(this.placeDataLabels(),w&&m&&H(this.points,function(a){var b;x=a.connector;if((v=a.dataLabel)&&v._pos&&a.visible){S=v._attr.visibility;if(b=!x)a.connector=x=g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(f.dataLabelsGroup),x.attr({"stroke-width":m,stroke:h.connectorColor||a.color||"#666666"}); +x[b?"attr":"animate"]({d:f.connectorPath(a.labelPos)});x.attr("visibility",S)}else x&&(a.connector=x.destroy())}))},g.pie.prototype.connectorPath=function(a){var d=a.x,b=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",d+("left"===a[6]?5:-5),b,"C",d,b,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",d+("left"===a[6]?5:-5),b,"L",a[2],a[3],"L",a[4],a[5]]},g.pie.prototype.placeDataLabels=function(){H(this.points,function(a){var d=a.dataLabel;d&&a.visible&&((a=d._pos)?(d.attr(d._attr), +d[d.moved?"animate":"attr"](a),d.moved=!0):d&&d.attr({y:-9999}))})},g.pie.prototype.alignDataLabel=t,g.pie.prototype.verifyDataLabelOverflow=function(a){var d=this.center,b=this.options,e=b.center,f=b.minSize||80,c,g;null!==e[0]?c=Math.max(d[2]-Math.max(a[1],a[3]),f):(c=Math.max(d[2]-a[1]-a[3],f),d[0]+=(a[3]-a[1])/2);null!==e[1]?c=Math.max(Math.min(c,d[2]-Math.max(a[0],a[2])),f):(c=Math.max(Math.min(c,d[2]-a[0]-a[2]),f),d[1]+=(a[0]-a[2])/2);ck(this.translatedThreshold,f.yAxis.len)),m=k(b.inside,!!this.options.stacking);n&&(g=w(n),0>g.y&&(g.height+=g.y,g.y=0),n=g.y+g.height-f.yAxis.len,0a+e||c+nb+f||g+hthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&r(d,function(a){a.setState()});r("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",g=c[d],n=(b.pointRange||0)/2,h=b.getExtremes(),q=b.toValue(g-f,!0)+n,n=b.toValue(g+b.len-f,!0)-n,g=g>f;b.series.length&&(g||q>Math.min(h.dataMin,h.min))&&(!g||n=p(k.minWidth,0)&&this.chartHeight>=p(k.minHeight,0)};void 0===l._id&&(l._id=a.uniqueKey());m=m.call(this);!r[l._id]&&m?l.chartOptions&&(r[l._id]=this.currentOptions(l.chartOptions),this.update(l.chartOptions,w)):r[l._id]&&!m&&(this.update(r[l._id],w),delete r[l._id])};D.prototype.currentOptions=function(a){function p(a,m,e){var g,h;for(g in a)if(-1< +G(g,["series","xAxis","yAxis"]))for(a[g]=l(a[g]),e[g]=[],h=0;hd.length||void 0===h)return a.call(this,g,h,k,f);x=d.length;for(c=0;ck;d[c]5*b||w){if(d[c]>u){for(r=a.call(this,g,d[e],d[c],f);r.length&&r[0]<=u;)r.shift();r.length&&(u=r[r.length-1]);y=y.concat(r)}e=c+1}if(w)break}a= +r.info;if(q&&a.unitRange<=m.hour){c=y.length-1;for(e=1;ek?a-1:a;for(M=void 0;q--;)e=c[q],k=M-e,M&&k<.8*C&&(null===t||k<.8*t)?(n[y[q]]&&!n[y[q+1]]?(k=q+1,M=e):k=q,y.splice(k,1)):M=e}return y});w(B.prototype,{beforeSetTickPositions:function(){var a, +g=[],h=!1,k,f=this.getExtremes(),d=f.min,b=f.max,q,m=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,c=this.chart.options.chart.ignoreHiddenSeries;if(f||m){r(this.series,function(b,d){if(!(c&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(g=g.concat(b.processedXData),a=g.length,g.sort(function(a,b){return a-b}),a))for(d=a-1;d--;)g[d]===g[d+1]&&g.splice(d,1)});a=g.length;if(2k||b-g[g.length- +1]>k)&&(h=!0)}h?(this.ordinalPositions=g,k=this.val2lin(Math.max(d,g[0]),!0),q=Math.max(this.val2lin(Math.min(b,g[g.length-1]),!0),1),this.ordinalSlope=b=(b-d)/(q-k),this.ordinalOffset=d-k*b):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=f&&h;this.groupIntervalFactor=null},val2lin:function(a,g){var e=this.ordinalPositions;if(e){var k=e.length,f,d;for(f=k;f--;)if(e[f]===a){d=f;break}for(f=k-1;f--;)if(a>e[f]||0===f){a=(a-e[f])/(e[f+1]-e[f]);d=f+a;break}g=g?d:this.ordinalSlope* +(d||0)+this.ordinalOffset}else g=a;return g},lin2val:function(a,g){var e=this.ordinalPositions;if(e){var k=this.ordinalSlope,f=this.ordinalOffset,d=e.length-1,b;if(g)0>a?a=e[0]:a>d?a=e[d]:(d=Math.floor(a),b=a-d);else for(;d--;)if(g=k*d+f,a>=g){k=k*(d+1)+f;b=(a-g)/(k-g);break}return void 0!==b&&void 0!==e[d]?e[d]+(b?b*(e[d+1]-e[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,g=this.series[0].currentDataGrouping,h=this.ordinalIndex,k=g?g.count+g.unitName:"raw",f=this.getExtremes(), +d,b;h||(h=this.ordinalIndex={});h[k]||(d={series:[],chart:a,getExtremes:function(){return{min:f.dataMin,max:f.dataMax}},options:{ordinal:!0},val2lin:B.prototype.val2lin},r(this.series,function(e){b={xAxis:d,xData:e.xData,chart:a,destroyGroupedData:t};b.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:"open",units:[[g.unitName,[g.count]]]}:{enabled:!1}};e.processData.apply(b);d.series.push(b)}),this.beforeSetTickPositions.apply(d),h[k]=d.ordinalPositions);return h[k]},getGroupIntervalFactor:function(a, +g,h){var e;h=h.processedXData;var f=h.length,d=[];e=this.groupIntervalFactor;if(!e){for(e=0;ed?(l=p,t=e.ordinalPositions?e:p):(l=e.ordinalPositions?e:p,t=p),p=t.ordinalPositions,q>p[p.length-1]&&p.push(q),this.fixedRange=c-m,d=e.toFixedRange(null,null,n.apply(l,[x.apply(l,[m,!0])+d,!0]),n.apply(t,[x.apply(t, +[c,!0])+d,!0])),d.min>=Math.min(b.dataMin,m)&&d.max<=Math.max(q,c)&&e.setExtremes(d.min,d.max,!0,!1,{trigger:"pan"}),this.mouseDownX=k,H(this.container,{cursor:"move"})):f=!0}else f=!0;f&&a.apply(this,Array.prototype.slice.call(arguments,1))});k.prototype.gappedPath=function(){var a=this.options.gapSize,g=this.points.slice(),h=g.length-1;if(a&&0this.closestPointRange*a&&g.splice(h+1,0,{isNull:!0});return this.getGraphPath(g)}})(N);(function(a){function D(){return Array.prototype.slice.call(arguments, +1)}function B(a){a.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,G(this.pointArrayMap,["y"]))}var G=a.pick,H=a.wrap,p=a.each,l=a.extend,r=a.fireEvent,w=a.Axis,t=a.Series;l(w.prototype,{isInBreak:function(a,m){var e=a.repeat||Infinity,g=a.from,h=a.to-a.from;m=m>=g?(m-g)%e:e-(g-m)%e;return a.inclusive?m<=h:m=a)break;else if(g.isInBreak(f,a)){e-=a-f.from;break}return e};this.lin2val=function(a){var e,f;for(f=0;f=a);f++)e.toh;)m-=b;for(;mb.to||l>b.from&&db.from&&db.from&&d>b.to&&d=c[0]);A++);for(A;A<=q;A++){for(;(void 0!==c[w+1]&&a[A]>=c[w+1]||A===q)&&(l=c[w],this.dataGroupInfo={start:p,length:t[0].length},p=d.apply(this,t),void 0!==p&&(g.push(l),h.push(p),m.push(this.dataGroupInfo)),p=A,t[0]=[],t[1]=[],t[2]=[],t[3]=[],w+=1,A!==q););if(A===q)break;if(x){l=this.cropStart+A;l=e&&e[l]|| +this.pointClass.prototype.applyOptions.apply({series:this},[f[l]]);var E,C;for(E=0;Ethis.chart.plotSizeX/d||b&&f.forced)&&(e=!0);return e?d:0};G.prototype.setDataGrouping=function(a,b){var c;b=e(b,!0);a||(a={forced:!1,units:null});if(this instanceof G)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else l(this.chart.options.series,function(b){b.dataGrouping=a},!1);b&&this.chart.redraw()}})(N);(function(a){var D=a.each,B=a.Point,G=a.seriesType,H=a.seriesTypes;G("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'}, +threshold:null,states:{hover:{lineWidth:3}}},{pointArrayMap:["open","high","low","close"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:"high",pointAttribs:function(a,l){l=H.column.prototype.pointAttribs.call(this,a,l);var p=this.options;delete l.fill;l["stroke-width"]=p.lineWidth;l.stroke=a.options.color||(a.openk)););B(g,function(a,b){var d;void 0===a.plotY&&(a.x>=c.min&&a.x<=c.max?a.plotY=e.chartHeight-p.bottom-(p.opposite?p.height:0)+p.offset-e.plotTop:a.shapeArgs={});a.plotX+=t;(f=g[b-1])&&f.plotX===a.plotX&&(void 0===f.stackIndex&&(f.stackIndex=0),d=f.stackIndex+1);a.stackIndex=d})},drawPoints:function(){var a=this.points,e=this.chart,g=e.renderer,k,l,f=this.options,d=f.y,b,q,p,c,r,n,t,x=this.yAxis;for(q=a.length;q--;)p=a[q],t=p.plotX>this.xAxis.len,k=p.plotX,c=p.stackIndex,b= +p.options.shape||f.shape,l=p.plotY,void 0!==l&&(l=p.plotY+d-(void 0!==c&&c*f.stackDistance)),r=c?void 0:p.plotX,n=c?void 0:p.plotY,c=p.graphic,void 0!==l&&0<=k&&!t?(c||(c=p.graphic=g.label("",null,null,b,null,null,f.useHTML).attr(this.pointAttribs(p)).css(G(f.style,p.style)).attr({align:"flag"===b?"left":"center",width:f.width,height:f.height,"text-align":f.textAlign}).addClass("highcharts-point").add(this.markerGroup),c.shadow(f.shadow)),0h&&(e-=Math.round((l-h)/2),h=l);e=k[a](e,g,h,l);d&&f&&e.push("M",d,g>f?g:g+l,"L",d,f);return e}});p===t&&B(["flag","circlepin","squarepin"],function(a){t.prototype.symbols[a]=k[a]})})(N);(function(a){function D(a,d,e){this.init(a,d,e)}var B=a.addEvent,G=a.Axis,H=a.correctFloat,p=a.defaultOptions, +l=a.defined,r=a.destroyObjectProperties,w=a.doc,t=a.each,k=a.fireEvent,m=a.hasTouch,e=a.isTouchDevice,g=a.merge,h=a.pick,C=a.removeEvent,f=a.wrap,d={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2", +trackBorderWidth:1};p.scrollbar=g(!0,d,p.scrollbar);D.prototype={init:function(a,e,f){this.scrollbarButtons=[];this.renderer=a;this.userOptions=e;this.options=g(d,e);this.chart=f;this.size=h(this.options.size,this.options.height);e.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,d=this.options,e=this.size,c;this.group=c=a.g("scrollbar").attr({zIndex:d.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0, +r:d.trackBorderRadius||0,height:e,width:e}).add(c);this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(this.swapXY(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L", +0,2*e/3,"M",3,e/4,"L",3,2*e/3],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth});this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a, +d,e,c){var b=this.options.vertical,f=0,g=this.rendered?"animate":"attr";this.x=a;this.y=d+this.trackBorderWidth;this.width=e;this.xOffset=this.height=c;this.yOffset=f;b?(this.width=this.yOffset=e=f=this.size,this.xOffset=d=0,this.barWidth=c-2*e,this.x=a+=this.options.margin):(this.height=this.xOffset=c=d=this.size,this.barWidth=e-2*c,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:e,height:c});this.scrollbarButtons[1].attr({translateX:b?0:e-d,translateY:b? +c-f:0})},drawScrollbarButton:function(a){var b=this.renderer,d=this.scrollbarButtons,c=this.options,e=this.size,f;f=b.g().add(this.group);d.push(f);f=b.rect().addClass("highcharts-scrollbar-button").add(f);f.attr({stroke:c.buttonBorderColor,"stroke-width":c.buttonBorderWidth,fill:c.buttonBackgroundColor});f.attr(f.crisp({x:-.5,y:-.5,width:e+1,height:e+1,r:c.buttonBorderRadius},f.strokeWidth()));f=b.path(this.swapXY(["M",e/2+(a?-1:1),e/2-3,"L",e/2+(a?-1:1),e/2+3,"L",e/2+(a?2:-2),e/2],c.vertical)).addClass("highcharts-scrollbar-arrow").add(d[a]); +f.attr({fill:c.buttonArrowColor})},swapXY:function(a,d){var b=a.length,c;if(d)for(d=0;d=k?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),c=a.options.vertical? +"chartY":"chartX",e=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][c]||(d=a.cursorToScrollbarPosition(d)[c],c=a[c],c=d-c,a.hasDragged=!0,a.updatePosition(e[0]+c,e[1]+c),a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b); +b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=H(a.to-a.from)*a.options.step;a.updatePosition(H(a.from-d),H(a.to-d));k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b), +c=a.to-a.from,e=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>e||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+c,a.to+c):a.updatePosition(a.from-c,a.to-c);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a, +d){1a&&(d=H(d-a),a=0);this.from=a;this.to=d},update:function(a){this.destroy();this.init(this.chart.renderer,g(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],d=this.scrollbarButtons,e=this.scrollbarGroup.element,c=this.mouseDownHandler,f=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[d[a[0]].element,"click",this.buttonToMinClick],[d[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e, +"mousedown",c],[w,"mousemove",f],[w,"mouseup",g]];m&&a.push([e,"touchstart",c],[w,"touchmove",f],[w,"touchend",g]);t(a,function(a){B.apply(null,a)});this._events=a},removeEvents:function(){t(this._events,function(a){C.apply(null,a)});this._events=void 0},destroy:function(){var a=this.chart.scroller;this.removeEvents();t(["track","scrollbarRifles","scrollbar","scrollbarGroup","group"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&(a.scrollbar=null,r(a.scrollbarButtons))}}; +f(G.prototype,"init",function(a){var b=this;a.apply(b,[].slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new D(b.chart.renderer,b.options.scrollbar,b.chart),B(b.scrollbar,"changed",function(a){var c=Math.min(h(b.options.min,b.min),b.min,b.dataMin),d=Math.max(h(b.options.max,b.max),b.max,b.dataMax)-c,e;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(e=c+d*this.to,c+=d*this.from):(e= +c+d*(1-this.from),c+=d*(1-this.to));b.setExtremes(c,e,!0,!1,a)}))});f(G.prototype,"render",function(a){var b=Math.min(h(this.options.min,this.min),this.min,this.dataMin),d=Math.max(h(this.options.max,this.max),this.max,this.dataMax),c=this.scrollbar,e;a.apply(this,[].slice.call(arguments,1));c&&(this.horiz?c.position(this.left,this.top+this.height+this.offset+2+(this.opposite?0:this.axisTitleMargin),this.width,this.height):c.position(this.left+this.width+2+this.offset+(this.opposite?this.axisTitleMargin: +0),this.top,this.width,this.height),isNaN(b)||isNaN(d)||!l(this.min)||!l(this.max)?c.setRange(0,0):(e=(this.min-b)/(d-b),b=(this.max-b)/(d-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(e,b):c.setRange(1-b,1-e)))});f(G.prototype,"getOffset",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,[].slice.call(arguments,1));d&&(this.chart.axisOffset[b]+=d.size+d.options.margin)});f(G.prototype,"destroy",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy()); +a.apply(this,[].slice.call(arguments,1))});a.Scrollbar=D})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.color,l=a.defaultOptions,r=a.defined,w=a.destroyObjectProperties,t=a.doc,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.grep,C=a.hasTouch,f=a.isNumber,d=a.isObject,b=a.isTouchDevice,q=a.merge,E=a.pick,c=a.removeEvent,F=a.Scrollbar,n=a.Series,A=a.seriesTypes,x=a.wrap,J=[].concat(a.defaultDataGroupingUnits),y=function(a){var b=h(arguments,f);if(b.length)return Math[a].apply(0, +b)};J[4]=["day",[1,2,3,4]];J[5]=["week",[1,2,3]];A=void 0===A.areaspline?"line":"areaspline";g(l,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:p("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",outlineWidth:1,series:{type:A,color:"#335cad",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:J},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series", +className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}}); +D.prototype={drawHandle:function(a,b){var c=this.chart.renderer,d=this.handles;this.rendered||(d[b]=c.path(["M",-4.5,.5,"L",3.5,.5,3.5,15.5,-4.5,15.5,-4.5,.5,"M",-1.5,4,"L",-1.5,12,"M",.5,4,"L",.5,12]).attr({zIndex:10-b}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][b]).add(),c=this.navigatorOptions.handles,d[b].attr({fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":1}).css({cursor:"ew-resize"}));d[b][this.rendered&&!this.hasDragged?"animate":"attr"]({translateX:Math.round(this.scrollerLeft+ +this.scrollbarHeight+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},update:function(a){this.destroy();q(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var e=this.chart,g=e.renderer,k,h,l,n;n=this.scrollbarHeight;var m=this.xAxis,p=this.navigatorOptions,u=p.maskInside,q=this.height,v=this.top,t=this.navigatorEnabled,x=this.outlineHeight,y;y=this.rendered;if(f(a)&&f(b)&&(!this.hasDragged||r(c))&&(this.navigatorLeft=k=E(m.left,e.plotLeft+ +n),this.navigatorWidth=h=E(m.len,e.plotWidth-2*n),this.scrollerLeft=l=k-n,this.scrollerWidth=n=n=h+2*n,c=E(c,m.translate(a)),d=E(d,m.translate(b)),f(c)&&Infinity!==Math.abs(c)||(c=0,d=n),!(m.translate(d,!0)-m.translate(c,!0)f&&tp+d-u&&rk&&re?e=0:e+v>=q&&(e=q-v,x=h.getUnionExtremes().dataMax),e!==d&&(h.fixedWidth=v,d=l.toFixedRange(e, +e+v,null,x),c.setExtremes(d.min,d.max,!0,null,{trigger:"navigator"}))))};h.mouseMoveHandler=function(b){var c=h.scrollbarHeight,d=h.navigatorLeft,e=h.navigatorWidth,f=h.scrollerLeft,g=h.scrollerWidth,k=h.range,l;b.touches&&0===b.touches[0].pageX||(b=a.pointer.normalize(b),l=b.chartX,lf+g-c&&(l=f+g-c),h.grabbedLeft?(h.hasDragged=!0,h.render(0,0,l-d,h.otherHandlePos)):h.grabbedRight?(h.hasDragged=!0,h.render(0,0,h.otherHandlePos,l-d)):h.grabbedCenter&&(h.hasDragged=!0,le+n-k&&(l=e+ +n-k),h.render(0,0,l-n,l-n+k)),h.hasDragged&&h.scrollbar&&h.scrollbar.options.liveRedraw&&(b.DOMType=b.type,setTimeout(function(){h.mouseUpHandler(b)},0)))};h.mouseUpHandler=function(b){var c,d,e=b.DOMEvent||b;if(h.hasDragged||"scrollbar"===b.trigger)h.zoomedMin===h.otherHandlePos?c=h.fixedExtreme:h.zoomedMax===h.otherHandlePos&&(d=h.fixedExtreme),h.zoomedMax===h.navigatorWidth&&(d=h.getUnionExtremes().dataMax),c=l.toFixedRange(h.zoomedMin,h.zoomedMax,c,d),r(c.min)&&a.xAxis[0].setExtremes(c.min,c.max, +!0,h.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:e});"mousemove"!==b.DOMType&&(h.grabbedLeft=h.grabbedRight=h.grabbedCenter=h.fixedWidth=h.fixedExtreme=h.otherHandlePos=h.hasDragged=n=null)};var c=a.xAxis.length,f=a.yAxis.length,m=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraBottomMargin=h.outlineHeight+d.margin;a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=l=new G(a,q({breaks:m.options.breaks,ordinal:m.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis", +isX:!0,type:"datetime",index:c,height:g,offset:0,offsetLeft:k,offsetRight:-k,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1})),h.yAxis=new G(a,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,height:g,offset:0,index:f,zoomEnabled:!1})),e||d.series.data?h.addBaseSeries():0===a.series.length&&x(a,"redraw",function(b,c){0=Math.round(a.navigatorWidth);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},destroy:function(){this.removeEvents();this.xAxis&&(m(this.chart.xAxis,this.xAxis),m(this.chart.axes,this.xAxis));this.yAxis&&(m(this.chart.yAxis,this.yAxis),m(this.chart.axes,this.yAxis));k(this.series||[],function(a){a.destroy&&a.destroy()});k("series xAxis yAxis leftShade rightShade outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" "), +function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);k([this.handles,this.elementsToDestroy],function(a){w(a)},this)}};a.Navigator=D;x(G.prototype,"zoom",function(a,b,c){var d=this.chart,e=d.options,f=e.chart.zoomType,g=e.navigator,e=e.rangeSelector,h;this.isXAxis&&(g&&g.enabled||e&&e.enabled)&&("x"===f?d.resetZoomButton="blocked":"y"===f?h=!1:"xy"===f&&(d=this.previousZoom,r(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!== +h?h:a.call(this,b,c)});x(H.prototype,"init",function(a,b,c){B(this,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});a.call(this,b,c)});x(H.prototype,"getMargins",function(a){var b=this.legend,c=b.options,d=this.scroller,e,f;a.apply(this,[].slice.call(arguments,1));d&&(e=d.xAxis,f=d.yAxis,d.top=d.navigatorOptions.top||this.chartHeight-d.height-d.scrollbarHeight-this.spacing[2]-("bottom"===c.verticalAlign&&c.enabled&& +!c.floating?b.legendHeight+E(c.margin,10):0),e&&f&&(e.options.top=f.options.top=d.top,e.setAxisSize(),f.setAxisSize()))});x(n.prototype,"addPoint",function(a,b,c,f,g){var h=this.options.turboThreshold;h&&this.xData.length>h&&d(b,!0)&&this.chart.scroller&&e(20,!0);a.call(this,b,c,f,g)});x(H.prototype,"addSeries",function(a,b,c,d){a=a.call(this,b,!1,d);this.scroller&&this.scroller.setBaseSeries();E(c,!0)&&this.redraw();return a});x(n.prototype,"update",function(a,b,c){a.call(this,b,!1);this.chart.scroller&& +this.chart.scroller.setBaseSeries();E(c,!0)&&this.chart.redraw()})})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.css,l=a.createElement,r=a.dateFormat,w=a.defaultOptions,t=w.global.useUTC,k=a.defined,m=a.destroyObjectProperties,e=a.discardElement,g=a.each,h=a.extend,C=a.fireEvent,f=a.Date,d=a.isNumber,b=a.merge,q=a.pick,E=a.pInt,c=a.splat,F=a.wrap;h(w,{rangeSelector:{buttonTheme:{"stroke-width":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:"right"}, +labelStyle:{color:"#666666"}}});w.lang=b(w.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(a,b){var e=this,f=e.chart,h=e.buttonOptions[a],k=f.xAxis[0],l=f.scroller&&f.scroller.getUnionExtremes()||k||{},n=l.dataMin,m=l.dataMax,p,r=k&&Math.round(Math.min(k.max,q(m,k.max))),w=h.type,z,l=h._range,A,C,D,E=h.dataGrouping;if(null!==n&&null!==m){f.fixedRange=l;E&&(this.forcedDataGrouping=!0,G.prototype.setDataGrouping.call(k||{chart:this.chart}, +E,!1));if("month"===w||"year"===w)k?(w={range:h,max:r,dataMin:n,dataMax:m},p=k.minFromRange.call(w),d(w.newMax)&&(r=w.newMax)):l=h;else if(l)p=Math.max(r-l,n),r=Math.min(p+l,m);else if("ytd"===w)if(k)void 0===m&&(n=Number.MAX_VALUE,m=Number.MIN_VALUE,g(f.series,function(a){a=a.xData;n=Math.min(a[0],n);m=Math.max(a[a.length-1],m)}),b=!1),r=e.getYTDExtremes(m,n,t),p=A=r.min,r=r.max;else{B(f,"beforeRender",function(){e.clickButton(a)});return}else"all"===w&&k&&(p=n,r=m);e.setSelected(a);k?k.setExtremes(p, +r,q(b,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:h}):(z=c(f.options.xAxis)[0],D=z.range,z.range=l,C=z.min,z.min=A,B(f,"load",function(){z.range=D;z.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons|| +[].concat(b.defaultButtons),e=c.selected,f=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&C(a,"blur");c&&c.blur&&C(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=B(a.container,"mousedown",f);this.unResize=B(a,"resize",f);g(d,b.computeButtonRange);void 0!==e&&d[e]&&this.clickButton(e,!1);B(a,"load",function(){B(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&& +b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,b=a.xAxis[0],c=Math.round(b.max-b.min),e=!b.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||b,f=a.dataMin,h=a.dataMax,a=this.getYTDExtremes(h,f,t),k=a.min,l=a.max,m=this.selected,p=d(m),q=this.options.allButtonsEnabled,r=this.buttons;g(this.buttonOptions,function(a,d){var g=a._range,n=a.type,u=a.count||1;a=r[d];var t=0;d=d===m;var v=g>h-f,x=g=864E5*{month:28,year:365}[n]*u&&c<=864E5*{month:31,year:366}[n]*u?g=!0:"ytd"===n?(g=l-k===c,y=!d):"all"===n&&(g=b.max-b.min>=h-f,w=!d&&p&&g);n=!q&&(v||x||w||e);g=d&&g||g&&!p&&!y;n?t=3:g&&(p=!0,t=2);a.state!==t&&a.setState(t)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if("month"===b||"year"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,b){var c= +this.chart.options.rangeSelector,d=this[a+"Input"];k(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=r(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:r(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];p(this[a+"Input"],{left:b.translateX+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){p(this[a+"Input"],{border:0,width:"1px",height:"1px"}); +this.setInputValue(a)},drawInput:function(a){function c(){var a=r.value,b=(m.inputDateParser||Date.parse)(a),c=f.xAxis[0],g=f.scroller&&f.scroller.xAxis?f.scroller.xAxis:c,h=g.dataMin,g=g.dataMax;b!==r.previousValue&&(r.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(E(b[0]),E(b[1])-1,E(b[2]))),d(b)&&(t||(b+=6E4*(new Date).getTimezoneOffset()),q?b>e.maxInput.HCTime?b=void 0:bg&&(b=g),void 0!==b&&c.setExtremes(q?b:c.min,q?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))} +var e=this,f=e.chart,g=f.renderer.style||{},k=f.renderer,m=f.options.rangeSelector,n=e.div,q="min"===a,r,B,C=this.inputGroup;this[a+"Label"]=B=k.label(w.lang[q?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(C);C.offset+=B.width+5;this[a+"DateBox"]=k=k.label("",C.offset).addClass("highcharts-range-input").attr({padding:2,width:m.inputBoxWidth||90,height:m.inputBoxHeight||17,stroke:m.inputBoxBorderColor||"#cccccc","stroke-width":1, +"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()}).add(C);C.offset+=k.width+(q?10:0);this[a+"Input"]=r=l("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:f.plotTop+"px"},n);B.css(b(g,m.labelStyle));k.css(b({color:"#333333"},g,m.inputStyle));p(r,h({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:g.fontSize,fontFamily:g.fontFamily,left:"-9em"},m.inputStyle));r.onfocus=function(){e.showInput(a)};r.onblur= +function(){e.hideInput(a)};r.onchange=c;r.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=q((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,b,c){var d=new f(a),e=d[f.hcGetFullYear]();c=c?f.UTC(e,0,1):+new f(e,0,1);b=Math.max(b||0,c);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(a,b){var c=this,d=c.chart,e=d.renderer,f=d.container,m=d.options, +n=m.exporting&&!1!==m.exporting.enabled&&m.navigation&&m.navigation.buttonOptions,p=m.rangeSelector,r=c.buttons,m=w.lang,t=c.div,t=c.inputGroup,A=p.buttonTheme,z=p.buttonPosition||{},B=p.inputEnabled,C=A&&A.states,D=d.plotLeft,E,G=this.getPosition(),F=c.group,H=c.rendered;!1!==p.enabled&&(H||(c.group=F=e.g("range-selector-buttons").add(),c.zoomText=e.text(m.rangeSelectorZoom,q(z.x,D),15).css(p.labelStyle).add(F),E=q(z.x,D)+c.zoomText.getBBox().width+5,g(c.buttonOptions,function(a,b){r[b]=e.button(a.text, +E,0,function(){c.clickButton(b);c.isActive=!0},A,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(F);E+=r[b].width+q(p.buttonSpacing,5)}),!1!==B&&(c.div=t=l("div",null,{position:"relative",height:0,zIndex:1}),f.parentNode.insertBefore(t,f),c.inputGroup=t=e.g("input-group").add(),t.offset=0,c.drawInput("min"),c.drawInput("max"))),c.updateButtonStates(),F[H?"animate":"attr"]({translateY:G.buttonTop}),!1!==B&&(t.align(h({y:G.inputTop,width:t.offset,x:n&&G.inputTop<(n.y||0)+n.height- +d.spacing[0]?-40:0},p.inputPosition),!0,d.spacingBox),k(B)||(d=F.getBBox(),t[t.alignAttr.translateXc&&(e?a=b-f:b=a+f);d(a)||(a=b=void 0);return{min:a,max:b}};G.prototype.minFromRange=function(){var a=this.range,b={month:"Month",year:"FullYear"}[a.type],c,e=this.max,f,g,h=function(a,c){var d=new Date(a);d["set"+b](d["get"+ +b]()+c);return d.getTime()-a};d(a)?(c=e-a,g=a):(c=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-c));f=q(this.dataMin,Number.MIN_VALUE);d(c)||(c=f);c<=f&&(c=f,void 0===g&&(g=h(c,a.count)),this.newMax=Math.min(c+g,this.dataMax));d(e)||(c=void 0);return c};F(H.prototype,"init",function(a,b,c){B(this,"init",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});a.call(this,b,c)});a.RangeSelector=D})(N);(function(a){var D=a.addEvent,B=a.isNumber;a.Chart.prototype.callbacks.push(function(a){function G(){p= +a.xAxis[0].getExtremes();B(p.min)&&r.render(p.min,p.max)}var p,l=a.scroller,r=a.rangeSelector,w,t;l&&(p=a.xAxis[0].getExtremes(),l.render(p.min,p.max));r&&(t=D(a.xAxis[0],"afterSetExtremes",function(a){r.render(a.min,a.max)}),w=D(a,"redraw",G),G());D(a,"destroy",function(){r&&(w(),t())})})})(N);(function(a){var D=a.arrayMax,B=a.arrayMin,G=a.Axis,H=a.Chart,p=a.defined,l=a.each,r=a.extend,w=a.format,t=a.inArray,k=a.isNumber,m=a.isString,e=a.map,g=a.merge,h=a.pick,C=a.Point,f=a.Renderer,d=a.Series,b= +a.splat,q=a.stop,E=a.SVGRenderer,c=a.VMLRenderer,F=a.wrap,n=d.prototype,A=n.init,x=n.processData,J=C.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,d,f){var k=m(c)||c.nodeName,l=arguments[k?1:0],n=l.series,p=a.getOptions(),q,r=h(l.navigator&&l.navigator.enabled,!0)?{startOnTick:!1,endOnTick:!1}:null,t={marker:{enabled:!1,radius:2}},u={shadow:!1,borderWidth:0};l.xAxis=e(b(l.xAxis||{}),function(a){return g({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"}, +showLastLabel:!0},p.xAxis,a,{type:"datetime",categories:null},r)});l.yAxis=e(b(l.yAxis||{}),function(a){q=h(a.opposite,!0);return g({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},p.yAxis,a)});l.series=null;l=g({chart:{panning:!0,pinchType:"x"},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null,style:{fontSize:"16px"}},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:t,spline:t,area:t,areaspline:t,arearange:t,areasplinerange:t, +column:u,columnrange:u,candlestick:u,ohlc:u}},l,{_stock:!0,chart:{inverted:!1}});l.series=n;return k?new H(c,l,f):new H(l,d)};F(G.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options._stock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=1,"right"):a.call(this,[].slice.call(arguments,1))});F(G.prototype,"getPlotLinePath",function(a, +b,c,d,f,g){var n=this,q=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=n.chart,u=r.renderer,v=n.left,w=n.top,y,x,A,B,C=[],D=[],E,F;if("colorAxis"===n.coll)return a.apply(this,[].slice.call(arguments,1));D=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=n.options[b];return k(a)?[r[b][a]]:m(a)?[r.get(a)]:e(q,function(a){return a[b]})}(n.coll);l(n.isXAxis?r.yAxis:r.xAxis,function(a){if(p(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=p(a.options[b])? +r[b][a.options[b]]:r[b][0];n===b&&D.push(a)}});E=D.length?[]:[n.isXAxis?r.yAxis[0]:r.xAxis[0]];l(D,function(a){-1===t(a,E)&&E.push(a)});F=h(g,n.translate(b,null,null,d));k(F)&&(n.horiz?l(E,function(a){var b;x=a.pos;B=x+a.len;y=A=Math.round(F+n.transB);if(yv+n.width)f?y=A=Math.min(Math.max(v,y),v+n.width):b=!0;b||C.push("M",y,x,"L",A,B)}):l(E,function(a){var b;y=a.pos;A=y+a.len;x=B=Math.round(w+n.height-F);if(xw+n.height)f?x=B=Math.min(Math.max(w,x),n.top+n.height):b=!0;b||C.push("M",y, +x,"L",A,B)}));return 0=e&&(x=-(l.translateX+b.width-e));l.attr({x:m+x,y:k,anchorX:g?m:this.opposite?0:a.chartWidth,anchorY:g?this.opposite?a.chartHeight:0:k+b.height/2})}});n.init=function(){A.apply(this,arguments);this.setCompare(this.options.compare)};n.setCompare=function(a){this.modifyValue= +"value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b=b/d*100-100,c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};n.processData=function(){var a,b=-1,c,d,e,f;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=t("close",this.pointArrayMap),-1===b&&(b=t(this.pointValKey||"y",this.pointArrayMap))),a=0;a< +e-1;a++)if(f=-1=this.xAxis.min&&0!==f){this.compareValue=f;break}};F(n,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=B(b),this.dataMax=D(b))});G.prototype.setCompare=function(a,b){this.isXAxis||(l(this.series,function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};C.prototype.tooltipFormatter=function(b){b=b.replace("{point.change}",(0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 '; + else + var expandButton = ''; + + return '' + expandButton + '' + ellipsedLabel({ name: item.name, parentClass: "nav-tooltip", childClass: "nav-label" }) + ''; +} + +function menuItemsForGroup(group, level, parent) { + var items = ''; + + if (level > 0) + items += menuItem(group, level - 1, parent, true); + + $.each(group.contents, function (contentName, content) { + if (content.type == 'GROUP') + items += menuItemsForGroup(content, level + 1, group.pathFormatted); + else if (content.type == 'REQUEST') + items += menuItem(content, level, group.pathFormatted); + }); + + return items; +} + +function setDetailsMenu(){ + $('.nav ul').append(menuItemsForGroup(stats, 0)); + $('.nav').expandable(); + $('.nav-tooltip').popover({trigger:'hover'}); +} + +function setGlobalMenu(){ + $('.nav ul') + .append('
  • Ranges
  • ') + .append('
  • Stats
  • ') + .append('
  • Active Users
  • ') + .append('
  • Requests / sec
  • ') + .append('
  • Responses / sec
  • '); +} + +function getLink(link){ + var a = link.split('/'); + return (a.length<=1)? link : a[a.length-1]; +} + +function expandUp(li) { + const parentId = li.attr("data-parent"); + if (parentId != "ROOT") { + const span = $('#' + parentId); + const parentLi = span.parents('li').first(); + span.expand(parentLi, false); + expandUp(parentLi); + } +} + +function setActiveMenu(){ + $('.nav a').each(function() { + const navA = $(this) + if(!navA.hasClass('expand-button') && navA.attr('href') == getLink(window.location.pathname)) { + const li = $(this).parents('li').first(); + li.addClass('on'); + expandUp(li); + return false; + } + }); +} diff --git a/webapp/loadTests/25users/js/stats.js b/webapp/loadTests/25users/js/stats.js new file mode 100644 index 0000000..a380167 --- /dev/null +++ b/webapp/loadTests/25users/js/stats.js @@ -0,0 +1,4147 @@ +var stats = { + type: "GROUP", +name: "All Requests", +path: "", +pathFormatted: "group_missing-name-b06d1", +stats: { + "name": "All Requests", + "numberOfRequests": { + "total": "1051", + "ok": "805", + "ko": "246" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "183" + }, + "maxResponseTime": { + "total": "4787", + "ok": "4787", + "ko": "3455" + }, + "meanResponseTime": { + "total": "901", + "ok": "527", + "ko": "2126" + }, + "standardDeviation": { + "total": "1023", + "ok": "672", + "ko": "1015" + }, + "percentiles1": { + "total": "492", + "ok": "348", + "ko": "2519" + }, + "percentiles2": { + "total": "1100", + "ok": "694", + "ko": "3016" + }, + "percentiles3": { + "total": "3211", + "ok": "1684", + "ko": "3344" + }, + "percentiles4": { + "total": "3770", + "ok": "4025", + "ko": "3416" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 659, + "percentage": 63 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 80, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 66, + "percentage": 6 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 246, + "percentage": 23 +}, + "meanNumberOfRequestsPerSecond": { + "total": "25.634", + "ok": "19.634", + "ko": "6" + } +}, +contents: { +"req_request-0-684d2": { + type: "REQUEST", + name: "request_0", +path: "request_0", +pathFormatted: "req_request-0-684d2", +stats: { + "name": "request_0", + "numberOfRequests": { + "total": "25", + "ok": "25", + "ko": "0" + }, + "minResponseTime": { + "total": "95", + "ok": "95", + "ko": "-" + }, + "maxResponseTime": { + "total": "106", + "ok": "106", + "ko": "-" + }, + "meanResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "standardDeviation": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "percentiles1": { + "total": "95", + "ok": "95", + "ko": "-" + }, + "percentiles2": { + "total": "98", + "ok": "98", + "ko": "-" + }, + "percentiles3": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles4": { + "total": "104", + "ok": "104", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.61", + "ok": "0.61", + "ko": "-" + } +} + },"req_request-1-46da4": { + type: "REQUEST", + name: "request_1", +path: "request_1", +pathFormatted: "req_request-1-46da4", +stats: { + "name": "request_1", + "numberOfRequests": { + "total": "25", + "ok": "25", + "ko": "0" + }, + "minResponseTime": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "maxResponseTime": { + "total": "311", + "ok": "311", + "ko": "-" + }, + "meanResponseTime": { + "total": "158", + "ok": "158", + "ko": "-" + }, + "standardDeviation": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "percentiles1": { + "total": "160", + "ok": "160", + "ko": "-" + }, + "percentiles2": { + "total": "230", + "ok": "230", + "ko": "-" + }, + "percentiles3": { + "total": "282", + "ok": "282", + "ko": "-" + }, + "percentiles4": { + "total": "305", + "ok": "305", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.61", + "ok": "0.61", + "ko": "-" + } +} + },"req_request-2-93baf": { + type: "REQUEST", + name: "request_2", +path: "request_2", +pathFormatted: "req_request-2-93baf", +stats: { + "name": "request_2", + "numberOfRequests": { + "total": "25", + "ok": "22", + "ko": "3" + }, + "minResponseTime": { + "total": "415", + "ok": "415", + "ko": "2703" + }, + "maxResponseTime": { + "total": "2958", + "ok": "2958", + "ko": "2727" + }, + "meanResponseTime": { + "total": "1092", + "ok": "870", + "ko": "2719" + }, + "standardDeviation": { + "total": "950", + "ok": "784", + "ko": "11" + }, + "percentiles1": { + "total": "463", + "ok": "456", + "ko": "2727" + }, + "percentiles2": { + "total": "1735", + "ok": "729", + "ko": "2727" + }, + "percentiles3": { + "total": "2857", + "ok": "2835", + "ko": "2727" + }, + "percentiles4": { + "total": "2942", + "ok": "2944", + "ko": "2727" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 16, + "percentage": 64 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 20 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.61", + "ok": "0.537", + "ko": "0.073" + } +} + },"req_request-3-d0973": { + type: "REQUEST", + name: "request_3", +path: "request_3", +pathFormatted: "req_request-3-d0973", +stats: { + "name": "request_3", + "numberOfRequests": { + "total": "22", + "ok": "22", + "ko": "0" + }, + "minResponseTime": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "maxResponseTime": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "meanResponseTime": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "standardDeviation": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "percentiles1": { + "total": "100", + "ok": "100", + "ko": "-" + }, + "percentiles2": { + "total": "103", + "ok": "103", + "ko": "-" + }, + "percentiles3": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "percentiles4": { + "total": "105", + "ok": "105", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.537", + "ok": "0.537", + "ko": "-" + } +} + },"req_request-4-e7d1b": { + type: "REQUEST", + name: "request_4", +path: "request_4", +pathFormatted: "req_request-4-e7d1b", +stats: { + "name": "request_4", + "numberOfRequests": { + "total": "22", + "ok": "15", + "ko": "7" + }, + "minResponseTime": { + "total": "192", + "ok": "419", + "ko": "192" + }, + "maxResponseTime": { + "total": "2556", + "ok": "1784", + "ko": "2556" + }, + "meanResponseTime": { + "total": "1308", + "ok": "1031", + "ko": "1900" + }, + "standardDeviation": { + "total": "707", + "ok": "421", + "ko": "823" + }, + "percentiles1": { + "total": "1121", + "ok": "832", + "ko": "2463" + }, + "percentiles2": { + "total": "1742", + "ok": "1174", + "ko": "2526" + }, + "percentiles3": { + "total": "2528", + "ok": "1761", + "ko": "2548" + }, + "percentiles4": { + "total": "2550", + "ok": "1779", + "ko": "2554" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 27 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 23 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 32 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.537", + "ok": "0.366", + "ko": "0.171" + } +} + },"req_request-5-48829": { + type: "REQUEST", + name: "request_5", +path: "request_5", +pathFormatted: "req_request-5-48829", +stats: { + "name": "request_5", + "numberOfRequests": { + "total": "22", + "ok": "13", + "ko": "9" + }, + "minResponseTime": { + "total": "200", + "ok": "385", + "ko": "200" + }, + "maxResponseTime": { + "total": "2535", + "ok": "1755", + "ko": "2535" + }, + "meanResponseTime": { + "total": "1345", + "ok": "1018", + "ko": "1816" + }, + "standardDeviation": { + "total": "710", + "ok": "456", + "ko": "745" + }, + "percentiles1": { + "total": "1295", + "ok": "1070", + "ko": "1544" + }, + "percentiles2": { + "total": "1727", + "ok": "1124", + "ko": "2528" + }, + "percentiles3": { + "total": "2528", + "ok": "1742", + "ko": "2532" + }, + "percentiles4": { + "total": "2534", + "ok": "1752", + "ko": "2534" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 27 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 41 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.537", + "ok": "0.317", + "ko": "0.22" + } +} + },"req_request-6-027a9": { + type: "REQUEST", + name: "request_6", +path: "request_6", +pathFormatted: "req_request-6-027a9", +stats: { + "name": "request_6", + "numberOfRequests": { + "total": "22", + "ok": "14", + "ko": "8" + }, + "minResponseTime": { + "total": "183", + "ok": "601", + "ko": "183" + }, + "maxResponseTime": { + "total": "2533", + "ok": "1941", + "ko": "2533" + }, + "meanResponseTime": { + "total": "1292", + "ok": "981", + "ko": "1835" + }, + "standardDeviation": { + "total": "680", + "ok": "331", + "ko": "785" + }, + "percentiles1": { + "total": "977", + "ok": "921", + "ko": "1980" + }, + "percentiles2": { + "total": "1499", + "ok": "983", + "ko": "2524" + }, + "percentiles3": { + "total": "2528", + "ok": "1509", + "ko": "2531" + }, + "percentiles4": { + "total": "2532", + "ok": "1855", + "ko": "2533" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 14 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 36 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 8, + "percentage": 36 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.537", + "ok": "0.341", + "ko": "0.195" + } +} + },"req_request-7-f222f": { + type: "REQUEST", + name: "request_7", +path: "request_7", +pathFormatted: "req_request-7-f222f", +stats: { + "name": "request_7", + "numberOfRequests": { + "total": "22", + "ok": "16", + "ko": "6" + }, + "minResponseTime": { + "total": "203", + "ok": "369", + "ko": "203" + }, + "maxResponseTime": { + "total": "2534", + "ok": "1749", + "ko": "2534" + }, + "meanResponseTime": { + "total": "1318", + "ok": "1074", + "ko": "1971" + }, + "standardDeviation": { + "total": "724", + "ok": "464", + "ko": "875" + }, + "percentiles1": { + "total": "1108", + "ok": "1087", + "ko": "2527" + }, + "percentiles2": { + "total": "1687", + "ok": "1647", + "ko": "2530" + }, + "percentiles3": { + "total": "2531", + "ok": "1707", + "ko": "2533" + }, + "percentiles4": { + "total": "2533", + "ok": "1741", + "ko": "2534" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 7, + "percentage": 32 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 23 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 27 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.537", + "ok": "0.39", + "ko": "0.146" + } +} + },"req_request-5-redir-affb3": { + type: "REQUEST", + name: "request_5 Redirect 1", +path: "request_5 Redirect 1", +pathFormatted: "req_request-5-redir-affb3", +stats: { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": "13", + "ok": "13", + "ko": "0" + }, + "minResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "maxResponseTime": { + "total": "122", + "ok": "122", + "ko": "-" + }, + "meanResponseTime": { + "total": "108", + "ok": "108", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "106", + "ok": "106", + "ko": "-" + }, + "percentiles2": { + "total": "111", + "ok": "111", + "ko": "-" + }, + "percentiles3": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "percentiles4": { + "total": "122", + "ok": "122", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 13, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.317", + "ok": "0.317", + "ko": "-" + } +} + },"req_request-8-ef0c8": { + type: "REQUEST", + name: "request_8", +path: "request_8", +pathFormatted: "req_request-8-ef0c8", +stats: { + "name": "request_8", + "numberOfRequests": { + "total": "25", + "ok": "23", + "ko": "2" + }, + "minResponseTime": { + "total": "475", + "ok": "475", + "ko": "2495" + }, + "maxResponseTime": { + "total": "2510", + "ok": "1310", + "ko": "2510" + }, + "meanResponseTime": { + "total": "992", + "ok": "861", + "ko": "2503" + }, + "standardDeviation": { + "total": "508", + "ok": "255", + "ko": "8" + }, + "percentiles1": { + "total": "978", + "ok": "951", + "ko": "2503" + }, + "percentiles2": { + "total": "1070", + "ok": "1042", + "ko": "2506" + }, + "percentiles3": { + "total": "2258", + "ok": "1244", + "ko": "2509" + }, + "percentiles4": { + "total": "2506", + "ok": "1297", + "ko": "2510" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 40 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 44 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 8 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.61", + "ok": "0.561", + "ko": "0.049" + } +} + },"req_request-8-redir-98b2a": { + type: "REQUEST", + name: "request_8 Redirect 1", +path: "request_8 Redirect 1", +pathFormatted: "req_request-8-redir-98b2a", +stats: { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "212", + "ok": "212", + "ko": "-" + }, + "maxResponseTime": { + "total": "1537", + "ok": "1537", + "ko": "-" + }, + "meanResponseTime": { + "total": "803", + "ok": "803", + "ko": "-" + }, + "standardDeviation": { + "total": "451", + "ok": "451", + "ko": "-" + }, + "percentiles1": { + "total": "697", + "ok": "697", + "ko": "-" + }, + "percentiles2": { + "total": "1234", + "ok": "1234", + "ko": "-" + }, + "percentiles3": { + "total": "1488", + "ok": "1488", + "ko": "-" + }, + "percentiles4": { + "total": "1526", + "ok": "1526", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 15, + "percentage": 65 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 6, + "percentage": 26 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-8-redir-fc911": { + type: "REQUEST", + name: "request_8 Redirect 2", +path: "request_8 Redirect 2", +pathFormatted: "req_request-8-redir-fc911", +stats: { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "242", + "ok": "242", + "ko": "-" + }, + "maxResponseTime": { + "total": "1242", + "ok": "1242", + "ko": "-" + }, + "meanResponseTime": { + "total": "455", + "ok": "455", + "ko": "-" + }, + "standardDeviation": { + "total": "206", + "ok": "206", + "ko": "-" + }, + "percentiles1": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "percentiles2": { + "total": "498", + "ok": "498", + "ko": "-" + }, + "percentiles3": { + "total": "707", + "ok": "707", + "ko": "-" + }, + "percentiles4": { + "total": "1129", + "ok": "1129", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 96 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-8-redir-e875c": { + type: "REQUEST", + name: "request_8 Redirect 3", +path: "request_8 Redirect 3", +pathFormatted: "req_request-8-redir-e875c", +stats: { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "418", + "ok": "418", + "ko": "-" + }, + "meanResponseTime": { + "total": "155", + "ok": "155", + "ko": "-" + }, + "standardDeviation": { + "total": "124", + "ok": "124", + "ko": "-" + }, + "percentiles1": { + "total": "136", + "ok": "136", + "ko": "-" + }, + "percentiles2": { + "total": "202", + "ok": "202", + "ko": "-" + }, + "percentiles3": { + "total": "409", + "ok": "409", + "ko": "-" + }, + "percentiles4": { + "total": "416", + "ok": "416", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-12-61da2": { + type: "REQUEST", + name: "request_12", +path: "request_12", +pathFormatted: "req_request-12-61da2", +stats: { + "name": "request_12", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "maxResponseTime": { + "total": "447", + "ok": "447", + "ko": "-" + }, + "meanResponseTime": { + "total": "228", + "ok": "228", + "ko": "-" + }, + "standardDeviation": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "percentiles1": { + "total": "227", + "ok": "227", + "ko": "-" + }, + "percentiles2": { + "total": "312", + "ok": "312", + "ko": "-" + }, + "percentiles3": { + "total": "433", + "ok": "433", + "ko": "-" + }, + "percentiles4": { + "total": "446", + "ok": "446", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-14-a0e30": { + type: "REQUEST", + name: "request_14", +path: "request_14", +pathFormatted: "req_request-14-a0e30", +stats: { + "name": "request_14", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "maxResponseTime": { + "total": "448", + "ok": "448", + "ko": "-" + }, + "meanResponseTime": { + "total": "232", + "ok": "232", + "ko": "-" + }, + "standardDeviation": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "percentiles1": { + "total": "236", + "ok": "236", + "ko": "-" + }, + "percentiles2": { + "total": "315", + "ok": "315", + "ko": "-" + }, + "percentiles3": { + "total": "434", + "ok": "434", + "ko": "-" + }, + "percentiles4": { + "total": "447", + "ok": "447", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-21-be4cb": { + type: "REQUEST", + name: "request_21", +path: "request_21", +pathFormatted: "req_request-21-be4cb", +stats: { + "name": "request_21", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "94", + "ok": "94", + "ko": "-" + }, + "maxResponseTime": { + "total": "1779", + "ok": "1779", + "ko": "-" + }, + "meanResponseTime": { + "total": "604", + "ok": "604", + "ko": "-" + }, + "standardDeviation": { + "total": "354", + "ok": "354", + "ko": "-" + }, + "percentiles1": { + "total": "646", + "ok": "646", + "ko": "-" + }, + "percentiles2": { + "total": "781", + "ok": "781", + "ko": "-" + }, + "percentiles3": { + "total": "916", + "ok": "916", + "ko": "-" + }, + "percentiles4": { + "total": "1590", + "ok": "1590", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 19, + "percentage": 83 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-22-8ecb1": { + type: "REQUEST", + name: "request_22", +path: "request_22", +pathFormatted: "req_request-22-8ecb1", +stats: { + "name": "request_22", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "maxResponseTime": { + "total": "915", + "ok": "915", + "ko": "-" + }, + "meanResponseTime": { + "total": "563", + "ok": "563", + "ko": "-" + }, + "standardDeviation": { + "total": "241", + "ok": "241", + "ko": "-" + }, + "percentiles1": { + "total": "564", + "ok": "564", + "ko": "-" + }, + "percentiles2": { + "total": "765", + "ok": "765", + "ko": "-" + }, + "percentiles3": { + "total": "883", + "ok": "883", + "ko": "-" + }, + "percentiles4": { + "total": "909", + "ok": "909", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 19, + "percentage": 83 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 17 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-24-dd0c9": { + type: "REQUEST", + name: "request_24", +path: "request_24", +pathFormatted: "req_request-24-dd0c9", +stats: { + "name": "request_24", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "maxResponseTime": { + "total": "1018", + "ok": "1018", + "ko": "-" + }, + "meanResponseTime": { + "total": "579", + "ok": "579", + "ko": "-" + }, + "standardDeviation": { + "total": "255", + "ok": "255", + "ko": "-" + }, + "percentiles1": { + "total": "567", + "ok": "567", + "ko": "-" + }, + "percentiles2": { + "total": "785", + "ok": "785", + "ko": "-" + }, + "percentiles3": { + "total": "920", + "ok": "920", + "ko": "-" + }, + "percentiles4": { + "total": "998", + "ok": "998", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 78 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-13-5cca6": { + type: "REQUEST", + name: "request_13", +path: "request_13", +pathFormatted: "req_request-13-5cca6", +stats: { + "name": "request_13", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "74", + "ok": "74", + "ko": "-" + }, + "maxResponseTime": { + "total": "152", + "ok": "152", + "ko": "-" + }, + "meanResponseTime": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "standardDeviation": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles1": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "percentiles2": { + "total": "104", + "ok": "104", + "ko": "-" + }, + "percentiles3": { + "total": "130", + "ok": "130", + "ko": "-" + }, + "percentiles4": { + "total": "147", + "ok": "147", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-200-636fa": { + type: "REQUEST", + name: "request_200", +path: "request_200", +pathFormatted: "req_request-200-636fa", +stats: { + "name": "request_200", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "103", + "ok": "103", + "ko": "-" + }, + "maxResponseTime": { + "total": "1782", + "ok": "1782", + "ko": "-" + }, + "meanResponseTime": { + "total": "641", + "ok": "641", + "ko": "-" + }, + "standardDeviation": { + "total": "349", + "ok": "349", + "ko": "-" + }, + "percentiles1": { + "total": "648", + "ok": "648", + "ko": "-" + }, + "percentiles2": { + "total": "812", + "ok": "812", + "ko": "-" + }, + "percentiles3": { + "total": "1014", + "ok": "1014", + "ko": "-" + }, + "percentiles4": { + "total": "1615", + "ok": "1615", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 17, + "percentage": 74 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-16-24733": { + type: "REQUEST", + name: "request_16", +path: "request_16", +pathFormatted: "req_request-16-24733", +stats: { + "name": "request_16", + "numberOfRequests": { + "total": "23", + "ok": "10", + "ko": "13" + }, + "minResponseTime": { + "total": "98", + "ok": "98", + "ko": "548" + }, + "maxResponseTime": { + "total": "2512", + "ok": "1220", + "ko": "2512" + }, + "meanResponseTime": { + "total": "1054", + "ok": "334", + "ko": "1608" + }, + "standardDeviation": { + "total": "987", + "ok": "333", + "ko": "965" + }, + "percentiles1": { + "total": "563", + "ok": "163", + "ko": "2490" + }, + "percentiles2": { + "total": "2492", + "ok": "458", + "ko": "2505" + }, + "percentiles3": { + "total": "2509", + "ok": "890", + "ko": "2510" + }, + "percentiles4": { + "total": "2511", + "ok": "1154", + "ko": "2512" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 39 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 13, + "percentage": 57 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.244", + "ko": "0.317" + } +} + },"req_request-15-56eac": { + type: "REQUEST", + name: "request_15", +path: "request_15", +pathFormatted: "req_request-15-56eac", +stats: { + "name": "request_15", + "numberOfRequests": { + "total": "23", + "ok": "11", + "ko": "12" + }, + "minResponseTime": { + "total": "100", + "ok": "100", + "ko": "563" + }, + "maxResponseTime": { + "total": "2561", + "ok": "1218", + "ko": "2561" + }, + "meanResponseTime": { + "total": "1138", + "ok": "273", + "ko": "1930" + }, + "standardDeviation": { + "total": "1047", + "ok": "318", + "ko": "835" + }, + "percentiles1": { + "total": "581", + "ok": "168", + "ko": "2504" + }, + "percentiles2": { + "total": "2504", + "ok": "188", + "ko": "2513" + }, + "percentiles3": { + "total": "2530", + "ok": "859", + "ko": "2545" + }, + "percentiles4": { + "total": "2555", + "ok": "1146", + "ko": "2558" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 43 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 12, + "percentage": 52 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.268", + "ko": "0.293" + } +} + },"req_logo-png-c9c2b": { + type: "REQUEST", + name: "Logo.png", +path: "Logo.png", +pathFormatted: "req_logo-png-c9c2b", +stats: { + "name": "Logo.png", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "maxResponseTime": { + "total": "443", + "ok": "443", + "ko": "-" + }, + "meanResponseTime": { + "total": "222", + "ok": "222", + "ko": "-" + }, + "standardDeviation": { + "total": "167", + "ok": "167", + "ko": "-" + }, + "percentiles1": { + "total": "281", + "ok": "281", + "ko": "-" + }, + "percentiles2": { + "total": "378", + "ok": "378", + "ko": "-" + }, + "percentiles3": { + "total": "414", + "ok": "414", + "ko": "-" + }, + "percentiles4": { + "total": "437", + "ok": "437", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-18-f5b64": { + type: "REQUEST", + name: "request_18", +path: "request_18", +pathFormatted: "req_request-18-f5b64", +stats: { + "name": "request_18", + "numberOfRequests": { + "total": "23", + "ok": "18", + "ko": "5" + }, + "minResponseTime": { + "total": "183", + "ok": "183", + "ko": "522" + }, + "maxResponseTime": { + "total": "2563", + "ok": "749", + "ko": "2563" + }, + "meanResponseTime": { + "total": "496", + "ok": "261", + "ko": "1342" + }, + "standardDeviation": { + "total": "646", + "ok": "136", + "ko": "969" + }, + "percentiles1": { + "total": "235", + "ok": "205", + "ko": "567" + }, + "percentiles2": { + "total": "506", + "ok": "248", + "ko": "2495" + }, + "percentiles3": { + "total": "2320", + "ok": "528", + "ko": "2549" + }, + "percentiles4": { + "total": "2548", + "ok": "705", + "ko": "2560" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 78 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 22 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.439", + "ko": "0.122" + } +} + },"req_bundle-js-0b837": { + type: "REQUEST", + name: "bundle.js", +path: "bundle.js", +pathFormatted: "req_bundle-js-0b837", +stats: { + "name": "bundle.js", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "26", + "ok": "26", + "ko": "-" + }, + "maxResponseTime": { + "total": "247", + "ok": "247", + "ko": "-" + }, + "meanResponseTime": { + "total": "119", + "ok": "119", + "ko": "-" + }, + "standardDeviation": { + "total": "67", + "ok": "67", + "ko": "-" + }, + "percentiles1": { + "total": "99", + "ok": "99", + "ko": "-" + }, + "percentiles2": { + "total": "170", + "ok": "170", + "ko": "-" + }, + "percentiles3": { + "total": "229", + "ok": "229", + "ko": "-" + }, + "percentiles4": { + "total": "243", + "ok": "243", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-9-d127e": { + type: "REQUEST", + name: "request_9", +path: "request_9", +pathFormatted: "req_request-9-d127e", +stats: { + "name": "request_9", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "33", + "ok": "33", + "ko": "-" + }, + "maxResponseTime": { + "total": "461", + "ok": "461", + "ko": "-" + }, + "meanResponseTime": { + "total": "264", + "ok": "264", + "ko": "-" + }, + "standardDeviation": { + "total": "149", + "ok": "149", + "ko": "-" + }, + "percentiles1": { + "total": "281", + "ok": "281", + "ko": "-" + }, + "percentiles2": { + "total": "420", + "ok": "420", + "ko": "-" + }, + "percentiles3": { + "total": "460", + "ok": "460", + "ko": "-" + }, + "percentiles4": { + "total": "461", + "ok": "461", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-10-1cfbe": { + type: "REQUEST", + name: "request_10", +path: "request_10", +pathFormatted: "req_request-10-1cfbe", +stats: { + "name": "request_10", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "maxResponseTime": { + "total": "460", + "ok": "460", + "ko": "-" + }, + "meanResponseTime": { + "total": "264", + "ok": "264", + "ko": "-" + }, + "standardDeviation": { + "total": "148", + "ok": "148", + "ko": "-" + }, + "percentiles1": { + "total": "282", + "ok": "282", + "ko": "-" + }, + "percentiles2": { + "total": "420", + "ok": "420", + "ko": "-" + }, + "percentiles3": { + "total": "458", + "ok": "458", + "ko": "-" + }, + "percentiles4": { + "total": "460", + "ok": "460", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-242-d6d33": { + type: "REQUEST", + name: "request_242", +path: "request_242", +pathFormatted: "req_request-242-d6d33", +stats: { + "name": "request_242", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "maxResponseTime": { + "total": "463", + "ok": "463", + "ko": "-" + }, + "meanResponseTime": { + "total": "274", + "ok": "274", + "ko": "-" + }, + "standardDeviation": { + "total": "147", + "ok": "147", + "ko": "-" + }, + "percentiles1": { + "total": "313", + "ok": "313", + "ko": "-" + }, + "percentiles2": { + "total": "424", + "ok": "424", + "ko": "-" + }, + "percentiles3": { + "total": "459", + "ok": "459", + "ko": "-" + }, + "percentiles4": { + "total": "462", + "ok": "462", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-11-f11e8": { + type: "REQUEST", + name: "request_11", +path: "request_11", +pathFormatted: "req_request-11-f11e8", +stats: { + "name": "request_11", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "maxResponseTime": { + "total": "1279", + "ok": "1279", + "ko": "-" + }, + "meanResponseTime": { + "total": "913", + "ok": "913", + "ko": "-" + }, + "standardDeviation": { + "total": "332", + "ok": "332", + "ko": "-" + }, + "percentiles1": { + "total": "1040", + "ok": "1040", + "ko": "-" + }, + "percentiles2": { + "total": "1128", + "ok": "1128", + "ko": "-" + }, + "percentiles3": { + "total": "1278", + "ok": "1278", + "ko": "-" + }, + "percentiles4": { + "total": "1279", + "ok": "1279", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 26 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 57 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_css2-family-rob-cf8a9": { + type: "REQUEST", + name: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +path: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +pathFormatted: "req_css2-family-rob-cf8a9", +stats: { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "102", + "ok": "102", + "ko": "-" + }, + "maxResponseTime": { + "total": "165", + "ok": "165", + "ko": "-" + }, + "meanResponseTime": { + "total": "128", + "ok": "128", + "ko": "-" + }, + "standardDeviation": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "percentiles1": { + "total": "128", + "ok": "128", + "ko": "-" + }, + "percentiles2": { + "total": "133", + "ok": "133", + "ko": "-" + }, + "percentiles3": { + "total": "145", + "ok": "145", + "ko": "-" + }, + "percentiles4": { + "total": "161", + "ok": "161", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-19-10d85": { + type: "REQUEST", + name: "request_19", +path: "request_19", +pathFormatted: "req_request-19-10d85", +stats: { + "name": "request_19", + "numberOfRequests": { + "total": "23", + "ok": "4", + "ko": "19" + }, + "minResponseTime": { + "total": "518", + "ok": "518", + "ko": "549" + }, + "maxResponseTime": { + "total": "2587", + "ok": "1487", + "ko": "2587" + }, + "meanResponseTime": { + "total": "1534", + "ok": "1096", + "ko": "1626" + }, + "standardDeviation": { + "total": "919", + "ok": "359", + "ko": "973" + }, + "percentiles1": { + "total": "1259", + "ok": "1190", + "ko": "2488" + }, + "percentiles2": { + "total": "2537", + "ok": "1316", + "ko": "2552" + }, + "percentiles3": { + "total": "2582", + "ok": "1453", + "ko": "2584" + }, + "percentiles4": { + "total": "2586", + "ok": "1480", + "ko": "2586" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.098", + "ko": "0.463" + } +} + },"req_request-20-6804b": { + type: "REQUEST", + name: "request_20", +path: "request_20", +pathFormatted: "req_request-20-6804b", +stats: { + "name": "request_20", + "numberOfRequests": { + "total": "23", + "ok": "5", + "ko": "18" + }, + "minResponseTime": { + "total": "219", + "ok": "501", + "ko": "219" + }, + "maxResponseTime": { + "total": "2562", + "ok": "1225", + "ko": "2562" + }, + "meanResponseTime": { + "total": "1441", + "ok": "724", + "ko": "1639" + }, + "standardDeviation": { + "total": "976", + "ok": "281", + "ko": "1006" + }, + "percentiles1": { + "total": "847", + "ok": "529", + "ko": "2500" + }, + "percentiles2": { + "total": "2546", + "ok": "847", + "ko": "2548" + }, + "percentiles3": { + "total": "2555", + "ok": "1149", + "ko": "2556" + }, + "percentiles4": { + "total": "2560", + "ok": "1210", + "ko": "2561" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 13 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 18, + "percentage": 78 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.122", + "ko": "0.439" + } +} + },"req_request-23-98f5d": { + type: "REQUEST", + name: "request_23", +path: "request_23", +pathFormatted: "req_request-23-98f5d", +stats: { + "name": "request_23", + "numberOfRequests": { + "total": "23", + "ok": "4", + "ko": "19" + }, + "minResponseTime": { + "total": "216", + "ok": "613", + "ko": "216" + }, + "maxResponseTime": { + "total": "2574", + "ok": "1687", + "ko": "2574" + }, + "meanResponseTime": { + "total": "1465", + "ok": "946", + "ko": "1574" + }, + "standardDeviation": { + "total": "963", + "ok": "440", + "ko": "1006" + }, + "percentiles1": { + "total": "862", + "ok": "741", + "ko": "2492" + }, + "percentiles2": { + "total": "2512", + "ok": "1068", + "ko": "2521" + }, + "percentiles3": { + "total": "2567", + "ok": "1563", + "ko": "2570" + }, + "percentiles4": { + "total": "2573", + "ok": "1662", + "ko": "2573" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 9 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.098", + "ko": "0.463" + } +} + },"req_request-222-24864": { + type: "REQUEST", + name: "request_222", +path: "request_222", +pathFormatted: "req_request-222-24864", +stats: { + "name": "request_222", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "123", + "ok": "123", + "ko": "-" + }, + "maxResponseTime": { + "total": "700", + "ok": "700", + "ko": "-" + }, + "meanResponseTime": { + "total": "467", + "ok": "467", + "ko": "-" + }, + "standardDeviation": { + "total": "189", + "ok": "189", + "ko": "-" + }, + "percentiles1": { + "total": "494", + "ok": "494", + "ko": "-" + }, + "percentiles2": { + "total": "653", + "ok": "653", + "ko": "-" + }, + "percentiles3": { + "total": "686", + "ok": "686", + "ko": "-" + }, + "percentiles4": { + "total": "697", + "ok": "697", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-227-2507b": { + type: "REQUEST", + name: "request_227", +path: "request_227", +pathFormatted: "req_request-227-2507b", +stats: { + "name": "request_227", + "numberOfRequests": { + "total": "23", + "ok": "23", + "ko": "0" + }, + "minResponseTime": { + "total": "143", + "ok": "143", + "ko": "-" + }, + "maxResponseTime": { + "total": "697", + "ok": "697", + "ko": "-" + }, + "meanResponseTime": { + "total": "487", + "ok": "487", + "ko": "-" + }, + "standardDeviation": { + "total": "182", + "ok": "182", + "ko": "-" + }, + "percentiles1": { + "total": "516", + "ok": "516", + "ko": "-" + }, + "percentiles2": { + "total": "658", + "ok": "658", + "ko": "-" + }, + "percentiles3": { + "total": "683", + "ok": "683", + "ko": "-" + }, + "percentiles4": { + "total": "694", + "ok": "694", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.561", + "ko": "-" + } +} + },"req_request-240-e27d8": { + type: "REQUEST", + name: "request_240", +path: "request_240", +pathFormatted: "req_request-240-e27d8", +stats: { + "name": "request_240", + "numberOfRequests": { + "total": "23", + "ok": "6", + "ko": "17" + }, + "minResponseTime": { + "total": "722", + "ok": "762", + "ko": "722" + }, + "maxResponseTime": { + "total": "4118", + "ok": "4118", + "ko": "3455" + }, + "meanResponseTime": { + "total": "2846", + "ok": "2511", + "ko": "2964" + }, + "standardDeviation": { + "total": "889", + "ok": "1221", + "ko": "699" + }, + "percentiles1": { + "total": "3169", + "ok": "2117", + "ko": "3195" + }, + "percentiles2": { + "total": "3337", + "ok": "3610", + "ko": "3326" + }, + "percentiles3": { + "total": "4042", + "ok": "4115", + "ko": "3417" + }, + "percentiles4": { + "total": "4116", + "ok": "4117", + "ko": "3447" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 17, + "percentage": 74 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.146", + "ko": "0.415" + } +} + },"req_request-241-2919b": { + type: "REQUEST", + name: "request_241", +path: "request_241", +pathFormatted: "req_request-241-2919b", +stats: { + "name": "request_241", + "numberOfRequests": { + "total": "23", + "ok": "4", + "ko": "19" + }, + "minResponseTime": { + "total": "397", + "ok": "397", + "ko": "696" + }, + "maxResponseTime": { + "total": "4082", + "ok": "4082", + "ko": "3393" + }, + "meanResponseTime": { + "total": "2797", + "ok": "2423", + "ko": "2875" + }, + "standardDeviation": { + "total": "1002", + "ok": "1467", + "ko": "852" + }, + "percentiles1": { + "total": "3271", + "ok": "2607", + "ko": "3271" + }, + "percentiles2": { + "total": "3377", + "ok": "3663", + "ko": "3356" + }, + "percentiles3": { + "total": "3510", + "ok": "3998", + "ko": "3392" + }, + "percentiles4": { + "total": "3959", + "ok": "4065", + "ko": "3393" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.098", + "ko": "0.463" + } +} + },"req_request-243-b078b": { + type: "REQUEST", + name: "request_243", +path: "request_243", +pathFormatted: "req_request-243-b078b", +stats: { + "name": "request_243", + "numberOfRequests": { + "total": "21", + "ok": "21", + "ko": "0" + }, + "minResponseTime": { + "total": "130", + "ok": "130", + "ko": "-" + }, + "maxResponseTime": { + "total": "853", + "ok": "853", + "ko": "-" + }, + "meanResponseTime": { + "total": "593", + "ok": "593", + "ko": "-" + }, + "standardDeviation": { + "total": "215", + "ok": "215", + "ko": "-" + }, + "percentiles1": { + "total": "638", + "ok": "638", + "ko": "-" + }, + "percentiles2": { + "total": "735", + "ok": "735", + "ko": "-" + }, + "percentiles3": { + "total": "844", + "ok": "844", + "ko": "-" + }, + "percentiles4": { + "total": "851", + "ok": "851", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 17, + "percentage": 81 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 19 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.512", + "ok": "0.512", + "ko": "-" + } +} + },"req_request-244-416e5": { + type: "REQUEST", + name: "request_244", +path: "request_244", +pathFormatted: "req_request-244-416e5", +stats: { + "name": "request_244", + "numberOfRequests": { + "total": "17", + "ok": "17", + "ko": "0" + }, + "minResponseTime": { + "total": "166", + "ok": "166", + "ko": "-" + }, + "maxResponseTime": { + "total": "875", + "ok": "875", + "ko": "-" + }, + "meanResponseTime": { + "total": "576", + "ok": "576", + "ko": "-" + }, + "standardDeviation": { + "total": "230", + "ok": "230", + "ko": "-" + }, + "percentiles1": { + "total": "612", + "ok": "612", + "ko": "-" + }, + "percentiles2": { + "total": "710", + "ok": "710", + "ko": "-" + }, + "percentiles3": { + "total": "845", + "ok": "845", + "ko": "-" + }, + "percentiles4": { + "total": "869", + "ok": "869", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 14, + "percentage": 82 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.415", + "ok": "0.415", + "ko": "-" + } +} + },"req_request-250-8cb1f": { + type: "REQUEST", + name: "request_250", +path: "request_250", +pathFormatted: "req_request-250-8cb1f", +stats: { + "name": "request_250", + "numberOfRequests": { + "total": "23", + "ok": "4", + "ko": "19" + }, + "minResponseTime": { + "total": "693", + "ok": "3403", + "ko": "693" + }, + "maxResponseTime": { + "total": "4787", + "ok": "4787", + "ko": "3342" + }, + "meanResponseTime": { + "total": "2717", + "ok": "4106", + "ko": "2425" + }, + "standardDeviation": { + "total": "1060", + "ok": "492", + "ko": "904" + }, + "percentiles1": { + "total": "2819", + "ok": "4117", + "ko": "2705" + }, + "percentiles2": { + "total": "3270", + "ok": "4336", + "ko": "3168" + }, + "percentiles3": { + "total": "4172", + "ok": "4697", + "ko": "3283" + }, + "percentiles4": { + "total": "4655", + "ok": "4769", + "ko": "3330" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.098", + "ko": "0.463" + } +} + },"req_request-252-38647": { + type: "REQUEST", + name: "request_252", +path: "request_252", +pathFormatted: "req_request-252-38647", +stats: { + "name": "request_252", + "numberOfRequests": { + "total": "23", + "ok": "3", + "ko": "20" + }, + "minResponseTime": { + "total": "708", + "ok": "3943", + "ko": "708" + }, + "maxResponseTime": { + "total": "4229", + "ok": "4229", + "ko": "3290" + }, + "meanResponseTime": { + "total": "2884", + "ok": "4067", + "ko": "2707" + }, + "standardDeviation": { + "total": "851", + "ok": "120", + "ko": "767" + }, + "percentiles1": { + "total": "3144", + "ok": "4028", + "ko": "3069" + }, + "percentiles2": { + "total": "3216", + "ok": "4129", + "ko": "3166" + }, + "percentiles3": { + "total": "4020", + "ok": "4209", + "ko": "3283" + }, + "percentiles4": { + "total": "4185", + "ok": "4225", + "ko": "3289" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 20, + "percentage": 87 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.073", + "ko": "0.488" + } +} + },"req_request-260-43b5f": { + type: "REQUEST", + name: "request_260", +path: "request_260", +pathFormatted: "req_request-260-43b5f", +stats: { + "name": "request_260", + "numberOfRequests": { + "total": "23", + "ok": "6", + "ko": "17" + }, + "minResponseTime": { + "total": "1019", + "ok": "1019", + "ko": "1559" + }, + "maxResponseTime": { + "total": "3891", + "ok": "3891", + "ko": "3452" + }, + "meanResponseTime": { + "total": "2651", + "ok": "2515", + "ko": "2699" + }, + "standardDeviation": { + "total": "854", + "ok": "1134", + "ko": "724" + }, + "percentiles1": { + "total": "3014", + "ok": "2752", + "ko": "3117" + }, + "percentiles2": { + "total": "3248", + "ok": "3466", + "ko": "3193" + }, + "percentiles3": { + "total": "3600", + "ok": "3823", + "ko": "3366" + }, + "percentiles4": { + "total": "3831", + "ok": "3877", + "ko": "3435" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 17, + "percentage": 74 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.146", + "ko": "0.415" + } +} + },"req_request-265-cf160": { + type: "REQUEST", + name: "request_265", +path: "request_265", +pathFormatted: "req_request-265-cf160", +stats: { + "name": "request_265", + "numberOfRequests": { + "total": "23", + "ok": "5", + "ko": "18" + }, + "minResponseTime": { + "total": "1102", + "ok": "1102", + "ko": "1551" + }, + "maxResponseTime": { + "total": "4753", + "ok": "4753", + "ko": "3423" + }, + "meanResponseTime": { + "total": "2442", + "ok": "2946", + "ko": "2302" + }, + "standardDeviation": { + "total": "971", + "ok": "1359", + "ko": "775" + }, + "percentiles1": { + "total": "1688", + "ok": "3577", + "ko": "1687" + }, + "percentiles2": { + "total": "3268", + "ok": "3649", + "ko": "3174" + }, + "percentiles3": { + "total": "3642", + "ok": "4532", + "ko": "3351" + }, + "percentiles4": { + "total": "4510", + "ok": "4709", + "ko": "3409" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 18, + "percentage": 78 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.561", + "ok": "0.122", + "ko": "0.439" + } +} + },"req_request-273-0cd3c": { + type: "REQUEST", + name: "request_273", +path: "request_273", +pathFormatted: "req_request-273-0cd3c", +stats: { + "name": "request_273", + "numberOfRequests": { + "total": "12", + "ok": "6", + "ko": "6" + }, + "minResponseTime": { + "total": "333", + "ok": "333", + "ko": "865" + }, + "maxResponseTime": { + "total": "3305", + "ok": "2930", + "ko": "3305" + }, + "meanResponseTime": { + "total": "1468", + "ok": "905", + "ko": "2032" + }, + "standardDeviation": { + "total": "1196", + "ok": "938", + "ko": "1160" + }, + "percentiles1": { + "total": "878", + "ok": "404", + "ko": "2010" + }, + "percentiles2": { + "total": "2981", + "ok": "883", + "ko": "3133" + }, + "percentiles3": { + "total": "3210", + "ok": "2454", + "ko": "3262" + }, + "percentiles4": { + "total": "3286", + "ok": "2835", + "ko": "3296" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 4, + "percentage": 33 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.293", + "ok": "0.146", + "ko": "0.146" + } +} + },"req_request-255-abfa6": { + type: "REQUEST", + name: "request_255", +path: "request_255", +pathFormatted: "req_request-255-abfa6", +stats: { + "name": "request_255", + "numberOfRequests": { + "total": "2", + "ok": "2", + "ko": "0" + }, + "minResponseTime": { + "total": "594", + "ok": "594", + "ko": "-" + }, + "maxResponseTime": { + "total": "698", + "ok": "698", + "ko": "-" + }, + "meanResponseTime": { + "total": "646", + "ok": "646", + "ko": "-" + }, + "standardDeviation": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles1": { + "total": "646", + "ok": "646", + "ko": "-" + }, + "percentiles2": { + "total": "672", + "ok": "672", + "ko": "-" + }, + "percentiles3": { + "total": "693", + "ok": "693", + "ko": "-" + }, + "percentiles4": { + "total": "697", + "ok": "697", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.049", + "ok": "0.049", + "ko": "-" + } +} + },"req_request-270-e02a1": { + type: "REQUEST", + name: "request_270", +path: "request_270", +pathFormatted: "req_request-270-e02a1", +stats: { + "name": "request_270", + "numberOfRequests": { + "total": "11", + "ok": "4", + "ko": "7" + }, + "minResponseTime": { + "total": "336", + "ok": "336", + "ko": "842" + }, + "maxResponseTime": { + "total": "3231", + "ok": "3231", + "ko": "919" + }, + "meanResponseTime": { + "total": "1024", + "ok": "1273", + "ko": "881" + }, + "standardDeviation": { + "total": "730", + "ok": "1169", + "ko": "22" + }, + "percentiles1": { + "total": "881", + "ok": "763", + "ko": "881" + }, + "percentiles2": { + "total": "907", + "ok": "1634", + "ko": "890" + }, + "percentiles3": { + "total": "2167", + "ok": "2912", + "ko": "912" + }, + "percentiles4": { + "total": "3018", + "ok": "3167", + "ko": "918" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 18 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 64 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.268", + "ok": "0.098", + "ko": "0.171" + } +} + },"req_request-277-d0ec5": { + type: "REQUEST", + name: "request_277", +path: "request_277", +pathFormatted: "req_request-277-d0ec5", +stats: { + "name": "request_277", + "numberOfRequests": { + "total": "2", + "ok": "0", + "ko": "2" + }, + "minResponseTime": { + "total": "872", + "ok": "-", + "ko": "872" + }, + "maxResponseTime": { + "total": "903", + "ok": "-", + "ko": "903" + }, + "meanResponseTime": { + "total": "888", + "ok": "-", + "ko": "888" + }, + "standardDeviation": { + "total": "16", + "ok": "-", + "ko": "16" + }, + "percentiles1": { + "total": "888", + "ok": "-", + "ko": "888" + }, + "percentiles2": { + "total": "895", + "ok": "-", + "ko": "895" + }, + "percentiles3": { + "total": "901", + "ok": "-", + "ko": "901" + }, + "percentiles4": { + "total": "903", + "ok": "-", + "ko": "903" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 100 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.049", + "ok": "-", + "ko": "0.049" + } +} + },"req_request-322-a2de9": { + type: "REQUEST", + name: "request_322", +path: "request_322", +pathFormatted: "req_request-322-a2de9", +stats: { + "name": "request_322", + "numberOfRequests": { + "total": "25", + "ok": "25", + "ko": "0" + }, + "minResponseTime": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "maxResponseTime": { + "total": "80", + "ok": "80", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles2": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "percentiles3": { + "total": "73", + "ok": "73", + "ko": "-" + }, + "percentiles4": { + "total": "79", + "ok": "79", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.61", + "ok": "0.61", + "ko": "-" + } +} + },"req_request-323-2fefc": { + type: "REQUEST", + name: "request_323", +path: "request_323", +pathFormatted: "req_request-323-2fefc", +stats: { + "name": "request_323", + "numberOfRequests": { + "total": "25", + "ok": "25", + "ko": "0" + }, + "minResponseTime": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "maxResponseTime": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "meanResponseTime": { + "total": "64", + "ok": "64", + "ko": "-" + }, + "standardDeviation": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles1": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles2": { + "total": "72", + "ok": "72", + "ko": "-" + }, + "percentiles3": { + "total": "76", + "ok": "76", + "ko": "-" + }, + "percentiles4": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.61", + "ok": "0.61", + "ko": "-" + } +} + } +} + +} + +function fillStats(stat){ + $("#numberOfRequests").append(stat.numberOfRequests.total); + $("#numberOfRequestsOK").append(stat.numberOfRequests.ok); + $("#numberOfRequestsKO").append(stat.numberOfRequests.ko); + + $("#minResponseTime").append(stat.minResponseTime.total); + $("#minResponseTimeOK").append(stat.minResponseTime.ok); + $("#minResponseTimeKO").append(stat.minResponseTime.ko); + + $("#maxResponseTime").append(stat.maxResponseTime.total); + $("#maxResponseTimeOK").append(stat.maxResponseTime.ok); + $("#maxResponseTimeKO").append(stat.maxResponseTime.ko); + + $("#meanResponseTime").append(stat.meanResponseTime.total); + $("#meanResponseTimeOK").append(stat.meanResponseTime.ok); + $("#meanResponseTimeKO").append(stat.meanResponseTime.ko); + + $("#standardDeviation").append(stat.standardDeviation.total); + $("#standardDeviationOK").append(stat.standardDeviation.ok); + $("#standardDeviationKO").append(stat.standardDeviation.ko); + + $("#percentiles1").append(stat.percentiles1.total); + $("#percentiles1OK").append(stat.percentiles1.ok); + $("#percentiles1KO").append(stat.percentiles1.ko); + + $("#percentiles2").append(stat.percentiles2.total); + $("#percentiles2OK").append(stat.percentiles2.ok); + $("#percentiles2KO").append(stat.percentiles2.ko); + + $("#percentiles3").append(stat.percentiles3.total); + $("#percentiles3OK").append(stat.percentiles3.ok); + $("#percentiles3KO").append(stat.percentiles3.ko); + + $("#percentiles4").append(stat.percentiles4.total); + $("#percentiles4OK").append(stat.percentiles4.ok); + $("#percentiles4KO").append(stat.percentiles4.ko); + + $("#meanNumberOfRequestsPerSecond").append(stat.meanNumberOfRequestsPerSecond.total); + $("#meanNumberOfRequestsPerSecondOK").append(stat.meanNumberOfRequestsPerSecond.ok); + $("#meanNumberOfRequestsPerSecondKO").append(stat.meanNumberOfRequestsPerSecond.ko); +} diff --git a/webapp/loadTests/25users/js/stats.json b/webapp/loadTests/25users/js/stats.json new file mode 100644 index 0000000..f6a200c --- /dev/null +++ b/webapp/loadTests/25users/js/stats.json @@ -0,0 +1,4105 @@ +{ + "type": "GROUP", +"name": "All Requests", +"path": "", +"pathFormatted": "group_missing-name-b06d1", +"stats": { + "name": "All Requests", + "numberOfRequests": { + "total": 1051, + "ok": 805, + "ko": 246 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 183 + }, + "maxResponseTime": { + "total": 4787, + "ok": 4787, + "ko": 3455 + }, + "meanResponseTime": { + "total": 901, + "ok": 527, + "ko": 2126 + }, + "standardDeviation": { + "total": 1023, + "ok": 672, + "ko": 1015 + }, + "percentiles1": { + "total": 492, + "ok": 348, + "ko": 2519 + }, + "percentiles2": { + "total": 1100, + "ok": 694, + "ko": 3016 + }, + "percentiles3": { + "total": 3211, + "ok": 1684, + "ko": 3344 + }, + "percentiles4": { + "total": 3770, + "ok": 4025, + "ko": 3416 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 659, + "percentage": 63 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 80, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 66, + "percentage": 6 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 246, + "percentage": 23 +}, + "meanNumberOfRequestsPerSecond": { + "total": 25.634146341463413, + "ok": 19.634146341463413, + "ko": 6.0 + } +}, +"contents": { +"req_request-0-684d2": { + "type": "REQUEST", + "name": "request_0", +"path": "request_0", +"pathFormatted": "req_request-0-684d2", +"stats": { + "name": "request_0", + "numberOfRequests": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "minResponseTime": { + "total": 95, + "ok": 95, + "ko": 0 + }, + "maxResponseTime": { + "total": 106, + "ok": 106, + "ko": 0 + }, + "meanResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "standardDeviation": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "percentiles1": { + "total": 95, + "ok": 95, + "ko": 0 + }, + "percentiles2": { + "total": 98, + "ok": 98, + "ko": 0 + }, + "percentiles3": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles4": { + "total": 104, + "ok": 104, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6097560975609756, + "ok": 0.6097560975609756, + "ko": 0 + } +} + },"req_request-1-46da4": { + "type": "REQUEST", + "name": "request_1", +"path": "request_1", +"pathFormatted": "req_request-1-46da4", +"stats": { + "name": "request_1", + "numberOfRequests": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "minResponseTime": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "maxResponseTime": { + "total": 311, + "ok": 311, + "ko": 0 + }, + "meanResponseTime": { + "total": 158, + "ok": 158, + "ko": 0 + }, + "standardDeviation": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "percentiles1": { + "total": 160, + "ok": 160, + "ko": 0 + }, + "percentiles2": { + "total": 230, + "ok": 230, + "ko": 0 + }, + "percentiles3": { + "total": 282, + "ok": 282, + "ko": 0 + }, + "percentiles4": { + "total": 305, + "ok": 305, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6097560975609756, + "ok": 0.6097560975609756, + "ko": 0 + } +} + },"req_request-2-93baf": { + "type": "REQUEST", + "name": "request_2", +"path": "request_2", +"pathFormatted": "req_request-2-93baf", +"stats": { + "name": "request_2", + "numberOfRequests": { + "total": 25, + "ok": 22, + "ko": 3 + }, + "minResponseTime": { + "total": 415, + "ok": 415, + "ko": 2703 + }, + "maxResponseTime": { + "total": 2958, + "ok": 2958, + "ko": 2727 + }, + "meanResponseTime": { + "total": 1092, + "ok": 870, + "ko": 2719 + }, + "standardDeviation": { + "total": 950, + "ok": 784, + "ko": 11 + }, + "percentiles1": { + "total": 463, + "ok": 456, + "ko": 2727 + }, + "percentiles2": { + "total": 1735, + "ok": 729, + "ko": 2727 + }, + "percentiles3": { + "total": 2857, + "ok": 2835, + "ko": 2727 + }, + "percentiles4": { + "total": 2942, + "ok": 2944, + "ko": 2727 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 16, + "percentage": 64 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 20 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 12 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6097560975609756, + "ok": 0.5365853658536586, + "ko": 0.07317073170731707 + } +} + },"req_request-3-d0973": { + "type": "REQUEST", + "name": "request_3", +"path": "request_3", +"pathFormatted": "req_request-3-d0973", +"stats": { + "name": "request_3", + "numberOfRequests": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "minResponseTime": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "maxResponseTime": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "meanResponseTime": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "standardDeviation": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "percentiles1": { + "total": 100, + "ok": 100, + "ko": 0 + }, + "percentiles2": { + "total": 103, + "ok": 103, + "ko": 0 + }, + "percentiles3": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "percentiles4": { + "total": 105, + "ok": 105, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5365853658536586, + "ok": 0.5365853658536586, + "ko": 0 + } +} + },"req_request-4-e7d1b": { + "type": "REQUEST", + "name": "request_4", +"path": "request_4", +"pathFormatted": "req_request-4-e7d1b", +"stats": { + "name": "request_4", + "numberOfRequests": { + "total": 22, + "ok": 15, + "ko": 7 + }, + "minResponseTime": { + "total": 192, + "ok": 419, + "ko": 192 + }, + "maxResponseTime": { + "total": 2556, + "ok": 1784, + "ko": 2556 + }, + "meanResponseTime": { + "total": 1308, + "ok": 1031, + "ko": 1900 + }, + "standardDeviation": { + "total": 707, + "ok": 421, + "ko": 823 + }, + "percentiles1": { + "total": 1121, + "ok": 832, + "ko": 2463 + }, + "percentiles2": { + "total": 1742, + "ok": 1174, + "ko": 2526 + }, + "percentiles3": { + "total": 2528, + "ok": 1761, + "ko": 2548 + }, + "percentiles4": { + "total": 2550, + "ok": 1779, + "ko": 2554 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 27 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 23 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 32 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5365853658536586, + "ok": 0.36585365853658536, + "ko": 0.17073170731707318 + } +} + },"req_request-5-48829": { + "type": "REQUEST", + "name": "request_5", +"path": "request_5", +"pathFormatted": "req_request-5-48829", +"stats": { + "name": "request_5", + "numberOfRequests": { + "total": 22, + "ok": 13, + "ko": 9 + }, + "minResponseTime": { + "total": 200, + "ok": 385, + "ko": 200 + }, + "maxResponseTime": { + "total": 2535, + "ok": 1755, + "ko": 2535 + }, + "meanResponseTime": { + "total": 1345, + "ok": 1018, + "ko": 1816 + }, + "standardDeviation": { + "total": 710, + "ok": 456, + "ko": 745 + }, + "percentiles1": { + "total": 1295, + "ok": 1070, + "ko": 1544 + }, + "percentiles2": { + "total": 1727, + "ok": 1124, + "ko": 2528 + }, + "percentiles3": { + "total": 2528, + "ok": 1742, + "ko": 2532 + }, + "percentiles4": { + "total": 2534, + "ok": 1752, + "ko": 2534 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 27 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 9, + "percentage": 41 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5365853658536586, + "ok": 0.3170731707317073, + "ko": 0.21951219512195122 + } +} + },"req_request-6-027a9": { + "type": "REQUEST", + "name": "request_6", +"path": "request_6", +"pathFormatted": "req_request-6-027a9", +"stats": { + "name": "request_6", + "numberOfRequests": { + "total": 22, + "ok": 14, + "ko": 8 + }, + "minResponseTime": { + "total": 183, + "ok": 601, + "ko": 183 + }, + "maxResponseTime": { + "total": 2533, + "ok": 1941, + "ko": 2533 + }, + "meanResponseTime": { + "total": 1292, + "ok": 981, + "ko": 1835 + }, + "standardDeviation": { + "total": 680, + "ok": 331, + "ko": 785 + }, + "percentiles1": { + "total": 977, + "ok": 921, + "ko": 1980 + }, + "percentiles2": { + "total": 1499, + "ok": 983, + "ko": 2524 + }, + "percentiles3": { + "total": 2528, + "ok": 1509, + "ko": 2531 + }, + "percentiles4": { + "total": 2532, + "ok": 1855, + "ko": 2533 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 14 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 8, + "percentage": 36 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 8, + "percentage": 36 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5365853658536586, + "ok": 0.34146341463414637, + "ko": 0.1951219512195122 + } +} + },"req_request-7-f222f": { + "type": "REQUEST", + "name": "request_7", +"path": "request_7", +"pathFormatted": "req_request-7-f222f", +"stats": { + "name": "request_7", + "numberOfRequests": { + "total": 22, + "ok": 16, + "ko": 6 + }, + "minResponseTime": { + "total": 203, + "ok": 369, + "ko": 203 + }, + "maxResponseTime": { + "total": 2534, + "ok": 1749, + "ko": 2534 + }, + "meanResponseTime": { + "total": 1318, + "ok": 1074, + "ko": 1971 + }, + "standardDeviation": { + "total": 724, + "ok": 464, + "ko": 875 + }, + "percentiles1": { + "total": 1108, + "ok": 1087, + "ko": 2527 + }, + "percentiles2": { + "total": 1687, + "ok": 1647, + "ko": 2530 + }, + "percentiles3": { + "total": 2531, + "ok": 1707, + "ko": 2533 + }, + "percentiles4": { + "total": 2533, + "ok": 1741, + "ko": 2534 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 7, + "percentage": 32 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 23 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 27 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5365853658536586, + "ok": 0.3902439024390244, + "ko": 0.14634146341463414 + } +} + },"req_request-5-redir-affb3": { + "type": "REQUEST", + "name": "request_5 Redirect 1", +"path": "request_5 Redirect 1", +"pathFormatted": "req_request-5-redir-affb3", +"stats": { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "minResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "maxResponseTime": { + "total": 122, + "ok": 122, + "ko": 0 + }, + "meanResponseTime": { + "total": 108, + "ok": 108, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 106, + "ok": 106, + "ko": 0 + }, + "percentiles2": { + "total": 111, + "ok": 111, + "ko": 0 + }, + "percentiles3": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "percentiles4": { + "total": 122, + "ok": 122, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 13, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.3170731707317073, + "ok": 0.3170731707317073, + "ko": 0 + } +} + },"req_request-8-ef0c8": { + "type": "REQUEST", + "name": "request_8", +"path": "request_8", +"pathFormatted": "req_request-8-ef0c8", +"stats": { + "name": "request_8", + "numberOfRequests": { + "total": 25, + "ok": 23, + "ko": 2 + }, + "minResponseTime": { + "total": 475, + "ok": 475, + "ko": 2495 + }, + "maxResponseTime": { + "total": 2510, + "ok": 1310, + "ko": 2510 + }, + "meanResponseTime": { + "total": 992, + "ok": 861, + "ko": 2503 + }, + "standardDeviation": { + "total": 508, + "ok": 255, + "ko": 8 + }, + "percentiles1": { + "total": 978, + "ok": 951, + "ko": 2503 + }, + "percentiles2": { + "total": 1070, + "ok": 1042, + "ko": 2506 + }, + "percentiles3": { + "total": 2258, + "ok": 1244, + "ko": 2509 + }, + "percentiles4": { + "total": 2506, + "ok": 1297, + "ko": 2510 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 40 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 44 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 8 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6097560975609756, + "ok": 0.5609756097560976, + "ko": 0.04878048780487805 + } +} + },"req_request-8-redir-98b2a": { + "type": "REQUEST", + "name": "request_8 Redirect 1", +"path": "request_8 Redirect 1", +"pathFormatted": "req_request-8-redir-98b2a", +"stats": { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 212, + "ok": 212, + "ko": 0 + }, + "maxResponseTime": { + "total": 1537, + "ok": 1537, + "ko": 0 + }, + "meanResponseTime": { + "total": 803, + "ok": 803, + "ko": 0 + }, + "standardDeviation": { + "total": 451, + "ok": 451, + "ko": 0 + }, + "percentiles1": { + "total": 697, + "ok": 697, + "ko": 0 + }, + "percentiles2": { + "total": 1234, + "ok": 1234, + "ko": 0 + }, + "percentiles3": { + "total": 1488, + "ok": 1488, + "ko": 0 + }, + "percentiles4": { + "total": 1526, + "ok": 1526, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 15, + "percentage": 65 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 6, + "percentage": 26 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-8-redir-fc911": { + "type": "REQUEST", + "name": "request_8 Redirect 2", +"path": "request_8 Redirect 2", +"pathFormatted": "req_request-8-redir-fc911", +"stats": { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 242, + "ok": 242, + "ko": 0 + }, + "maxResponseTime": { + "total": 1242, + "ok": 1242, + "ko": 0 + }, + "meanResponseTime": { + "total": 455, + "ok": 455, + "ko": 0 + }, + "standardDeviation": { + "total": 206, + "ok": 206, + "ko": 0 + }, + "percentiles1": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "percentiles2": { + "total": 498, + "ok": 498, + "ko": 0 + }, + "percentiles3": { + "total": 707, + "ok": 707, + "ko": 0 + }, + "percentiles4": { + "total": 1129, + "ok": 1129, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 96 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-8-redir-e875c": { + "type": "REQUEST", + "name": "request_8 Redirect 3", +"path": "request_8 Redirect 3", +"pathFormatted": "req_request-8-redir-e875c", +"stats": { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 418, + "ok": 418, + "ko": 0 + }, + "meanResponseTime": { + "total": 155, + "ok": 155, + "ko": 0 + }, + "standardDeviation": { + "total": 124, + "ok": 124, + "ko": 0 + }, + "percentiles1": { + "total": 136, + "ok": 136, + "ko": 0 + }, + "percentiles2": { + "total": 202, + "ok": 202, + "ko": 0 + }, + "percentiles3": { + "total": 409, + "ok": 409, + "ko": 0 + }, + "percentiles4": { + "total": 416, + "ok": 416, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-12-61da2": { + "type": "REQUEST", + "name": "request_12", +"path": "request_12", +"pathFormatted": "req_request-12-61da2", +"stats": { + "name": "request_12", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "maxResponseTime": { + "total": 447, + "ok": 447, + "ko": 0 + }, + "meanResponseTime": { + "total": 228, + "ok": 228, + "ko": 0 + }, + "standardDeviation": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "percentiles1": { + "total": 227, + "ok": 227, + "ko": 0 + }, + "percentiles2": { + "total": 312, + "ok": 312, + "ko": 0 + }, + "percentiles3": { + "total": 433, + "ok": 433, + "ko": 0 + }, + "percentiles4": { + "total": 446, + "ok": 446, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-14-a0e30": { + "type": "REQUEST", + "name": "request_14", +"path": "request_14", +"pathFormatted": "req_request-14-a0e30", +"stats": { + "name": "request_14", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "maxResponseTime": { + "total": 448, + "ok": 448, + "ko": 0 + }, + "meanResponseTime": { + "total": 232, + "ok": 232, + "ko": 0 + }, + "standardDeviation": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "percentiles1": { + "total": 236, + "ok": 236, + "ko": 0 + }, + "percentiles2": { + "total": 315, + "ok": 315, + "ko": 0 + }, + "percentiles3": { + "total": 434, + "ok": 434, + "ko": 0 + }, + "percentiles4": { + "total": 447, + "ok": 447, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-21-be4cb": { + "type": "REQUEST", + "name": "request_21", +"path": "request_21", +"pathFormatted": "req_request-21-be4cb", +"stats": { + "name": "request_21", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "maxResponseTime": { + "total": 1779, + "ok": 1779, + "ko": 0 + }, + "meanResponseTime": { + "total": 604, + "ok": 604, + "ko": 0 + }, + "standardDeviation": { + "total": 354, + "ok": 354, + "ko": 0 + }, + "percentiles1": { + "total": 646, + "ok": 646, + "ko": 0 + }, + "percentiles2": { + "total": 781, + "ok": 781, + "ko": 0 + }, + "percentiles3": { + "total": 916, + "ok": 916, + "ko": 0 + }, + "percentiles4": { + "total": 1590, + "ok": 1590, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 19, + "percentage": 83 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-22-8ecb1": { + "type": "REQUEST", + "name": "request_22", +"path": "request_22", +"pathFormatted": "req_request-22-8ecb1", +"stats": { + "name": "request_22", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "maxResponseTime": { + "total": 915, + "ok": 915, + "ko": 0 + }, + "meanResponseTime": { + "total": 563, + "ok": 563, + "ko": 0 + }, + "standardDeviation": { + "total": 241, + "ok": 241, + "ko": 0 + }, + "percentiles1": { + "total": 564, + "ok": 564, + "ko": 0 + }, + "percentiles2": { + "total": 765, + "ok": 765, + "ko": 0 + }, + "percentiles3": { + "total": 883, + "ok": 883, + "ko": 0 + }, + "percentiles4": { + "total": 909, + "ok": 909, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 19, + "percentage": 83 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 17 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-24-dd0c9": { + "type": "REQUEST", + "name": "request_24", +"path": "request_24", +"pathFormatted": "req_request-24-dd0c9", +"stats": { + "name": "request_24", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "maxResponseTime": { + "total": 1018, + "ok": 1018, + "ko": 0 + }, + "meanResponseTime": { + "total": 579, + "ok": 579, + "ko": 0 + }, + "standardDeviation": { + "total": 255, + "ok": 255, + "ko": 0 + }, + "percentiles1": { + "total": 567, + "ok": 567, + "ko": 0 + }, + "percentiles2": { + "total": 785, + "ok": 785, + "ko": 0 + }, + "percentiles3": { + "total": 920, + "ok": 920, + "ko": 0 + }, + "percentiles4": { + "total": 998, + "ok": 998, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 78 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-13-5cca6": { + "type": "REQUEST", + "name": "request_13", +"path": "request_13", +"pathFormatted": "req_request-13-5cca6", +"stats": { + "name": "request_13", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 74, + "ok": 74, + "ko": 0 + }, + "maxResponseTime": { + "total": 152, + "ok": 152, + "ko": 0 + }, + "meanResponseTime": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "standardDeviation": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles1": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "percentiles2": { + "total": 104, + "ok": 104, + "ko": 0 + }, + "percentiles3": { + "total": 130, + "ok": 130, + "ko": 0 + }, + "percentiles4": { + "total": 147, + "ok": 147, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-200-636fa": { + "type": "REQUEST", + "name": "request_200", +"path": "request_200", +"pathFormatted": "req_request-200-636fa", +"stats": { + "name": "request_200", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 103, + "ok": 103, + "ko": 0 + }, + "maxResponseTime": { + "total": 1782, + "ok": 1782, + "ko": 0 + }, + "meanResponseTime": { + "total": 641, + "ok": 641, + "ko": 0 + }, + "standardDeviation": { + "total": 349, + "ok": 349, + "ko": 0 + }, + "percentiles1": { + "total": 648, + "ok": 648, + "ko": 0 + }, + "percentiles2": { + "total": 812, + "ok": 812, + "ko": 0 + }, + "percentiles3": { + "total": 1014, + "ok": 1014, + "ko": 0 + }, + "percentiles4": { + "total": 1615, + "ok": 1615, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 17, + "percentage": 74 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-16-24733": { + "type": "REQUEST", + "name": "request_16", +"path": "request_16", +"pathFormatted": "req_request-16-24733", +"stats": { + "name": "request_16", + "numberOfRequests": { + "total": 23, + "ok": 10, + "ko": 13 + }, + "minResponseTime": { + "total": 98, + "ok": 98, + "ko": 548 + }, + "maxResponseTime": { + "total": 2512, + "ok": 1220, + "ko": 2512 + }, + "meanResponseTime": { + "total": 1054, + "ok": 334, + "ko": 1608 + }, + "standardDeviation": { + "total": 987, + "ok": 333, + "ko": 965 + }, + "percentiles1": { + "total": 563, + "ok": 163, + "ko": 2490 + }, + "percentiles2": { + "total": 2492, + "ok": 458, + "ko": 2505 + }, + "percentiles3": { + "total": 2509, + "ok": 890, + "ko": 2510 + }, + "percentiles4": { + "total": 2511, + "ok": 1154, + "ko": 2512 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 9, + "percentage": 39 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 13, + "percentage": 57 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.24390243902439024, + "ko": 0.3170731707317073 + } +} + },"req_request-15-56eac": { + "type": "REQUEST", + "name": "request_15", +"path": "request_15", +"pathFormatted": "req_request-15-56eac", +"stats": { + "name": "request_15", + "numberOfRequests": { + "total": 23, + "ok": 11, + "ko": 12 + }, + "minResponseTime": { + "total": 100, + "ok": 100, + "ko": 563 + }, + "maxResponseTime": { + "total": 2561, + "ok": 1218, + "ko": 2561 + }, + "meanResponseTime": { + "total": 1138, + "ok": 273, + "ko": 1930 + }, + "standardDeviation": { + "total": 1047, + "ok": 318, + "ko": 835 + }, + "percentiles1": { + "total": 581, + "ok": 168, + "ko": 2504 + }, + "percentiles2": { + "total": 2504, + "ok": 188, + "ko": 2513 + }, + "percentiles3": { + "total": 2530, + "ok": 859, + "ko": 2545 + }, + "percentiles4": { + "total": 2555, + "ok": 1146, + "ko": 2558 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 43 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 12, + "percentage": 52 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.2682926829268293, + "ko": 0.2926829268292683 + } +} + },"req_logo-png-c9c2b": { + "type": "REQUEST", + "name": "Logo.png", +"path": "Logo.png", +"pathFormatted": "req_logo-png-c9c2b", +"stats": { + "name": "Logo.png", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "maxResponseTime": { + "total": 443, + "ok": 443, + "ko": 0 + }, + "meanResponseTime": { + "total": 222, + "ok": 222, + "ko": 0 + }, + "standardDeviation": { + "total": 167, + "ok": 167, + "ko": 0 + }, + "percentiles1": { + "total": 281, + "ok": 281, + "ko": 0 + }, + "percentiles2": { + "total": 378, + "ok": 378, + "ko": 0 + }, + "percentiles3": { + "total": 414, + "ok": 414, + "ko": 0 + }, + "percentiles4": { + "total": 437, + "ok": 437, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-18-f5b64": { + "type": "REQUEST", + "name": "request_18", +"path": "request_18", +"pathFormatted": "req_request-18-f5b64", +"stats": { + "name": "request_18", + "numberOfRequests": { + "total": 23, + "ok": 18, + "ko": 5 + }, + "minResponseTime": { + "total": 183, + "ok": 183, + "ko": 522 + }, + "maxResponseTime": { + "total": 2563, + "ok": 749, + "ko": 2563 + }, + "meanResponseTime": { + "total": 496, + "ok": 261, + "ko": 1342 + }, + "standardDeviation": { + "total": 646, + "ok": 136, + "ko": 969 + }, + "percentiles1": { + "total": 235, + "ok": 205, + "ko": 567 + }, + "percentiles2": { + "total": 506, + "ok": 248, + "ko": 2495 + }, + "percentiles3": { + "total": 2320, + "ok": 528, + "ko": 2549 + }, + "percentiles4": { + "total": 2548, + "ok": 705, + "ko": 2560 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 18, + "percentage": 78 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 5, + "percentage": 22 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.43902439024390244, + "ko": 0.12195121951219512 + } +} + },"req_bundle-js-0b837": { + "type": "REQUEST", + "name": "bundle.js", +"path": "bundle.js", +"pathFormatted": "req_bundle-js-0b837", +"stats": { + "name": "bundle.js", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 26, + "ok": 26, + "ko": 0 + }, + "maxResponseTime": { + "total": 247, + "ok": 247, + "ko": 0 + }, + "meanResponseTime": { + "total": 119, + "ok": 119, + "ko": 0 + }, + "standardDeviation": { + "total": 67, + "ok": 67, + "ko": 0 + }, + "percentiles1": { + "total": 99, + "ok": 99, + "ko": 0 + }, + "percentiles2": { + "total": 170, + "ok": 170, + "ko": 0 + }, + "percentiles3": { + "total": 229, + "ok": 229, + "ko": 0 + }, + "percentiles4": { + "total": 243, + "ok": 243, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-9-d127e": { + "type": "REQUEST", + "name": "request_9", +"path": "request_9", +"pathFormatted": "req_request-9-d127e", +"stats": { + "name": "request_9", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 33, + "ok": 33, + "ko": 0 + }, + "maxResponseTime": { + "total": 461, + "ok": 461, + "ko": 0 + }, + "meanResponseTime": { + "total": 264, + "ok": 264, + "ko": 0 + }, + "standardDeviation": { + "total": 149, + "ok": 149, + "ko": 0 + }, + "percentiles1": { + "total": 281, + "ok": 281, + "ko": 0 + }, + "percentiles2": { + "total": 420, + "ok": 420, + "ko": 0 + }, + "percentiles3": { + "total": 460, + "ok": 460, + "ko": 0 + }, + "percentiles4": { + "total": 461, + "ok": 461, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-10-1cfbe": { + "type": "REQUEST", + "name": "request_10", +"path": "request_10", +"pathFormatted": "req_request-10-1cfbe", +"stats": { + "name": "request_10", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "maxResponseTime": { + "total": 460, + "ok": 460, + "ko": 0 + }, + "meanResponseTime": { + "total": 264, + "ok": 264, + "ko": 0 + }, + "standardDeviation": { + "total": 148, + "ok": 148, + "ko": 0 + }, + "percentiles1": { + "total": 282, + "ok": 282, + "ko": 0 + }, + "percentiles2": { + "total": 420, + "ok": 420, + "ko": 0 + }, + "percentiles3": { + "total": 458, + "ok": 458, + "ko": 0 + }, + "percentiles4": { + "total": 460, + "ok": 460, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-242-d6d33": { + "type": "REQUEST", + "name": "request_242", +"path": "request_242", +"pathFormatted": "req_request-242-d6d33", +"stats": { + "name": "request_242", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "maxResponseTime": { + "total": 463, + "ok": 463, + "ko": 0 + }, + "meanResponseTime": { + "total": 274, + "ok": 274, + "ko": 0 + }, + "standardDeviation": { + "total": 147, + "ok": 147, + "ko": 0 + }, + "percentiles1": { + "total": 313, + "ok": 313, + "ko": 0 + }, + "percentiles2": { + "total": 424, + "ok": 424, + "ko": 0 + }, + "percentiles3": { + "total": 459, + "ok": 459, + "ko": 0 + }, + "percentiles4": { + "total": 462, + "ok": 462, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-11-f11e8": { + "type": "REQUEST", + "name": "request_11", +"path": "request_11", +"pathFormatted": "req_request-11-f11e8", +"stats": { + "name": "request_11", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "maxResponseTime": { + "total": 1279, + "ok": 1279, + "ko": 0 + }, + "meanResponseTime": { + "total": 913, + "ok": 913, + "ko": 0 + }, + "standardDeviation": { + "total": 332, + "ok": 332, + "ko": 0 + }, + "percentiles1": { + "total": 1040, + "ok": 1040, + "ko": 0 + }, + "percentiles2": { + "total": 1128, + "ok": 1128, + "ko": 0 + }, + "percentiles3": { + "total": 1278, + "ok": 1278, + "ko": 0 + }, + "percentiles4": { + "total": 1279, + "ok": 1279, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 6, + "percentage": 26 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 57 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_css2-family-rob-cf8a9": { + "type": "REQUEST", + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"path": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"pathFormatted": "req_css2-family-rob-cf8a9", +"stats": { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 102, + "ok": 102, + "ko": 0 + }, + "maxResponseTime": { + "total": 165, + "ok": 165, + "ko": 0 + }, + "meanResponseTime": { + "total": 128, + "ok": 128, + "ko": 0 + }, + "standardDeviation": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "percentiles1": { + "total": 128, + "ok": 128, + "ko": 0 + }, + "percentiles2": { + "total": 133, + "ok": 133, + "ko": 0 + }, + "percentiles3": { + "total": 145, + "ok": 145, + "ko": 0 + }, + "percentiles4": { + "total": 161, + "ok": 161, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-19-10d85": { + "type": "REQUEST", + "name": "request_19", +"path": "request_19", +"pathFormatted": "req_request-19-10d85", +"stats": { + "name": "request_19", + "numberOfRequests": { + "total": 23, + "ok": 4, + "ko": 19 + }, + "minResponseTime": { + "total": 518, + "ok": 518, + "ko": 549 + }, + "maxResponseTime": { + "total": 2587, + "ok": 1487, + "ko": 2587 + }, + "meanResponseTime": { + "total": 1534, + "ok": 1096, + "ko": 1626 + }, + "standardDeviation": { + "total": 919, + "ok": 359, + "ko": 973 + }, + "percentiles1": { + "total": 1259, + "ok": 1190, + "ko": 2488 + }, + "percentiles2": { + "total": 2537, + "ok": 1316, + "ko": 2552 + }, + "percentiles3": { + "total": 2582, + "ok": 1453, + "ko": 2584 + }, + "percentiles4": { + "total": 2586, + "ok": 1480, + "ko": 2586 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.0975609756097561, + "ko": 0.4634146341463415 + } +} + },"req_request-20-6804b": { + "type": "REQUEST", + "name": "request_20", +"path": "request_20", +"pathFormatted": "req_request-20-6804b", +"stats": { + "name": "request_20", + "numberOfRequests": { + "total": 23, + "ok": 5, + "ko": 18 + }, + "minResponseTime": { + "total": 219, + "ok": 501, + "ko": 219 + }, + "maxResponseTime": { + "total": 2562, + "ok": 1225, + "ko": 2562 + }, + "meanResponseTime": { + "total": 1441, + "ok": 724, + "ko": 1639 + }, + "standardDeviation": { + "total": 976, + "ok": 281, + "ko": 1006 + }, + "percentiles1": { + "total": 847, + "ok": 529, + "ko": 2500 + }, + "percentiles2": { + "total": 2546, + "ok": 847, + "ko": 2548 + }, + "percentiles3": { + "total": 2555, + "ok": 1149, + "ko": 2556 + }, + "percentiles4": { + "total": 2560, + "ok": 1210, + "ko": 2561 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 3, + "percentage": 13 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 18, + "percentage": 78 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.12195121951219512, + "ko": 0.43902439024390244 + } +} + },"req_request-23-98f5d": { + "type": "REQUEST", + "name": "request_23", +"path": "request_23", +"pathFormatted": "req_request-23-98f5d", +"stats": { + "name": "request_23", + "numberOfRequests": { + "total": 23, + "ok": 4, + "ko": 19 + }, + "minResponseTime": { + "total": 216, + "ok": 613, + "ko": 216 + }, + "maxResponseTime": { + "total": 2574, + "ok": 1687, + "ko": 2574 + }, + "meanResponseTime": { + "total": 1465, + "ok": 946, + "ko": 1574 + }, + "standardDeviation": { + "total": 963, + "ok": 440, + "ko": 1006 + }, + "percentiles1": { + "total": 862, + "ok": 741, + "ko": 2492 + }, + "percentiles2": { + "total": 2512, + "ok": 1068, + "ko": 2521 + }, + "percentiles3": { + "total": 2567, + "ok": 1563, + "ko": 2570 + }, + "percentiles4": { + "total": 2573, + "ok": 1662, + "ko": 2573 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 9 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.0975609756097561, + "ko": 0.4634146341463415 + } +} + },"req_request-222-24864": { + "type": "REQUEST", + "name": "request_222", +"path": "request_222", +"pathFormatted": "req_request-222-24864", +"stats": { + "name": "request_222", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 123, + "ok": 123, + "ko": 0 + }, + "maxResponseTime": { + "total": 700, + "ok": 700, + "ko": 0 + }, + "meanResponseTime": { + "total": 467, + "ok": 467, + "ko": 0 + }, + "standardDeviation": { + "total": 189, + "ok": 189, + "ko": 0 + }, + "percentiles1": { + "total": 494, + "ok": 494, + "ko": 0 + }, + "percentiles2": { + "total": 653, + "ok": 653, + "ko": 0 + }, + "percentiles3": { + "total": 686, + "ok": 686, + "ko": 0 + }, + "percentiles4": { + "total": 697, + "ok": 697, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-227-2507b": { + "type": "REQUEST", + "name": "request_227", +"path": "request_227", +"pathFormatted": "req_request-227-2507b", +"stats": { + "name": "request_227", + "numberOfRequests": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "minResponseTime": { + "total": 143, + "ok": 143, + "ko": 0 + }, + "maxResponseTime": { + "total": 697, + "ok": 697, + "ko": 0 + }, + "meanResponseTime": { + "total": 487, + "ok": 487, + "ko": 0 + }, + "standardDeviation": { + "total": 182, + "ok": 182, + "ko": 0 + }, + "percentiles1": { + "total": 516, + "ok": 516, + "ko": 0 + }, + "percentiles2": { + "total": 658, + "ok": 658, + "ko": 0 + }, + "percentiles3": { + "total": 683, + "ok": 683, + "ko": 0 + }, + "percentiles4": { + "total": 694, + "ok": 694, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 23, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.5609756097560976, + "ko": 0 + } +} + },"req_request-240-e27d8": { + "type": "REQUEST", + "name": "request_240", +"path": "request_240", +"pathFormatted": "req_request-240-e27d8", +"stats": { + "name": "request_240", + "numberOfRequests": { + "total": 23, + "ok": 6, + "ko": 17 + }, + "minResponseTime": { + "total": 722, + "ok": 762, + "ko": 722 + }, + "maxResponseTime": { + "total": 4118, + "ok": 4118, + "ko": 3455 + }, + "meanResponseTime": { + "total": 2846, + "ok": 2511, + "ko": 2964 + }, + "standardDeviation": { + "total": 889, + "ok": 1221, + "ko": 699 + }, + "percentiles1": { + "total": 3169, + "ok": 2117, + "ko": 3195 + }, + "percentiles2": { + "total": 3337, + "ok": 3610, + "ko": 3326 + }, + "percentiles3": { + "total": 4042, + "ok": 4115, + "ko": 3417 + }, + "percentiles4": { + "total": 4116, + "ok": 4117, + "ko": 3447 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 22 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 17, + "percentage": 74 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.14634146341463414, + "ko": 0.4146341463414634 + } +} + },"req_request-241-2919b": { + "type": "REQUEST", + "name": "request_241", +"path": "request_241", +"pathFormatted": "req_request-241-2919b", +"stats": { + "name": "request_241", + "numberOfRequests": { + "total": 23, + "ok": 4, + "ko": 19 + }, + "minResponseTime": { + "total": 397, + "ok": 397, + "ko": 696 + }, + "maxResponseTime": { + "total": 4082, + "ok": 4082, + "ko": 3393 + }, + "meanResponseTime": { + "total": 2797, + "ok": 2423, + "ko": 2875 + }, + "standardDeviation": { + "total": 1002, + "ok": 1467, + "ko": 852 + }, + "percentiles1": { + "total": 3271, + "ok": 2607, + "ko": 3271 + }, + "percentiles2": { + "total": 3377, + "ok": 3663, + "ko": 3356 + }, + "percentiles3": { + "total": 3510, + "ok": 3998, + "ko": 3392 + }, + "percentiles4": { + "total": 3959, + "ok": 4065, + "ko": 3393 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1, + "percentage": 4 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.0975609756097561, + "ko": 0.4634146341463415 + } +} + },"req_request-243-b078b": { + "type": "REQUEST", + "name": "request_243", +"path": "request_243", +"pathFormatted": "req_request-243-b078b", +"stats": { + "name": "request_243", + "numberOfRequests": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "minResponseTime": { + "total": 130, + "ok": 130, + "ko": 0 + }, + "maxResponseTime": { + "total": 853, + "ok": 853, + "ko": 0 + }, + "meanResponseTime": { + "total": 593, + "ok": 593, + "ko": 0 + }, + "standardDeviation": { + "total": 215, + "ok": 215, + "ko": 0 + }, + "percentiles1": { + "total": 638, + "ok": 638, + "ko": 0 + }, + "percentiles2": { + "total": 735, + "ok": 735, + "ko": 0 + }, + "percentiles3": { + "total": 844, + "ok": 844, + "ko": 0 + }, + "percentiles4": { + "total": 851, + "ok": 851, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 17, + "percentage": 81 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 19 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5121951219512195, + "ok": 0.5121951219512195, + "ko": 0 + } +} + },"req_request-244-416e5": { + "type": "REQUEST", + "name": "request_244", +"path": "request_244", +"pathFormatted": "req_request-244-416e5", +"stats": { + "name": "request_244", + "numberOfRequests": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "minResponseTime": { + "total": 166, + "ok": 166, + "ko": 0 + }, + "maxResponseTime": { + "total": 875, + "ok": 875, + "ko": 0 + }, + "meanResponseTime": { + "total": 576, + "ok": 576, + "ko": 0 + }, + "standardDeviation": { + "total": 230, + "ok": 230, + "ko": 0 + }, + "percentiles1": { + "total": 612, + "ok": 612, + "ko": 0 + }, + "percentiles2": { + "total": 710, + "ok": 710, + "ko": 0 + }, + "percentiles3": { + "total": 845, + "ok": 845, + "ko": 0 + }, + "percentiles4": { + "total": 869, + "ok": 869, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 14, + "percentage": 82 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 3, + "percentage": 18 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.4146341463414634, + "ok": 0.4146341463414634, + "ko": 0 + } +} + },"req_request-250-8cb1f": { + "type": "REQUEST", + "name": "request_250", +"path": "request_250", +"pathFormatted": "req_request-250-8cb1f", +"stats": { + "name": "request_250", + "numberOfRequests": { + "total": 23, + "ok": 4, + "ko": 19 + }, + "minResponseTime": { + "total": 693, + "ok": 3403, + "ko": 693 + }, + "maxResponseTime": { + "total": 4787, + "ok": 4787, + "ko": 3342 + }, + "meanResponseTime": { + "total": 2717, + "ok": 4106, + "ko": 2425 + }, + "standardDeviation": { + "total": 1060, + "ok": 492, + "ko": 904 + }, + "percentiles1": { + "total": 2819, + "ok": 4117, + "ko": 2705 + }, + "percentiles2": { + "total": 3270, + "ok": 4336, + "ko": 3168 + }, + "percentiles3": { + "total": 4172, + "ok": 4697, + "ko": 3283 + }, + "percentiles4": { + "total": 4655, + "ok": 4769, + "ko": 3330 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 19, + "percentage": 83 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.0975609756097561, + "ko": 0.4634146341463415 + } +} + },"req_request-252-38647": { + "type": "REQUEST", + "name": "request_252", +"path": "request_252", +"pathFormatted": "req_request-252-38647", +"stats": { + "name": "request_252", + "numberOfRequests": { + "total": 23, + "ok": 3, + "ko": 20 + }, + "minResponseTime": { + "total": 708, + "ok": 3943, + "ko": 708 + }, + "maxResponseTime": { + "total": 4229, + "ok": 4229, + "ko": 3290 + }, + "meanResponseTime": { + "total": 2884, + "ok": 4067, + "ko": 2707 + }, + "standardDeviation": { + "total": 851, + "ok": 120, + "ko": 767 + }, + "percentiles1": { + "total": 3144, + "ok": 4028, + "ko": 3069 + }, + "percentiles2": { + "total": 3216, + "ok": 4129, + "ko": 3166 + }, + "percentiles3": { + "total": 4020, + "ok": 4209, + "ko": 3283 + }, + "percentiles4": { + "total": 4185, + "ok": 4225, + "ko": 3289 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 20, + "percentage": 87 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.07317073170731707, + "ko": 0.4878048780487805 + } +} + },"req_request-260-43b5f": { + "type": "REQUEST", + "name": "request_260", +"path": "request_260", +"pathFormatted": "req_request-260-43b5f", +"stats": { + "name": "request_260", + "numberOfRequests": { + "total": 23, + "ok": 6, + "ko": 17 + }, + "minResponseTime": { + "total": 1019, + "ok": 1019, + "ko": 1559 + }, + "maxResponseTime": { + "total": 3891, + "ok": 3891, + "ko": 3452 + }, + "meanResponseTime": { + "total": 2651, + "ok": 2515, + "ko": 2699 + }, + "standardDeviation": { + "total": 854, + "ok": 1134, + "ko": 724 + }, + "percentiles1": { + "total": 3014, + "ok": 2752, + "ko": 3117 + }, + "percentiles2": { + "total": 3248, + "ok": 3466, + "ko": 3193 + }, + "percentiles3": { + "total": 3600, + "ok": 3823, + "ko": 3366 + }, + "percentiles4": { + "total": 3831, + "ok": 3877, + "ko": 3435 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 17, + "percentage": 74 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.14634146341463414, + "ko": 0.4146341463414634 + } +} + },"req_request-265-cf160": { + "type": "REQUEST", + "name": "request_265", +"path": "request_265", +"pathFormatted": "req_request-265-cf160", +"stats": { + "name": "request_265", + "numberOfRequests": { + "total": 23, + "ok": 5, + "ko": 18 + }, + "minResponseTime": { + "total": 1102, + "ok": 1102, + "ko": 1551 + }, + "maxResponseTime": { + "total": 4753, + "ok": 4753, + "ko": 3423 + }, + "meanResponseTime": { + "total": 2442, + "ok": 2946, + "ko": 2302 + }, + "standardDeviation": { + "total": 971, + "ok": 1359, + "ko": 775 + }, + "percentiles1": { + "total": 1688, + "ok": 3577, + "ko": 1687 + }, + "percentiles2": { + "total": 3268, + "ok": 3649, + "ko": 3174 + }, + "percentiles3": { + "total": 3642, + "ok": 4532, + "ko": 3351 + }, + "percentiles4": { + "total": 4510, + "ok": 4709, + "ko": 3409 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 17 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 18, + "percentage": 78 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5609756097560976, + "ok": 0.12195121951219512, + "ko": 0.43902439024390244 + } +} + },"req_request-273-0cd3c": { + "type": "REQUEST", + "name": "request_273", +"path": "request_273", +"pathFormatted": "req_request-273-0cd3c", +"stats": { + "name": "request_273", + "numberOfRequests": { + "total": 12, + "ok": 6, + "ko": 6 + }, + "minResponseTime": { + "total": 333, + "ok": 333, + "ko": 865 + }, + "maxResponseTime": { + "total": 3305, + "ok": 2930, + "ko": 3305 + }, + "meanResponseTime": { + "total": 1468, + "ok": 905, + "ko": 2032 + }, + "standardDeviation": { + "total": 1196, + "ok": 938, + "ko": 1160 + }, + "percentiles1": { + "total": 878, + "ok": 404, + "ko": 2010 + }, + "percentiles2": { + "total": 2981, + "ok": 883, + "ko": 3133 + }, + "percentiles3": { + "total": 3210, + "ok": 2454, + "ko": 3262 + }, + "percentiles4": { + "total": 3286, + "ok": 2835, + "ko": 3296 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 4, + "percentage": 33 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 8 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 6, + "percentage": 50 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2926829268292683, + "ok": 0.14634146341463414, + "ko": 0.14634146341463414 + } +} + },"req_request-255-abfa6": { + "type": "REQUEST", + "name": "request_255", +"path": "request_255", +"pathFormatted": "req_request-255-abfa6", +"stats": { + "name": "request_255", + "numberOfRequests": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "minResponseTime": { + "total": 594, + "ok": 594, + "ko": 0 + }, + "maxResponseTime": { + "total": 698, + "ok": 698, + "ko": 0 + }, + "meanResponseTime": { + "total": 646, + "ok": 646, + "ko": 0 + }, + "standardDeviation": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles1": { + "total": 646, + "ok": 646, + "ko": 0 + }, + "percentiles2": { + "total": 672, + "ok": 672, + "ko": 0 + }, + "percentiles3": { + "total": 693, + "ok": 693, + "ko": 0 + }, + "percentiles4": { + "total": 697, + "ok": 697, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.04878048780487805, + "ok": 0.04878048780487805, + "ko": 0 + } +} + },"req_request-270-e02a1": { + "type": "REQUEST", + "name": "request_270", +"path": "request_270", +"pathFormatted": "req_request-270-e02a1", +"stats": { + "name": "request_270", + "numberOfRequests": { + "total": 11, + "ok": 4, + "ko": 7 + }, + "minResponseTime": { + "total": 336, + "ok": 336, + "ko": 842 + }, + "maxResponseTime": { + "total": 3231, + "ok": 3231, + "ko": 919 + }, + "meanResponseTime": { + "total": 1024, + "ok": 1273, + "ko": 881 + }, + "standardDeviation": { + "total": 730, + "ok": 1169, + "ko": 22 + }, + "percentiles1": { + "total": 881, + "ok": 763, + "ko": 881 + }, + "percentiles2": { + "total": 907, + "ok": 1634, + "ko": 890 + }, + "percentiles3": { + "total": 2167, + "ok": 2912, + "ko": 912 + }, + "percentiles4": { + "total": 3018, + "ok": 3167, + "ko": 918 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 2, + "percentage": 18 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 9 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 1, + "percentage": 9 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 7, + "percentage": 64 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.2682926829268293, + "ok": 0.0975609756097561, + "ko": 0.17073170731707318 + } +} + },"req_request-277-d0ec5": { + "type": "REQUEST", + "name": "request_277", +"path": "request_277", +"pathFormatted": "req_request-277-d0ec5", +"stats": { + "name": "request_277", + "numberOfRequests": { + "total": 2, + "ok": 0, + "ko": 2 + }, + "minResponseTime": { + "total": 872, + "ok": 0, + "ko": 872 + }, + "maxResponseTime": { + "total": 903, + "ok": 0, + "ko": 903 + }, + "meanResponseTime": { + "total": 888, + "ok": 0, + "ko": 888 + }, + "standardDeviation": { + "total": 16, + "ok": 0, + "ko": 16 + }, + "percentiles1": { + "total": 888, + "ok": 0, + "ko": 888 + }, + "percentiles2": { + "total": 895, + "ok": 0, + "ko": 895 + }, + "percentiles3": { + "total": 901, + "ok": 0, + "ko": 901 + }, + "percentiles4": { + "total": 903, + "ok": 0, + "ko": 903 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 0, + "percentage": 0 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 100 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.04878048780487805, + "ok": 0, + "ko": 0.04878048780487805 + } +} + },"req_request-322-a2de9": { + "type": "REQUEST", + "name": "request_322", +"path": "request_322", +"pathFormatted": "req_request-322-a2de9", +"stats": { + "name": "request_322", + "numberOfRequests": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "minResponseTime": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "maxResponseTime": { + "total": 80, + "ok": 80, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles2": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "percentiles3": { + "total": 73, + "ok": 73, + "ko": 0 + }, + "percentiles4": { + "total": 79, + "ok": 79, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6097560975609756, + "ok": 0.6097560975609756, + "ko": 0 + } +} + },"req_request-323-2fefc": { + "type": "REQUEST", + "name": "request_323", +"path": "request_323", +"pathFormatted": "req_request-323-2fefc", +"stats": { + "name": "request_323", + "numberOfRequests": { + "total": 25, + "ok": 25, + "ko": 0 + }, + "minResponseTime": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "maxResponseTime": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "meanResponseTime": { + "total": 64, + "ok": 64, + "ko": 0 + }, + "standardDeviation": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles1": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles2": { + "total": 72, + "ok": 72, + "ko": 0 + }, + "percentiles3": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "percentiles4": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 25, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.6097560975609756, + "ok": 0.6097560975609756, + "ko": 0 + } +} + } +} + +} \ No newline at end of file diff --git a/webapp/loadTests/25users/js/theme.js b/webapp/loadTests/25users/js/theme.js new file mode 100644 index 0000000..b95a7b3 --- /dev/null +++ b/webapp/loadTests/25users/js/theme.js @@ -0,0 +1,127 @@ +/* + * Copyright 2011-2022 Gatling Corp + * + * Licensed under the Gatling Highcharts License + */ +Highcharts.theme = { + chart: { + backgroundColor: '#f7f7f7', + borderWidth: 0, + borderRadius: 8, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#666', + tickColor: '#666', + labels: { + style: { + color: '#666' + } + }, + title: { + style: { + color: '#666' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: '#999', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#666', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#666', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + + rangeSelector: { + buttonTheme: { + fill: '#cfc9c6', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#b2b2a9' + }, + states: { + hover: { + fill: '#92918C', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#8b897d' + } + }, + select: { + fill: '#E37400', + stroke: '#000000', + style: { + color: '#FFF' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: '#8b897d' + } + }, + + navigator: { + handles: { + backgroundColor: '#f7f7f7', + borderColor: '#92918C' + }, + outlineColor: '#92918C', + outlineWidth: 1, + maskFill: 'rgba(146, 145, 140, 0.5)', + series: { + color: '#5E7BE2', + lineColor: '#5E7BE2' + } + }, + + scrollbar: { + buttonBackgroundColor: '#f7f7f7', + buttonBorderWidth: 1, + buttonBorderColor: '#92918C', + buttonArrowColor: '#92918C', + buttonBorderRadius: 2, + + barBorderWidth: 1, + barBorderRadius: 0, + barBackgroundColor: '#92918C', + barBorderColor: '#92918C', + + rifleColor: '#92918C', + + trackBackgroundColor: '#b0b0a8', + trackBorderWidth: 1, + trackBorderColor: '#b0b0a8' + } +}; + +Highcharts.setOptions(Highcharts.theme); diff --git a/webapp/loadTests/25users/js/unpack.js b/webapp/loadTests/25users/js/unpack.js new file mode 100644 index 0000000..883c33e --- /dev/null +++ b/webapp/loadTests/25users/js/unpack.js @@ -0,0 +1,38 @@ +'use strict'; + +var unpack = function (array) { + var findNbSeries = function (array) { + var currentPlotPack; + var length = array.length; + + for (var i = 0; i < length; i++) { + currentPlotPack = array[i][1]; + if(currentPlotPack !== null) { + return currentPlotPack.length; + } + } + return 0; + }; + + var i, j; + var nbPlots = array.length; + var nbSeries = findNbSeries(array); + + // Prepare unpacked array + var unpackedArray = new Array(nbSeries); + + for (i = 0; i < nbSeries; i++) { + unpackedArray[i] = new Array(nbPlots); + } + + // Unpack the array + for (i = 0; i < nbPlots; i++) { + var timestamp = array[i][0]; + var values = array[i][1]; + for (j = 0; j < nbSeries; j++) { + unpackedArray[j][i] = [timestamp * 1000, values === null ? null : values[j]]; + } + } + + return unpackedArray; +}; diff --git a/webapp/loadTests/25users/style/arrow_down.png b/webapp/loadTests/25users/style/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdbc86e36d0d025402710734046405455ba300 GIT binary patch literal 983 zcmaJ=U2D@&7>;fZDHd;a3La7~Hn92V+O!GFMw@i5vXs(R?8T6!$!Qz9_ z=Rer5@K(VKz41c*2SY&wuf1>zUd=aM+wH=7NOI13d7tNf-jBSfRqrPg%L#^Il9g?} z4*PX@6IU1DyZip+6KpqWxkVeKLkDJnnW9bF7*$-ei|g35hfhA>b%t5E>oi-mW$Y*x zaXB;g;Ud=uG{dZKM!sqFF-2|Mbv%{*@#Zay99v}{(6Mta8f2H7$2EFFLFYh($vu~ z{_pC#Gw+br@wwiA5{J#9kNG+d$w6R2<2tE0l&@$3HYo|3gzQhNSnCl=!XELF){xMO zVOowC8&<~%!%!+-NKMbe6nl*YcI5V zYJ&NRkF&vr%WU+q2lF1lU?-O^-GZNDskYNBpN`kV!(aPgxlHTT#wqjtmGA&=s};T2 zjE>uT`ju-(hf9m^K6dqQrIXa_+Rv}MM}GwF^TyKc-wTU3m^&*>@7eL=F92dH<*NR& HwDFdgVhf9Ks!(i$ny>OtAWQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyvFlc$Sgh{pM)L8rMG3^=@Q{{O$p`t7BNW1mD+?G!w^;tkj$ z(itxFDR3sIr)^#L`so{%PjmYM-riK)$MRAsEYzTK67RjU>c3}HyQct6WAJqKb6Mw< G&;$UsBSU@w literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/arrow_right.png b/webapp/loadTests/25users/style/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a609f80fe17e6f185e1b6373f668fc1f28baae2c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu@pObhHwBu4M$1`knic~;uxYa zvG@EzE(Qe-<_o&N{>R5n@3?e|Q?{o)*sCe{Y!G9XUG*c;{fmVEy{&lgYDVka)lZ$Q rCit0rf5s|lpJ$-R@IrLOqF~-LT3j-WcUP(c4Q23j^>bP0l+XkKUN$bz literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/arrow_right_black.png b/webapp/loadTests/25users/style/arrow_right_black.png new file mode 100644 index 0000000000000000000000000000000000000000..651bd5d27675d9e92ac8d477f2db9efa89c2b355 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`!T#~#}T5FGAlLHD#mbgZgIOpf)rskC}I2WZRmZYXA zlxLP?D7bt2281{Ai31gRdb&7a_JLSF1VWMQKse&#dLi5wlM1_0 z{FM;Ti|sk&y~DuuWXc=~!vbOZMy|V())CrJpY;0L8wi!QM>m&zYv9kY5B?3u;2c!O zs6ZM%Cwv?}ZUCR5a}lC&3CiHSi?f8KBR+xu!araKY=q^sqfcTxa>ExJ5kHFbN8w@G zFbUZkx(k2U9zdM>;c2eb9<@Vt5POLKHVlK|b%E|Ae7gwwDx3hf9oZ^{qwoRjg6;52 zcpeJLI}f_J>rdS@R>r_B=yd$%s`3!zFD&bhZdZTkLaK?cPhvA2 zKl><4eGxC4a;Mdo*PR{+mo_KQ0&Hlk7(2(YeOGR{yx#iw!sRK{pC^Z_`%&gZIOHn( z0A)|bA46eyt%M^3$D@Q6QTcTUVt9h#E14pioqpnJ5Fv4vueCTp(_y(W_1RLr&f2 zqI)=IL-U*F1Lco^e7uSJ_DHlro5zyo?tjgxFM|B=QxDdXXQn?~UhTf54G*EKdD-|u zWftJKwuxmXUXwQ)-H%*()s8zUXDUnsXPpUz?CyzqH4f0-=E{2#{o&G^u_}`4MWPK| zGcOFrhQ_|B|0!d~OW(w?ZnYrKW>-GtKStgfYlX>^DA8Z$%3n^K?&qG-Jk_EOS}M&~ zSmyKt;kMY&T4m~Q6TU}wa>8Y`&PSBh4?T@@lTT9pxFoTjwOyl|2O4L_#y<(a2I`l( z_!a5jhgQ_TIdUr)8=4RH#^M$;j#_w?Px@py3nrhDhiKc)UU?GZD0>?D-D{Dt(GYo> z{mz&`fvtJyWsiEu#tG^&D6w2!Q}%77YrgU->oD<47@K|3>re}AiN6y)?PZJ&g*E?a zKTsDRQLmTaI&A1ZdIO9NN$rJnU;Z3Adexu2ePcTAeC}{L>Br!2@E6#XfZ{#`%~>X& z=AN$5tsc5kzOxRXr#W;#7#o`Z7J&8>o@2-Hf7Kkm!IjVCzgl^TIpI5AzN#yZ@~41% z3?8H2{p-qO(%6fPB=3LfX@mT$KG1!s`_Axt!dfRxdvzbLVLaRm@%_FltoUKGf*0d+ ziZ5(8A*2esb2%T!qR?L?zjmkbm{QqUbpo+5Y;bl<5@UZ>vksWYd= z)qkY5f?t3sS9McgxSvZB!y4B+m=m1+1HSLY^_yU9NU9HI=MZCKZ1qyBuJVc^sZe8I z76_F!A|Lxc=ickgKD?!mwk6ugVUJ6j9zaj^F=hXOxLKez+Y7DZig(sV+HgH#tq*Fq zv9Xu9c`>~afx=SHJ#wJXPWJ`Nn9dG0~%k(XL|0)b(fP9EKlYB(7M_h zTG8GN*3cg0nE{&5KXv6lO?Vx8{oFR{3;PP4=f?@yR=;-h)v?bYy(tW%oae#4-W?$S z^qDI!&nGH(RS)ppgpSgYFay zfX-0*!FbR*qP1P)#q_s)rf1k8c`Iw)A8G^pRqYAB!v3HiWsHnrp7XVCwx{i$<6HT! z!K7 zY1Mc-Co%a;dLZe6FN_B`E73b>oe7VIDLfDA+(FWyvn4$zdST9EFRHo+DTeofqdI0t$jFNyI9 zQfKTs`+N&tf;p7QOzXUtYC?Dr<*UBkb@qhhywuir2b~Ddgzcd7&O_93j-H`?=(!=j z1?gFE7pUGk$EX0k7tBH43ZtM8*X?+Z>zw&fPHW1kb9TfwXB^HsjQpVUhS`Cj-I%lA zbT_kuk;YD&cxR8!i=aB3BLDon2E1oRHx)XraG zuGLrVtNJ!Ffw11ONMCIBde24Mnv(V`$X}}Klc4h|z4z9q$?+f8KLXj(dr-YU?E^Z0 zGQ{8Gs4Vn;7t=q592Ga@3J|ZeqBAi)wOyY%d;Un91$yUG28$_o1dMi}Gre)7_45VK zryy5>>KlQFNV}f)#`{%;5Wgg*WBl|S?^s%SRRBHNHg(lKdBFpfrT*&$ZriH&9>{dt z=K2vZWlO4UTS4!rZwE8~e1o`0L1ju$=aV`&d?kU6To*82GLSz2>FVD36XXNCt;;{I zvq57=dTunvROdvbqqtd@t<(%LcAKMP`u}6Xp5IFF4xtHY8gr_nyL?^04*8(5sJZc9 zARYN=GpqrfH;SLYgDO|GA*^v_+NFDBKJ!ks?+Q$<858o=!|*N~fnD$zzIX1Wn7u*7 z6@$uGA84*U@1m5j@-ffb9g)8U>8c&l+e%yG?+W#PgfseheRwyb@!A&nt}D_mr@)TC z7vWw~{3ejS!{A3}400?;YTQfqhMu4?q5D~5@d?s2ZnI2#jih|Og|gfGYdK?%wYv*> z*MY{vX>83k`B@9}9YF@Dekyw*>;aXndM*a1KTICC^cUJ%e}<>k`j> z&a;&EIBlRiq{Dc44?=J^+zYuNTOWY-tv!wV36BKrC$tVvQathjI1A5#_IcXhYR{#5 zXuolbqsM-i@OsdmWd=IVH#3CQ?&I(>JPALBr7#E1fa3Ihz4E^RQPBQp13Uv-XFmt6 znG0h~jmgiD_k;5e7^$+h!$Eiow7$Ixs{d=C=Tfb)^3OIn3Ad{L_>Vn;-IVKA(2@G+ z8!hM&P7LH*?Hb7SjjFRsUd%6%NRz+7xKmOnt_Vj9eV__wnvUqALE y@<9iX-XLgKmGb5P*V(C?vZI{Ap0ljoe9iI#Pp2!ETh`m`k}sX$tTjPb`Thqd2I;E+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/little_arrow_right.png b/webapp/loadTests/25users/style/little_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..252abe66d3a92aced2cff2df88e8a23d91459251 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd;O^<-7$PB=oN$2m z-(ru2pAv$OC-6w{28nSzPFOlManYH8W7Z01d5`Q)6p~NiIh8RX*um{#37-cePkG{I i?kCneiZ^N=&|+f{`pw(F`1}WPkkOv5elF{r5}E)*4>EfI literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/logo-enterprise.svg b/webapp/loadTests/25users/style/logo-enterprise.svg new file mode 100644 index 0000000..4a6e1de --- /dev/null +++ b/webapp/loadTests/25users/style/logo-enterprise.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/webapp/loadTests/25users/style/logo.svg b/webapp/loadTests/25users/style/logo.svg new file mode 100644 index 0000000..f519eef --- /dev/null +++ b/webapp/loadTests/25users/style/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/webapp/loadTests/25users/style/sortable.png b/webapp/loadTests/25users/style/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb54f9acddb8848e68b640d416bf959cb18b6a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd5b5dS7$PCr+ka7z zL4e13=24exMiQ@YG*qwKncdI-GfUZ1Rki=vCY#SQRzF`R>17u7PVwr=D?vVeZ+UA{ zG@h@BI20Mdp}F2&UODjiSKfWA%2W&v$1X_F*vS}sO7fVb_47iIWuC5nF6*2Ung9-k BJ)r;q literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/sorted-down.png b/webapp/loadTests/25users/style/sorted-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5100cc8efd490cf534a6186f163143bc59de3036 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVDIVT7$PB=oN$2m z-{GYajXDDFEn-;Il?7IbEN2SgoY1K-S+LB}QlU75b4p`dJwwurrwV2sJj^AGt`0LQ Z7#M<{@}@-BSMLEC>FMg{vd$@?2>{QlDr5iv literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/sorted-up.png b/webapp/loadTests/25users/style/sorted-up.png new file mode 100644 index 0000000000000000000000000000000000000000..340a5f0370f1a74439459179e9c4cf1610de75d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVD0JR7$PB=oN$2m z-(rtihEG!hT@vQ#Ni?%SDB=JB literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/stat-fleche-bas.png b/webapp/loadTests/25users/style/stat-fleche-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b501a37f521fa56ce790b5279b204cf16f275 GIT binary patch literal 625 zcmV-%0*?KOP)X1^@s6HR9gx0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6G=otRCwBaRk3XYF$@$1uayA|xJs2O zh6iw!${V;%XBun$AzDJ_5hsobnt%D0lR{6AC-TZ=qQYNSE%4fZr(r%*U%{3#@fMV-wZ|U32I`2RVTet9ov9a1><;a zc490LC;}x<)W9HSa|@E2D5Q~wPER)4Hd~) z7a}hi*bPEZ3E##6tEpfWilBDoTvc z!^R~Z;5%h77OwQK2sCp1=!WSe*z2u-)=XU8l4MF00000 LNkvXXu0mjfMhXuu literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/stat-l-roue.png b/webapp/loadTests/25users/style/stat-l-roue.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a3aae0169d62a079278f0a6737f3376f1b45ae GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!N$PAIIE<7Cy>LE?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2hb1*QrXELw=S&Tp|1;h*tObeLcA_5DT;cR}8^0f~MUKVSdnX!bNbd8LT)Sw-%(F%_zr0N|UagV3xWgqvH;8K?&n0oOR41jMpR4np z@3~veKIhln&vTy7`M&S_y+s{K$4a+%SBakr4tulXXK%nlnMZA<7fW86CAV}Io#FMZ zJKEZlXuR&E=;dFVn4ON?-myI9m-fc)cdfl=xStxmHlE_%*ZyqH3w8e^yf4K+{I{K9 z7w&AxcaMk7ySZ|)QCy;@Qg`etYuie0o>bqd-!G^vY&6qP5x86+IYoDN%G}3H>wNMj zPL^13>44!EmANYvNU$)%J@GUM4J8`33?}zp?$qRpGv)z8kkP`CHe&Oqvvu;}m~M yv&%5+ugjcD{r&Hid!>2~a6b9iXUJ`u|A%4w{h$p3k*sGyq3h}D=d#Wzp$Py=EVp6+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/stat-l-temps.png b/webapp/loadTests/25users/style/stat-l-temps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce268037f94ef73f56cd658d392ef393d562db3 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^{2w#$-&vQnwtC-_ zkh{O~uCAT`QnSlTzs$^@t=jDWl)1cj-p;w{budGVRji^Z`nX^5u3Kw&?Kk^Y?fZDw zg5!e%<_ApQ}k@w$|KtRPs~#LkYapu zf%*GA`~|UpRDQGRR`SL_+3?i5Es{UA^j&xb|x=ujSRd8$p5V>FVdQ&MBb@04c<~BLDyZ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/25users/style/style.css b/webapp/loadTests/25users/style/style.css new file mode 100644 index 0000000..7f50e1b --- /dev/null +++ b/webapp/loadTests/25users/style/style.css @@ -0,0 +1,988 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --gatling-background-color: #f2f2f2; + --gatling-background-light-color: #f7f7f7; + --gatling-border-color: #dddddd; + --gatling-blue-color: #4a9fe5; + --gatling-dark-blue-color: #24275e; + --gatling-danger-color: #f15b4f; + --gatling-danger-light-color: #f5d1ce; + --gatling-enterprise-color: #6161d6; + --gatling-enterprise-light-color: #c4c4ed; + --gatling-gray-medium-color: #bbb; + --gatling-hover-color: #e6e6e6; + --gatling-light-color: #ffffff; + --gatling-orange-color: #f78557; + --gatling-success-color: #68b65c; + --gatling-text-color: #1f2024; + --gatling-total-color: #ffa900; + + --gatling-border-radius: 2px; + --gatling-spacing-small: 5px; + --gatling-spacing: 10px; + --gatling-spacing-layout: 20px; + + --gatling-font-weight-normal: 400; + --gatling-font-weight-medium: 500; + --gatling-font-weight-bold: 700; + --gatling-font-size-secondary: 12px; + --gatling-font-size-default: 14px; + --gatling-font-size-heading: 16px; + --gatling-font-size-section: 22px; + --gatling-font-size-header: 34px; + + --gatling-media-desktop-large: 1920px; +} + +* { + min-height: 0; + min-width: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + color: var(--gatling-text-color); + font-family: arial; + font-size: var(--gatling-font-size-secondary); + margin: 0; +} + +.app-container { + display: flex; + flex-direction: column; + + height: 100%; + width: 100%; +} + +.head { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + + flex: 1; + + background-color: var(--gatling-light-color); + border-bottom: 1px solid var(--gatling-border-color); + min-height: 69px; + padding: 0 var(--gatling-spacing-layout); +} + +.gatling-open-source { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + gap: var(--gatling-spacing-layout); +} + +.gatling-documentation { + display: flex; + align-items: center; + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-orange-color); + border: 1px solid var(--gatling-orange-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 23px; +} + +.gatling-documentation:hover { + background-color: var(--gatling-orange-color); + color: var(--gatling-light-color); +} + +.gatling-logo { + height: 35px; +} + +.gatling-logo img { + height: 100%; +} + +.container { + display: flex; + align-items: stretch; + height: 100%; +} + +.nav { + min-width: 210px; + width: 210px; + max-height: calc(100vh - var(--gatling-spacing-layout) - var(--gatling-spacing-layout)); + background: var(--gatling-light-color); + border-right: 1px solid var(--gatling-border-color); + overflow-y: auto; +} + +@media print { + .nav { + display: none; + } +} + +@media screen and (min-width: 1920px) { + .nav { + min-width: 310px; + width: 310px; + } +} + +.nav ul { + display: flex; + flex-direction: column; + + padding: 0; + margin: 0; +} + +.nav li { + display: flex; + list-style: none; + width: 100%; + padding: 0; +} + +.nav .item { + display: inline-flex; + align-items: center; + margin: 0 auto; + white-space: nowrap; + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + margin: 0; + width: 100%; +} + +.nav .item .nav-label { + padding: var(--gatling-spacing) var(--gatling-spacing-layout); +} + +.nav .item:hover { + background-color: var(--gatling-hover-color); +} + +.nav .on .item { + background-color: var(--gatling-orange-color); +} + +.nav .on .item span { + color: var(--gatling-light-color); +} + +.cadre { + width: 100%; + height: 100%; + overflow-y: scroll; + scroll-behavior: smooth; +} + +@media print { + .cadre { + overflow-y: unset; + } +} + +.frise { + position: absolute; + top: 60px; + z-index: -1; + + background-color: var(--gatling-background-color); + height: 530px; +} + +.global { + height: 650px +} + +a { + text-decoration: none; +} + +a:hover { + color: var(--gatling-hover-color); +} + +img { + border: 0; +} + +h1 { + color: var(--gatling-dark-blue-color); + font-size: var(--gatling-font-size-section); + font-weight: var(--gatling-font-weight-medium); + text-align: center; + margin: 0; +} + +h1 span { + color: var(--gatling-hover-color); +} + +.enterprise { + display: flex; + align-items: center; + justify-content: center; + gap: var(--gatling-spacing-small); + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-enterprise-color); + color: var(--gatling-enterprise-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 25px; +} + +.enterprise:hover { + background-color: var(--gatling-enterprise-light-color); + color: var(--gatling-enterprise-color); +} + +.enterprise img { + display: block; + width: 160px; +} + +.simulation-card { + display: flex; + flex-direction: column; + align-self: stretch; + flex: 1; + gap: var(--gatling-spacing-layout); + max-height: 375px; +} + +#simulation-information { + flex: 1; +} + +.simulation-version-information { + display: flex; + flex-direction: column; + + gap: var(--gatling-spacing); + font-size: var(--gatling-font-size-default); + + background-color: var(--gatling-background-color); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing); +} + +.simulation-information-container { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing); +} + +.withTooltip .popover-title { + display: none; +} + +.popover-content p { + margin: 0; +} + +.ellipsed-name { + display: block; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.simulation-information-item { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--gatling-spacing-small); +} + +.simulation-information-item.description { + flex-direction: column; +} + +.simulation-information-label { + display: inline-block; + font-weight: var(--gatling-font-weight-bold); + min-width: fit-content; +} + +.simulation-information-title { + display: block; + text-align: center; + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + width: 100%; +} + +.simulation-tooltip span { + display: inline-block; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; +} + +.content { + display: flex; + flex-direction: column; +} + +.content-in { + width: 100%; + height: 100%; + + overflow-x: scroll; +} + +@media print { + .content-in { + overflow-x: unset; + } +} + +.container-article { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + min-width: 1050px; + width: 1050px; + margin: 0 auto; + padding: var(--gatling-spacing-layout); + box-sizing: border-box; +} + +@media screen and (min-width: 1920px) { + .container-article { + min-width: 1350px; + width: 1350px; + } + + #responses * .highcharts-tracker { + transform: translate(400px, 70px); + } +} + +.content-header { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + background-color: var(--gatling-background-light-color); + border-bottom: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-layout) var(--gatling-spacing-layout) 0; +} + +.onglet { + font-size: var(--gatling-font-size-header); + font-weight: var(--gatling-font-weight-medium); + text-align: center; +} + +.sous-menu { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.sous-menu-spacer { + display: flex; + align-items: center; + flex-direction: row; +} + +.sous-menu .item { + margin-bottom: -1px; +} + +.sous-menu a { + display: block; + + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-normal); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border-bottom: 2px solid transparent; + color: var(--gatling-text-color); + text-align: center; + width: 100px; +} + +.sous-menu a:hover { + border-bottom-color: var(--gatling-text-color); +} + +.sous-menu .ouvert a { + border-bottom-color: var(--gatling-orange-color); + font-weight: var(--gatling-font-weight-bold); +} + +.article { + position: relative; + + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); +} + +.infos { + width: 340px; + color: var(--gatling-light-color); +} + +.infos-title { + background-color: var(--gatling-background-light-color); + border: 1px solid var(--gatling-border-color); + border-bottom: 0; + border-top-left-radius: var(--gatling-border-radius); + border-top-right-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.info { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + height: 100%; + margin: 0; +} + +.info table { + margin: auto; + padding-right: 15px; +} + +.alert-danger { + background-color: var(--gatling-danger-light-color); + border: 1px solid var(--gatling-danger-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + padding: var(--gatling-spacing-layout); + font-weight: var(--gatling-font-weight-bold); +} + +.repli { + position: absolute; + bottom: 0; + right: 0; + + background: url('stat-fleche-bas.png') no-repeat top left; + height: 25px; + width: 22px; +} + +.infos h2 { + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + height: 19px; + margin: 0; + padding: 3.5px 0 0 35px; +} + +.infos .first { + background: url('stat-l-roue.png') no-repeat 15px 5px; +} + +.infos .second { + background: url('stat-l-temps.png') no-repeat 15px 3px; + border-top: 1px solid var(--gatling-border-color); +} + +.infos th { + text-align: center; +} + +.infos td { + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing-small); + -webkit-border-radius: var(--gatling-border-radius); + -moz-border-radius: var(--gatling-border-radius); + -ms-border-radius: var(--gatling-border-radius); + -o-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + text-align: right; + width: 50px; +} + +.infos .title { + width: 120px; +} + +.infos .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); +} + +.infos .total { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); +} + +.infos .ko { + background-color: var(--gatling-danger-color); + -webkit-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); +} + +.schema-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--gatling-spacing-layout); +} + +.schema { + background: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); +} + +.ranges { + height: 375px; + width: 500px; +} + +.ranges-large { + height: 375px; + width: 530px; +} + +.geant { + height: 362px; +} + +.extensible-geant { + width: 100%; +} + +.polar { + height: 375px; + width: 230px; +} + +.chart_title { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + padding: 2px var(--gatling-spacing); +} + +.statistics { + display: flex; + flex-direction: column; + + background-color: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border-collapse: collapse; + color: var(--gatling-text-color); + max-height: 100%; +} + +.statistics .title { + display: flex; + text-align: center; + justify-content: space-between; + + min-height: 49.5px; + box-sizing: border-box; + + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing); +} + +.title_base { + display: flex; + align-items: center; + text-align: left; + user-select: none; +} + +.title_base_stats { + color: var(--gatling-text-color); + margin-right: 20px; +} + +.toggle-table { + position: relative; + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: 25px; + width: 40px; + height: 20px; + margin: 0 var(--gatling-spacing-small); +} + +.toggle-table::before { + position: absolute; + top: calc(50% - 9px); + left: 1px; + content: ""; + width: 50%; + height: 18px; + border-radius: 50%; + background-color: var(--gatling-text-color); +} + +.toggle-table.off::before { + left: unset; + right: 1px; +} + +.title_expanded { + cursor: pointer; + color: var(--gatling-text-color); +} + +.expand-table, +.collapse-table { + font-size: var(--gatling-font-size-secondary); + font-weight: var(--gatling-font-weight-normal); +} + +.title_expanded span.expand-table { + color: var(--gatling-gray-medium-color); +} + +.title_collapsed { + cursor: pointer; + color: var(--gatling-text-color); +} + +.title_collapsed span.collapse-table { + color: var(--gatling-gray-medium-color); +} + +#container_statistics_head { + position: sticky; + top: -1px; + + background: var(--gatling-background-light-color); + margin-top: -1px; + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); +} + +#container_statistics_body { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + margin-top: -1px; + padding: 0px var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small); +} + +#container_errors { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); + margin-top: -1px; +} + +#container_assertions { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small); + margin-top: -1px; +} + +.statistics-in { + border-spacing: var(--gatling-spacing-small); + border-collapse: collapse; + margin: 0; +} + +.statistics .scrollable { + max-height: 100%; + overflow-y: auto; +} + +#statistics_table_container .statistics .scrollable { + max-height: 785px; +} + +.statistics-in a { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .header { + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small); +} + +.sortable { + cursor: pointer; +} + +.sortable span { + background: url('sortable.png') no-repeat right 3px; + padding-right: 10px; +} + +.sorted-up span { + background-image: url('sorted-up.png'); +} + +.sorted-down span { + background-image: url('sorted-down.png'); +} + +.executions { + background: url('stat-l-roue.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.response-time { + background: url('stat-l-temps.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.statistics-in td { + background-color: var(--gatling-light-color); + border: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-small); + min-width: 50px; +} + +.statistics-in .col-1 { + width: 175px; + max-width: 175px; +} +@media screen and (min-width: 1200px) { + .statistics-in .col-1 { + width: 50%; + } +} + +.expandable-container { + display: flex; + flex-direction: row; + box-sizing: border-box; + max-width: 100%; +} + +.statistics-in .value { + text-align: right; + width: 50px; +} + +.statistics-in .total { + color: var(--gatling-text-color); +} + +.statistics-in .col-2 { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .error-col-1 { + background-color: var(--gatling-light-color); + color: var(--gatling-text-color); +} + +.statistics-in .error-col-2 { + text-align: center; +} + +.statistics-in .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .ko { + background-color: var(--gatling-danger-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .expand-button { + padding-left: var(--gatling-spacing); + cursor: pointer; +} + +.expand-button.hidden { + background: none; + cursor: default; +} + +.statistics-button { + background-color: var(--gatling-light-color); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); +} + +.statistics-button:hover:not(:disabled) { + cursor: pointer; + background-color: var(--gatling-hover-color); +} + +.statistics-in .expand-button.expand { + background: url('little_arrow_right.png') no-repeat 3px 3px; +} + +.statistics-in .expand-button.collapse { + background: url('sorted-down.png') no-repeat 3px 3px; +} + +.nav .expand-button { + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.nav .expand-button.expand { + background: url('arrow_right_black.png') no-repeat 5px 10px; + cursor: pointer; +} + +.nav .expand-button.collapse { + background: url('arrow_down_black.png') no-repeat 3px 12px; + cursor: pointer; +} + +.nav .on .expand-button.expand { + background-image: url('arrow_right_black.png'); +} + +.nav .on .expand-button.collapse { + background-image: url('arrow_down_black.png'); +} + +.right { + display: flex; + align-items: center; + gap: var(--gatling-spacing); + float: right; + font-size: var(--gatling-font-size-default); +} + +.withTooltip { + outline: none; +} + +.withTooltip:hover { + text-decoration: none; +} + +.withTooltip .tooltipContent { + position: absolute; + z-index: 10; + display: none; + + background: var(--gatling-orange-color); + -webkit-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + -moz-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); + margin-top: -5px; + padding: var(--gatling-spacing-small); +} + +.withTooltip:hover .tooltipContent { + display: inline; +} + +.statistics-table-modal { + height: calc(100% - 60px); + width: calc(100% - 60px); + border-radius: var(--gatling-border-radius); +} + +.statistics-table-modal::backdrop { + position: fixed; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + + background-color: rgba(100, 100, 100, 0.9); +} + +.statistics-table-modal-container { + display: flex; + flex-direction: column; + + width: 100%; + height: calc(100% - 35px); + overflow-x: auto; +} + +.button-modal { + cursor: pointer; + + height: 25px; + width: 25px; + + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); +} + +.button-modal:hover { + background-color: var(--gatling-background-color); +} + +.statistics-table-modal-header { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-bottom: var(--gatling-spacing); +} + +.statistics-table-modal-content { + flex: 1; + overflow-y: auto; + min-width: 1050px; +} + +.statistics-table-modal-footer { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-top: var(--gatling-spacing); +} diff --git a/webapp/loadTests/50UsersIn1Min.html b/webapp/loadTests/50users1minute/50UsersIn1Min.html similarity index 100% rename from webapp/loadTests/50UsersIn1Min.html rename to webapp/loadTests/50users1minute/50UsersIn1Min.html diff --git a/webapp/loadTests/50users1minute/js/all_sessions.js b/webapp/loadTests/50users1minute/js/all_sessions.js new file mode 100644 index 0000000..a22431b --- /dev/null +++ b/webapp/loadTests/50users1minute/js/all_sessions.js @@ -0,0 +1,11 @@ +allUsersData = { + +color: '#FFA900', +name: 'Active Users', +data: [ + [1682848692000,2],[1682848693000,3],[1682848694000,4],[1682848695000,5],[1682848696000,5],[1682848697000,6],[1682848698000,7],[1682848699000,8],[1682848700000,9],[1682848701000,10],[1682848702000,10],[1682848703000,11],[1682848704000,12],[1682848705000,13],[1682848706000,14],[1682848707000,15],[1682848708000,15],[1682848709000,16],[1682848710000,17],[1682848711000,18],[1682848712000,19],[1682848713000,20],[1682848714000,20],[1682848715000,21],[1682848716000,22],[1682848717000,23],[1682848718000,24],[1682848719000,25],[1682848720000,25],[1682848721000,26],[1682848722000,27],[1682848723000,28],[1682848724000,29],[1682848725000,30],[1682848726000,28],[1682848727000,28],[1682848728000,28],[1682848729000,28],[1682848730000,29],[1682848731000,30],[1682848732000,29],[1682848733000,29],[1682848734000,28],[1682848735000,29],[1682848736000,29],[1682848737000,30],[1682848738000,28],[1682848739000,29],[1682848740000,29],[1682848741000,29],[1682848742000,29],[1682848743000,29],[1682848744000,28],[1682848745000,29],[1682848746000,29],[1682848747000,29],[1682848748000,29],[1682848749000,29],[1682848750000,29],[1682848751000,27],[1682848752000,26],[1682848753000,26],[1682848754000,25],[1682848755000,24],[1682848756000,23],[1682848757000,23],[1682848758000,22],[1682848759000,21],[1682848760000,20],[1682848761000,20],[1682848762000,19],[1682848763000,19],[1682848764000,18],[1682848765000,18],[1682848766000,18],[1682848767000,17],[1682848768000,17],[1682848769000,17],[1682848770000,17],[1682848771000,15],[1682848772000,14],[1682848773000,13],[1682848774000,11],[1682848775000,9],[1682848776000,8],[1682848777000,7],[1682848778000,5],[1682848779000,5],[1682848780000,5],[1682848781000,5],[1682848782000,5],[1682848783000,5],[1682848784000,5],[1682848785000,4] +], +tooltip: { yDecimals: 0, ySuffix: '', valueDecimals: 0 } + , zIndex: 20 + , yAxis: 1 +}; \ No newline at end of file diff --git a/webapp/loadTests/50users1minute/js/assertions.json b/webapp/loadTests/50users1minute/js/assertions.json new file mode 100644 index 0000000..4515166 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/assertions.json @@ -0,0 +1,10 @@ +{ + "simulation": "RecordedSimulation", + "simulationId": "recordedsimulation-20230430095810574", + "start": 1682848691560, + "description": "", + "scenarios": ["RecordedSimulation"], + "assertions": [ + + ] +} \ No newline at end of file diff --git a/webapp/loadTests/50users1minute/js/assertions.xml b/webapp/loadTests/50users1minute/js/assertions.xml new file mode 100644 index 0000000..5e4dbe9 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/assertions.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/webapp/loadTests/50users1minute/js/bootstrap.min.js b/webapp/loadTests/50users1minute/js/bootstrap.min.js new file mode 100644 index 0000000..ea41042 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-tooltip.js, bootstrap-popover.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){var b=function(a,b){this.init("tooltip",a,b)};b.prototype={constructor:b,init:function(b,c,d){var e,f;this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.enabled=!0,this.options.trigger=="click"?this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this)):this.options.trigger!="manual"&&(e=this.options.trigger=="hover"?"mouseenter":"focus",f=this.options.trigger=="hover"?"mouseleave":"blur",this.$element.on(e+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(f+"."+this.type,this.options.selector,a.proxy(this.leave,this))),this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},getOptions:function(b){return b=a.extend({},a.fn[this.type].defaults,b,this.$element.data()),b.delay&&typeof b.delay=="number"&&(b.delay={show:b.delay,hide:b.delay}),b},enter:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);if(!c.options.delay||!c.options.delay.show)return c.show();clearTimeout(this.timeout),c.hoverState="in",this.timeout=setTimeout(function(){c.hoverState=="in"&&c.show()},c.options.delay.show)},leave:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);this.timeout&&clearTimeout(this.timeout);if(!c.options.delay||!c.options.delay.hide)return c.hide();c.hoverState="out",this.timeout=setTimeout(function(){c.hoverState=="out"&&c.hide()},c.options.delay.hide)},show:function(){var a,b,c,d,e,f,g;if(this.hasContent()&&this.enabled){a=this.tip(),this.setContent(),this.options.animation&&a.addClass("fade"),f=typeof this.options.placement=="function"?this.options.placement.call(this,a[0],this.$element[0]):this.options.placement,b=/in/.test(f),a.detach().css({top:0,left:0,display:"block"}).insertAfter(this.$element),c=this.getPosition(b),d=a[0].offsetWidth,e=a[0].offsetHeight;switch(b?f.split(" ")[1]:f){case"bottom":g={top:c.top+c.height,left:c.left+c.width/2-d/2};break;case"top":g={top:c.top-e,left:c.left+c.width/2-d/2};break;case"left":g={top:c.top+c.height/2-e/2,left:c.left-d};break;case"right":g={top:c.top+c.height/2-e/2,left:c.left+c.width}}a.offset(g).addClass(f).addClass("in")}},setContent:function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},hide:function(){function d(){var b=setTimeout(function(){c.off(a.support.transition.end).detach()},500);c.one(a.support.transition.end,function(){clearTimeout(b),c.detach()})}var b=this,c=this.tip();return c.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d():c.detach(),this},fixTitle:function(){var a=this.$element;(a.attr("title")||typeof a.attr("data-original-title")!="string")&&a.attr("data-original-title",a.attr("title")||"").removeAttr("title")},hasContent:function(){return this.getTitle()},getPosition:function(b){return a.extend({},b?{top:0,left:0}:this.$element.offset(),{width:this.$element[0].offsetWidth,height:this.$element[0].offsetHeight})},getTitle:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||(typeof c.title=="function"?c.title.call(b[0]):c.title),a},tip:function(){return this.$tip=this.$tip||a(this.options.template)},validate:function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},enable:function(){this.enabled=!0},disable:function(){this.enabled=!1},toggleEnabled:function(){this.enabled=!this.enabled},toggle:function(b){var c=a(b.currentTarget)[this.type](this._options).data(this.type);c[c.tip().hasClass("in")?"hide":"show"]()},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}},a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("tooltip"),f=typeof c=="object"&&c;e||d.data("tooltip",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.defaults={animation:!0,placement:"top",selector:!1,template:'
    ',trigger:"hover",title:"",delay:0,html:!1}}(window.jQuery),!function(a){var b=function(a,b){this.init("popover",a,b)};b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype,{constructor:b,setContent:function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content > *")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in")},hasContent:function(){return this.getTitle()||this.getContent()},getContent:function(){var a,b=this.$element,c=this.options;return a=b.attr("data-content")||(typeof c.content=="function"?c.content.call(b[0]):c.content),a},tip:function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip},destroy:function(){this.hide().$element.off("."+this.type).removeData(this.type)}}),a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("popover"),f=typeof c=="object"&&c;e||d.data("popover",e=new b(this,f)),typeof c=="string"&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.defaults=a.extend({},a.fn.tooltip.defaults,{placement:"right",trigger:"click",content:"",template:'

    '})}(window.jQuery) \ No newline at end of file diff --git a/webapp/loadTests/50users1minute/js/ellipsis.js b/webapp/loadTests/50users1minute/js/ellipsis.js new file mode 100644 index 0000000..781d0de --- /dev/null +++ b/webapp/loadTests/50users1minute/js/ellipsis.js @@ -0,0 +1,26 @@ +function parentId(name) { + return "parent-" + name; +} + +function isEllipsed(name) { + const child = document.getElementById(name); + const parent = document.getElementById(parentId(name)); + const emptyData = parent.getAttribute("data-content") === ""; + const hasOverflow = child.clientWidth < child.scrollWidth; + + if (hasOverflow) { + if (emptyData) { + parent.setAttribute("data-content", name); + } + } else { + if (!emptyData) { + parent.setAttribute("data-content", ""); + } + } +} + +function ellipsedLabel ({ name, parentClass = "", childClass = "" }) { + const child = "" + name + ""; + + return "" + child + ""; +} diff --git a/webapp/loadTests/50users1minute/js/gatling.js b/webapp/loadTests/50users1minute/js/gatling.js new file mode 100644 index 0000000..0208f82 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/gatling.js @@ -0,0 +1,137 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +(function ($) { + $.fn.expandable = function () { + var scope = this; + + this.find('.expand-button:not([class*=hidden])').addClass('collapse').on('click', function () { + var $this = $(this); + + if ($this.hasClass('expand')) + $this.expand(scope); + else + $this.collapse(scope); + }); + + this.find('.expand-all-button').on('click', function () { + $(this).expandAll(scope); + }); + + this.find('.collapse-all-button').on('click', function () { + $(this).collapseAll(scope); + }); + + this.collapseAll(this); + + return this; + }; + + $.fn.expand = function (scope, recursive) { + return this.each(function () { + var $this = $(this); + + if (recursive) { + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + scope.find('*[data-parent=' + $this.attr('id') + ']').find('.expand-button.expand').expand(scope, true); + } + + if ($this.hasClass('expand')) { + $('*[data-parent=' + $this.attr('id') + ']').toggle(true); + $this.toggleClass('expand').toggleClass('collapse'); + } + }); + }; + + $.fn.expandAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.expand').expand(scope, true); + $('*[data-parent=ROOT]').find('.expand-button.collapse').expand(scope, true); + }; + + $.fn.collapse = function (scope) { + return this.each(function () { + var $this = $(this); + + scope.find('*[data-parent=' + $this.attr('id') + '] .expand-button.collapse').collapse(scope); + scope.find('*[data-parent=' + $this.attr('id') + ']').toggle(false); + $this.toggleClass('expand').toggleClass('collapse'); + }); + }; + + $.fn.collapseAll = function (scope) { + $('*[data-parent=ROOT]').find('.expand-button.collapse').collapse(scope); + }; + + $.fn.sortable = function (target) { + var table = this; + + this.find('thead .sortable').on('click', function () { + var $this = $(this); + + if ($this.hasClass('sorted-down')) { + var desc = false; + var style = 'sorted-up'; + } + else { + var desc = true; + var style = 'sorted-down'; + } + + $(target).sortTable($this.attr('id'), desc); + + table.find('thead .sortable').removeClass('sorted-up sorted-down'); + $this.addClass(style); + + return false; + }); + + return this; + }; + + $.fn.sortTable = function (col, desc) { + function getValue(line) { + var cell = $(line).find('.' + col); + + if (cell.hasClass('value')) + var value = cell.text(); + else + var value = cell.find('.value').text(); + + return parseFloat(value); + } + + function sortLines (lines, group) { + var notErrorTable = col.search("error") == -1; + var linesToSort = notErrorTable ? lines.filter('*[data-parent=' + group + ']') : lines; + + var sortedLines = linesToSort.sort(function (a, b) { + return desc ? getValue(b) - getValue(a): getValue(a) - getValue(b); + }).toArray(); + + var result = []; + $.each(sortedLines, function (i, line) { + result.push(line); + if (notErrorTable) + result = result.concat(sortLines(lines, $(line).attr('id'))); + }); + + return result; + } + + this.find('tbody').append(sortLines(this.find('tbody tr').detach(), 'ROOT')); + + return this; + }; +})(jQuery); diff --git a/webapp/loadTests/50users1minute/js/global_stats.json b/webapp/loadTests/50users1minute/js/global_stats.json new file mode 100644 index 0000000..08e9860 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/global_stats.json @@ -0,0 +1,77 @@ +{ + "name": "All Requests", + "numberOfRequests": { + "total": 2252, + "ok": 2238, + "ko": 14 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 181 + }, + "maxResponseTime": { + "total": 5617, + "ok": 5617, + "ko": 2036 + }, + "meanResponseTime": { + "total": 396, + "ok": 396, + "ko": 333 + }, + "standardDeviation": { + "total": 569, + "ok": 569, + "ko": 472 + }, + "percentiles1": { + "total": 125, + "ok": 121, + "ko": 203 + }, + "percentiles2": { + "total": 593, + "ok": 594, + "ko": 206 + }, + "percentiles3": { + "total": 1343, + "ok": 1343, + "ko": 856 + }, + "percentiles4": { + "total": 2553, + "ok": 2557, + "ko": 1800 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1931, + "percentage": 86 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 167, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 140, + "percentage": 6 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 14, + "percentage": 1 +}, + "meanNumberOfRequestsPerSecond": { + "total": 23.95744680851064, + "ok": 23.80851063829787, + "ko": 0.14893617021276595 + } +} \ No newline at end of file diff --git a/webapp/loadTests/50users1minute/js/highcharts-more.js b/webapp/loadTests/50users1minute/js/highcharts-more.js new file mode 100644 index 0000000..2d78893 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/highcharts-more.js @@ -0,0 +1,60 @@ +/* + Highcharts JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(x){"object"===typeof module&&module.exports?module.exports=x:x(Highcharts)})(function(x){(function(b){function r(b,a,d){this.init(b,a,d)}var t=b.each,w=b.extend,m=b.merge,q=b.splat;w(r.prototype,{init:function(b,a,d){var f=this,h=f.defaultOptions;f.chart=a;f.options=b=m(h,a.angular?{background:{}}:void 0,b);(b=b.background)&&t([].concat(q(b)).reverse(),function(a){var c,h=d.userOptions;c=m(f.defaultBackgroundOptions,a);a.backgroundColor&&(c.backgroundColor=a.backgroundColor);c.color=c.backgroundColor; +d.options.plotBands.unshift(c);h.plotBands=h.plotBands||[];h.plotBands!==d.options.plotBands&&h.plotBands.unshift(c)})},defaultOptions:{center:["50%","50%"],size:"85%",startAngle:0},defaultBackgroundOptions:{className:"highcharts-pane",shape:"circle",borderWidth:1,borderColor:"#cccccc",backgroundColor:{linearGradient:{x1:0,y1:0,x2:0,y2:1},stops:[[0,"#ffffff"],[1,"#e6e6e6"]]},from:-Number.MAX_VALUE,innerRadius:0,to:Number.MAX_VALUE,outerRadius:"105%"}});b.Pane=r})(x);(function(b){var r=b.CenteredSeriesMixin, +t=b.each,w=b.extend,m=b.map,q=b.merge,e=b.noop,a=b.Pane,d=b.pick,f=b.pInt,h=b.splat,u=b.wrap,c,l,k=b.Axis.prototype;b=b.Tick.prototype;c={getOffset:e,redraw:function(){this.isDirty=!1},render:function(){this.isDirty=!1},setScale:e,setCategories:e,setTitle:e};l={defaultRadialGaugeOptions:{labels:{align:"center",x:0,y:null},minorGridLineWidth:0,minorTickInterval:"auto",minorTickLength:10,minorTickPosition:"inside",minorTickWidth:1,tickLength:10,tickPosition:"inside",tickWidth:2,title:{rotation:0},zIndex:2}, +defaultRadialXOptions:{gridLineWidth:1,labels:{align:null,distance:15,x:0,y:null},maxPadding:0,minPadding:0,showLastLabel:!1,tickLength:0},defaultRadialYOptions:{gridLineInterpolation:"circle",labels:{align:"right",x:-3,y:-2},showLastLabel:!1,title:{x:4,text:null,rotation:90}},setOptions:function(a){a=this.options=q(this.defaultOptions,this.defaultRadialOptions,a);a.plotBands||(a.plotBands=[])},getOffset:function(){k.getOffset.call(this);this.chart.axisOffset[this.side]=0;this.center=this.pane.center= +r.getCenter.call(this.pane)},getLinePath:function(a,g){a=this.center;var c=this.chart,f=d(g,a[2]/2-this.offset);this.isCircular||void 0!==g?g=this.chart.renderer.symbols.arc(this.left+a[0],this.top+a[1],f,f,{start:this.startAngleRad,end:this.endAngleRad,open:!0,innerR:0}):(g=this.postTranslate(this.angleRad,f),g=["M",a[0]+c.plotLeft,a[1]+c.plotTop,"L",g.x,g.y]);return g},setAxisTranslation:function(){k.setAxisTranslation.call(this);this.center&&(this.transA=this.isCircular?(this.endAngleRad-this.startAngleRad)/ +(this.max-this.min||1):this.center[2]/2/(this.max-this.min||1),this.minPixelPadding=this.isXAxis?this.transA*this.minPointOffset:0)},beforeSetTickPositions:function(){if(this.autoConnect=this.isCircular&&void 0===d(this.userMax,this.options.max)&&this.endAngleRad-this.startAngleRad===2*Math.PI)this.max+=this.categories&&1||this.pointRange||this.closestPointRange||0},setAxisSize:function(){k.setAxisSize.call(this);this.isRadial&&(this.center=this.pane.center=r.getCenter.call(this.pane),this.isCircular&& +(this.sector=this.endAngleRad-this.startAngleRad),this.len=this.width=this.height=this.center[2]*d(this.sector,1)/2)},getPosition:function(a,g){return this.postTranslate(this.isCircular?this.translate(a):this.angleRad,d(this.isCircular?g:this.translate(a),this.center[2]/2)-this.offset)},postTranslate:function(a,g){var d=this.chart,c=this.center;a=this.startAngleRad+a;return{x:d.plotLeft+c[0]+Math.cos(a)*g,y:d.plotTop+c[1]+Math.sin(a)*g}},getPlotBandPath:function(a,g,c){var h=this.center,p=this.startAngleRad, +k=h[2]/2,n=[d(c.outerRadius,"100%"),c.innerRadius,d(c.thickness,10)],b=Math.min(this.offset,0),l=/%$/,u,e=this.isCircular;"polygon"===this.options.gridLineInterpolation?h=this.getPlotLinePath(a).concat(this.getPlotLinePath(g,!0)):(a=Math.max(a,this.min),g=Math.min(g,this.max),e||(n[0]=this.translate(a),n[1]=this.translate(g)),n=m(n,function(a){l.test(a)&&(a=f(a,10)*k/100);return a}),"circle"!==c.shape&&e?(a=p+this.translate(a),g=p+this.translate(g)):(a=-Math.PI/2,g=1.5*Math.PI,u=!0),n[0]-=b,n[2]-= +b,h=this.chart.renderer.symbols.arc(this.left+h[0],this.top+h[1],n[0],n[0],{start:Math.min(a,g),end:Math.max(a,g),innerR:d(n[1],n[0]-n[2]),open:u}));return h},getPlotLinePath:function(a,g){var d=this,c=d.center,f=d.chart,h=d.getPosition(a),k,b,p;d.isCircular?p=["M",c[0]+f.plotLeft,c[1]+f.plotTop,"L",h.x,h.y]:"circle"===d.options.gridLineInterpolation?(a=d.translate(a))&&(p=d.getLinePath(0,a)):(t(f.xAxis,function(a){a.pane===d.pane&&(k=a)}),p=[],a=d.translate(a),c=k.tickPositions,k.autoConnect&&(c= +c.concat([c[0]])),g&&(c=[].concat(c).reverse()),t(c,function(g,d){b=k.getPosition(g,a);p.push(d?"L":"M",b.x,b.y)}));return p},getTitlePosition:function(){var a=this.center,g=this.chart,d=this.options.title;return{x:g.plotLeft+a[0]+(d.x||0),y:g.plotTop+a[1]-{high:.5,middle:.25,low:0}[d.align]*a[2]+(d.y||0)}}};u(k,"init",function(f,g,k){var b=g.angular,p=g.polar,n=k.isX,u=b&&n,e,A=g.options,m=k.pane||0;if(b){if(w(this,u?c:l),e=!n)this.defaultRadialOptions=this.defaultRadialGaugeOptions}else p&&(w(this, +l),this.defaultRadialOptions=(e=n)?this.defaultRadialXOptions:q(this.defaultYAxisOptions,this.defaultRadialYOptions));b||p?(this.isRadial=!0,g.inverted=!1,A.chart.zoomType=null):this.isRadial=!1;f.call(this,g,k);u||!b&&!p||(f=this.options,g.panes||(g.panes=[]),this.pane=g=g.panes[m]=g.panes[m]||new a(h(A.pane)[m],g,this),g=g.options,this.angleRad=(f.angle||0)*Math.PI/180,this.startAngleRad=(g.startAngle-90)*Math.PI/180,this.endAngleRad=(d(g.endAngle,g.startAngle+360)-90)*Math.PI/180,this.offset=f.offset|| +0,this.isCircular=e)});u(k,"autoLabelAlign",function(a){if(!this.isRadial)return a.apply(this,[].slice.call(arguments,1))});u(b,"getPosition",function(a,d,c,f,h){var g=this.axis;return g.getPosition?g.getPosition(c):a.call(this,d,c,f,h)});u(b,"getLabelPosition",function(a,g,c,f,h,k,b,l,u){var n=this.axis,p=k.y,e=20,y=k.align,v=(n.translate(this.pos)+n.startAngleRad+Math.PI/2)/Math.PI*180%360;n.isRadial?(a=n.getPosition(this.pos,n.center[2]/2+d(k.distance,-25)),"auto"===k.rotation?f.attr({rotation:v}): +null===p&&(p=n.chart.renderer.fontMetrics(f.styles.fontSize).b-f.getBBox().height/2),null===y&&(n.isCircular?(this.label.getBBox().width>n.len*n.tickInterval/(n.max-n.min)&&(e=0),y=v>e&&v<180-e?"left":v>180+e&&v<360-e?"right":"center"):y="center",f.attr({align:y})),a.x+=k.x,a.y+=p):a=a.call(this,g,c,f,h,k,b,l,u);return a});u(b,"getMarkPath",function(a,d,c,f,h,k,b){var g=this.axis;g.isRadial?(a=g.getPosition(this.pos,g.center[2]/2+f),d=["M",d,c,"L",a.x,a.y]):d=a.call(this,d,c,f,h,k,b);return d})})(x); +(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.Series,q=b.seriesType,e=b.seriesTypes;q("arearange","area",{lineWidth:1,marker:null,threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},trackByArea:!0,dataLabels:{align:null,verticalAlign:null,xLow:0,xHigh:0,yLow:0,yHigh:0},states:{hover:{halo:!1}}},{pointArrayMap:["low","high"],dataLabelCollections:["dataLabel", +"dataLabelUpper"],toYData:function(a){return[a.low,a.high]},pointValKey:"low",deferTranslatePolar:!0,highToXY:function(a){var d=this.chart,f=this.xAxis.postTranslate(a.rectPlotX,this.yAxis.len-a.plotHigh);a.plotHighX=f.x-d.plotLeft;a.plotHigh=f.y-d.plotTop},translate:function(){var a=this,d=a.yAxis,f=!!a.modifyValue;e.area.prototype.translate.apply(a);r(a.points,function(h){var b=h.low,c=h.high,l=h.plotY;null===c||null===b?h.isNull=!0:(h.plotLow=l,h.plotHigh=d.translate(f?a.modifyValue(c,h):c,0,1, +0,1),f&&(h.yBottom=h.plotHigh))});this.chart.polar&&r(this.points,function(d){a.highToXY(d)})},getGraphPath:function(a){var d=[],f=[],h,b=e.area.prototype.getGraphPath,c,l,k;k=this.options;var p=k.step;a=a||this.points;for(h=a.length;h--;)c=a[h],c.isNull||k.connectEnds||a[h+1]&&!a[h+1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1}),l={polarPlotY:c.polarPlotY,rectPlotX:c.rectPlotX,yBottom:c.yBottom,plotX:w(c.plotHighX,c.plotX),plotY:c.plotHigh,isNull:c.isNull},f.push(l),d.push(l),c.isNull|| +k.connectEnds||a[h-1]&&!a[h-1].isNull||f.push({plotX:c.plotX,plotY:c.plotY,doCurve:!1});a=b.call(this,a);p&&(!0===p&&(p="left"),k.step={left:"right",center:"center",right:"left"}[p]);d=b.call(this,d);f=b.call(this,f);k.step=p;k=[].concat(a,d);this.chart.polar||"M"!==f[0]||(f[0]="L");this.graphPath=k;this.areaPath=this.areaPath.concat(a,f);k.isArea=!0;k.xMap=a.xMap;this.areaPath.xMap=a.xMap;return k},drawDataLabels:function(){var a=this.data,d=a.length,f,h=[],b=m.prototype,c=this.options.dataLabels, +l=c.align,k=c.verticalAlign,p=c.inside,g,n,e=this.chart.inverted;if(c.enabled||this._hasPointLabels){for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.y=g.high,g._plotY=g.plotY,g.plotY=g.plotHigh,h[f]=g.dataLabel,g.dataLabel=g.dataLabelUpper,g.below=n,e?l||(c.align=n?"right":"left"):k||(c.verticalAlign=n?"top":"bottom"),c.x=c.xHigh,c.y=c.yHigh;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments);for(f=d;f--;)if(g=a[f])n=p?g.plotHighg.plotLow,g.dataLabelUpper= +g.dataLabel,g.dataLabel=h[f],g.y=g.low,g.plotY=g._plotY,g.below=!n,e?l||(c.align=n?"left":"right"):k||(c.verticalAlign=n?"bottom":"top"),c.x=c.xLow,c.y=c.yLow;b.drawDataLabels&&b.drawDataLabels.apply(this,arguments)}c.align=l;c.verticalAlign=k},alignDataLabel:function(){e.column.prototype.alignDataLabel.apply(this,arguments)},setStackedPoints:t,getSymbol:t,drawPoints:t})})(x);(function(b){var r=b.seriesType;r("areasplinerange","arearange",null,{getPointSpline:b.seriesTypes.spline.prototype.getPointSpline})})(x); +(function(b){var r=b.defaultPlotOptions,t=b.each,w=b.merge,m=b.noop,q=b.pick,e=b.seriesType,a=b.seriesTypes.column.prototype;e("columnrange","arearange",w(r.column,r.arearange,{lineWidth:1,pointRange:null}),{translate:function(){var d=this,f=d.yAxis,b=d.xAxis,u=b.startAngleRad,c,l=d.chart,k=d.xAxis.isRadial,p;a.translate.apply(d);t(d.points,function(a){var g=a.shapeArgs,h=d.options.minPointLength,e,v;a.plotHigh=p=f.translate(a.high,0,1,0,1);a.plotLow=a.plotY;v=p;e=q(a.rectPlotY,a.plotY)-p;Math.abs(e)< +h?(h-=e,e+=h,v-=h/2):0>e&&(e*=-1,v-=e);k?(c=a.barX+u,a.shapeType="path",a.shapeArgs={d:d.polarArc(v+e,v,c,c+a.pointWidth)}):(g.height=e,g.y=v,a.tooltipPos=l.inverted?[f.len+f.pos-l.plotLeft-v-e/2,b.len+b.pos-l.plotTop-g.x-g.width/2,e]:[b.left-l.plotLeft+g.x+g.width/2,f.pos-l.plotTop+v+e/2,e])})},directTouch:!0,trackerGroups:["group","dataLabelsGroup"],drawGraph:m,crispCol:a.crispCol,drawPoints:a.drawPoints,drawTracker:a.drawTracker,getColumnMetrics:a.getColumnMetrics,animate:function(){return a.animate.apply(this, +arguments)},polarArc:function(){return a.polarArc.apply(this,arguments)},pointAttribs:a.pointAttribs})})(x);(function(b){var r=b.each,t=b.isNumber,w=b.merge,m=b.pick,q=b.pInt,e=b.Series,a=b.seriesType,d=b.TrackerMixin;a("gauge","line",{dataLabels:{enabled:!0,defer:!1,y:15,borderRadius:3,crop:!1,verticalAlign:"top",zIndex:2,borderWidth:1,borderColor:"#cccccc"},dial:{},pivot:{},tooltip:{headerFormat:""},showInLegend:!1},{angular:!0,directTouch:!0,drawGraph:b.noop,fixedBox:!0,forceDL:!0,noSharedTooltip:!0, +trackerGroups:["group","dataLabelsGroup"],translate:function(){var a=this.yAxis,d=this.options,b=a.center;this.generatePoints();r(this.points,function(c){var f=w(d.dial,c.dial),k=q(m(f.radius,80))*b[2]/200,h=q(m(f.baseLength,70))*k/100,g=q(m(f.rearLength,10))*k/100,n=f.baseWidth||3,u=f.topWidth||1,e=d.overshoot,v=a.startAngleRad+a.translate(c.y,null,null,null,!0);t(e)?(e=e/180*Math.PI,v=Math.max(a.startAngleRad-e,Math.min(a.endAngleRad+e,v))):!1===d.wrap&&(v=Math.max(a.startAngleRad,Math.min(a.endAngleRad, +v)));v=180*v/Math.PI;c.shapeType="path";c.shapeArgs={d:f.path||["M",-g,-n/2,"L",h,-n/2,k,-u/2,k,u/2,h,n/2,-g,n/2,"z"],translateX:b[0],translateY:b[1],rotation:v};c.plotX=b[0];c.plotY=b[1]})},drawPoints:function(){var a=this,d=a.yAxis.center,b=a.pivot,c=a.options,l=c.pivot,k=a.chart.renderer;r(a.points,function(d){var g=d.graphic,b=d.shapeArgs,f=b.d,h=w(c.dial,d.dial);g?(g.animate(b),b.d=f):(d.graphic=k[d.shapeType](b).attr({rotation:b.rotation,zIndex:1}).addClass("highcharts-dial").add(a.group),d.graphic.attr({stroke:h.borderColor|| +"none","stroke-width":h.borderWidth||0,fill:h.backgroundColor||"#000000"}))});b?b.animate({translateX:d[0],translateY:d[1]}):(a.pivot=k.circle(0,0,m(l.radius,5)).attr({zIndex:2}).addClass("highcharts-pivot").translate(d[0],d[1]).add(a.group),a.pivot.attr({"stroke-width":l.borderWidth||0,stroke:l.borderColor||"#cccccc",fill:l.backgroundColor||"#000000"}))},animate:function(a){var d=this;a||(r(d.points,function(a){var c=a.graphic;c&&(c.attr({rotation:180*d.yAxis.startAngleRad/Math.PI}),c.animate({rotation:a.shapeArgs.rotation}, +d.options.animation))}),d.animate=null)},render:function(){this.group=this.plotGroup("group","series",this.visible?"visible":"hidden",this.options.zIndex,this.chart.seriesGroup);e.prototype.render.call(this);this.group.clip(this.chart.clipRect)},setData:function(a,d){e.prototype.setData.call(this,a,!1);this.processData();this.generatePoints();m(d,!0)&&this.chart.redraw()},drawTracker:d&&d.drawTrackerPoint},{setState:function(a){this.state=a}})})(x);(function(b){var r=b.each,t=b.noop,w=b.pick,m=b.seriesType, +q=b.seriesTypes;m("boxplot","column",{threshold:null,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eMaximum: {point.high}\x3cbr/\x3eUpper quartile: {point.q3}\x3cbr/\x3eMedian: {point.median}\x3cbr/\x3eLower quartile: {point.q1}\x3cbr/\x3eMinimum: {point.low}\x3cbr/\x3e'},whiskerLength:"50%",fillColor:"#ffffff",lineWidth:1,medianWidth:2,states:{hover:{brightness:-.3}},whiskerWidth:2},{pointArrayMap:["low","q1","median", +"q3","high"],toYData:function(b){return[b.low,b.q1,b.median,b.q3,b.high]},pointValKey:"high",pointAttribs:function(b){var a=this.options,d=b&&b.color||this.color;return{fill:b.fillColor||a.fillColor||d,stroke:a.lineColor||d,"stroke-width":a.lineWidth||0}},drawDataLabels:t,translate:function(){var b=this.yAxis,a=this.pointArrayMap;q.column.prototype.translate.apply(this);r(this.points,function(d){r(a,function(a){null!==d[a]&&(d[a+"Plot"]=b.translate(d[a],0,1,0,1))})})},drawPoints:function(){var b= +this,a=b.options,d=b.chart.renderer,f,h,u,c,l,k,p=0,g,n,m,q,v=!1!==b.doQuartiles,t,x=b.options.whiskerLength;r(b.points,function(e){var r=e.graphic,y=r?"animate":"attr",I=e.shapeArgs,z={},B={},G={},H=e.color||b.color;void 0!==e.plotY&&(g=I.width,n=Math.floor(I.x),m=n+g,q=Math.round(g/2),f=Math.floor(v?e.q1Plot:e.lowPlot),h=Math.floor(v?e.q3Plot:e.lowPlot),u=Math.floor(e.highPlot),c=Math.floor(e.lowPlot),r||(e.graphic=r=d.g("point").add(b.group),e.stem=d.path().addClass("highcharts-boxplot-stem").add(r), +x&&(e.whiskers=d.path().addClass("highcharts-boxplot-whisker").add(r)),v&&(e.box=d.path(void 0).addClass("highcharts-boxplot-box").add(r)),e.medianShape=d.path(void 0).addClass("highcharts-boxplot-median").add(r),z.stroke=e.stemColor||a.stemColor||H,z["stroke-width"]=w(e.stemWidth,a.stemWidth,a.lineWidth),z.dashstyle=e.stemDashStyle||a.stemDashStyle,e.stem.attr(z),x&&(B.stroke=e.whiskerColor||a.whiskerColor||H,B["stroke-width"]=w(e.whiskerWidth,a.whiskerWidth,a.lineWidth),e.whiskers.attr(B)),v&&(r= +b.pointAttribs(e),e.box.attr(r)),G.stroke=e.medianColor||a.medianColor||H,G["stroke-width"]=w(e.medianWidth,a.medianWidth,a.lineWidth),e.medianShape.attr(G)),k=e.stem.strokeWidth()%2/2,p=n+q+k,e.stem[y]({d:["M",p,h,"L",p,u,"M",p,f,"L",p,c]}),v&&(k=e.box.strokeWidth()%2/2,f=Math.floor(f)+k,h=Math.floor(h)+k,n+=k,m+=k,e.box[y]({d:["M",n,h,"L",n,f,"L",m,f,"L",m,h,"L",n,h,"z"]})),x&&(k=e.whiskers.strokeWidth()%2/2,u+=k,c+=k,t=/%$/.test(x)?q*parseFloat(x)/100:x/2,e.whiskers[y]({d:["M",p-t,u,"L",p+t,u, +"M",p-t,c,"L",p+t,c]})),l=Math.round(e.medianPlot),k=e.medianShape.strokeWidth()%2/2,l+=k,e.medianShape[y]({d:["M",n,l,"L",m,l]}))})},setStackedPoints:t})})(x);(function(b){var r=b.each,t=b.noop,w=b.seriesType,m=b.seriesTypes;w("errorbar","boxplot",{color:"#000000",grouping:!1,linkedTo:":previous",tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.low}\x3c/b\x3e - \x3cb\x3e{point.high}\x3c/b\x3e\x3cbr/\x3e'},whiskerWidth:null},{type:"errorbar", +pointArrayMap:["low","high"],toYData:function(b){return[b.low,b.high]},pointValKey:"high",doQuartiles:!1,drawDataLabels:m.arearange?function(){var b=this.pointValKey;m.arearange.prototype.drawDataLabels.call(this);r(this.data,function(e){e.y=e[b]})}:t,getColumnMetrics:function(){return this.linkedParent&&this.linkedParent.columnMetrics||m.column.prototype.getColumnMetrics.call(this)}})})(x);(function(b){var r=b.correctFloat,t=b.isNumber,w=b.pick,m=b.Point,q=b.Series,e=b.seriesType,a=b.seriesTypes; +e("waterfall","column",{dataLabels:{inside:!0},lineWidth:1,lineColor:"#333333",dashStyle:"dot",borderColor:"#333333",states:{hover:{lineWidthPlus:0}}},{pointValKey:"y",translate:function(){var d=this.options,b=this.yAxis,h,e,c,l,k,p,g,n,m,q=w(d.minPointLength,5),v=d.threshold,t=d.stacking;a.column.prototype.translate.apply(this);this.minPointLengthOffset=0;g=n=v;e=this.points;h=0;for(d=e.length;hl.height&&(l.y+=l.height,l.height*=-1),c.plotY=l.y=Math.round(l.y)- +this.borderWidth%2/2,l.height=Math.max(Math.round(l.height),.001),c.yBottom=l.y+l.height,l.height<=q&&(l.height=q,this.minPointLengthOffset+=q),l.y-=this.minPointLengthOffset,l=c.plotY+(c.negative?l.height:0)-this.minPointLengthOffset,this.chart.inverted?c.tooltipPos[0]=b.len-l:c.tooltipPos[1]=l},processData:function(a){var b=this.yData,d=this.options.data,e,c=b.length,l,k,p,g,n,m;k=l=p=g=this.options.threshold||0;for(m=0;ma[k-1].y&&(l[2]+=c.height,l[5]+=c.height),e=e.concat(l);return e},drawGraph:function(){q.prototype.drawGraph.call(this);this.graph.attr({d:this.getCrispPath()})},getExtremes:b.noop},{getClassName:function(){var a=m.prototype.getClassName.call(this);this.isSum?a+=" highcharts-sum":this.isIntermediateSum&&(a+=" highcharts-intermediate-sum"); +return a},isValid:function(){return t(this.y,!0)||this.isSum||this.isIntermediateSum}})})(x);(function(b){var r=b.Series,t=b.seriesType,w=b.seriesTypes;t("polygon","scatter",{marker:{enabled:!1,states:{hover:{enabled:!1}}},stickyTracking:!1,tooltip:{followPointer:!0,pointFormat:""},trackByArea:!0},{type:"polygon",getGraphPath:function(){for(var b=r.prototype.getGraphPath.call(this),q=b.length+1;q--;)(q===b.length||"M"===b[q])&&0=this.minPxSize/2?(d.shapeType="circle",d.shapeArgs={x:d.plotX,y:d.plotY,r:c},d.dlBox={x:d.plotX-c,y:d.plotY-c,width:2*c,height:2*c}):d.shapeArgs=d.plotY=d.dlBox=void 0},drawLegendSymbol:function(a,b){var d=this.chart.renderer,c=d.fontMetrics(a.itemStyle.fontSize).f/2;b.legendSymbol=d.circle(c,a.baseline-c,c).attr({zIndex:3}).add(b.legendGroup);b.legendSymbol.isMarker= +!0},drawPoints:l.column.prototype.drawPoints,alignDataLabel:l.column.prototype.alignDataLabel,buildKDTree:a,applyZones:a},{haloPath:function(a){return h.prototype.haloPath.call(this,this.shapeArgs.r+a)},ttBelow:!1});w.prototype.beforePadding=function(){var a=this,b=this.len,c=this.chart,h=0,l=b,u=this.isXAxis,m=u?"xData":"yData",w=this.min,x={},A=Math.min(c.plotWidth,c.plotHeight),C=Number.MAX_VALUE,D=-Number.MAX_VALUE,E=this.max-w,z=b/E,F=[];q(this.series,function(b){var g=b.options;!b.bubblePadding|| +!b.visible&&c.options.chart.ignoreHiddenSeries||(a.allowZoomOutside=!0,F.push(b),u&&(q(["minSize","maxSize"],function(a){var b=g[a],d=/%$/.test(b),b=f(b);x[a]=d?A*b/100:b}),b.minPxSize=x.minSize,b.maxPxSize=Math.max(x.maxSize,x.minSize),b=b.zData,b.length&&(C=d(g.zMin,Math.min(C,Math.max(t(b),!1===g.displayNegative?g.zThreshold:-Number.MAX_VALUE))),D=d(g.zMax,Math.max(D,r(b))))))});q(F,function(b){var d=b[m],c=d.length,f;u&&b.getRadii(C,D,b.minPxSize,b.maxPxSize);if(0f&&(f+=360),a.clientX=f):a.clientX=a.plotX};m.spline&&q(m.spline.prototype,"getPointSpline",function(a,b,f,h){var d,c,e,k,p,g,n;this.chart.polar?(d=f.plotX, +c=f.plotY,a=b[h-1],e=b[h+1],this.connectEnds&&(a||(a=b[b.length-2]),e||(e=b[1])),a&&e&&(k=a.plotX,p=a.plotY,b=e.plotX,g=e.plotY,k=(1.5*d+k)/2.5,p=(1.5*c+p)/2.5,e=(1.5*d+b)/2.5,n=(1.5*c+g)/2.5,b=Math.sqrt(Math.pow(k-d,2)+Math.pow(p-c,2)),g=Math.sqrt(Math.pow(e-d,2)+Math.pow(n-c,2)),k=Math.atan2(p-c,k-d),p=Math.atan2(n-c,e-d),n=Math.PI/2+(k+p)/2,Math.abs(k-n)>Math.PI/2&&(n-=Math.PI),k=d+Math.cos(n)*b,p=c+Math.sin(n)*b,e=d+Math.cos(Math.PI+n)*g,n=c+Math.sin(Math.PI+n)*g,f.rightContX=e,f.rightContY=n), +h?(f=["C",a.rightContX||a.plotX,a.rightContY||a.plotY,k||d,p||c,d,c],a.rightContX=a.rightContY=null):f=["M",d,c]):f=a.call(this,b,f,h);return f});q(e,"translate",function(a){var b=this.chart;a.call(this);if(b.polar&&(this.kdByAngle=b.tooltip&&b.tooltip.shared,!this.preventPostTranslate))for(a=this.points,b=a.length;b--;)this.toXY(a[b])});q(e,"getGraphPath",function(a,b){var d=this,e,m;if(this.chart.polar){b=b||this.points;for(e=0;eb.center[1]}),q(m,"alignDataLabel",function(a,b,f,h,m,c){this.chart.polar?(a=b.rectPlotX/Math.PI*180,null===h.align&&(h.align=20a?"left":200a?"right":"center"),null===h.verticalAlign&&(h.verticalAlign=45>a||315a?"top":"middle"),e.alignDataLabel.call(this,b,f,h,m,c)):a.call(this, +b,f,h,m,c)}));q(b,"getCoordinates",function(a,b){var d=this.chart,e={xAxis:[],yAxis:[]};d.polar?t(d.axes,function(a){var c=a.isXAxis,f=a.center,h=b.chartX-f[0]-d.plotLeft,f=b.chartY-f[1]-d.plotTop;e[c?"xAxis":"yAxis"].push({axis:a,value:a.translate(c?Math.PI-Math.atan2(h,f):Math.sqrt(Math.pow(h,2)+Math.pow(f,2)),!0)})}):e=a.call(this,b);return e})})(x)}); diff --git a/webapp/loadTests/50users1minute/js/highstock.js b/webapp/loadTests/50users1minute/js/highstock.js new file mode 100644 index 0000000..34a3f91 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/highstock.js @@ -0,0 +1,496 @@ +/* + Highstock JS v5.0.3 (2016-11-18) + + (c) 2009-2016 Torstein Honsi + + License: www.highcharts.com/license +*/ +(function(N,a){"object"===typeof module&&module.exports?module.exports=N.document?a(N):a:N.Highcharts=a(N)})("undefined"!==typeof window?window:this,function(N){N=function(){var a=window,D=a.document,B=a.navigator&&a.navigator.userAgent||"",G=D&&D.createElementNS&&!!D.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect,H=/(edge|msie|trident)/i.test(B)&&!window.opera,p=!G,l=/Firefox/.test(B),r=l&&4>parseInt(B.split("Firefox/")[1],10);return a.Highcharts?a.Highcharts.error(16,!0):{product:"Highstock", +version:"5.0.3",deg2rad:2*Math.PI/360,doc:D,hasBidiBug:r,hasTouch:D&&void 0!==D.documentElement.ontouchstart,isMS:H,isWebKit:/AppleWebKit/.test(B),isFirefox:l,isTouchDevice:/(Mobile|Android|Windows Phone)/.test(B),SVG_NS:"http://www.w3.org/2000/svg",chartCount:0,seriesTypes:{},symbolSizes:{},svg:G,vml:p,win:a,charts:[],marginNames:["plotTop","marginRight","marginBottom","plotLeft"],noop:function(){}}}();(function(a){var D=[],B=a.charts,G=a.doc,H=a.win;a.error=function(a,l){a="Highcharts error #"+ +a+": www.highcharts.com/errors/"+a;if(l)throw Error(a);H.console&&console.log(a)};a.Fx=function(a,l,r){this.options=l;this.elem=a;this.prop=r};a.Fx.prototype={dSetter:function(){var a=this.paths[0],l=this.paths[1],r=[],w=this.now,t=a.length,k;if(1===w)r=this.toD;else if(t===l.length&&1>w)for(;t--;)k=parseFloat(a[t]),r[t]=isNaN(k)?a[t]:w*parseFloat(l[t]-k)+k;else r=l;this.elem.attr("d",r)},update:function(){var a=this.elem,l=this.prop,r=this.now,w=this.options.step;if(this[l+"Setter"])this[l+"Setter"](); +else a.attr?a.element&&a.attr(l,r):a.style[l]=r+this.unit;w&&w.call(a,r,this)},run:function(a,l,r){var p=this,t=function(a){return t.stopped?!1:p.step(a)},k;this.startTime=+new Date;this.start=a;this.end=l;this.unit=r;this.now=this.start;this.pos=0;t.elem=this.elem;t()&&1===D.push(t)&&(t.timerId=setInterval(function(){for(k=0;k=k+this.startTime){this.now=this.end;this.pos=1;this.update();a=m[this.prop]=!0;for(e in m)!0!==m[e]&&(a=!1);a&&t&&t.call(p);p=!1}else this.pos=w.easing((l-this.startTime)/k),this.now=this.start+(this.end-this.start)*this.pos,this.update(),p=!0;return p},initPath:function(p,l,r){function w(a){for(b=a.length;b--;)"M"!==a[b]&&"L"!==a[b]||a.splice(b+1,0,a[b+1],a[b+2],a[b+1],a[b+2])}function t(a,c){for(;a.lengthm?"AM":"PM",P:12>m?"am":"pm",S:q(t.getSeconds()),L:q(Math.round(l%1E3),3)},a.dateFormats);for(k in w)for(;-1!==p.indexOf("%"+k);)p= +p.replace("%"+k,"function"===typeof w[k]?w[k](l):w[k]);return r?p.substr(0,1).toUpperCase()+p.substr(1):p};a.formatSingle=function(p,l){var r=/\.([0-9])/,w=a.defaultOptions.lang;/f$/.test(p)?(r=(r=p.match(r))?r[1]:-1,null!==l&&(l=a.numberFormat(l,r,w.decimalPoint,-1=r&&(l=[1/r])));for(w=0;w=p||!t&&k<=(l[w]+(l[w+1]||l[w]))/ +2);w++);return m*r};a.stableSort=function(a,l){var r=a.length,p,t;for(t=0;tr&&(r=a[l]);return r};a.destroyObjectProperties=function(a,l){for(var r in a)a[r]&&a[r]!==l&&a[r].destroy&&a[r].destroy(),delete a[r]};a.discardElement=function(p){var l= +a.garbageBin;l||(l=a.createElement("div"));p&&l.appendChild(p);l.innerHTML=""};a.correctFloat=function(a,l){return parseFloat(a.toPrecision(l||14))};a.setAnimation=function(p,l){l.renderer.globalAnimation=a.pick(p,l.options.chart.animation,!0)};a.animObject=function(p){return a.isObject(p)?a.merge(p):{duration:p?500:0}};a.timeUnits={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5,month:24192E5,year:314496E5};a.numberFormat=function(p,l,r,w){p=+p||0;l=+l;var t=a.defaultOptions.lang, +k=(p.toString().split(".")[1]||"").length,m,e,g=Math.abs(p);-1===l?l=Math.min(k,20):a.isNumber(l)||(l=2);m=String(a.pInt(g.toFixed(l)));e=3p?"-":"")+(e?m.substr(0,e)+w:"");p+=m.substr(e).replace(/(\d{3})(?=\d)/g,"$1"+w);l&&(w=Math.abs(g-m+Math.pow(10,-Math.max(l,k)-1)),p+=r+w.toFixed(l).slice(2));return p};Math.easeInOutSine=function(a){return-.5*(Math.cos(Math.PI*a)-1)};a.getStyle=function(p,l){return"width"===l?Math.min(p.offsetWidth, +p.scrollWidth)-a.getStyle(p,"padding-left")-a.getStyle(p,"padding-right"):"height"===l?Math.min(p.offsetHeight,p.scrollHeight)-a.getStyle(p,"padding-top")-a.getStyle(p,"padding-bottom"):(p=H.getComputedStyle(p,void 0))&&a.pInt(p.getPropertyValue(l))};a.inArray=function(a,l){return l.indexOf?l.indexOf(a):[].indexOf.call(l,a)};a.grep=function(a,l){return[].filter.call(a,l)};a.map=function(a,l){for(var r=[],p=0,t=a.length;pl;l++)w[l]+=p(255*a),0>w[l]&&(w[l]=0),255z.width)z={width:0,height:0}}else z=this.htmlGetBBox();b.isSVG&&(a=z.width, +b=z.height,c&&L&&"11px"===L.fontSize&&"16.9"===b.toPrecision(3)&&(z.height=b=14),v&&(z.width=Math.abs(b*Math.sin(d))+Math.abs(a*Math.cos(d)),z.height=Math.abs(b*Math.cos(d))+Math.abs(a*Math.sin(d))));if(g&&0]*>/g,"")))},textSetter:function(a){a!==this.textStr&&(delete this.bBox,this.textStr=a,this.added&&this.renderer.buildText(this))},fillSetter:function(a,c,v){"string"===typeof a?v.setAttribute(c, +a):a&&this.colorGradient(a,c,v)},visibilitySetter:function(a,c,v){"inherit"===a?v.removeAttribute(c):v.setAttribute(c,a)},zIndexSetter:function(a,c){var v=this.renderer,z=this.parentGroup,b=(z||v).element||v.box,d,n=this.element,f;d=this.added;var e;k(a)&&(n.zIndex=a,a=+a,this[c]===a&&(d=!1),this[c]=a);if(d){(a=this.zIndex)&&z&&(z.handleZ=!0);c=b.childNodes;for(e=0;ea||!k(a)&&k(d)||0>a&&!k(d)&&b!==v.box)&&(b.insertBefore(n,z),f=!0);f||b.appendChild(n)}return f}, +_defaultSetter:function(a,c,v){v.setAttribute(c,a)}};D.prototype.yGetter=D.prototype.xGetter;D.prototype.translateXSetter=D.prototype.translateYSetter=D.prototype.rotationSetter=D.prototype.verticalAlignSetter=D.prototype.scaleXSetter=D.prototype.scaleYSetter=function(a,c){this[c]=a;this.doTransform=!0};D.prototype["stroke-widthSetter"]=D.prototype.strokeSetter=function(a,c,v){this[c]=a;this.stroke&&this["stroke-width"]?(D.prototype.fillSetter.call(this,this.stroke,"stroke",v),v.setAttribute("stroke-width", +this["stroke-width"]),this.hasStroke=!0):"stroke-width"===c&&0===a&&this.hasStroke&&(v.removeAttribute("stroke"),this.hasStroke=!1)};B=a.SVGRenderer=function(){this.init.apply(this,arguments)};B.prototype={Element:D,SVG_NS:K,init:function(a,c,v,b,d,n){var z;b=this.createElement("svg").attr({version:"1.1","class":"highcharts-root"}).css(this.getStyle(b));z=b.element;a.appendChild(z);-1===a.innerHTML.indexOf("xmlns")&&p(z,"xmlns",this.SVG_NS);this.isSVG=!0;this.box=z;this.boxWrapper=b;this.alignedObjects= +[];this.url=(E||A)&&g.getElementsByTagName("base").length?R.location.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(g.createTextNode("Created with Highstock 5.0.3"));this.defs=this.createElement("defs").add();this.allowHTML=n;this.forExport=d;this.gradients={};this.cache={};this.cacheKeys=[];this.imgCount=0;this.setSize(c,v,!1);var f;E&&a.getBoundingClientRect&&(c=function(){w(a,{left:0,top:0});f=a.getBoundingClientRect(); +w(a,{left:Math.ceil(f.left)-f.left+"px",top:Math.ceil(f.top)-f.top+"px"})},c(),this.unSubPixelFix=G(R,"resize",c))},getStyle:function(a){return this.style=C({fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Arial, Helvetica, sans-serif',fontSize:"12px"},a)},setStyle:function(a){this.boxWrapper.css(this.getStyle(a))},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var a=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();e(this.gradients||{});this.gradients= +null;a&&(this.defs=a.destroy());this.unSubPixelFix&&this.unSubPixelFix();return this.alignedObjects=null},createElement:function(a){var c=new this.Element;c.init(this,a);return c},draw:J,getRadialAttr:function(a,c){return{cx:a[0]-a[2]/2+c.cx*a[2],cy:a[1]-a[2]/2+c.cy*a[2],r:c.r*a[2]}},buildText:function(a){for(var c=a.element,z=this,b=z.forExport,n=y(a.textStr,"").toString(),f=-1!==n.indexOf("\x3c"),e=c.childNodes,q,F,x,A,I=p(c,"x"),m=a.styles,k=a.textWidth,C=m&&m.lineHeight,M=m&&m.textOutline,J=m&& +"ellipsis"===m.textOverflow,E=e.length,O=k&&!a.added&&this.box,t=function(a){var v;v=/(px|em)$/.test(a&&a.style.fontSize)?a.style.fontSize:m&&m.fontSize||z.style.fontSize||12;return C?u(C):z.fontMetrics(v,a.getAttribute("style")?a:c).h};E--;)c.removeChild(e[E]);f||M||J||k||-1!==n.indexOf(" ")?(q=/<.*class="([^"]+)".*>/,F=/<.*style="([^"]+)".*>/,x=/<.*href="(http[^"]+)".*>/,O&&O.appendChild(c),n=f?n.replace(/<(b|strong)>/g,'\x3cspan style\x3d"font-weight:bold"\x3e').replace(/<(i|em)>/g,'\x3cspan style\x3d"font-style:italic"\x3e').replace(//g,"\x3c/span\x3e").split(//g):[n],n=d(n,function(a){return""!==a}),h(n,function(d,n){var f,e=0;d=d.replace(/^\s+|\s+$/g,"").replace(//g,"\x3c/span\x3e|||");f=d.split("|||");h(f,function(d){if(""!==d||1===f.length){var u={},y=g.createElementNS(z.SVG_NS,"tspan"),L,h;q.test(d)&&(L=d.match(q)[1],p(y,"class",L));F.test(d)&&(h=d.match(F)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),p(y,"style",h));x.test(d)&&!b&&(p(y, +"onclick",'location.href\x3d"'+d.match(x)[1]+'"'),w(y,{cursor:"pointer"}));d=(d.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"\x3c").replace(/>/g,"\x3e");if(" "!==d){y.appendChild(g.createTextNode(d));e?u.dx=0:n&&null!==I&&(u.x=I);p(y,u);c.appendChild(y);!e&&n&&(!v&&b&&w(y,{display:"block"}),p(y,"dy",t(y)));if(k){u=d.replace(/([^\^])-/g,"$1- ").split(" ");L="nowrap"===m.whiteSpace;for(var C=1k,void 0===A&&(A=M),J&&A?(Q/=2,""===l||!M&&.5>Q?u=[]:(l=d.substring(0,l.length+(M?-1:1)*Math.ceil(Q)),u=[l+(3k&&(k=P)),u.length&&y.appendChild(g.createTextNode(u.join(" ").replace(/- /g, +"-")));a.rotation=R}e++}}})}),A&&a.attr("title",a.textStr),O&&O.removeChild(c),M&&a.applyTextOutline&&a.applyTextOutline(M)):c.appendChild(g.createTextNode(n.replace(/</g,"\x3c").replace(/>/g,"\x3e")))},getContrast:function(a){a=r(a).rgba;return 510v?d>c+f&&de?d>c+f&&db&&e>a+f&&ed&&e>a+f&&ea?a+3:Math.round(1.2*a);return{h:c,b:Math.round(.8*c),f:a}},rotCorr:function(a, +c,v){var b=a;c&&v&&(b=Math.max(b*Math.cos(c*m),4));return{x:-a/3*Math.sin(c*m),y:b}},label:function(a,c,v,b,d,n,f,e,K){var q=this,u=q.g("button"!==K&&"label"),y=u.text=q.text("",0,0,f).attr({zIndex:1}),g,F,z=0,A=3,L=0,m,M,J,E,O,t={},l,R,r=/^url\((.*?)\)$/.test(b),p=r,P,w,Q,S;K&&u.addClass("highcharts-"+K);p=r;P=function(){return(l||0)%2/2};w=function(){var a=y.element.style,c={};F=(void 0===m||void 0===M||O)&&k(y.textStr)&&y.getBBox();u.width=(m||F.width||0)+2*A+L;u.height=(M||F.height||0)+2*A;R= +A+q.fontMetrics(a&&a.fontSize,y).b;p&&(g||(u.box=g=q.symbols[b]||r?q.symbol(b):q.rect(),g.addClass(("button"===K?"":"highcharts-label-box")+(K?" highcharts-"+K+"-box":"")),g.add(u),a=P(),c.x=a,c.y=(e?-R:0)+a),c.width=Math.round(u.width),c.height=Math.round(u.height),g.attr(C(c,t)),t={})};Q=function(){var a=L+A,c;c=e?0:R;k(m)&&F&&("center"===O||"right"===O)&&(a+={center:.5,right:1}[O]*(m-F.width));if(a!==y.x||c!==y.y)y.attr("x",a),void 0!==c&&y.attr("y",c);y.x=a;y.y=c};S=function(a,c){g?g.attr(a,c): +t[a]=c};u.onAdd=function(){y.add(u);u.attr({text:a||0===a?a:"",x:c,y:v});g&&k(d)&&u.attr({anchorX:d,anchorY:n})};u.widthSetter=function(a){m=a};u.heightSetter=function(a){M=a};u["text-alignSetter"]=function(a){O=a};u.paddingSetter=function(a){k(a)&&a!==A&&(A=u.padding=a,Q())};u.paddingLeftSetter=function(a){k(a)&&a!==L&&(L=a,Q())};u.alignSetter=function(a){a={left:0,center:.5,right:1}[a];a!==z&&(z=a,F&&u.attr({x:J}))};u.textSetter=function(a){void 0!==a&&y.textSetter(a);w();Q()};u["stroke-widthSetter"]= +function(a,c){a&&(p=!0);l=this["stroke-width"]=a;S(c,a)};u.strokeSetter=u.fillSetter=u.rSetter=function(a,c){"fill"===c&&a&&(p=!0);S(c,a)};u.anchorXSetter=function(a,c){d=a;S(c,Math.round(a)-P()-J)};u.anchorYSetter=function(a,c){n=a;S(c,a-E)};u.xSetter=function(a){u.x=a;z&&(a-=z*((m||F.width)+2*A));J=Math.round(a);u.attr("translateX",J)};u.ySetter=function(a){E=u.y=Math.round(a);u.attr("translateY",E)};var T=u.css;return C(u,{css:function(a){if(a){var c={};a=x(a);h(u.textProps,function(v){void 0!== +a[v]&&(c[v]=a[v],delete a[v])});y.css(c)}return T.call(u,a)},getBBox:function(){return{width:F.width+2*A,height:F.height+2*A,x:F.x-A,y:F.y-A}},shadow:function(a){a&&(w(),g&&g.shadow(a));return u},destroy:function(){I(u.element,"mouseenter");I(u.element,"mouseleave");y&&(y=y.destroy());g&&(g=g.destroy());D.prototype.destroy.call(u);u=q=w=Q=S=null}})}};a.Renderer=B})(N);(function(a){var D=a.attr,B=a.createElement,G=a.css,H=a.defined,p=a.each,l=a.extend,r=a.isFirefox,w=a.isMS,t=a.isWebKit,k=a.pInt,m= +a.SVGRenderer,e=a.win,g=a.wrap;l(a.SVGElement.prototype,{htmlCss:function(a){var e=this.element;if(e=a&&"SPAN"===e.tagName&&a.width)delete a.width,this.textWidth=e,this.updateTransform();a&&"ellipsis"===a.textOverflow&&(a.whiteSpace="nowrap",a.overflow="hidden");this.styles=l(this.styles,a);G(this.element,a);return this},htmlGetBBox:function(){var a=this.element;"text"===a.nodeName&&(a.style.position="absolute");return{x:a.offsetLeft,y:a.offsetTop,width:a.offsetWidth,height:a.offsetHeight}},htmlUpdateTransform:function(){if(this.added){var a= +this.renderer,e=this.element,f=this.translateX||0,d=this.translateY||0,b=this.x||0,q=this.y||0,g=this.textAlign||"left",c={left:0,center:.5,right:1}[g],F=this.styles;G(e,{marginLeft:f,marginTop:d});this.shadows&&p(this.shadows,function(a){G(a,{marginLeft:f+1,marginTop:d+1})});this.inverted&&p(e.childNodes,function(c){a.invertChild(c,e)});if("SPAN"===e.tagName){var n=this.rotation,A=k(this.textWidth),x=F&&F.whiteSpace,m=[n,g,e.innerHTML,this.textWidth,this.textAlign].join();m!==this.cTT&&(F=a.fontMetrics(e.style.fontSize).b, +H(n)&&this.setSpanRotation(n,c,F),G(e,{width:"",whiteSpace:x||"nowrap"}),e.offsetWidth>A&&/[ \-]/.test(e.textContent||e.innerText)&&G(e,{width:A+"px",display:"block",whiteSpace:x||"normal"}),this.getSpanCorrection(e.offsetWidth,F,c,n,g));G(e,{left:b+(this.xCorr||0)+"px",top:q+(this.yCorr||0)+"px"});t&&(F=e.offsetHeight);this.cTT=m}}else this.alignOnAdd=!0},setSpanRotation:function(a,g,f){var d={},b=w?"-ms-transform":t?"-webkit-transform":r?"MozTransform":e.opera?"-o-transform":"";d[b]=d.transform= +"rotate("+a+"deg)";d[b+(r?"Origin":"-origin")]=d.transformOrigin=100*g+"% "+f+"px";G(this.element,d)},getSpanCorrection:function(a,e,f){this.xCorr=-a*f;this.yCorr=-e}});l(m.prototype,{html:function(a,e,f){var d=this.createElement("span"),b=d.element,q=d.renderer,h=q.isSVG,c=function(a,c){p(["opacity","visibility"],function(b){g(a,b+"Setter",function(a,b,d,n){a.call(this,b,d,n);c[d]=b})})};d.textSetter=function(a){a!==b.innerHTML&&delete this.bBox;b.innerHTML=this.textStr=a;d.htmlUpdateTransform()}; +h&&c(d,d.element.style);d.xSetter=d.ySetter=d.alignSetter=d.rotationSetter=function(a,c){"align"===c&&(c="textAlign");d[c]=a;d.htmlUpdateTransform()};d.attr({text:a,x:Math.round(e),y:Math.round(f)}).css({fontFamily:this.style.fontFamily,fontSize:this.style.fontSize,position:"absolute"});b.style.whiteSpace="nowrap";d.css=d.htmlCss;h&&(d.add=function(a){var n,f=q.box.parentNode,e=[];if(this.parentGroup=a){if(n=a.div,!n){for(;a;)e.push(a),a=a.parentGroup;p(e.reverse(),function(a){var b,d=D(a.element, +"class");d&&(d={className:d});n=a.div=a.div||B("div",d,{position:"absolute",left:(a.translateX||0)+"px",top:(a.translateY||0)+"px",display:a.display,opacity:a.opacity,pointerEvents:a.styles&&a.styles.pointerEvents},n||f);b=n.style;l(a,{translateXSetter:function(c,d){b.left=c+"px";a[d]=c;a.doTransform=!0},translateYSetter:function(c,d){b.top=c+"px";a[d]=c;a.doTransform=!0}});c(a,b)})}}else n=f;n.appendChild(b);d.added=!0;d.alignOnAdd&&d.htmlUpdateTransform();return d});return d}})})(N);(function(a){var D, +B,G=a.createElement,H=a.css,p=a.defined,l=a.deg2rad,r=a.discardElement,w=a.doc,t=a.each,k=a.erase,m=a.extend;D=a.extendClass;var e=a.isArray,g=a.isNumber,h=a.isObject,C=a.merge;B=a.noop;var f=a.pick,d=a.pInt,b=a.SVGElement,q=a.SVGRenderer,E=a.win;a.svg||(B={docMode8:w&&8===w.documentMode,init:function(a,b){var c=["\x3c",b,' filled\x3d"f" stroked\x3d"f"'],d=["position: ","absolute",";"],f="div"===b;("shape"===b||f)&&d.push("left:0;top:0;width:1px;height:1px;");d.push("visibility: ",f?"hidden":"visible"); +c.push(' style\x3d"',d.join(""),'"/\x3e');b&&(c=f||"span"===b||"img"===b?c.join(""):a.prepVML(c),this.element=G(c));this.renderer=a},add:function(a){var c=this.renderer,b=this.element,d=c.box,f=a&&a.inverted,d=a?a.element||a:d;a&&(this.parentGroup=a);f&&c.invertChild(b,d);d.appendChild(b);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();if(this.onAdd)this.onAdd();this.className&&this.attr("class",this.className);return this},updateTransform:b.prototype.htmlUpdateTransform, +setSpanRotation:function(){var a=this.rotation,b=Math.cos(a*l),d=Math.sin(a*l);H(this.element,{filter:a?["progid:DXImageTransform.Microsoft.Matrix(M11\x3d",b,", M12\x3d",-d,", M21\x3d",d,", M22\x3d",b,", sizingMethod\x3d'auto expand')"].join(""):"none"})},getSpanCorrection:function(a,b,d,e,q){var c=e?Math.cos(e*l):1,n=e?Math.sin(e*l):0,u=f(this.elemHeight,this.element.offsetHeight),g;this.xCorr=0>c&&-a;this.yCorr=0>n&&-u;g=0>c*n;this.xCorr+=n*b*(g?1-d:d);this.yCorr-=c*b*(e?g?d:1-d:1);q&&"left"!== +q&&(this.xCorr-=a*d*(0>c?-1:1),e&&(this.yCorr-=u*d*(0>n?-1:1)),H(this.element,{textAlign:q}))},pathToVML:function(a){for(var c=a.length,b=[];c--;)g(a[c])?b[c]=Math.round(10*a[c])-5:"Z"===a[c]?b[c]="x":(b[c]=a[c],!a.isArc||"wa"!==a[c]&&"at"!==a[c]||(b[c+5]===b[c+7]&&(b[c+7]+=a[c+7]>a[c+5]?1:-1),b[c+6]===b[c+8]&&(b[c+8]+=a[c+8]>a[c+6]?1:-1)));return b.join(" ")||"x"},clip:function(a){var c=this,b;a?(b=a.members,k(b,c),b.push(c),c.destroyClip=function(){k(b,c)},a=a.getCSS(c)):(c.destroyClip&&c.destroyClip(), +a={clip:c.docMode8?"inherit":"rect(auto)"});return c.css(a)},css:b.prototype.htmlCss,safeRemoveChild:function(a){a.parentNode&&r(a)},destroy:function(){this.destroyClip&&this.destroyClip();return b.prototype.destroy.apply(this)},on:function(a,b){this.element["on"+a]=function(){var a=E.event;a.target=a.srcElement;b(a)};return this},cutOffPath:function(a,b){var c;a=a.split(/[ ,]/);c=a.length;if(9===c||11===c)a[c-4]=a[c-2]=d(a[c-2])-10*b;return a.join(" ")},shadow:function(a,b,e){var c=[],n,q=this.element, +g=this.renderer,u,I=q.style,F,v=q.path,K,h,m,z;v&&"string"!==typeof v.value&&(v="x");h=v;if(a){m=f(a.width,3);z=(a.opacity||.15)/m;for(n=1;3>=n;n++)K=2*m+1-2*n,e&&(h=this.cutOffPath(v.value,K+.5)),F=['\x3cshape isShadow\x3d"true" strokeweight\x3d"',K,'" filled\x3d"false" path\x3d"',h,'" coordsize\x3d"10 10" style\x3d"',q.style.cssText,'" /\x3e'],u=G(g.prepVML(F),null,{left:d(I.left)+f(a.offsetX,1),top:d(I.top)+f(a.offsetY,1)}),e&&(u.cutOff=K+1),F=['\x3cstroke color\x3d"',a.color||"#000000",'" opacity\x3d"', +z*n,'"/\x3e'],G(g.prepVML(F),null,null,u),b?b.element.appendChild(u):q.parentNode.insertBefore(u,q),c.push(u);this.shadows=c}return this},updateShadows:B,setAttr:function(a,b){this.docMode8?this.element[a]=b:this.element.setAttribute(a,b)},classSetter:function(a){(this.added?this.element:this).className=a},dashstyleSetter:function(a,b,d){(d.getElementsByTagName("stroke")[0]||G(this.renderer.prepVML(["\x3cstroke/\x3e"]),null,null,d))[b]=a||"solid";this[b]=a},dSetter:function(a,b,d){var c=this.shadows; +a=a||[];this.d=a.join&&a.join(" ");d.path=a=this.pathToVML(a);if(c)for(d=c.length;d--;)c[d].path=c[d].cutOff?this.cutOffPath(a,c[d].cutOff):a;this.setAttr(b,a)},fillSetter:function(a,b,d){var c=d.nodeName;"SPAN"===c?d.style.color=a:"IMG"!==c&&(d.filled="none"!==a,this.setAttr("fillcolor",this.renderer.color(a,d,b,this)))},"fill-opacitySetter":function(a,b,d){G(this.renderer.prepVML(["\x3c",b.split("-")[0],' opacity\x3d"',a,'"/\x3e']),null,null,d)},opacitySetter:B,rotationSetter:function(a,b,d){d= +d.style;this[b]=d[b]=a;d.left=-Math.round(Math.sin(a*l)+1)+"px";d.top=Math.round(Math.cos(a*l))+"px"},strokeSetter:function(a,b,d){this.setAttr("strokecolor",this.renderer.color(a,d,b,this))},"stroke-widthSetter":function(a,b,d){d.stroked=!!a;this[b]=a;g(a)&&(a+="px");this.setAttr("strokeweight",a)},titleSetter:function(a,b){this.setAttr(b,a)},visibilitySetter:function(a,b,d){"inherit"===a&&(a="visible");this.shadows&&t(this.shadows,function(c){c.style[b]=a});"DIV"===d.nodeName&&(a="hidden"===a?"-999em": +0,this.docMode8||(d.style[b]=a?"visible":"hidden"),b="top");d.style[b]=a},xSetter:function(a,b,d){this[b]=a;"x"===b?b="left":"y"===b&&(b="top");this.updateClipping?(this[b]=a,this.updateClipping()):d.style[b]=a},zIndexSetter:function(a,b,d){d.style[b]=a}},B["stroke-opacitySetter"]=B["fill-opacitySetter"],a.VMLElement=B=D(b,B),B.prototype.ySetter=B.prototype.widthSetter=B.prototype.heightSetter=B.prototype.xSetter,B={Element:B,isIE8:-1l[0]&&c.push([1,l[1]]);t(c,function(c,b){q.test(c[1])?(n=a.color(c[1]),v=n.get("rgb"),K=n.get("a")):(v=c[1],K=1);r.push(100*c[0]+"% "+v);b?(m=K,k=v):(z=K,E=v)});if("fill"===d)if("gradient"===g)d=A.x1||A[0]||0,c=A.y1||A[1]||0,F=A.x2||A[2]||0,A=A.y2||A[3]||0,C='angle\x3d"'+(90-180*Math.atan((A-c)/(F-d))/Math.PI)+'"',p();else{var h=A.r,w=2*h,B=2*h,D=A.cx,H=A.cy,V=b.radialReference,U,h=function(){V&&(U=f.getBBox(),D+=(V[0]- +U.x)/U.width-.5,H+=(V[1]-U.y)/U.height-.5,w*=V[2]/U.width,B*=V[2]/U.height);C='src\x3d"'+a.getOptions().global.VMLRadialGradientURL+'" size\x3d"'+w+","+B+'" origin\x3d"0.5,0.5" position\x3d"'+D+","+H+'" color2\x3d"'+E+'" ';p()};f.added?h():f.onAdd=h;h=k}else h=v}else q.test(c)&&"IMG"!==b.tagName?(n=a.color(c),f[d+"-opacitySetter"](n.get("a"),d,b),h=n.get("rgb")):(h=b.getElementsByTagName(d),h.length&&(h[0].opacity=1,h[0].type="solid"),h=c);return h},prepVML:function(a){var c=this.isIE8;a=a.join(""); +c?(a=a.replace("/\x3e",' xmlns\x3d"urn:schemas-microsoft-com:vml" /\x3e'),a=-1===a.indexOf('style\x3d"')?a.replace("/\x3e",' style\x3d"display:inline-block;behavior:url(#default#VML);" /\x3e'):a.replace('style\x3d"','style\x3d"display:inline-block;behavior:url(#default#VML);')):a=a.replace("\x3c","\x3chcv:");return a},text:q.prototype.html,path:function(a){var c={coordsize:"10 10"};e(a)?c.d=a:h(a)&&m(c,a);return this.createElement("shape").attr(c)},circle:function(a,b,d){var c=this.symbol("circle"); +h(a)&&(d=a.r,b=a.y,a=a.x);c.isCircle=!0;c.r=d;return c.attr({x:a,y:b})},g:function(a){var c;a&&(c={className:"highcharts-"+a,"class":"highcharts-"+a});return this.createElement("div").attr(c)},image:function(a,b,d,f,e){var c=this.createElement("img").attr({src:a});1f&&m-d*bg&&(F=Math.round((e-m)/Math.cos(f*w)));else if(e=m+(1-d)*b,m-d*bg&&(E=g-a.x+E*d,c=-1),E=Math.min(q, +E),EE||k.autoRotation&&(C.styles||{}).width)F=E;F&&(n.width=F,(k.options.labels.style||{}).textOverflow||(n.textOverflow="ellipsis"),C.css(n))},getPosition:function(a,k,m,e){var g=this.axis,h=g.chart,l=e&&h.oldChartHeight||h.chartHeight;return{x:a?g.translate(k+m,null,null,e)+g.transB:g.left+g.offset+(g.opposite?(e&&h.oldChartWidth||h.chartWidth)-g.right-g.left:0),y:a?l-g.bottom+g.offset-(g.opposite?g.height:0):l-g.translate(k+m,null, +null,e)-g.transB}},getLabelPosition:function(a,k,m,e,g,h,l,f){var d=this.axis,b=d.transA,q=d.reversed,E=d.staggerLines,c=d.tickRotCorr||{x:0,y:0},F=g.y;B(F)||(F=0===d.side?m.rotation?-8:-m.getBBox().height:2===d.side?c.y+8:Math.cos(m.rotation*w)*(c.y-m.getBBox(!1,0).height/2));a=a+g.x+c.x-(h&&e?h*b*(q?-1:1):0);k=k+F-(h&&!e?h*b*(q?1:-1):0);E&&(m=l/(f||1)%E,d.opposite&&(m=E-m-1),k+=d.labelOffset/E*m);return{x:a,y:Math.round(k)}},getMarkPath:function(a,k,m,e,g,h){return h.crispLine(["M",a,k,"L",a+(g? +0:-m),k+(g?m:0)],e)},render:function(a,k,m){var e=this.axis,g=e.options,h=e.chart.renderer,C=e.horiz,f=this.type,d=this.label,b=this.pos,q=g.labels,E=this.gridLine,c=f?f+"Tick":"tick",F=e.tickSize(c),n=this.mark,A=!n,x=q.step,p={},y=!0,u=e.tickmarkOffset,I=this.getPosition(C,b,u,k),M=I.x,I=I.y,v=C&&M===e.pos+e.len||!C&&I===e.pos?-1:1,K=f?f+"Grid":"grid",O=g[K+"LineWidth"],R=g[K+"LineColor"],z=g[K+"LineDashStyle"],K=l(g[c+"Width"],!f&&e.isXAxis?1:0),c=g[c+"Color"];m=l(m,1);this.isActive=!0;E||(p.stroke= +R,p["stroke-width"]=O,z&&(p.dashstyle=z),f||(p.zIndex=1),k&&(p.opacity=0),this.gridLine=E=h.path().attr(p).addClass("highcharts-"+(f?f+"-":"")+"grid-line").add(e.gridGroup));if(!k&&E&&(b=e.getPlotLinePath(b+u,E.strokeWidth()*v,k,!0)))E[this.isNew?"attr":"animate"]({d:b,opacity:m});F&&(e.opposite&&(F[0]=-F[0]),A&&(this.mark=n=h.path().addClass("highcharts-"+(f?f+"-":"")+"tick").add(e.axisGroup),n.attr({stroke:c,"stroke-width":K})),n[A?"attr":"animate"]({d:this.getMarkPath(M,I,F[0],n.strokeWidth()* +v,C,h),opacity:m}));d&&H(M)&&(d.xy=I=this.getLabelPosition(M,I,d,C,q,u,a,x),this.isFirst&&!this.isLast&&!l(g.showFirstLabel,1)||this.isLast&&!this.isFirst&&!l(g.showLastLabel,1)?y=!1:!C||e.isRadial||q.step||q.rotation||k||0===m||this.handleOverflow(I),x&&a%x&&(y=!1),y&&H(I.y)?(I.opacity=m,d[this.isNew?"attr":"animate"](I)):(r(d),d.attr("y",-9999)),this.isNew=!1)},destroy:function(){G(this,this.axis)}}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.AxisPlotLineOrBandExtension, +l=a.color,r=a.correctFloat,w=a.defaultOptions,t=a.defined,k=a.deg2rad,m=a.destroyObjectProperties,e=a.each,g=a.error,h=a.extend,C=a.fireEvent,f=a.format,d=a.getMagnitude,b=a.grep,q=a.inArray,E=a.isArray,c=a.isNumber,F=a.isString,n=a.merge,A=a.normalizeTickInterval,x=a.pick,J=a.PlotLineOrBand,y=a.removeEvent,u=a.splat,I=a.syncTimeout,M=a.Tick;a.Axis=function(){this.init.apply(this,arguments)};a.Axis.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M", +hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,labels:{enabled:!0,style:{color:"#666666",cursor:"default",fontSize:"11px"},x:0},minPadding:.01,maxPadding:.01,minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickLength:10,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",title:{align:"middle",style:{color:"#666666"}},type:"linear",minorGridLineColor:"#f2f2f2",minorGridLineWidth:1,minorTickColor:"#999999",lineColor:"#ccd6eb", +lineWidth:1,gridLineColor:"#e6e6e6",tickColor:"#ccd6eb"},defaultYAxisOptions:{endOnTick:!0,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8},maxPadding:.05,minPadding:.05,startOnTick:!0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return a.numberFormat(this.total,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"#000000",textOutline:"1px contrast"}},gridLineWidth:1,lineWidth:0},defaultLeftAxisOptions:{labels:{x:-15},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:15}, +title:{rotation:90}},defaultBottomAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},defaultTopAxisOptions:{labels:{autoRotation:[-45],x:0},title:{rotation:0}},init:function(a,c){var b=c.isX;this.chart=a;this.horiz=a.inverted?!b:b;this.isXAxis=b;this.coll=this.coll||(b?"xAxis":"yAxis");this.opposite=c.opposite;this.side=c.side||(this.horiz?this.opposite?0:2:this.opposite?1:3);this.setOptions(c);var d=this.options,v=d.type;this.labelFormatter=d.labels.formatter||this.defaultLabelFormatter; +this.userOptions=c;this.minPixelPadding=0;this.reversed=d.reversed;this.visible=!1!==d.visible;this.zoomEnabled=!1!==d.zoomEnabled;this.hasNames="category"===v||!0===d.categories;this.categories=d.categories||this.hasNames;this.names=this.names||[];this.isLog="logarithmic"===v;this.isDatetimeAxis="datetime"===v;this.isLinked=t(d.linkedTo);this.ticks={};this.labelEdge=[];this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=d.minRange||d.maxZoom; +this.range=d.range;this.offset=d.offset||0;this.stacks={};this.oldStacks={};this.stacksTouched=0;this.min=this.max=null;this.crosshair=x(d.crosshair,u(a.options.tooltip.crosshairs)[b?0:1],!1);var f;c=this.options.events;-1===q(this,a.axes)&&(b?a.axes.splice(a.xAxis.length,0,this):a.axes.push(this),a[this.coll].push(this));this.series=this.series||[];a.inverted&&b&&void 0===this.reversed&&(this.reversed=!0);this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(f in c)D(this,f,c[f]); +this.isLog&&(this.val2lin=this.log2lin,this.lin2val=this.lin2log)},setOptions:function(a){this.options=n(this.defaultOptions,"yAxis"===this.coll&&this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],n(w[this.coll],a))},defaultLabelFormatter:function(){var c=this.axis,b=this.value,d=c.categories,e=this.dateTimeLabelFormat,q=w.lang,u=q.numericSymbols,q=q.numericSymbolMagnitude||1E3,n=u&&u.length,g,y=c.options.labels.format, +c=c.isLog?b:c.tickInterval;if(y)g=f(y,this);else if(d)g=b;else if(e)g=a.dateFormat(e,b);else if(n&&1E3<=c)for(;n--&&void 0===g;)d=Math.pow(q,n+1),c>=d&&0===10*b%d&&null!==u[n]&&0!==b&&(g=a.numberFormat(b/d,-1)+u[n]);void 0===g&&(g=1E4<=Math.abs(b)?a.numberFormat(b,-1):a.numberFormat(b,-1,void 0,""));return g},getSeriesExtremes:function(){var a=this,d=a.chart;a.hasVisibleSeries=!1;a.dataMin=a.dataMax=a.threshold=null;a.softThreshold=!a.isXAxis;a.buildStacks&&a.buildStacks();e(a.series,function(v){if(v.visible|| +!d.options.chart.ignoreHiddenSeries){var f=v.options,e=f.threshold,q;a.hasVisibleSeries=!0;a.isLog&&0>=e&&(e=null);if(a.isXAxis)f=v.xData,f.length&&(v=H(f),c(v)||v instanceof Date||(f=b(f,function(a){return c(a)}),v=H(f)),a.dataMin=Math.min(x(a.dataMin,f[0]),v),a.dataMax=Math.max(x(a.dataMax,f[0]),G(f)));else if(v.getExtremes(),q=v.dataMax,v=v.dataMin,t(v)&&t(q)&&(a.dataMin=Math.min(x(a.dataMin,v),v),a.dataMax=Math.max(x(a.dataMax,q),q)),t(e)&&(a.threshold=e),!f.softThreshold||a.isLog)a.softThreshold= +!1}})},translate:function(a,b,d,f,e,q){var v=this.linkedParent||this,u=1,n=0,g=f?v.oldTransA:v.transA;f=f?v.oldMin:v.min;var K=v.minPixelPadding;e=(v.isOrdinal||v.isBroken||v.isLog&&e)&&v.lin2val;g||(g=v.transA);d&&(u*=-1,n=v.len);v.reversed&&(u*=-1,n-=u*(v.sector||v.len));b?(a=(a*u+n-K)/g+f,e&&(a=v.lin2val(a))):(e&&(a=v.val2lin(a)),a=u*(a-f)*g+n+u*K+(c(q)?g*q:0));return a},toPixels:function(a,c){return this.translate(a,!1,!this.horiz,null,!0)+(c?0:this.pos)},toValue:function(a,c){return this.translate(a- +(c?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(a,b,d,f,e){var v=this.chart,q=this.left,u=this.top,n,g,K=d&&v.oldChartHeight||v.chartHeight,y=d&&v.oldChartWidth||v.chartWidth,z;n=this.transB;var h=function(a,c,b){if(ab)f?a=Math.min(Math.max(c,a),b):z=!0;return a};e=x(e,this.translate(a,null,null,d));a=d=Math.round(e+n);n=g=Math.round(K-e-n);c(e)?this.horiz?(n=u,g=K-this.bottom,a=d=h(a,q,q+this.width)):(a=q,d=y-this.right,n=g=h(n,u,u+this.height)):z=!0;return z&&!f?null:v.renderer.crispLine(["M", +a,n,"L",d,g],b||1)},getLinearTickPositions:function(a,b,d){var v,f=r(Math.floor(b/a)*a),e=r(Math.ceil(d/a)*a),q=[];if(b===d&&c(b))return[b];for(b=f;b<=e;){q.push(b);b=r(b+a);if(b===v)break;v=b}return q},getMinorTickPositions:function(){var a=this.options,c=this.tickPositions,b=this.minorTickInterval,d=[],f,e=this.pointRangePadding||0;f=this.min-e;var e=this.max+e,q=e-f;if(q&&q/b=this.minRange,q,u,n,g,y,h;this.isXAxis&&void 0===this.minRange&&!this.isLog&&(t(a.min)||t(a.max)?this.minRange=null:(e(this.series,function(a){g=a.xData;for(u=y=a.xIncrement? +1:g.length-1;0=E?(p=E,m=0):b.dataMax<=E&&(J=E,I=0)),b.min=x(w,p,b.dataMin),b.max=x(B,J,b.dataMax));q&&(!a&&0>=Math.min(b.min, +x(b.dataMin,b.min))&&g(10,1),b.min=r(u(b.min),15),b.max=r(u(b.max),15));b.range&&t(b.max)&&(b.userMin=b.min=w=Math.max(b.min,b.minFromRange()),b.userMax=B=b.max,b.range=null);C(b,"foundExtremes");b.beforePadding&&b.beforePadding();b.adjustForMinRange();!(l||b.axisPointRange||b.usePercentage||h)&&t(b.min)&&t(b.max)&&(u=b.max-b.min)&&(!t(w)&&m&&(b.min-=u*m),!t(B)&&I&&(b.max+=u*I));c(f.floor)?b.min=Math.max(b.min,f.floor):c(f.softMin)&&(b.min=Math.min(b.min,f.softMin));c(f.ceiling)?b.max=Math.min(b.max, +f.ceiling):c(f.softMax)&&(b.max=Math.max(b.max,f.softMax));M&&t(b.dataMin)&&(E=E||0,!t(w)&&b.min=E?b.min=E:!t(B)&&b.max>E&&b.dataMax<=E&&(b.max=E));b.tickInterval=b.min===b.max||void 0===b.min||void 0===b.max?1:h&&!k&&F===b.linkedParent.options.tickPixelInterval?k=b.linkedParent.tickInterval:x(k,this.tickAmount?(b.max-b.min)/Math.max(this.tickAmount-1,1):void 0,l?1:(b.max-b.min)*F/Math.max(b.len,F));y&&!a&&e(b.series,function(a){a.processData(b.min!==b.oldMin||b.max!==b.oldMax)});b.setAxisTranslation(!0); +b.beforeSetTickPositions&&b.beforeSetTickPositions();b.postProcessTickInterval&&(b.tickInterval=b.postProcessTickInterval(b.tickInterval));b.pointRange&&!k&&(b.tickInterval=Math.max(b.pointRange,b.tickInterval));a=x(f.minTickInterval,b.isDatetimeAxis&&b.closestPointRange);!k&&b.tickIntervalb.tickInterval&&1E3b.max)),!!this.tickAmount));this.tickAmount||(b.tickInterval= +b.unsquish());this.setTickPositions()},setTickPositions:function(){var a=this.options,b,c=a.tickPositions,d=a.tickPositioner,f=a.startOnTick,e=a.endOnTick,q;this.tickmarkOffset=this.categories&&"between"===a.tickmarkPlacement&&1===this.tickInterval?.5:0;this.minorTickInterval="auto"===a.minorTickInterval&&this.tickInterval?this.tickInterval/5:a.minorTickInterval;this.tickPositions=b=c&&c.slice();!b&&(b=this.isDatetimeAxis?this.getTimeTicks(this.normalizeTimeTickInterval(this.tickInterval,a.units), +this.min,this.max,a.startOfWeek,this.ordinalPositions,this.closestPointRange,!0):this.isLog?this.getLogTickPositions(this.tickInterval,this.min,this.max):this.getLinearTickPositions(this.tickInterval,this.min,this.max),b.length>this.len&&(b=[b[0],b.pop()]),this.tickPositions=b,d&&(d=d.apply(this,[this.min,this.max])))&&(this.tickPositions=b=d);this.isLinked||(this.trimTicks(b,f,e),this.min===this.max&&t(this.min)&&!this.tickAmount&&(q=!0,this.min-=.5,this.max+=.5),this.single=q,c||d||this.adjustTickAmount())}, +trimTicks:function(a,b,c){var d=a[0],f=a[a.length-1],v=this.minPointOffset||0;if(b)this.min=d;else for(;this.min-v>a[0];)a.shift();if(c)this.max=f;else for(;this.max+vb&&(this.finalTickAmt=b,b=5);this.tickAmount=b},adjustTickAmount:function(){var a=this.tickInterval,b=this.tickPositions,c=this.tickAmount,d=this.finalTickAmt,f=b&&b.length;if(fc&&(this.tickInterval*= +2,this.setTickPositions());if(t(d)){for(a=c=b.length;a--;)(3===d&&1===a%2||2>=d&&0=f&&(b=f)),this.displayBtn=void 0!==a||void 0!==b,this.setExtremes(a,b,!1,void 0,{trigger:"zoom"});return!0},setAxisSize:function(){var a=this.chart,b=this.options,c=b.offsetLeft||0,d=this.horiz,f=x(b.width,a.plotWidth-c+(b.offsetRight||0)),e=x(b.height,a.plotHeight),q=x(b.top,a.plotTop),b=x(b.left,a.plotLeft+c),c=/%$/;c.test(e)&&(e=Math.round(parseFloat(e)/ +100*a.plotHeight));c.test(q)&&(q=Math.round(parseFloat(q)/100*a.plotHeight+a.plotTop));this.left=b;this.top=q;this.width=f;this.height=e;this.bottom=a.chartHeight-e-q;this.right=a.chartWidth-f-b;this.len=Math.max(d?f:e,0);this.pos=d?b:q},getExtremes:function(){var a=this.isLog,b=this.lin2log;return{min:a?r(b(this.min)):this.min,max:a?r(b(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(a){var b=this.isLog,c=this.lin2log, +d=b?c(this.min):this.min,b=b?c(this.max):this.max;null===a?a=d:d>a?a=d:ba?"right":195a?"left":"center"},tickSize:function(a){var b=this.options,c=b[a+"Length"],d=x(b[a+"Width"],"tick"===a&&this.isXAxis?1:0);if(d&&c)return"inside"===b[a+"Position"]&&(c=-c),[c,d]},labelMetrics:function(){return this.chart.renderer.fontMetrics(this.options.labels.style&&this.options.labels.style.fontSize, +this.ticks[0]&&this.ticks[0].label)},unsquish:function(){var a=this.options.labels,b=this.horiz,c=this.tickInterval,d=c,f=this.len/(((this.categories?1:0)+this.max-this.min)/c),q,u=a.rotation,n=this.labelMetrics(),g,y=Number.MAX_VALUE,h,I=function(a){a/=f||1;a=1=a)g=I(Math.abs(n.h/Math.sin(k*a))),b=g+Math.abs(a/360),b(c.step||0)&&!c.rotation&&(this.staggerLines||1)*a.plotWidth/d||!b&&(f&&f-a.spacing[3]||.33*a.chartWidth)},renderUnsquish:function(){var a=this.chart,b=a.renderer,c=this.tickPositions,d=this.ticks,f=this.options.labels,q=this.horiz,u=this.getSlotWidth(),g=Math.max(1, +Math.round(u-2*(f.padding||5))),y={},h=this.labelMetrics(),I=f.style&&f.style.textOverflow,A,x=0,m,k;F(f.rotation)||(y.rotation=f.rotation||0);e(c,function(a){(a=d[a])&&a.labelLength>x&&(x=a.labelLength)});this.maxLabelLength=x;if(this.autoRotation)x>g&&x>h.h?y.rotation=this.labelRotation:this.labelRotation=0;else if(u&&(A={width:g+"px"},!I))for(A.textOverflow="clip",m=c.length;!q&&m--;)if(k=c[m],g=d[k].label)g.styles&&"ellipsis"===g.styles.textOverflow?g.css({textOverflow:"clip"}):d[k].labelLength> +u&&g.css({width:u+"px"}),g.getBBox().height>this.len/c.length-(h.h-h.f)&&(g.specCss={textOverflow:"ellipsis"});y.rotation&&(A={width:(x>.5*a.chartHeight?.33*a.chartHeight:a.chartHeight)+"px"},I||(A.textOverflow="ellipsis"));if(this.labelAlign=f.align||this.autoLabelAlign(this.labelRotation))y.align=this.labelAlign;e(c,function(a){var b=(a=d[a])&&a.label;b&&(b.attr(y),A&&b.css(n(A,b.specCss)),delete b.specCss,a.rotation=y.rotation)});this.tickRotCorr=b.rotCorr(h.b,this.labelRotation||0,0!==this.side)}, +hasData:function(){return this.hasVisibleSeries||t(this.min)&&t(this.max)&&!!this.tickPositions},getOffset:function(){var a=this,b=a.chart,c=b.renderer,d=a.options,f=a.tickPositions,q=a.ticks,u=a.horiz,n=a.side,g=b.inverted?[1,0,3,2][n]:n,y,h,I=0,A,m=0,k=d.title,F=d.labels,E=0,l=a.opposite,C=b.axisOffset,b=b.clipOffset,p=[-1,1,1,-1][n],r,J=d.className,w=a.axisParent,B=this.tickSize("tick");y=a.hasData();a.showAxis=h=y||x(d.showEmpty,!0);a.staggerLines=a.horiz&&F.staggerLines;a.axisGroup||(a.gridGroup= +c.g("grid").attr({zIndex:d.gridZIndex||1}).addClass("highcharts-"+this.coll.toLowerCase()+"-grid "+(J||"")).add(w),a.axisGroup=c.g("axis").attr({zIndex:d.zIndex||2}).addClass("highcharts-"+this.coll.toLowerCase()+" "+(J||"")).add(w),a.labelGroup=c.g("axis-labels").attr({zIndex:F.zIndex||7}).addClass("highcharts-"+a.coll.toLowerCase()+"-labels "+(J||"")).add(w));if(y||a.isLinked)e(f,function(b){q[b]?q[b].addLabel():q[b]=new M(a,b)}),a.renderUnsquish(),!1===F.reserveSpace||0!==n&&2!==n&&{1:"left",3:"right"}[n]!== +a.labelAlign&&"center"!==a.labelAlign||e(f,function(a){E=Math.max(q[a].getLabelSize(),E)}),a.staggerLines&&(E*=a.staggerLines,a.labelOffset=E*(a.opposite?-1:1));else for(r in q)q[r].destroy(),delete q[r];k&&k.text&&!1!==k.enabled&&(a.axisTitle||((r=k.textAlign)||(r=(u?{low:"left",middle:"center",high:"right"}:{low:l?"right":"left",middle:"center",high:l?"left":"right"})[k.align]),a.axisTitle=c.text(k.text,0,0,k.useHTML).attr({zIndex:7,rotation:k.rotation||0,align:r}).addClass("highcharts-axis-title").css(k.style).add(a.axisGroup), +a.axisTitle.isNew=!0),h&&(I=a.axisTitle.getBBox()[u?"height":"width"],A=k.offset,m=t(A)?0:x(k.margin,u?5:10)),a.axisTitle[h?"show":"hide"](!0));a.renderLine();a.offset=p*x(d.offset,C[n]);a.tickRotCorr=a.tickRotCorr||{x:0,y:0};c=0===n?-a.labelMetrics().h:2===n?a.tickRotCorr.y:0;m=Math.abs(E)+m;E&&(m=m-c+p*(u?x(F.y,a.tickRotCorr.y+8*p):F.x));a.axisTitleMargin=x(A,m);C[n]=Math.max(C[n],a.axisTitleMargin+I+p*a.offset,m,y&&f.length&&B?B[0]:0);d=d.offset?0:2*Math.floor(a.axisLine.strokeWidth()/2);b[g]= +Math.max(b[g],d)},getLinePath:function(a){var b=this.chart,c=this.opposite,d=this.offset,f=this.horiz,e=this.left+(c?this.width:0)+d,d=b.chartHeight-this.bottom-(c?this.height:0)+d;c&&(a*=-1);return b.renderer.crispLine(["M",f?this.left:e,f?d:this.top,"L",f?b.chartWidth-this.right:e,f?d:b.chartHeight-this.bottom],a)},renderLine:function(){this.axisLine||(this.axisLine=this.chart.renderer.path().addClass("highcharts-axis-line").add(this.axisGroup),this.axisLine.attr({stroke:this.options.lineColor, +"stroke-width":this.options.lineWidth,zIndex:7}))},getTitlePosition:function(){var a=this.horiz,b=this.left,c=this.top,d=this.len,f=this.options.title,e=a?b:c,q=this.opposite,u=this.offset,n=f.x||0,g=f.y||0,y=this.chart.renderer.fontMetrics(f.style&&f.style.fontSize,this.axisTitle).f,d={low:e+(a?0:d),middle:e+d/2,high:e+(a?d:0)}[f.align],b=(a?c+this.height:b)+(a?1:-1)*(q?-1:1)*this.axisTitleMargin+(2===this.side?y:0);return{x:a?d+n:b+(q?this.width:0)+u+n,y:a?b+g-(q?this.height:0)+u:d+g}},render:function(){var a= +this,b=a.chart,d=b.renderer,f=a.options,q=a.isLog,u=a.lin2log,n=a.isLinked,g=a.tickPositions,y=a.axisTitle,h=a.ticks,A=a.minorTicks,x=a.alternateBands,m=f.stackLabels,k=f.alternateGridColor,F=a.tickmarkOffset,E=a.axisLine,l=b.hasRendered&&c(a.oldMin),C=a.showAxis,p=B(d.globalAnimation),r,t;a.labelEdge.length=0;a.overlap=!1;e([h,A,x],function(a){for(var b in a)a[b].isActive=!1});if(a.hasData()||n)a.minorTickInterval&&!a.categories&&e(a.getMinorTickPositions(),function(b){A[b]||(A[b]=new M(a,b,"minor")); +l&&A[b].isNew&&A[b].render(null,!0);A[b].render(null,!1,1)}),g.length&&(e(g,function(b,c){if(!n||b>=a.min&&b<=a.max)h[b]||(h[b]=new M(a,b)),l&&h[b].isNew&&h[b].render(c,!0,.1),h[b].render(c)}),F&&(0===a.min||a.single)&&(h[-1]||(h[-1]=new M(a,-1,null,!0)),h[-1].render(-1))),k&&e(g,function(c,d){t=void 0!==g[d+1]?g[d+1]+F:a.max-F;0===d%2&&c=e.second?0:A*Math.floor(c.getMilliseconds()/A));if(n>=e.second)c[B.hcSetSeconds](n>=e.minute?0:A*Math.floor(c.getSeconds()/ +A));if(n>=e.minute)c[B.hcSetMinutes](n>=e.hour?0:A*Math.floor(c[B.hcGetMinutes]()/A));if(n>=e.hour)c[B.hcSetHours](n>=e.day?0:A*Math.floor(c[B.hcGetHours]()/A));if(n>=e.day)c[B.hcSetDate](n>=e.month?1:A*Math.floor(c[B.hcGetDate]()/A));n>=e.month&&(c[B.hcSetMonth](n>=e.year?0:A*Math.floor(c[B.hcGetMonth]()/A)),g=c[B.hcGetFullYear]());if(n>=e.year)c[B.hcSetFullYear](g-g%A);if(n===e.week)c[B.hcSetDate](c[B.hcGetDate]()-c[B.hcGetDay]()+m(f,1));g=c[B.hcGetFullYear]();f=c[B.hcGetMonth]();var C=c[B.hcGetDate](), +y=c[B.hcGetHours]();if(B.hcTimezoneOffset||B.hcGetTimezoneOffset)x=(!q||!!B.hcGetTimezoneOffset)&&(k-h>4*e.month||t(h)!==t(k)),c=c.getTime(),c=new B(c+t(c));q=c.getTime();for(h=1;qr&&(!t||b<=w)&&void 0!==b&&h.push(b),b>w&&(q=!0),b=d;else r=e(r),w= +e(w),a=k[t?"minorTickInterval":"tickInterval"],a=p("auto"===a?null:a,this._minorAutoInterval,k.tickPixelInterval/(t?5:1)*(w-r)/((t?m/this.tickPositions.length:m)||1)),a=H(a,null,B(a)),h=G(this.getLinearTickPositions(a,r,w),g),t||(this._minorAutoInterval=a/5);t||(this.tickInterval=a);return h};D.prototype.log2lin=function(a){return Math.log(a)/Math.LN10};D.prototype.lin2log=function(a){return Math.pow(10,a)}})(N);(function(a){var D=a.dateFormat,B=a.each,G=a.extend,H=a.format,p=a.isNumber,l=a.map,r= +a.merge,w=a.pick,t=a.splat,k=a.stop,m=a.syncTimeout,e=a.timeUnits;a.Tooltip=function(){this.init.apply(this,arguments)};a.Tooltip.prototype={init:function(a,e){this.chart=a;this.options=e;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.split=e.split&&!a.inverted;this.shared=e.shared||this.split},cleanSplit:function(a){B(this.chart.series,function(e){var g=e&&e.tt;g&&(!g.isActive||a?e.tt=g.destroy():g.isActive=!1)})},getLabel:function(){var a=this.chart.renderer,e=this.options;this.label|| +(this.split?this.label=a.g("tooltip"):(this.label=a.label("",0,0,e.shape||"callout",null,null,e.useHTML,null,"tooltip").attr({padding:e.padding,r:e.borderRadius}),this.label.attr({fill:e.backgroundColor,"stroke-width":e.borderWidth}).css(e.style).shadow(e.shadow)),this.label.attr({zIndex:8}).add());return this.label},update:function(a){this.destroy();this.init(this.chart,r(!0,this.options,a))},destroy:function(){this.label&&(this.label=this.label.destroy());this.split&&this.tt&&(this.cleanSplit(this.chart, +!0),this.tt=this.tt.destroy());clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(a,e,m,f){var d=this,b=d.now,q=!1!==d.options.animation&&!d.isHidden&&(1h-q?h:h-q);else if(v)b[a]=Math.max(g,e+q+f>c?e:e+q);else return!1},x=function(a,c,f,e){var q;ec-d?q=!1:b[a]=ec-f/2?c-f-2:e-f/2;return q},k=function(a){var b=c;c=h;h=b;g=a},y=function(){!1!==A.apply(0,c)?!1!==x.apply(0,h)||g||(k(!0),y()):g?b.x=b.y=0:(k(!0),y())};(f.inverted||1y&&(q=!1);a=(e.series&&e.series.yAxis&&e.series.yAxis.pos)+(e.plotY||0);a-=d.plotTop;f.push({target:e.isHeader?d.plotHeight+c:a,rank:e.isHeader?1:0,size:n.tt.getBBox().height+1,point:e,x:y,tt:A})});this.cleanSplit(); +a.distribute(f,d.plotHeight+c);B(f,function(a){var b=a.point;a.tt.attr({visibility:void 0===a.pos?"hidden":"inherit",x:q||b.isHeader?a.x:b.plotX+d.plotLeft+w(m.distance,16),y:a.pos+d.plotTop,anchorX:b.plotX+d.plotLeft,anchorY:b.isHeader?a.pos+d.plotTop-15:b.plotY+d.plotTop})})},updatePosition:function(a){var e=this.chart,g=this.getLabel(),g=(this.options.positioner||this.getPosition).call(this,g.width,g.height,a);this.move(Math.round(g.x),Math.round(g.y||0),a.plotX+e.plotLeft,a.plotY+e.plotTop)}, +getXDateFormat:function(a,h,m){var f;h=h.dateTimeLabelFormats;var d=m&&m.closestPointRange,b,q={millisecond:15,second:12,minute:9,hour:6,day:3},g,c="millisecond";if(d){g=D("%m-%d %H:%M:%S.%L",a.x);for(b in e){if(d===e.week&&+D("%w",a.x)===m.options.startOfWeek&&"00:00:00.000"===g.substr(6)){b="week";break}if(e[b]>d){b=c;break}if(q[b]&&g.substr(q[b])!=="01-01 00:00:00.000".substr(q[b]))break;"week"!==b&&(c=b)}b&&(f=h[b])}else f=h.day;return f||h.year},tooltipFooterHeaderFormatter:function(a,e){var g= +e?"footer":"header";e=a.series;var f=e.tooltipOptions,d=f.xDateFormat,b=e.xAxis,q=b&&"datetime"===b.options.type&&p(a.key),g=f[g+"Format"];q&&!d&&(d=this.getXDateFormat(a,f,b));q&&d&&(g=g.replace("{point.key}","{point.key:"+d+"}"));return H(g,{point:a,series:e})},bodyFormatter:function(a){return l(a,function(a){var e=a.series.tooltipOptions;return(e.pointFormatter||a.point.tooltipFormatter).call(a.point,e.pointFormat)})}}})(N);(function(a){var D=a.addEvent,B=a.attr,G=a.charts,H=a.color,p=a.css,l= +a.defined,r=a.doc,w=a.each,t=a.extend,k=a.fireEvent,m=a.offset,e=a.pick,g=a.removeEvent,h=a.splat,C=a.Tooltip,f=a.win;a.Pointer=function(a,b){this.init(a,b)};a.Pointer.prototype={init:function(a,b){this.options=b;this.chart=a;this.runChartClick=b.chart.events&&!!b.chart.events.click;this.pinchDown=[];this.lastValidTouch={};C&&b.tooltip.enabled&&(a.tooltip=new C(a,b.tooltip),this.followTouchMove=e(b.tooltip.followTouchMove,!0));this.setDOMEvents()},zoomOption:function(a){var b=this.chart,d=b.options.chart, +f=d.zoomType||"",b=b.inverted;/touch/.test(a.type)&&(f=e(d.pinchType,f));this.zoomX=a=/x/.test(f);this.zoomY=f=/y/.test(f);this.zoomHor=a&&!b||f&&b;this.zoomVert=f&&!b||a&&b;this.hasZoom=a||f},normalize:function(a,b){var d,e;a=a||f.event;a.target||(a.target=a.srcElement);e=a.touches?a.touches.length?a.touches.item(0):a.changedTouches[0]:a;b||(this.chartPosition=b=m(this.chart.container));void 0===e.pageX?(d=Math.max(a.x,a.clientX-b.left),b=a.y):(d=e.pageX-b.left,b=e.pageY-b.top);return t(a,{chartX:Math.round(d), +chartY:Math.round(b)})},getCoordinates:function(a){var b={xAxis:[],yAxis:[]};w(this.chart.axes,function(d){b[d.isXAxis?"xAxis":"yAxis"].push({axis:d,value:d.toValue(a[d.horiz?"chartX":"chartY"])})});return b},runPointActions:function(d){var b=this.chart,f=b.series,g=b.tooltip,c=g?g.shared:!1,h=!0,n=b.hoverPoint,m=b.hoverSeries,x,k,y,u=[],I;if(!c&&!m)for(x=0;xb.series.index?-1:1}));if(c)for(x=u.length;x--;)(u[x].x!==u[0].x||u[x].series.noSharedTooltip)&&u.splice(x,1);if(u[0]&&(u[0]!==this.prevKDPoint||g&&g.isHidden)){if(c&& +!u[0].series.noSharedTooltip){for(x=0;xh+k&&(f=h+k),cm+y&&(c=m+y),this.hasDragged=Math.sqrt(Math.pow(l-f,2)+Math.pow(v-c,2)),10x.max&&(l=x.max-c,v=!0);v?(u-=.8*(u-g[f][0]),J||(M-=.8*(M-g[f][1])),p()):g[f]=[u,M];A||(e[f]=F-E,e[q]=c);e=A?1/n:n;m[q]=c;m[f]=l;k[A?a?"scaleY":"scaleX":"scale"+d]=n;k["translate"+d]=e* +E+(u-e*y)},pinch:function(a){var r=this,t=r.chart,k=r.pinchDown,m=a.touches,e=m.length,g=r.lastValidTouch,h=r.hasZoom,C=r.selectionMarker,f={},d=1===e&&(r.inClass(a.target,"highcharts-tracker")&&t.runTrackerClick||r.runChartClick),b={};1b-6&&n(u||d.chartWidth- +2*x-v-e.x)&&(this.itemX=v,this.itemY+=p+this.lastLineHeight+I,this.lastLineHeight=0);this.maxItemWidth=Math.max(this.maxItemWidth,c);this.lastItemY=p+this.itemY+I;this.lastLineHeight=Math.max(g,this.lastLineHeight);a._legendItemPos=[this.itemX,this.itemY];f?this.itemX+=c:(this.itemY+=p+g+I,this.lastLineHeight=g);this.offsetWidth=u||Math.max((f?this.itemX-v-l:c)+x,this.offsetWidth)},getAllItems:function(){var a=[];l(this.chart.series,function(d){var b=d&&d.options;d&&m(b.showInLegend,p(b.linkedTo)? +!1:void 0,!0)&&(a=a.concat(d.legendItems||("point"===b.legendType?d.data:d)))});return a},adjustMargins:function(a,d){var b=this.chart,e=this.options,f=e.align.charAt(0)+e.verticalAlign.charAt(0)+e.layout.charAt(0);e.floating||l([/(lth|ct|rth)/,/(rtv|rm|rbv)/,/(rbh|cb|lbh)/,/(lbv|lm|ltv)/],function(c,g){c.test(f)&&!p(a[g])&&(b[t[g]]=Math.max(b[t[g]],b.legend[(g+1)%2?"legendHeight":"legendWidth"]+[1,-1,-1,1][g]*e[g%2?"x":"y"]+m(e.margin,12)+d[g]))})},render:function(){var a=this,d=a.chart,b=d.renderer, +e=a.group,h,c,m,n,k=a.box,x=a.options,p=a.padding;a.itemX=a.initialItemX;a.itemY=a.initialItemY;a.offsetWidth=0;a.lastItemY=0;e||(a.group=e=b.g("legend").attr({zIndex:7}).add(),a.contentGroup=b.g().attr({zIndex:1}).add(e),a.scrollGroup=b.g().add(a.contentGroup));a.renderTitle();h=a.getAllItems();g(h,function(a,b){return(a.options&&a.options.legendIndex||0)-(b.options&&b.options.legendIndex||0)});x.reversed&&h.reverse();a.allItems=h;a.display=c=!!h.length;a.lastLineHeight=0;l(h,function(b){a.renderItem(b)}); +m=(x.width||a.offsetWidth)+p;n=a.lastItemY+a.lastLineHeight+a.titleHeight;n=a.handleOverflow(n);n+=p;k||(a.box=k=b.rect().addClass("highcharts-legend-box").attr({r:x.borderRadius}).add(e),k.isNew=!0);k.attr({stroke:x.borderColor,"stroke-width":x.borderWidth||0,fill:x.backgroundColor||"none"}).shadow(x.shadow);0b&&!1!==h.enabled?(this.clipHeight=g=Math.max(b-20-this.titleHeight-I,0),this.currentPage=m(this.currentPage,1),this.fullHeight=a,l(v,function(a,b){var c=a._legendItemPos[1];a=Math.round(a.legendItem.getBBox().height);var d=u.length;if(!d||c-u[d-1]>g&&(r||c)!==u[d-1])u.push(r||c),d++;b===v.length-1&&c+a-u[d-1]>g&&u.push(c);c!==r&&(r=c)}),n||(n=d.clipRect= +e.clipRect(0,I,9999,0),d.contentGroup.clip(n)),t(g),y||(this.nav=y=e.g().attr({zIndex:1}).add(this.group),this.up=e.symbol("triangle",0,0,p,p).on("click",function(){d.scroll(-1,k)}).add(y),this.pager=e.text("",15,10).addClass("highcharts-legend-navigation").css(h.style).add(y),this.down=e.symbol("triangle-down",0,0,p,p).on("click",function(){d.scroll(1,k)}).add(y)),d.scroll(0),a=b):y&&(t(),y.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0);return a},scroll:function(a,d){var b=this.pages, +f=b.length;a=this.currentPage+a;var g=this.clipHeight,c=this.options.navigation,h=this.pager,n=this.padding;a>f&&(a=f);0f&&(g=typeof a[0],"string"===g?e.name=a[0]:"number"===g&&(e.x=a[0]),d++);b=h.value;)h=e[++g];h&&h.color&&!this.options.color&&(this.color=h.color);return h},destroy:function(){var a=this.series.chart,e=a.hoverPoints,g;a.pointCount--;e&&(this.setState(),H(e,this),e.length||(a.hoverPoints=null));if(this===a.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)k(this), +this.destroyElements();this.legendItem&&a.legend.destroyItem(this);for(g in this)this[g]=null},destroyElements:function(){for(var a=["graphic","dataLabel","dataLabelUpper","connector","shadowGroup"],e,g=6;g--;)e=a[g],this[e]&&(this[e]=this[e].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,color:this.color,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},tooltipFormatter:function(a){var e=this.series,g= +e.tooltipOptions,h=t(g.valueDecimals,""),k=g.valuePrefix||"",f=g.valueSuffix||"";B(e.pointArrayMap||["y"],function(d){d="{point."+d;if(k||f)a=a.replace(d+"}",k+d+"}"+f);a=a.replace(d+"}",d+":,."+h+"f}")});return l(a,{point:this,series:this.series})},firePointEvent:function(a,e,g){var h=this,k=this.series.options;(k.point.events[a]||h.options&&h.options.events&&h.options.events[a])&&this.importEvents();"click"===a&&k.allowPointSelect&&(g=function(a){h.select&&h.select(null,a.ctrlKey||a.metaKey||a.shiftKey)}); +p(this,a,e,g)},visible:!0}})(N);(function(a){var D=a.addEvent,B=a.animObject,G=a.arrayMax,H=a.arrayMin,p=a.correctFloat,l=a.Date,r=a.defaultOptions,w=a.defaultPlotOptions,t=a.defined,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.fireEvent,C=a.grep,f=a.isArray,d=a.isNumber,b=a.isString,q=a.merge,E=a.pick,c=a.removeEvent,F=a.splat,n=a.stableSort,A=a.SVGElement,x=a.syncTimeout,J=a.win;a.Series=a.seriesType("line",null,{lineWidth:2,allowPointSelect:!1,showCheckbox:!1,animation:{duration:1E3},events:{}, +marker:{lineWidth:0,lineColor:"#ffffff",radius:4,states:{hover:{animation:{duration:50},enabled:!0,radiusPlus:2,lineWidthPlus:1},select:{fillColor:"#cccccc",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:{align:"center",formatter:function(){return null===this.y?"":a.numberFormat(this.y,-1)},style:{fontSize:"11px",fontWeight:"bold",color:"contrast",textOutline:"1px contrast"},verticalAlign:"bottom",x:0,y:0,padding:5},cropThreshold:300,pointRange:0,softThreshold:!0,states:{hover:{lineWidthPlus:1, +marker:{},halo:{size:10,opacity:.25}},select:{marker:{}}},stickyTracking:!0,turboThreshold:1E3},{isCartesian:!0,pointClass:a.Point,sorted:!0,requireSorting:!0,directTouch:!1,axisTypes:["xAxis","yAxis"],colorCounter:0,parallelArrays:["x","y"],coll:"series",init:function(a,b){var c=this,d,e,f=a.series,u,y=function(a,b){return E(a.options.index,a._i)-E(b.options.index,b._i)};c.chart=a;c.options=b=c.setOptions(b);c.linkedSeries=[];c.bindAxes();g(c,{name:b.name,state:"",visible:!1!==b.visible,selected:!0=== +b.selected});e=b.events;for(d in e)D(c,d,e[d]);if(e&&e.click||b.point&&b.point.events&&b.point.events.click||b.allowPointSelect)a.runTrackerClick=!0;c.getColor();c.getSymbol();k(c.parallelArrays,function(a){c[a+"Data"]=[]});c.setData(b.data,!1);c.isCartesian&&(a.hasCartesianSeries=!0);f.length&&(u=f[f.length-1]);c._i=E(u&&u._i,-1)+1;f.push(c);n(f,y);this.yAxis&&n(this.yAxis.series,y);k(f,function(a,b){a.index=b;a.name=a.name||"Series "+(b+1)})},bindAxes:function(){var a=this,b=a.options,c=a.chart, +d;k(a.axisTypes||[],function(f){k(c[f],function(c){d=c.options;if(b[f]===d.index||void 0!==b[f]&&b[f]===d.id||void 0===b[f]&&0===d.index)c.series.push(a),a[f]=c,c.isDirty=!0});a[f]||a.optionalAxis===f||e(18,!0)})},updateParallelArrays:function(a,b){var c=a.series,e=arguments,f=d(b)?function(d){var e="y"===d&&c.toYData?c.toYData(a):a[d];c[d+"Data"][b]=e}:function(a){Array.prototype[b].apply(c[a+"Data"],Array.prototype.slice.call(e,2))};k(c.parallelArrays,f)},autoIncrement:function(){var a=this.options, +b=this.xIncrement,c,d=a.pointIntervalUnit,b=E(b,a.pointStart,0);this.pointInterval=c=E(this.pointInterval,a.pointInterval,1);d&&(a=new l(b),"day"===d?a=+a[l.hcSetDate](a[l.hcGetDate]()+c):"month"===d?a=+a[l.hcSetMonth](a[l.hcGetMonth]()+c):"year"===d&&(a=+a[l.hcSetFullYear](a[l.hcGetFullYear]()+c)),c=a-b);this.xIncrement=b+c;return b},setOptions:function(a){var b=this.chart,c=b.options.plotOptions,b=b.userOptions||{},d=b.plotOptions||{},e=c[this.type];this.userOptions=a;c=q(e,c.series,a);this.tooltipOptions= +q(r.tooltip,r.plotOptions[this.type].tooltip,b.tooltip,d.series&&d.series.tooltip,d[this.type]&&d[this.type].tooltip,a.tooltip);null===e.marker&&delete c.marker;this.zoneAxis=c.zoneAxis;a=this.zones=(c.zones||[]).slice();!c.negativeColor&&!c.negativeFillColor||c.zones||a.push({value:c[this.zoneAxis+"Threshold"]||c.threshold||0,className:"highcharts-negative",color:c.negativeColor,fillColor:c.negativeFillColor});a.length&&t(a[a.length-1].value)&&a.push({color:this.color,fillColor:this.fillColor}); +return c},getCyclic:function(a,b,c){var d,e=this.userOptions,f=a+"Index",g=a+"Counter",u=c?c.length:E(this.chart.options.chart[a+"Count"],this.chart[a+"Count"]);b||(d=E(e[f],e["_"+f]),t(d)||(e["_"+f]=d=this.chart[g]%u,this.chart[g]+=1),c&&(b=c[d]));void 0!==d&&(this[f]=d);this[a]=b},getColor:function(){this.options.colorByPoint?this.options.color=null:this.getCyclic("color",this.options.color||w[this.type].color,this.chart.options.colors)},getSymbol:function(){this.getCyclic("symbol",this.options.marker.symbol, +this.chart.options.symbols)},drawLegendSymbol:a.LegendSymbolMixin.drawLineMarker,setData:function(a,c,g,n){var u=this,q=u.points,h=q&&q.length||0,y,m=u.options,x=u.chart,A=null,I=u.xAxis,l=m.turboThreshold,p=this.xData,r=this.yData,F=(y=u.pointArrayMap)&&y.length;a=a||[];y=a.length;c=E(c,!0);if(!1!==n&&y&&h===y&&!u.cropped&&!u.hasGroupedData&&u.visible)k(a,function(a,b){q[b].update&&a!==m.data[b]&&q[b].update(a,!1,null,!1)});else{u.xIncrement=null;u.colorCounter=0;k(this.parallelArrays,function(a){u[a+ +"Data"].length=0});if(l&&y>l){for(g=0;null===A&&gh||this.forceCrop))if(b[d-1]l)b=[],c=[];else if(b[0]l)f=this.cropData(this.xData,this.yData,A,l),b=f.xData,c=f.yData,f=f.start,g=!0;for(h=b.length||1;--h;)d=x?y(b[h])-y(b[h-1]):b[h]-b[h-1],0d&&this.requireSorting&&e(15);this.cropped=g;this.cropStart=f;this.processedXData=b;this.processedYData=c;this.closestPointRange=n},cropData:function(a,b,c,d){var e=a.length,f=0,g=e,n=E(this.cropShoulder,1),u;for(u=0;u=c){f=Math.max(0,u- +n);break}for(c=u;cd){g=c+n;break}return{xData:a.slice(f,g),yData:b.slice(f,g),start:f,end:g}},generatePoints:function(){var a=this.options.data,b=this.data,c,d=this.processedXData,e=this.processedYData,f=this.pointClass,g=d.length,n=this.cropStart||0,q,h=this.hasGroupedData,k,m=[],x;b||h||(b=[],b.length=a.length,b=this.data=b);for(x=0;x=q&&(c[x-1]||k)<=h,y&&k)if(y=m.length)for(;y--;)null!==m[y]&&(g[n++]=m[y]);else g[n++]=m;this.dataMin=H(g);this.dataMax=G(g)},translate:function(){this.processedXData||this.processData();this.generatePoints();var a=this.options,b=a.stacking,c=this.xAxis,e=c.categories,f=this.yAxis,g=this.points,n=g.length,q=!!this.modifyValue,h=a.pointPlacement,k="between"===h||d(h),m=a.threshold,x=a.startFromThreshold?m:0,A,l,r,F,J=Number.MAX_VALUE;"between"===h&&(h=.5);d(h)&&(h*=E(a.pointRange||c.pointRange)); +for(a=0;a=B&&(C.isNull=!0);C.plotX=A=p(Math.min(Math.max(-1E5,c.translate(w,0,0,0,1,h,"flags"===this.type)),1E5));b&&this.visible&&!C.isNull&&D&&D[w]&&(F=this.getStackIndicator(F,w,this.index),G=D[w],B=G.points[F.key],l=B[0],B=B[1],l===x&&F.key===D[w].base&&(l=E(m,f.min)),f.isLog&&0>=l&&(l=null),C.total=C.stackTotal=G.total,C.percentage=G.total&&C.y/G.total*100,C.stackY= +B,G.setOffset(this.pointXOffset||0,this.barW||0));C.yBottom=t(l)?f.translate(l,0,1,0,1):null;q&&(B=this.modifyValue(B,C));C.plotY=l="number"===typeof B&&Infinity!==B?Math.min(Math.max(-1E5,f.translate(B,0,1,0,1)),1E5):void 0;C.isInside=void 0!==l&&0<=l&&l<=f.len&&0<=A&&A<=c.len;C.clientX=k?p(c.translate(w,0,0,0,1,h)):A;C.negative=C.y<(m||0);C.category=e&&void 0!==e[C.x]?e[C.x]:C.x;C.isNull||(void 0!==r&&(J=Math.min(J,Math.abs(A-r))),r=A)}this.closestPointRangePx=J},getValidPoints:function(a,b){var c= +this.chart;return C(a||this.points||[],function(a){return b&&!c.isInsidePlot(a.plotX,a.plotY,c.inverted)?!1:!a.isNull})},setClip:function(a){var b=this.chart,c=this.options,d=b.renderer,e=b.inverted,f=this.clipBox,g=f||b.clipBox,n=this.sharedClipKey||["_sharedClip",a&&a.duration,a&&a.easing,g.height,c.xAxis,c.yAxis].join(),q=b[n],h=b[n+"m"];q||(a&&(g.width=0,b[n+"m"]=h=d.clipRect(-99,e?-b.plotLeft:-b.plotTop,99,e?b.chartWidth:b.chartHeight)),b[n]=q=d.clipRect(g),q.count={length:0});a&&!q.count[this.index]&& +(q.count[this.index]=!0,q.count.length+=1);!1!==c.clip&&(this.group.clip(a||f?q:b.clipRect),this.markerGroup.clip(h),this.sharedClipKey=n);a||(q.count[this.index]&&(delete q.count[this.index],--q.count.length),0===q.count.length&&n&&b[n]&&(f||(b[n]=b[n].destroy()),b[n+"m"]&&(b[n+"m"]=b[n+"m"].destroy())))},animate:function(a){var b=this.chart,c=B(this.options.animation),d;a?this.setClip(c):(d=this.sharedClipKey,(a=b[d])&&a.animate({width:b.plotSizeX},c),b[d+"m"]&&b[d+"m"].animate({width:b.plotSizeX+ +99},c),this.animate=null)},afterAnimate:function(){this.setClip();h(this,"afterAnimate")},drawPoints:function(){var a=this.points,b=this.chart,c,e,f,g,n=this.options.marker,q,h,k,m,x=this.markerGroup,A=E(n.enabled,this.xAxis.isRadial?!0:null,this.closestPointRangePx>2*n.radius);if(!1!==n.enabled||this._hasPointMarkers)for(e=a.length;e--;)f=a[e],c=f.plotY,g=f.graphic,q=f.marker||{},h=!!f.marker,k=A&&void 0===q.enabled||q.enabled,m=f.isInside,k&&d(c)&&null!==f.y?(c=E(q.symbol,this.symbol),f.hasImage= +0===c.indexOf("url"),k=this.markerAttribs(f,f.selected&&"select"),g?g[m?"show":"hide"](!0).animate(k):m&&(0e&&b.shadow));g&&(g.startX=c.xMap, +g.isArea=c.isArea)})},applyZones:function(){var a=this,b=this.chart,c=b.renderer,d=this.zones,e,f,g=this.clips||[],n,q=this.graph,h=this.area,m=Math.max(b.chartWidth,b.chartHeight),x=this[(this.zoneAxis||"y")+"Axis"],A,l,p=b.inverted,r,F,C,t,J=!1;d.length&&(q||h)&&x&&void 0!==x.min&&(l=x.reversed,r=x.horiz,q&&q.hide(),h&&h.hide(),A=x.getExtremes(),k(d,function(d,u){e=l?r?b.plotWidth:0:r?0:x.toPixels(A.min);e=Math.min(Math.max(E(f,e),0),m);f=Math.min(Math.max(Math.round(x.toPixels(E(d.value,A.max), +!0)),0),m);J&&(e=f=x.toPixels(A.max));F=Math.abs(e-f);C=Math.min(e,f);t=Math.max(e,f);x.isXAxis?(n={x:p?t:C,y:0,width:F,height:m},r||(n.x=b.plotHeight-n.x)):(n={x:0,y:p?t:C,width:m,height:F},r&&(n.y=b.plotWidth-n.y));p&&c.isVML&&(n=x.isXAxis?{x:0,y:l?C:t,height:n.width,width:b.chartWidth}:{x:n.y-b.plotLeft-b.spacingBox.x,y:0,width:n.height,height:b.chartHeight});g[u]?g[u].animate(n):(g[u]=c.clipRect(n),q&&a["zone-graph-"+u].clip(g[u]),h&&a["zone-area-"+u].clip(g[u]));J=d.value>A.max}),this.clips= +g)},invertGroups:function(a){function b(){var b={width:c.yAxis.len,height:c.xAxis.len};k(["group","markerGroup"],function(d){c[d]&&c[d].attr(b).invert(a)})}var c=this,d;c.xAxis&&(d=D(c.chart,"resize",b),D(c,"destroy",d),b(a),c.invertGroups=b)},plotGroup:function(a,b,c,d,e){var f=this[a],g=!f;g&&(this[a]=f=this.chart.renderer.g(b).attr({zIndex:d||.1}).add(e),f.addClass("highcharts-series-"+this.index+" highcharts-"+this.type+"-series highcharts-color-"+this.colorIndex+" "+(this.options.className|| +"")));f.attr({visibility:c})[g?"attr":"animate"](this.getPlotBox());return f},getPlotBox:function(){var a=this.chart,b=this.xAxis,c=this.yAxis;a.inverted&&(b=c,c=this.xAxis);return{translateX:b?b.left:a.plotLeft,translateY:c?c.top:a.plotTop,scaleX:1,scaleY:1}},render:function(){var a=this,b=a.chart,c,d=a.options,e=!!a.animate&&b.renderer.isSVG&&B(d.animation).duration,f=a.visible?"inherit":"hidden",g=d.zIndex,n=a.hasRendered,q=b.seriesGroup,h=b.inverted;c=a.plotGroup("group","series",f,g,q);a.markerGroup= +a.plotGroup("markerGroup","markers",f,g,q);e&&a.animate(!0);c.inverted=a.isCartesian?h:!1;a.drawGraph&&(a.drawGraph(),a.applyZones());a.drawDataLabels&&a.drawDataLabels();a.visible&&a.drawPoints();a.drawTracker&&!1!==a.options.enableMouseTracking&&a.drawTracker();a.invertGroups(h);!1===d.clip||a.sharedClipKey||n||c.clip(b.clipRect);e&&a.animate();n||(a.animationTimeout=x(function(){a.afterAnimate()},e));a.isDirty=a.isDirtyData=!1;a.hasRendered=!0},redraw:function(){var a=this.chart,b=this.isDirty|| +this.isDirtyData,c=this.group,d=this.xAxis,e=this.yAxis;c&&(a.inverted&&c.attr({width:a.plotWidth,height:a.plotHeight}),c.animate({translateX:E(d&&d.left,a.plotLeft),translateY:E(e&&e.top,a.plotTop)}));this.translate();this.render();b&&delete this.kdTree},kdDimensions:1,kdAxisArray:["clientX","plotY"],searchPoint:function(a,b){var c=this.xAxis,d=this.yAxis,e=this.chart.inverted;return this.searchKDTree({clientX:e?c.len-a.chartY+c.pos:a.chartX-c.pos,plotY:e?d.len-a.chartX+d.pos:a.chartY-d.pos},b)}, +buildKDTree:function(){function a(c,d,e){var f,g;if(g=c&&c.length)return f=b.kdAxisArray[d%e],c.sort(function(a,b){return a[f]-b[f]}),g=Math.floor(g/2),{point:c[g],left:a(c.slice(0,g),d+1,e),right:a(c.slice(g+1),d+1,e)}}var b=this,c=b.kdDimensions;delete b.kdTree;x(function(){b.kdTree=a(b.getValidPoints(null,!b.directTouch),c,c)},b.options.kdNow?0:1)},searchKDTree:function(a,b){function c(a,b,n,q){var h=b.point,u=d.kdAxisArray[n%q],k,m,x=h;m=t(a[e])&&t(h[e])?Math.pow(a[e]-h[e],2):null;k=t(a[f])&& +t(h[f])?Math.pow(a[f]-h[f],2):null;k=(m||0)+(k||0);h.dist=t(k)?Math.sqrt(k):Number.MAX_VALUE;h.distX=t(m)?Math.sqrt(m):Number.MAX_VALUE;u=a[u]-h[u];k=0>u?"left":"right";m=0>u?"right":"left";b[k]&&(k=c(a,b[k],n+1,q),x=k[g]A;)l--;this.updateParallelArrays(h,"splice",l,0,0);this.updateParallelArrays(h,l);n&&h.name&&(n[A]=h.name);q.splice(l,0,a);m&&(this.data.splice(l,0,null),this.processData());"point"===c.legendType&&this.generatePoints();d&&(f[0]&&f[0].remove?f[0].remove(!1):(f.shift(),this.updateParallelArrays(h,"shift"),q.shift()));this.isDirtyData=this.isDirty=!0;b&&g.redraw(e)},removePoint:function(a, +b,d){var c=this,e=c.data,f=e[a],g=c.points,n=c.chart,h=function(){g&&g.length===e.length&&g.splice(a,1);e.splice(a,1);c.options.data.splice(a,1);c.updateParallelArrays(f||{series:c},"splice",a,1);f&&f.destroy();c.isDirty=!0;c.isDirtyData=!0;b&&n.redraw()};q(d,n);b=C(b,!0);f?f.firePointEvent("remove",null,h):h()},remove:function(a,b,d){function c(){e.destroy();f.isDirtyLegend=f.isDirtyBox=!0;f.linkSeries();C(a,!0)&&f.redraw(b)}var e=this,f=e.chart;!1!==d?k(e,"remove",null,c):c()},update:function(a, +d){var c=this,e=this.chart,f=this.userOptions,g=this.type,q=a.type||f.type||e.options.chart.type,u=b[g].prototype,m=["group","markerGroup","dataLabelsGroup"],k;if(q&&q!==g||void 0!==a.zIndex)m.length=0;r(m,function(a){m[a]=c[a];delete c[a]});a=h(f,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},a);this.remove(!1,null,!1);for(k in u)this[k]=void 0;t(this,b[q||g].prototype);r(m,function(a){c[a]=m[a]});this.init(e,a);e.linkSeries();C(d,!0)&&e.redraw(!1)}});t(G.prototype, +{update:function(a,b){var c=this.chart;a=c.options[this.coll][this.options.index]=h(this.userOptions,a);this.destroy(!0);this.init(c,t(a,{events:void 0}));c.isDirtyBox=!0;C(b,!0)&&c.redraw()},remove:function(a){for(var b=this.chart,c=this.coll,d=this.series,e=d.length;e--;)d[e]&&d[e].remove(!1);w(b.axes,this);w(b[c],this);b.options[c].splice(this.options.index,1);r(b[c],function(a,b){a.options.index=b});this.destroy();b.isDirtyBox=!0;C(a,!0)&&b.redraw()},setTitle:function(a,b){this.update({title:a}, +b)},setCategories:function(a,b){this.update({categories:a},b)}})})(N);(function(a){var D=a.color,B=a.each,G=a.map,H=a.pick,p=a.Series,l=a.seriesType;l("area","line",{softThreshold:!1,threshold:0},{singleStacks:!1,getStackPoints:function(){var a=[],l=[],p=this.xAxis,k=this.yAxis,m=k.stacks[this.stackKey],e={},g=this.points,h=this.index,C=k.series,f=C.length,d,b=H(k.options.reversedStacks,!0)?1:-1,q,E;if(this.options.stacking){for(q=0;qa&&t>l?(t=Math.max(a,l),m=2*l-t):tH&& +m>l?(m=Math.max(H,l),t=2*l-m):m=Math.abs(g)&&.5a.closestPointRange*a.xAxis.transA,k=a.borderWidth=r(h.borderWidth,k?0:1),f=a.yAxis,d=a.translatedThreshold=f.getThreshold(h.threshold),b=r(h.minPointLength,5),q=a.getColumnMetrics(),m=q.width,c=a.barW=Math.max(m,1+2*k),l=a.pointXOffset= +q.offset;g.inverted&&(d-=.5);h.pointPadding&&(c=Math.ceil(c));w.prototype.translate.apply(a);G(a.points,function(e){var n=r(e.yBottom,d),q=999+Math.abs(n),q=Math.min(Math.max(-q,e.plotY),f.len+q),h=e.plotX+l,k=c,u=Math.min(q,n),p,t=Math.max(q,n)-u;Math.abs(t)b?n-b:d-(p?b:0));e.barX=h;e.pointWidth=m;e.tooltipPos=g.inverted?[f.len+f.pos-g.plotLeft-q,a.xAxis.len-h-k/2,t]:[h+k/2,q+f.pos-g.plotTop,t];e.shapeType="rect";e.shapeArgs= +a.crispCol.apply(a,e.isNull?[e.plotX,f.len/2,0,0]:[h,u,k,t])})},getSymbol:a.noop,drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,drawGraph:function(){this.group[this.dense?"addClass":"removeClass"]("highcharts-dense-data")},pointAttribs:function(a,g){var e=this.options,k=this.pointAttrToOptions||{},f=k.stroke||"borderColor",d=k["stroke-width"]||"borderWidth",b=a&&a.color||this.color,q=a[f]||e[f]||this.color||b,k=e.dashStyle,m;a&&this.zones.length&&(b=(b=a.getZone())&&b.color||a.options.color|| +this.color);g&&(g=e.states[g],m=g.brightness,b=g.color||void 0!==m&&B(b).brighten(g.brightness).get()||b,q=g[f]||q,k=g.dashStyle||k);a={fill:b,stroke:q,"stroke-width":a[d]||e[d]||this[d]||0};e.borderRadius&&(a.r=e.borderRadius);k&&(a.dashstyle=k);return a},drawPoints:function(){var a=this,g=this.chart,h=a.options,m=g.renderer,f=h.animationLimit||250,d;G(a.points,function(b){var e=b.graphic;p(b.plotY)&&null!==b.y?(d=b.shapeArgs,e?(k(e),e[g.pointCountt;++t)k=r[t],a=2>t||2===t&&/%$/.test(k),r[t]=B(k,[l,H,w,r[2]][t])+(a?p:0);r[3]>r[2]&&(r[3]=r[2]);return r}}})(N);(function(a){var D=a.addEvent,B=a.defined,G=a.each,H=a.extend,p=a.inArray,l=a.noop,r=a.pick,w=a.Point,t=a.Series,k=a.seriesType,m=a.setAnimation;k("pie","line",{center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return null===this.y? +void 0:this.point.name},x:0},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,stickyTracking:!1,tooltip:{followPointer:!0},borderColor:"#ffffff",borderWidth:1,states:{hover:{brightness:.1,shadow:!1}}},{isCartesian:!1,requireSorting:!1,directTouch:!0,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],axisTypes:[],pointAttribs:a.seriesTypes.column.prototype.pointAttribs,animate:function(a){var e=this,h=e.points,k=e.startAngleRad;a||(G(h,function(a){var d= +a.graphic,b=a.shapeArgs;d&&(d.attr({r:a.startR||e.center[3]/2,start:k,end:k}),d.animate({r:b.r,start:b.start,end:b.end},e.options.animation))}),e.animate=null)},updateTotals:function(){var a,g=0,h=this.points,k=h.length,f,d=this.options.ignoreHiddenPoint;for(a=0;af.y&&(f.y=null),g+=d&&!f.visible?0:f.y;this.total=g;for(a=0;a1.5*Math.PI?q-=2*Math.PI:q<-Math.PI/2&&(q+=2*Math.PI);t.slicedTranslation={translateX:Math.round(Math.cos(q)*k),translateY:Math.round(Math.sin(q)*k)};d=Math.cos(q)*a[2]/2;b=Math.sin(q)*a[2]/2;t.tooltipPos=[a[0]+.7*d,a[1]+.7*b];t.half=q<-Math.PI/2||q>Math.PI/2?1:0;t.angle=q;f=Math.min(f,n/5);t.labelPos=[a[0]+d+Math.cos(q)*n,a[1]+b+Math.sin(q)*n,a[0]+d+Math.cos(q)*f,a[1]+b+Math.sin(q)* +f,a[0]+d,a[1]+b,0>n?"center":t.half?"right":"left",q]}},drawGraph:null,drawPoints:function(){var a=this,g=a.chart.renderer,h,k,f,d,b=a.options.shadow;b&&!a.shadowGroup&&(a.shadowGroup=g.g("shadow").add(a.group));G(a.points,function(e){if(null!==e.y){k=e.graphic;d=e.shapeArgs;h=e.sliced?e.slicedTranslation:{};var q=e.shadowGroup;b&&!q&&(q=e.shadowGroup=g.g("shadow").add(a.shadowGroup));q&&q.attr(h);f=a.pointAttribs(e,e.selected&&"select");k?k.setRadialReference(a.center).attr(f).animate(H(d,h)):(e.graphic= +k=g[e.shapeType](d).addClass(e.getClassName()).setRadialReference(a.center).attr(h).add(a.group),e.visible||k.attr({visibility:"hidden"}),k.attr(f).attr({"stroke-linejoin":"round"}).shadow(b,q))}})},searchPoint:l,sortByAngle:function(a,g){a.sort(function(a,e){return void 0!==a.angle&&(e.angle-a.angle)*g})},drawLegendSymbol:a.LegendSymbolMixin.drawRectangle,getCenter:a.CenteredSeriesMixin.getCenter,getSymbol:l},{init:function(){w.prototype.init.apply(this,arguments);var a=this,g;a.name=r(a.name,"Slice"); +g=function(e){a.slice("select"===e.type)};D(a,"select",g);D(a,"unselect",g);return a},setVisible:function(a,g){var e=this,k=e.series,f=k.chart,d=k.options.ignoreHiddenPoint;g=r(g,d);a!==e.visible&&(e.visible=e.options.visible=a=void 0===a?!e.visible:a,k.options.data[p(e,k.data)]=e.options,G(["graphic","dataLabel","connector","shadowGroup"],function(b){if(e[b])e[b][a?"show":"hide"](!0)}),e.legendItem&&f.legend.colorizeItem(e,a),a||"hover"!==e.state||e.setState(""),d&&(k.isDirty=!0),g&&f.redraw())}, +slice:function(a,g,h){var e=this.series;m(h,e.chart);r(g,!0);this.sliced=this.options.sliced=a=B(a)?a:!this.sliced;e.options.data[p(this,e.data)]=this.options;a=a?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(a);this.shadowGroup&&this.shadowGroup.animate(a)},haloPath:function(a){var e=this.shapeArgs;return this.sliced||!this.visible?[]:this.series.chart.renderer.symbols.arc(e.x,e.y,e.r+a,e.r+a,{innerR:this.shapeArgs.r,start:e.start,end:e.end})}})})(N);(function(a){var D= +a.addEvent,B=a.arrayMax,G=a.defined,H=a.each,p=a.extend,l=a.format,r=a.map,w=a.merge,t=a.noop,k=a.pick,m=a.relativeLength,e=a.Series,g=a.seriesTypes,h=a.stableSort,C=a.stop;a.distribute=function(a,d){function b(a,b){return a.target-b.target}var e,f=!0,c=a,g=[],n;n=0;for(e=a.length;e--;)n+=a[e].size;if(n>d){h(a,function(a,b){return(b.rank||0)-(a.rank||0)});for(n=e=0;n<=d;)n+=a[e].size,e++;g=a.splice(e-1,a.length)}h(a,b);for(a=r(a,function(a){return{size:a.size,targets:[a.target]}});f;){for(e=a.length;e--;)f= +a[e],n=(Math.min.apply(0,f.targets)+Math.max.apply(0,f.targets))/2,f.pos=Math.min(Math.max(0,n-f.size/2),d-f.size);e=a.length;for(f=!1;e--;)0a[e].pos&&(a[e-1].size+=a[e].size,a[e-1].targets=a[e-1].targets.concat(a[e].targets),a[e-1].pos+a[e-1].size>d&&(a[e-1].pos=d-a[e-1].size),a.splice(e,1),f=!0)}e=0;H(a,function(a){var b=0;H(a.targets,function(){c[e].pos=a.pos+b;b+=c[e].size;e++})});c.push.apply(c,g);h(c,b)};e.prototype.drawDataLabels=function(){var a=this,d=a.options, +b=d.dataLabels,e=a.points,g,c,h=a.hasRendered||0,n,m,x=k(b.defer,!0),r=a.chart.renderer;if(b.enabled||a._hasPointLabels)a.dlProcessOptions&&a.dlProcessOptions(b),m=a.plotGroup("dataLabelsGroup","data-labels",x&&!h?"hidden":"visible",b.zIndex||6),x&&(m.attr({opacity:+h}),h||D(a,"afterAnimate",function(){a.visible&&m.show(!0);m[d.animation?"animate":"attr"]({opacity:1},{duration:200})})),c=b,H(e,function(e){var f,q=e.dataLabel,h,x,A=e.connector,y=!0,t,z={};g=e.dlOptions||e.options&&e.options.dataLabels; +f=k(g&&g.enabled,c.enabled)&&null!==e.y;if(q&&!f)e.dataLabel=q.destroy();else if(f){b=w(c,g);t=b.style;f=b.rotation;h=e.getLabelConfig();n=b.format?l(b.format,h):b.formatter.call(h,b);t.color=k(b.color,t.color,a.color,"#000000");if(q)G(n)?(q.attr({text:n}),y=!1):(e.dataLabel=q=q.destroy(),A&&(e.connector=A.destroy()));else if(G(n)){q={fill:b.backgroundColor,stroke:b.borderColor,"stroke-width":b.borderWidth,r:b.borderRadius||0,rotation:f,padding:b.padding,zIndex:1};"contrast"===t.color&&(z.color=b.inside|| +0>b.distance||d.stacking?r.getContrast(e.color||a.color):"#000000");d.cursor&&(z.cursor=d.cursor);for(x in q)void 0===q[x]&&delete q[x];q=e.dataLabel=r[f?"text":"label"](n,0,-9999,b.shape,null,null,b.useHTML,null,"data-label").attr(q);q.addClass("highcharts-data-label-color-"+e.colorIndex+" "+(b.className||""));q.css(p(t,z));q.add(m);q.shadow(b.shadow)}q&&a.alignDataLabel(e,q,b,null,y)}})};e.prototype.alignDataLabel=function(a,d,b,e,g){var c=this.chart,f=c.inverted,n=k(a.plotX,-9999),q=k(a.plotY, +-9999),h=d.getBBox(),m,l=b.rotation,u=b.align,r=this.visible&&(a.series.forceDL||c.isInsidePlot(n,Math.round(q),f)||e&&c.isInsidePlot(n,f?e.x+1:e.y+e.height-1,f)),t="justify"===k(b.overflow,"justify");r&&(m=b.style.fontSize,m=c.renderer.fontMetrics(m,d).b,e=p({x:f?c.plotWidth-q:n,y:Math.round(f?c.plotHeight-n:q),width:0,height:0},e),p(b,{width:h.width,height:h.height}),l?(t=!1,f=c.renderer.rotCorr(m,l),f={x:e.x+b.x+e.width/2+f.x,y:e.y+b.y+{top:0,middle:.5,bottom:1}[b.verticalAlign]*e.height},d[g? +"attr":"animate"](f).attr({align:u}),n=(l+720)%360,n=180n,"left"===u?f.y-=n?h.height:0:"center"===u?(f.x-=h.width/2,f.y-=h.height/2):"right"===u&&(f.x-=h.width,f.y-=n?0:h.height)):(d.align(b,null,e),f=d.alignAttr),t?this.justifyDataLabel(d,b,f,h,e,g):k(b.crop,!0)&&(r=c.isInsidePlot(f.x,f.y)&&c.isInsidePlot(f.x+h.width,f.y+h.height)),b.shape&&!l&&d.attr({anchorX:a.plotX,anchorY:a.plotY}));r||(C(d),d.attr({y:-9999}),d.placed=!1)};e.prototype.justifyDataLabel=function(a,d,b,e,g,c){var f=this.chart, +n=d.align,h=d.verticalAlign,q,k,m=a.box?0:a.padding||0;q=b.x+m;0>q&&("right"===n?d.align="left":d.x=-q,k=!0);q=b.x+e.width-m;q>f.plotWidth&&("left"===n?d.align="right":d.x=f.plotWidth-q,k=!0);q=b.y+m;0>q&&("bottom"===h?d.verticalAlign="top":d.y=-q,k=!0);q=b.y+e.height-m;q>f.plotHeight&&("top"===h?d.verticalAlign="bottom":d.y=f.plotHeight-q,k=!0);k&&(a.placed=!c,a.align(d,null,g))};g.pie&&(g.pie.prototype.drawDataLabels=function(){var f=this,d=f.data,b,g=f.chart,h=f.options.dataLabels,c=k(h.connectorPadding, +10),m=k(h.connectorWidth,1),n=g.plotWidth,l=g.plotHeight,x,p=h.distance,y=f.center,u=y[2]/2,t=y[1],w=0k-2?A:P,e),v._attr={visibility:S,align:D[6]},v._pos={x:L+h.x+({left:c,right:-c}[D[6]]||0),y:P+h.y-10},D.x=L,D.y=P,null===f.options.size&&(C=v.width,L-Cn-c&&(T[1]=Math.max(Math.round(L+ +C-n+c),T[1])),0>P-G/2?T[0]=Math.max(Math.round(-P+G/2),T[0]):P+G/2>l&&(T[2]=Math.max(Math.round(P+G/2-l),T[2])))}),0===B(T)||this.verifyDataLabelOverflow(T))&&(this.placeDataLabels(),w&&m&&H(this.points,function(a){var b;x=a.connector;if((v=a.dataLabel)&&v._pos&&a.visible){S=v._attr.visibility;if(b=!x)a.connector=x=g.renderer.path().addClass("highcharts-data-label-connector highcharts-color-"+a.colorIndex).add(f.dataLabelsGroup),x.attr({"stroke-width":m,stroke:h.connectorColor||a.color||"#666666"}); +x[b?"attr":"animate"]({d:f.connectorPath(a.labelPos)});x.attr("visibility",S)}else x&&(a.connector=x.destroy())}))},g.pie.prototype.connectorPath=function(a){var d=a.x,b=a.y;return k(this.options.dataLabels.softConnector,!0)?["M",d+("left"===a[6]?5:-5),b,"C",d,b,2*a[2]-a[4],2*a[3]-a[5],a[2],a[3],"L",a[4],a[5]]:["M",d+("left"===a[6]?5:-5),b,"L",a[2],a[3],"L",a[4],a[5]]},g.pie.prototype.placeDataLabels=function(){H(this.points,function(a){var d=a.dataLabel;d&&a.visible&&((a=d._pos)?(d.attr(d._attr), +d[d.moved?"animate":"attr"](a),d.moved=!0):d&&d.attr({y:-9999}))})},g.pie.prototype.alignDataLabel=t,g.pie.prototype.verifyDataLabelOverflow=function(a){var d=this.center,b=this.options,e=b.center,f=b.minSize||80,c,g;null!==e[0]?c=Math.max(d[2]-Math.max(a[1],a[3]),f):(c=Math.max(d[2]-a[1]-a[3],f),d[0]+=(a[3]-a[1])/2);null!==e[1]?c=Math.max(Math.min(c,d[2]-Math.max(a[0],a[2])),f):(c=Math.max(Math.min(c,d[2]-a[0]-a[2]),f),d[1]+=(a[0]-a[2])/2);ck(this.translatedThreshold,f.yAxis.len)),m=k(b.inside,!!this.options.stacking);n&&(g=w(n),0>g.y&&(g.height+=g.y,g.y=0),n=g.y+g.height-f.yAxis.len,0a+e||c+nb+f||g+hthis.pointCount))},pan:function(a,b){var c=this,d=c.hoverPoints, +e;d&&r(d,function(a){a.setState()});r("xy"===b?[1,0]:[1],function(b){b=c[b?"xAxis":"yAxis"][0];var d=b.horiz,f=a[d?"chartX":"chartY"],d=d?"mouseDownX":"mouseDownY",g=c[d],n=(b.pointRange||0)/2,h=b.getExtremes(),q=b.toValue(g-f,!0)+n,n=b.toValue(g+b.len-f,!0)-n,g=g>f;b.series.length&&(g||q>Math.min(h.dataMin,h.min))&&(!g||n=p(k.minWidth,0)&&this.chartHeight>=p(k.minHeight,0)};void 0===l._id&&(l._id=a.uniqueKey());m=m.call(this);!r[l._id]&&m?l.chartOptions&&(r[l._id]=this.currentOptions(l.chartOptions),this.update(l.chartOptions,w)):r[l._id]&&!m&&(this.update(r[l._id],w),delete r[l._id])};D.prototype.currentOptions=function(a){function p(a,m,e){var g,h;for(g in a)if(-1< +G(g,["series","xAxis","yAxis"]))for(a[g]=l(a[g]),e[g]=[],h=0;hd.length||void 0===h)return a.call(this,g,h,k,f);x=d.length;for(c=0;ck;d[c]5*b||w){if(d[c]>u){for(r=a.call(this,g,d[e],d[c],f);r.length&&r[0]<=u;)r.shift();r.length&&(u=r[r.length-1]);y=y.concat(r)}e=c+1}if(w)break}a= +r.info;if(q&&a.unitRange<=m.hour){c=y.length-1;for(e=1;ek?a-1:a;for(M=void 0;q--;)e=c[q],k=M-e,M&&k<.8*C&&(null===t||k<.8*t)?(n[y[q]]&&!n[y[q+1]]?(k=q+1,M=e):k=q,y.splice(k,1)):M=e}return y});w(B.prototype,{beforeSetTickPositions:function(){var a, +g=[],h=!1,k,f=this.getExtremes(),d=f.min,b=f.max,q,m=this.isXAxis&&!!this.options.breaks,f=this.options.ordinal,c=this.chart.options.chart.ignoreHiddenSeries;if(f||m){r(this.series,function(b,d){if(!(c&&!1===b.visible||!1===b.takeOrdinalPosition&&!m)&&(g=g.concat(b.processedXData),a=g.length,g.sort(function(a,b){return a-b}),a))for(d=a-1;d--;)g[d]===g[d+1]&&g.splice(d,1)});a=g.length;if(2k||b-g[g.length- +1]>k)&&(h=!0)}h?(this.ordinalPositions=g,k=this.val2lin(Math.max(d,g[0]),!0),q=Math.max(this.val2lin(Math.min(b,g[g.length-1]),!0),1),this.ordinalSlope=b=(b-d)/(q-k),this.ordinalOffset=d-k*b):this.ordinalPositions=this.ordinalSlope=this.ordinalOffset=void 0}this.isOrdinal=f&&h;this.groupIntervalFactor=null},val2lin:function(a,g){var e=this.ordinalPositions;if(e){var k=e.length,f,d;for(f=k;f--;)if(e[f]===a){d=f;break}for(f=k-1;f--;)if(a>e[f]||0===f){a=(a-e[f])/(e[f+1]-e[f]);d=f+a;break}g=g?d:this.ordinalSlope* +(d||0)+this.ordinalOffset}else g=a;return g},lin2val:function(a,g){var e=this.ordinalPositions;if(e){var k=this.ordinalSlope,f=this.ordinalOffset,d=e.length-1,b;if(g)0>a?a=e[0]:a>d?a=e[d]:(d=Math.floor(a),b=a-d);else for(;d--;)if(g=k*d+f,a>=g){k=k*(d+1)+f;b=(a-g)/(k-g);break}return void 0!==b&&void 0!==e[d]?e[d]+(b?b*(e[d+1]-e[d]):0):a}return a},getExtendedPositions:function(){var a=this.chart,g=this.series[0].currentDataGrouping,h=this.ordinalIndex,k=g?g.count+g.unitName:"raw",f=this.getExtremes(), +d,b;h||(h=this.ordinalIndex={});h[k]||(d={series:[],chart:a,getExtremes:function(){return{min:f.dataMin,max:f.dataMax}},options:{ordinal:!0},val2lin:B.prototype.val2lin},r(this.series,function(e){b={xAxis:d,xData:e.xData,chart:a,destroyGroupedData:t};b.options={dataGrouping:g?{enabled:!0,forced:!0,approximation:"open",units:[[g.unitName,[g.count]]]}:{enabled:!1}};e.processData.apply(b);d.series.push(b)}),this.beforeSetTickPositions.apply(d),h[k]=d.ordinalPositions);return h[k]},getGroupIntervalFactor:function(a, +g,h){var e;h=h.processedXData;var f=h.length,d=[];e=this.groupIntervalFactor;if(!e){for(e=0;ed?(l=p,t=e.ordinalPositions?e:p):(l=e.ordinalPositions?e:p,t=p),p=t.ordinalPositions,q>p[p.length-1]&&p.push(q),this.fixedRange=c-m,d=e.toFixedRange(null,null,n.apply(l,[x.apply(l,[m,!0])+d,!0]),n.apply(t,[x.apply(t, +[c,!0])+d,!0])),d.min>=Math.min(b.dataMin,m)&&d.max<=Math.max(q,c)&&e.setExtremes(d.min,d.max,!0,!1,{trigger:"pan"}),this.mouseDownX=k,H(this.container,{cursor:"move"})):f=!0}else f=!0;f&&a.apply(this,Array.prototype.slice.call(arguments,1))});k.prototype.gappedPath=function(){var a=this.options.gapSize,g=this.points.slice(),h=g.length-1;if(a&&0this.closestPointRange*a&&g.splice(h+1,0,{isNull:!0});return this.getGraphPath(g)}})(N);(function(a){function D(){return Array.prototype.slice.call(arguments, +1)}function B(a){a.apply(this);this.drawBreaks(this.xAxis,["x"]);this.drawBreaks(this.yAxis,G(this.pointArrayMap,["y"]))}var G=a.pick,H=a.wrap,p=a.each,l=a.extend,r=a.fireEvent,w=a.Axis,t=a.Series;l(w.prototype,{isInBreak:function(a,m){var e=a.repeat||Infinity,g=a.from,h=a.to-a.from;m=m>=g?(m-g)%e:e-(g-m)%e;return a.inclusive?m<=h:m=a)break;else if(g.isInBreak(f,a)){e-=a-f.from;break}return e};this.lin2val=function(a){var e,f;for(f=0;f=a);f++)e.toh;)m-=b;for(;mb.to||l>b.from&&db.from&&db.from&&d>b.to&&d=c[0]);A++);for(A;A<=q;A++){for(;(void 0!==c[w+1]&&a[A]>=c[w+1]||A===q)&&(l=c[w],this.dataGroupInfo={start:p,length:t[0].length},p=d.apply(this,t),void 0!==p&&(g.push(l),h.push(p),m.push(this.dataGroupInfo)),p=A,t[0]=[],t[1]=[],t[2]=[],t[3]=[],w+=1,A!==q););if(A===q)break;if(x){l=this.cropStart+A;l=e&&e[l]|| +this.pointClass.prototype.applyOptions.apply({series:this},[f[l]]);var E,C;for(E=0;Ethis.chart.plotSizeX/d||b&&f.forced)&&(e=!0);return e?d:0};G.prototype.setDataGrouping=function(a,b){var c;b=e(b,!0);a||(a={forced:!1,units:null});if(this instanceof G)for(c=this.series.length;c--;)this.series[c].update({dataGrouping:a},!1);else l(this.chart.options.series,function(b){b.dataGrouping=a},!1);b&&this.chart.redraw()}})(N);(function(a){var D=a.each,B=a.Point,G=a.seriesType,H=a.seriesTypes;G("ohlc","column",{lineWidth:1,tooltip:{pointFormat:'\x3cspan style\x3d"color:{point.color}"\x3e\u25cf\x3c/span\x3e \x3cb\x3e {series.name}\x3c/b\x3e\x3cbr/\x3eOpen: {point.open}\x3cbr/\x3eHigh: {point.high}\x3cbr/\x3eLow: {point.low}\x3cbr/\x3eClose: {point.close}\x3cbr/\x3e'}, +threshold:null,states:{hover:{lineWidth:3}}},{pointArrayMap:["open","high","low","close"],toYData:function(a){return[a.open,a.high,a.low,a.close]},pointValKey:"high",pointAttribs:function(a,l){l=H.column.prototype.pointAttribs.call(this,a,l);var p=this.options;delete l.fill;l["stroke-width"]=p.lineWidth;l.stroke=a.options.color||(a.openk)););B(g,function(a,b){var d;void 0===a.plotY&&(a.x>=c.min&&a.x<=c.max?a.plotY=e.chartHeight-p.bottom-(p.opposite?p.height:0)+p.offset-e.plotTop:a.shapeArgs={});a.plotX+=t;(f=g[b-1])&&f.plotX===a.plotX&&(void 0===f.stackIndex&&(f.stackIndex=0),d=f.stackIndex+1);a.stackIndex=d})},drawPoints:function(){var a=this.points,e=this.chart,g=e.renderer,k,l,f=this.options,d=f.y,b,q,p,c,r,n,t,x=this.yAxis;for(q=a.length;q--;)p=a[q],t=p.plotX>this.xAxis.len,k=p.plotX,c=p.stackIndex,b= +p.options.shape||f.shape,l=p.plotY,void 0!==l&&(l=p.plotY+d-(void 0!==c&&c*f.stackDistance)),r=c?void 0:p.plotX,n=c?void 0:p.plotY,c=p.graphic,void 0!==l&&0<=k&&!t?(c||(c=p.graphic=g.label("",null,null,b,null,null,f.useHTML).attr(this.pointAttribs(p)).css(G(f.style,p.style)).attr({align:"flag"===b?"left":"center",width:f.width,height:f.height,"text-align":f.textAlign}).addClass("highcharts-point").add(this.markerGroup),c.shadow(f.shadow)),0h&&(e-=Math.round((l-h)/2),h=l);e=k[a](e,g,h,l);d&&f&&e.push("M",d,g>f?g:g+l,"L",d,f);return e}});p===t&&B(["flag","circlepin","squarepin"],function(a){t.prototype.symbols[a]=k[a]})})(N);(function(a){function D(a,d,e){this.init(a,d,e)}var B=a.addEvent,G=a.Axis,H=a.correctFloat,p=a.defaultOptions, +l=a.defined,r=a.destroyObjectProperties,w=a.doc,t=a.each,k=a.fireEvent,m=a.hasTouch,e=a.isTouchDevice,g=a.merge,h=a.pick,C=a.removeEvent,f=a.wrap,d={height:e?20:14,barBorderRadius:0,buttonBorderRadius:0,liveRedraw:a.svg&&!e,margin:10,minWidth:6,step:.2,zIndex:3,barBackgroundColor:"#cccccc",barBorderWidth:1,barBorderColor:"#cccccc",buttonArrowColor:"#333333",buttonBackgroundColor:"#e6e6e6",buttonBorderColor:"#cccccc",buttonBorderWidth:1,rifleColor:"#333333",trackBackgroundColor:"#f2f2f2",trackBorderColor:"#f2f2f2", +trackBorderWidth:1};p.scrollbar=g(!0,d,p.scrollbar);D.prototype={init:function(a,e,f){this.scrollbarButtons=[];this.renderer=a;this.userOptions=e;this.options=g(d,e);this.chart=f;this.size=h(this.options.size,this.options.height);e.enabled&&(this.render(),this.initEvents(),this.addEvents())},render:function(){var a=this.renderer,d=this.options,e=this.size,c;this.group=c=a.g("scrollbar").attr({zIndex:d.zIndex,translateY:-99999}).add();this.track=a.rect().addClass("highcharts-scrollbar-track").attr({x:0, +r:d.trackBorderRadius||0,height:e,width:e}).add(c);this.track.attr({fill:d.trackBackgroundColor,stroke:d.trackBorderColor,"stroke-width":d.trackBorderWidth});this.trackBorderWidth=this.track.strokeWidth();this.track.attr({y:-this.trackBorderWidth%2/2});this.scrollbarGroup=a.g().add(c);this.scrollbar=a.rect().addClass("highcharts-scrollbar-thumb").attr({height:e,width:e,r:d.barBorderRadius||0}).add(this.scrollbarGroup);this.scrollbarRifles=a.path(this.swapXY(["M",-3,e/4,"L",-3,2*e/3,"M",0,e/4,"L", +0,2*e/3,"M",3,e/4,"L",3,2*e/3],d.vertical)).addClass("highcharts-scrollbar-rifles").add(this.scrollbarGroup);this.scrollbar.attr({fill:d.barBackgroundColor,stroke:d.barBorderColor,"stroke-width":d.barBorderWidth});this.scrollbarRifles.attr({stroke:d.rifleColor,"stroke-width":1});this.scrollbarStrokeWidth=this.scrollbar.strokeWidth();this.scrollbarGroup.translate(-this.scrollbarStrokeWidth%2/2,-this.scrollbarStrokeWidth%2/2);this.drawScrollbarButton(0);this.drawScrollbarButton(1)},position:function(a, +d,e,c){var b=this.options.vertical,f=0,g=this.rendered?"animate":"attr";this.x=a;this.y=d+this.trackBorderWidth;this.width=e;this.xOffset=this.height=c;this.yOffset=f;b?(this.width=this.yOffset=e=f=this.size,this.xOffset=d=0,this.barWidth=c-2*e,this.x=a+=this.options.margin):(this.height=this.xOffset=c=d=this.size,this.barWidth=e-2*c,this.y+=this.options.margin);this.group[g]({translateX:a,translateY:this.y});this.track[g]({width:e,height:c});this.scrollbarButtons[1].attr({translateX:b?0:e-d,translateY:b? +c-f:0})},drawScrollbarButton:function(a){var b=this.renderer,d=this.scrollbarButtons,c=this.options,e=this.size,f;f=b.g().add(this.group);d.push(f);f=b.rect().addClass("highcharts-scrollbar-button").add(f);f.attr({stroke:c.buttonBorderColor,"stroke-width":c.buttonBorderWidth,fill:c.buttonBackgroundColor});f.attr(f.crisp({x:-.5,y:-.5,width:e+1,height:e+1,r:c.buttonBorderRadius},f.strokeWidth()));f=b.path(this.swapXY(["M",e/2+(a?-1:1),e/2-3,"L",e/2+(a?-1:1),e/2+3,"L",e/2+(a?2:-2),e/2],c.vertical)).addClass("highcharts-scrollbar-arrow").add(d[a]); +f.attr({fill:c.buttonArrowColor})},swapXY:function(a,d){var b=a.length,c;if(d)for(d=0;d=k?this.scrollbarRifles.hide():this.scrollbarRifles.show(!0),!1===b.showFull&&(0>=a&&1<=d?this.group.hide():this.group.show()),this.rendered=!0)},initEvents:function(){var a=this;a.mouseMoveHandler=function(b){var d=a.chart.pointer.normalize(b),c=a.options.vertical? +"chartY":"chartX",e=a.initPositions;!a.grabbedCenter||b.touches&&0===b.touches[0][c]||(d=a.cursorToScrollbarPosition(d)[c],c=a[c],c=d-c,a.hasDragged=!0,a.updatePosition(e[0]+c,e[1]+c),a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b}))};a.mouseUpHandler=function(b){a.hasDragged&&k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMType:b.type,DOMEvent:b});a.grabbedCenter=a.hasDragged=a.chartX=a.chartY=null};a.mouseDownHandler=function(b){b=a.chart.pointer.normalize(b); +b=a.cursorToScrollbarPosition(b);a.chartX=b.chartX;a.chartY=b.chartY;a.initPositions=[a.from,a.to];a.grabbedCenter=!0};a.buttonToMinClick=function(b){var d=H(a.to-a.from)*a.options.step;a.updatePosition(H(a.from-d),H(a.to-d));k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.buttonToMaxClick=function(b){var d=(a.to-a.from)*a.options.step;a.updatePosition(a.from+d,a.to+d);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})};a.trackClick=function(b){var d=a.chart.pointer.normalize(b), +c=a.to-a.from,e=a.y+a.scrollbarTop,f=a.x+a.scrollbarLeft;a.options.vertical&&d.chartY>e||!a.options.vertical&&d.chartX>f?a.updatePosition(a.from+c,a.to+c):a.updatePosition(a.from-c,a.to-c);k(a,"changed",{from:a.from,to:a.to,trigger:"scrollbar",DOMEvent:b})}},cursorToScrollbarPosition:function(a){var b=this.options,b=b.minWidth>this.calculatedWidth?b.minWidth:0;return{chartX:(a.chartX-this.x-this.xOffset)/(this.barWidth-b),chartY:(a.chartY-this.y-this.yOffset)/(this.barWidth-b)}},updatePosition:function(a, +d){1a&&(d=H(d-a),a=0);this.from=a;this.to=d},update:function(a){this.destroy();this.init(this.chart.renderer,g(!0,this.options,a),this.chart)},addEvents:function(){var a=this.options.inverted?[1,0]:[0,1],d=this.scrollbarButtons,e=this.scrollbarGroup.element,c=this.mouseDownHandler,f=this.mouseMoveHandler,g=this.mouseUpHandler,a=[[d[a[0]].element,"click",this.buttonToMinClick],[d[a[1]].element,"click",this.buttonToMaxClick],[this.track.element,"click",this.trackClick],[e, +"mousedown",c],[w,"mousemove",f],[w,"mouseup",g]];m&&a.push([e,"touchstart",c],[w,"touchmove",f],[w,"touchend",g]);t(a,function(a){B.apply(null,a)});this._events=a},removeEvents:function(){t(this._events,function(a){C.apply(null,a)});this._events=void 0},destroy:function(){var a=this.chart.scroller;this.removeEvents();t(["track","scrollbarRifles","scrollbar","scrollbarGroup","group"],function(a){this[a]&&this[a].destroy&&(this[a]=this[a].destroy())},this);a&&(a.scrollbar=null,r(a.scrollbarButtons))}}; +f(G.prototype,"init",function(a){var b=this;a.apply(b,[].slice.call(arguments,1));b.options.scrollbar&&b.options.scrollbar.enabled&&(b.options.scrollbar.vertical=!b.horiz,b.options.startOnTick=b.options.endOnTick=!1,b.scrollbar=new D(b.chart.renderer,b.options.scrollbar,b.chart),B(b.scrollbar,"changed",function(a){var c=Math.min(h(b.options.min,b.min),b.min,b.dataMin),d=Math.max(h(b.options.max,b.max),b.max,b.dataMax)-c,e;b.horiz&&!b.reversed||!b.horiz&&b.reversed?(e=c+d*this.to,c+=d*this.from):(e= +c+d*(1-this.from),c+=d*(1-this.to));b.setExtremes(c,e,!0,!1,a)}))});f(G.prototype,"render",function(a){var b=Math.min(h(this.options.min,this.min),this.min,this.dataMin),d=Math.max(h(this.options.max,this.max),this.max,this.dataMax),c=this.scrollbar,e;a.apply(this,[].slice.call(arguments,1));c&&(this.horiz?c.position(this.left,this.top+this.height+this.offset+2+(this.opposite?0:this.axisTitleMargin),this.width,this.height):c.position(this.left+this.width+2+this.offset+(this.opposite?this.axisTitleMargin: +0),this.top,this.width,this.height),isNaN(b)||isNaN(d)||!l(this.min)||!l(this.max)?c.setRange(0,0):(e=(this.min-b)/(d-b),b=(this.max-b)/(d-b),this.horiz&&!this.reversed||!this.horiz&&this.reversed?c.setRange(e,b):c.setRange(1-b,1-e)))});f(G.prototype,"getOffset",function(a){var b=this.horiz?2:1,d=this.scrollbar;a.apply(this,[].slice.call(arguments,1));d&&(this.chart.axisOffset[b]+=d.size+d.options.margin)});f(G.prototype,"destroy",function(a){this.scrollbar&&(this.scrollbar=this.scrollbar.destroy()); +a.apply(this,[].slice.call(arguments,1))});a.Scrollbar=D})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.color,l=a.defaultOptions,r=a.defined,w=a.destroyObjectProperties,t=a.doc,k=a.each,m=a.erase,e=a.error,g=a.extend,h=a.grep,C=a.hasTouch,f=a.isNumber,d=a.isObject,b=a.isTouchDevice,q=a.merge,E=a.pick,c=a.removeEvent,F=a.Scrollbar,n=a.Series,A=a.seriesTypes,x=a.wrap,J=[].concat(a.defaultDataGroupingUnits),y=function(a){var b=h(arguments,f);if(b.length)return Math[a].apply(0, +b)};J[4]=["day",[1,2,3,4]];J[5]=["week",[1,2,3]];A=void 0===A.areaspline?"line":"areaspline";g(l,{navigator:{height:40,margin:25,maskInside:!0,handles:{backgroundColor:"#f2f2f2",borderColor:"#999999"},maskFill:p("#6685c2").setOpacity(.3).get(),outlineColor:"#cccccc",outlineWidth:1,series:{type:A,color:"#335cad",fillOpacity:.05,lineWidth:1,compare:null,dataGrouping:{approximation:"average",enabled:!0,groupPixelWidth:2,smoothed:!0,units:J},dataLabels:{enabled:!1,zIndex:2},id:"highcharts-navigator-series", +className:"highcharts-navigator-series",lineColor:null,marker:{enabled:!1},pointRange:0,shadow:!1,threshold:null},xAxis:{className:"highcharts-navigator-xaxis",tickLength:0,lineWidth:0,gridLineColor:"#e6e6e6",gridLineWidth:1,tickPixelInterval:200,labels:{align:"left",style:{color:"#999999"},x:3,y:-4},crosshair:!1},yAxis:{className:"highcharts-navigator-yaxis",gridLineWidth:0,startOnTick:!1,endOnTick:!1,minPadding:.1,maxPadding:.1,labels:{enabled:!1},crosshair:!1,title:{text:null},tickLength:0,tickWidth:0}}}); +D.prototype={drawHandle:function(a,b){var c=this.chart.renderer,d=this.handles;this.rendered||(d[b]=c.path(["M",-4.5,.5,"L",3.5,.5,3.5,15.5,-4.5,15.5,-4.5,.5,"M",-1.5,4,"L",-1.5,12,"M",.5,4,"L",.5,12]).attr({zIndex:10-b}).addClass("highcharts-navigator-handle highcharts-navigator-handle-"+["left","right"][b]).add(),c=this.navigatorOptions.handles,d[b].attr({fill:c.backgroundColor,stroke:c.borderColor,"stroke-width":1}).css({cursor:"ew-resize"}));d[b][this.rendered&&!this.hasDragged?"animate":"attr"]({translateX:Math.round(this.scrollerLeft+ +this.scrollbarHeight+parseInt(a,10)),translateY:Math.round(this.top+this.height/2-8)})},update:function(a){this.destroy();q(!0,this.chart.options.navigator,this.options,a);this.init(this.chart)},render:function(a,b,c,d){var e=this.chart,g=e.renderer,k,h,l,n;n=this.scrollbarHeight;var m=this.xAxis,p=this.navigatorOptions,u=p.maskInside,q=this.height,v=this.top,t=this.navigatorEnabled,x=this.outlineHeight,y;y=this.rendered;if(f(a)&&f(b)&&(!this.hasDragged||r(c))&&(this.navigatorLeft=k=E(m.left,e.plotLeft+ +n),this.navigatorWidth=h=E(m.len,e.plotWidth-2*n),this.scrollerLeft=l=k-n,this.scrollerWidth=n=n=h+2*n,c=E(c,m.translate(a)),d=E(d,m.translate(b)),f(c)&&Infinity!==Math.abs(c)||(c=0,d=n),!(m.translate(d,!0)-m.translate(c,!0)f&&tp+d-u&&rk&&re?e=0:e+v>=q&&(e=q-v,x=h.getUnionExtremes().dataMax),e!==d&&(h.fixedWidth=v,d=l.toFixedRange(e, +e+v,null,x),c.setExtremes(d.min,d.max,!0,null,{trigger:"navigator"}))))};h.mouseMoveHandler=function(b){var c=h.scrollbarHeight,d=h.navigatorLeft,e=h.navigatorWidth,f=h.scrollerLeft,g=h.scrollerWidth,k=h.range,l;b.touches&&0===b.touches[0].pageX||(b=a.pointer.normalize(b),l=b.chartX,lf+g-c&&(l=f+g-c),h.grabbedLeft?(h.hasDragged=!0,h.render(0,0,l-d,h.otherHandlePos)):h.grabbedRight?(h.hasDragged=!0,h.render(0,0,h.otherHandlePos,l-d)):h.grabbedCenter&&(h.hasDragged=!0,le+n-k&&(l=e+ +n-k),h.render(0,0,l-n,l-n+k)),h.hasDragged&&h.scrollbar&&h.scrollbar.options.liveRedraw&&(b.DOMType=b.type,setTimeout(function(){h.mouseUpHandler(b)},0)))};h.mouseUpHandler=function(b){var c,d,e=b.DOMEvent||b;if(h.hasDragged||"scrollbar"===b.trigger)h.zoomedMin===h.otherHandlePos?c=h.fixedExtreme:h.zoomedMax===h.otherHandlePos&&(d=h.fixedExtreme),h.zoomedMax===h.navigatorWidth&&(d=h.getUnionExtremes().dataMax),c=l.toFixedRange(h.zoomedMin,h.zoomedMax,c,d),r(c.min)&&a.xAxis[0].setExtremes(c.min,c.max, +!0,h.hasDragged?!1:null,{trigger:"navigator",triggerOp:"navigator-drag",DOMEvent:e});"mousemove"!==b.DOMType&&(h.grabbedLeft=h.grabbedRight=h.grabbedCenter=h.fixedWidth=h.fixedExtreme=h.otherHandlePos=h.hasDragged=n=null)};var c=a.xAxis.length,f=a.yAxis.length,m=e&&e[0]&&e[0].xAxis||a.xAxis[0];a.extraBottomMargin=h.outlineHeight+d.margin;a.isDirtyBox=!0;h.navigatorEnabled?(h.xAxis=l=new G(a,q({breaks:m.options.breaks,ordinal:m.options.ordinal},d.xAxis,{id:"navigator-x-axis",yAxis:"navigator-y-axis", +isX:!0,type:"datetime",index:c,height:g,offset:0,offsetLeft:k,offsetRight:-k,keepOrdinalPadding:!0,startOnTick:!1,endOnTick:!1,minPadding:0,maxPadding:0,zoomEnabled:!1})),h.yAxis=new G(a,q(d.yAxis,{id:"navigator-y-axis",alignTicks:!1,height:g,offset:0,index:f,zoomEnabled:!1})),e||d.series.data?h.addBaseSeries():0===a.series.length&&x(a,"redraw",function(b,c){0=Math.round(a.navigatorWidth);b&&!a.hasNavigatorData&&(b.options.pointStart=this.xData[0],b.setData(this.options.data,!1,null,!1))},destroy:function(){this.removeEvents();this.xAxis&&(m(this.chart.xAxis,this.xAxis),m(this.chart.axes,this.xAxis));this.yAxis&&(m(this.chart.yAxis,this.yAxis),m(this.chart.axes,this.yAxis));k(this.series||[],function(a){a.destroy&&a.destroy()});k("series xAxis yAxis leftShade rightShade outline scrollbarTrack scrollbarRifles scrollbarGroup scrollbar navigatorGroup rendered".split(" "), +function(a){this[a]&&this[a].destroy&&this[a].destroy();this[a]=null},this);k([this.handles,this.elementsToDestroy],function(a){w(a)},this)}};a.Navigator=D;x(G.prototype,"zoom",function(a,b,c){var d=this.chart,e=d.options,f=e.chart.zoomType,g=e.navigator,e=e.rangeSelector,h;this.isXAxis&&(g&&g.enabled||e&&e.enabled)&&("x"===f?d.resetZoomButton="blocked":"y"===f?h=!1:"xy"===f&&(d=this.previousZoom,r(b)?this.previousZoom=[this.min,this.max]:d&&(b=d[0],c=d[1],delete this.previousZoom)));return void 0!== +h?h:a.call(this,b,c)});x(H.prototype,"init",function(a,b,c){B(this,"beforeRender",function(){var a=this.options;if(a.navigator.enabled||a.scrollbar.enabled)this.scroller=this.navigator=new D(this)});a.call(this,b,c)});x(H.prototype,"getMargins",function(a){var b=this.legend,c=b.options,d=this.scroller,e,f;a.apply(this,[].slice.call(arguments,1));d&&(e=d.xAxis,f=d.yAxis,d.top=d.navigatorOptions.top||this.chartHeight-d.height-d.scrollbarHeight-this.spacing[2]-("bottom"===c.verticalAlign&&c.enabled&& +!c.floating?b.legendHeight+E(c.margin,10):0),e&&f&&(e.options.top=f.options.top=d.top,e.setAxisSize(),f.setAxisSize()))});x(n.prototype,"addPoint",function(a,b,c,f,g){var h=this.options.turboThreshold;h&&this.xData.length>h&&d(b,!0)&&this.chart.scroller&&e(20,!0);a.call(this,b,c,f,g)});x(H.prototype,"addSeries",function(a,b,c,d){a=a.call(this,b,!1,d);this.scroller&&this.scroller.setBaseSeries();E(c,!0)&&this.redraw();return a});x(n.prototype,"update",function(a,b,c){a.call(this,b,!1);this.chart.scroller&& +this.chart.scroller.setBaseSeries();E(c,!0)&&this.chart.redraw()})})(N);(function(a){function D(a){this.init(a)}var B=a.addEvent,G=a.Axis,H=a.Chart,p=a.css,l=a.createElement,r=a.dateFormat,w=a.defaultOptions,t=w.global.useUTC,k=a.defined,m=a.destroyObjectProperties,e=a.discardElement,g=a.each,h=a.extend,C=a.fireEvent,f=a.Date,d=a.isNumber,b=a.merge,q=a.pick,E=a.pInt,c=a.splat,F=a.wrap;h(w,{rangeSelector:{buttonTheme:{"stroke-width":0,width:28,height:18,padding:2,zIndex:7},height:35,inputPosition:{align:"right"}, +labelStyle:{color:"#666666"}}});w.lang=b(w.lang,{rangeSelectorZoom:"Zoom",rangeSelectorFrom:"From",rangeSelectorTo:"To"});D.prototype={clickButton:function(a,b){var e=this,f=e.chart,h=e.buttonOptions[a],k=f.xAxis[0],l=f.scroller&&f.scroller.getUnionExtremes()||k||{},n=l.dataMin,m=l.dataMax,p,r=k&&Math.round(Math.min(k.max,q(m,k.max))),w=h.type,z,l=h._range,A,C,D,E=h.dataGrouping;if(null!==n&&null!==m){f.fixedRange=l;E&&(this.forcedDataGrouping=!0,G.prototype.setDataGrouping.call(k||{chart:this.chart}, +E,!1));if("month"===w||"year"===w)k?(w={range:h,max:r,dataMin:n,dataMax:m},p=k.minFromRange.call(w),d(w.newMax)&&(r=w.newMax)):l=h;else if(l)p=Math.max(r-l,n),r=Math.min(p+l,m);else if("ytd"===w)if(k)void 0===m&&(n=Number.MAX_VALUE,m=Number.MIN_VALUE,g(f.series,function(a){a=a.xData;n=Math.min(a[0],n);m=Math.max(a[a.length-1],m)}),b=!1),r=e.getYTDExtremes(m,n,t),p=A=r.min,r=r.max;else{B(f,"beforeRender",function(){e.clickButton(a)});return}else"all"===w&&k&&(p=n,r=m);e.setSelected(a);k?k.setExtremes(p, +r,q(b,1),null,{trigger:"rangeSelectorButton",rangeSelectorButton:h}):(z=c(f.options.xAxis)[0],D=z.range,z.range=l,C=z.min,z.min=A,B(f,"load",function(){z.range=D;z.min=C}))}},setSelected:function(a){this.selected=this.options.selected=a},defaultButtons:[{type:"month",count:1,text:"1m"},{type:"month",count:3,text:"3m"},{type:"month",count:6,text:"6m"},{type:"ytd",text:"YTD"},{type:"year",count:1,text:"1y"},{type:"all",text:"All"}],init:function(a){var b=this,c=a.options.rangeSelector,d=c.buttons|| +[].concat(b.defaultButtons),e=c.selected,f=function(){var a=b.minInput,c=b.maxInput;a&&a.blur&&C(a,"blur");c&&c.blur&&C(c,"blur")};b.chart=a;b.options=c;b.buttons=[];a.extraTopMargin=c.height;b.buttonOptions=d;this.unMouseDown=B(a.container,"mousedown",f);this.unResize=B(a,"resize",f);g(d,b.computeButtonRange);void 0!==e&&d[e]&&this.clickButton(e,!1);B(a,"load",function(){B(a.xAxis[0],"setExtremes",function(c){this.max-this.min!==a.fixedRange&&"rangeSelectorButton"!==c.trigger&&"updatedData"!==c.trigger&& +b.forcedDataGrouping&&this.setDataGrouping(!1,!1)})})},updateButtonStates:function(){var a=this.chart,b=a.xAxis[0],c=Math.round(b.max-b.min),e=!b.hasVisibleSeries,a=a.scroller&&a.scroller.getUnionExtremes()||b,f=a.dataMin,h=a.dataMax,a=this.getYTDExtremes(h,f,t),k=a.min,l=a.max,m=this.selected,p=d(m),q=this.options.allButtonsEnabled,r=this.buttons;g(this.buttonOptions,function(a,d){var g=a._range,n=a.type,u=a.count||1;a=r[d];var t=0;d=d===m;var v=g>h-f,x=g=864E5*{month:28,year:365}[n]*u&&c<=864E5*{month:31,year:366}[n]*u?g=!0:"ytd"===n?(g=l-k===c,y=!d):"all"===n&&(g=b.max-b.min>=h-f,w=!d&&p&&g);n=!q&&(v||x||w||e);g=d&&g||g&&!p&&!y;n?t=3:g&&(p=!0,t=2);a.state!==t&&a.setState(t)})},computeButtonRange:function(a){var b=a.type,c=a.count||1,d={millisecond:1,second:1E3,minute:6E4,hour:36E5,day:864E5,week:6048E5};if(d[b])a._range=d[b]*c;else if("month"===b||"year"===b)a._range=864E5*{month:30,year:365}[b]*c},setInputValue:function(a,b){var c= +this.chart.options.rangeSelector,d=this[a+"Input"];k(b)&&(d.previousValue=d.HCTime,d.HCTime=b);d.value=r(c.inputEditDateFormat||"%Y-%m-%d",d.HCTime);this[a+"DateBox"].attr({text:r(c.inputDateFormat||"%b %e, %Y",d.HCTime)})},showInput:function(a){var b=this.inputGroup,c=this[a+"DateBox"];p(this[a+"Input"],{left:b.translateX+c.x+"px",top:b.translateY+"px",width:c.width-2+"px",height:c.height-2+"px",border:"2px solid silver"})},hideInput:function(a){p(this[a+"Input"],{border:0,width:"1px",height:"1px"}); +this.setInputValue(a)},drawInput:function(a){function c(){var a=r.value,b=(m.inputDateParser||Date.parse)(a),c=f.xAxis[0],g=f.scroller&&f.scroller.xAxis?f.scroller.xAxis:c,h=g.dataMin,g=g.dataMax;b!==r.previousValue&&(r.previousValue=b,d(b)||(b=a.split("-"),b=Date.UTC(E(b[0]),E(b[1])-1,E(b[2]))),d(b)&&(t||(b+=6E4*(new Date).getTimezoneOffset()),q?b>e.maxInput.HCTime?b=void 0:bg&&(b=g),void 0!==b&&c.setExtremes(q?b:c.min,q?c.max:b,void 0,void 0,{trigger:"rangeSelectorInput"})))} +var e=this,f=e.chart,g=f.renderer.style||{},k=f.renderer,m=f.options.rangeSelector,n=e.div,q="min"===a,r,B,C=this.inputGroup;this[a+"Label"]=B=k.label(w.lang[q?"rangeSelectorFrom":"rangeSelectorTo"],this.inputGroup.offset).addClass("highcharts-range-label").attr({padding:2}).add(C);C.offset+=B.width+5;this[a+"DateBox"]=k=k.label("",C.offset).addClass("highcharts-range-input").attr({padding:2,width:m.inputBoxWidth||90,height:m.inputBoxHeight||17,stroke:m.inputBoxBorderColor||"#cccccc","stroke-width":1, +"text-align":"center"}).on("click",function(){e.showInput(a);e[a+"Input"].focus()}).add(C);C.offset+=k.width+(q?10:0);this[a+"Input"]=r=l("input",{name:a,className:"highcharts-range-selector",type:"text"},{top:f.plotTop+"px"},n);B.css(b(g,m.labelStyle));k.css(b({color:"#333333"},g,m.inputStyle));p(r,h({position:"absolute",border:0,width:"1px",height:"1px",padding:0,textAlign:"center",fontSize:g.fontSize,fontFamily:g.fontFamily,left:"-9em"},m.inputStyle));r.onfocus=function(){e.showInput(a)};r.onblur= +function(){e.hideInput(a)};r.onchange=c;r.onkeypress=function(a){13===a.keyCode&&c()}},getPosition:function(){var a=this.chart,b=a.options.rangeSelector,a=q((b.buttonPosition||{}).y,a.plotTop-a.axisOffset[0]-b.height);return{buttonTop:a,inputTop:a-10}},getYTDExtremes:function(a,b,c){var d=new f(a),e=d[f.hcGetFullYear]();c=c?f.UTC(e,0,1):+new f(e,0,1);b=Math.max(b||0,c);d=d.getTime();return{max:Math.min(a||d,d),min:b}},render:function(a,b){var c=this,d=c.chart,e=d.renderer,f=d.container,m=d.options, +n=m.exporting&&!1!==m.exporting.enabled&&m.navigation&&m.navigation.buttonOptions,p=m.rangeSelector,r=c.buttons,m=w.lang,t=c.div,t=c.inputGroup,A=p.buttonTheme,z=p.buttonPosition||{},B=p.inputEnabled,C=A&&A.states,D=d.plotLeft,E,G=this.getPosition(),F=c.group,H=c.rendered;!1!==p.enabled&&(H||(c.group=F=e.g("range-selector-buttons").add(),c.zoomText=e.text(m.rangeSelectorZoom,q(z.x,D),15).css(p.labelStyle).add(F),E=q(z.x,D)+c.zoomText.getBBox().width+5,g(c.buttonOptions,function(a,b){r[b]=e.button(a.text, +E,0,function(){c.clickButton(b);c.isActive=!0},A,C&&C.hover,C&&C.select,C&&C.disabled).attr({"text-align":"center"}).add(F);E+=r[b].width+q(p.buttonSpacing,5)}),!1!==B&&(c.div=t=l("div",null,{position:"relative",height:0,zIndex:1}),f.parentNode.insertBefore(t,f),c.inputGroup=t=e.g("input-group").add(),t.offset=0,c.drawInput("min"),c.drawInput("max"))),c.updateButtonStates(),F[H?"animate":"attr"]({translateY:G.buttonTop}),!1!==B&&(t.align(h({y:G.inputTop,width:t.offset,x:n&&G.inputTop<(n.y||0)+n.height- +d.spacing[0]?-40:0},p.inputPosition),!0,d.spacingBox),k(B)||(d=F.getBBox(),t[t.alignAttr.translateXc&&(e?a=b-f:b=a+f);d(a)||(a=b=void 0);return{min:a,max:b}};G.prototype.minFromRange=function(){var a=this.range,b={month:"Month",year:"FullYear"}[a.type],c,e=this.max,f,g,h=function(a,c){var d=new Date(a);d["set"+b](d["get"+ +b]()+c);return d.getTime()-a};d(a)?(c=e-a,g=a):(c=e+h(e,-a.count),this.chart&&(this.chart.fixedRange=e-c));f=q(this.dataMin,Number.MIN_VALUE);d(c)||(c=f);c<=f&&(c=f,void 0===g&&(g=h(c,a.count)),this.newMax=Math.min(c+g,this.dataMax));d(e)||(c=void 0);return c};F(H.prototype,"init",function(a,b,c){B(this,"init",function(){this.options.rangeSelector.enabled&&(this.rangeSelector=new D(this))});a.call(this,b,c)});a.RangeSelector=D})(N);(function(a){var D=a.addEvent,B=a.isNumber;a.Chart.prototype.callbacks.push(function(a){function G(){p= +a.xAxis[0].getExtremes();B(p.min)&&r.render(p.min,p.max)}var p,l=a.scroller,r=a.rangeSelector,w,t;l&&(p=a.xAxis[0].getExtremes(),l.render(p.min,p.max));r&&(t=D(a.xAxis[0],"afterSetExtremes",function(a){r.render(a.min,a.max)}),w=D(a,"redraw",G),G());D(a,"destroy",function(){r&&(w(),t())})})})(N);(function(a){var D=a.arrayMax,B=a.arrayMin,G=a.Axis,H=a.Chart,p=a.defined,l=a.each,r=a.extend,w=a.format,t=a.inArray,k=a.isNumber,m=a.isString,e=a.map,g=a.merge,h=a.pick,C=a.Point,f=a.Renderer,d=a.Series,b= +a.splat,q=a.stop,E=a.SVGRenderer,c=a.VMLRenderer,F=a.wrap,n=d.prototype,A=n.init,x=n.processData,J=C.prototype.tooltipFormatter;a.StockChart=a.stockChart=function(c,d,f){var k=m(c)||c.nodeName,l=arguments[k?1:0],n=l.series,p=a.getOptions(),q,r=h(l.navigator&&l.navigator.enabled,!0)?{startOnTick:!1,endOnTick:!1}:null,t={marker:{enabled:!1,radius:2}},u={shadow:!1,borderWidth:0};l.xAxis=e(b(l.xAxis||{}),function(a){return g({minPadding:0,maxPadding:0,ordinal:!0,title:{text:null},labels:{overflow:"justify"}, +showLastLabel:!0},p.xAxis,a,{type:"datetime",categories:null},r)});l.yAxis=e(b(l.yAxis||{}),function(a){q=h(a.opposite,!0);return g({labels:{y:-2},opposite:q,showLastLabel:!1,title:{text:null}},p.yAxis,a)});l.series=null;l=g({chart:{panning:!0,pinchType:"x"},navigator:{enabled:!0},scrollbar:{enabled:!0},rangeSelector:{enabled:!0},title:{text:null,style:{fontSize:"16px"}},tooltip:{shared:!0,crosshairs:!0},legend:{enabled:!1},plotOptions:{line:t,spline:t,area:t,areaspline:t,arearange:t,areasplinerange:t, +column:u,columnrange:u,candlestick:u,ohlc:u}},l,{_stock:!0,chart:{inverted:!1}});l.series=n;return k?new H(c,l,f):new H(l,d)};F(G.prototype,"autoLabelAlign",function(a){var b=this.chart,c=this.options,b=b._labelPanes=b._labelPanes||{},d=this.options.labels;return this.chart.options._stock&&"yAxis"===this.coll&&(c=c.top+","+c.height,!b[c]&&d.enabled)?(15===d.x&&(d.x=0),void 0===d.align&&(d.align="right"),b[c]=1,"right"):a.call(this,[].slice.call(arguments,1))});F(G.prototype,"getPlotLinePath",function(a, +b,c,d,f,g){var n=this,q=this.isLinked&&!this.series?this.linkedParent.series:this.series,r=n.chart,u=r.renderer,v=n.left,w=n.top,y,x,A,B,C=[],D=[],E,F;if("colorAxis"===n.coll)return a.apply(this,[].slice.call(arguments,1));D=function(a){var b="xAxis"===a?"yAxis":"xAxis";a=n.options[b];return k(a)?[r[b][a]]:m(a)?[r.get(a)]:e(q,function(a){return a[b]})}(n.coll);l(n.isXAxis?r.yAxis:r.xAxis,function(a){if(p(a.options.id)?-1===a.options.id.indexOf("navigator"):1){var b=a.isXAxis?"yAxis":"xAxis",b=p(a.options[b])? +r[b][a.options[b]]:r[b][0];n===b&&D.push(a)}});E=D.length?[]:[n.isXAxis?r.yAxis[0]:r.xAxis[0]];l(D,function(a){-1===t(a,E)&&E.push(a)});F=h(g,n.translate(b,null,null,d));k(F)&&(n.horiz?l(E,function(a){var b;x=a.pos;B=x+a.len;y=A=Math.round(F+n.transB);if(yv+n.width)f?y=A=Math.min(Math.max(v,y),v+n.width):b=!0;b||C.push("M",y,x,"L",A,B)}):l(E,function(a){var b;y=a.pos;A=y+a.len;x=B=Math.round(w+n.height-F);if(xw+n.height)f?x=B=Math.min(Math.max(w,x),n.top+n.height):b=!0;b||C.push("M",y, +x,"L",A,B)}));return 0=e&&(x=-(l.translateX+b.width-e));l.attr({x:m+x,y:k,anchorX:g?m:this.opposite?0:a.chartWidth,anchorY:g?this.opposite?a.chartHeight:0:k+b.height/2})}});n.init=function(){A.apply(this,arguments);this.setCompare(this.options.compare)};n.setCompare=function(a){this.modifyValue= +"value"===a||"percent"===a?function(b,c){var d=this.compareValue;if(void 0!==b&&void 0!==d)return b="value"===a?b-d:b=b/d*100-100,c&&(c.change=b),b}:null;this.userOptions.compare=a;this.chart.hasRendered&&(this.isDirty=!0)};n.processData=function(){var a,b=-1,c,d,e,f;x.apply(this,arguments);if(this.xAxis&&this.processedYData)for(c=this.processedXData,d=this.processedYData,e=d.length,this.pointArrayMap&&(b=t("close",this.pointArrayMap),-1===b&&(b=t(this.pointValKey||"y",this.pointArrayMap))),a=0;a< +e-1;a++)if(f=-1=this.xAxis.min&&0!==f){this.compareValue=f;break}};F(n,"getExtremes",function(a){var b;a.apply(this,[].slice.call(arguments,1));this.modifyValue&&(b=[this.modifyValue(this.dataMin),this.modifyValue(this.dataMax)],this.dataMin=B(b),this.dataMax=D(b))});G.prototype.setCompare=function(a,b){this.isXAxis||(l(this.series,function(b){b.setCompare(a)}),h(b,!0)&&this.chart.redraw())};C.prototype.tooltipFormatter=function(b){b=b.replace("{point.change}",(0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function D(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||j,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,j=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function qe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function Le(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function He(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Oe(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Ut,Xt=[],Vt=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Xt.pop()||S.expando+"_"+Ct.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Vt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Vt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Vt,"$1"+r):!1!==e.jsonp&&(e.url+=(Et.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Xt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Ut=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Ut.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):("number"==typeof f.top&&(f.top+="px"),"number"==typeof f.left&&(f.left+="px"),c.css(f))}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=$e(y.pixelPosition,function(e,t){if(t)return t=Be(e,n),Me.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0 '; + else + var expandButton = ''; + + return '' + expandButton + '' + ellipsedLabel({ name: item.name, parentClass: "nav-tooltip", childClass: "nav-label" }) + ''; +} + +function menuItemsForGroup(group, level, parent) { + var items = ''; + + if (level > 0) + items += menuItem(group, level - 1, parent, true); + + $.each(group.contents, function (contentName, content) { + if (content.type == 'GROUP') + items += menuItemsForGroup(content, level + 1, group.pathFormatted); + else if (content.type == 'REQUEST') + items += menuItem(content, level, group.pathFormatted); + }); + + return items; +} + +function setDetailsMenu(){ + $('.nav ul').append(menuItemsForGroup(stats, 0)); + $('.nav').expandable(); + $('.nav-tooltip').popover({trigger:'hover'}); +} + +function setGlobalMenu(){ + $('.nav ul') + .append('
  • Ranges
  • ') + .append('
  • Stats
  • ') + .append('
  • Active Users
  • ') + .append('
  • Requests / sec
  • ') + .append('
  • Responses / sec
  • '); +} + +function getLink(link){ + var a = link.split('/'); + return (a.length<=1)? link : a[a.length-1]; +} + +function expandUp(li) { + const parentId = li.attr("data-parent"); + if (parentId != "ROOT") { + const span = $('#' + parentId); + const parentLi = span.parents('li').first(); + span.expand(parentLi, false); + expandUp(parentLi); + } +} + +function setActiveMenu(){ + $('.nav a').each(function() { + const navA = $(this) + if(!navA.hasClass('expand-button') && navA.attr('href') == getLink(window.location.pathname)) { + const li = $(this).parents('li').first(); + li.addClass('on'); + expandUp(li); + return false; + } + }); +} diff --git a/webapp/loadTests/50users1minute/js/stats.js b/webapp/loadTests/50users1minute/js/stats.js new file mode 100644 index 0000000..c45e081 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/stats.js @@ -0,0 +1,4065 @@ +var stats = { + type: "GROUP", +name: "All Requests", +path: "", +pathFormatted: "group_missing-name-b06d1", +stats: { + "name": "All Requests", + "numberOfRequests": { + "total": "2252", + "ok": "2238", + "ko": "14" + }, + "minResponseTime": { + "total": "1", + "ok": "1", + "ko": "181" + }, + "maxResponseTime": { + "total": "5617", + "ok": "5617", + "ko": "2036" + }, + "meanResponseTime": { + "total": "396", + "ok": "396", + "ko": "333" + }, + "standardDeviation": { + "total": "569", + "ok": "569", + "ko": "472" + }, + "percentiles1": { + "total": "125", + "ok": "121", + "ko": "203" + }, + "percentiles2": { + "total": "593", + "ok": "594", + "ko": "206" + }, + "percentiles3": { + "total": "1343", + "ok": "1343", + "ko": "856" + }, + "percentiles4": { + "total": "2553", + "ok": "2557", + "ko": "1800" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1931, + "percentage": 86 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 167, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 140, + "percentage": 6 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 14, + "percentage": 1 +}, + "meanNumberOfRequestsPerSecond": { + "total": "23.957", + "ok": "23.809", + "ko": "0.149" + } +}, +contents: { +"req_request-0-684d2": { + type: "REQUEST", + name: "request_0", +path: "request_0", +pathFormatted: "req_request-0-684d2", +stats: { + "name": "request_0", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "1", + "ok": "1", + "ko": "-" + }, + "maxResponseTime": { + "total": "37", + "ok": "37", + "ko": "-" + }, + "meanResponseTime": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "standardDeviation": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles1": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles2": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "percentiles3": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles4": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-1-46da4": { + type: "REQUEST", + name: "request_1", +path: "request_1", +pathFormatted: "req_request-1-46da4", +stats: { + "name": "request_1", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "meanResponseTime": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "standardDeviation": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles3": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles4": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-2-93baf": { + type: "REQUEST", + name: "request_2", +path: "request_2", +pathFormatted: "req_request-2-93baf", +stats: { + "name": "request_2", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "412", + "ok": "412", + "ko": "-" + }, + "maxResponseTime": { + "total": "1649", + "ok": "1649", + "ko": "-" + }, + "meanResponseTime": { + "total": "602", + "ok": "602", + "ko": "-" + }, + "standardDeviation": { + "total": "260", + "ok": "260", + "ko": "-" + }, + "percentiles1": { + "total": "537", + "ok": "537", + "ko": "-" + }, + "percentiles2": { + "total": "614", + "ok": "614", + "ko": "-" + }, + "percentiles3": { + "total": "1307", + "ok": "1307", + "ko": "-" + }, + "percentiles4": { + "total": "1552", + "ok": "1552", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 46, + "percentage": 92 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-3-d0973": { + type: "REQUEST", + name: "request_3", +path: "request_3", +pathFormatted: "req_request-3-d0973", +stats: { + "name": "request_3", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "91", + "ok": "91", + "ko": "-" + }, + "maxResponseTime": { + "total": "1334", + "ok": "1334", + "ko": "-" + }, + "meanResponseTime": { + "total": "241", + "ok": "241", + "ko": "-" + }, + "standardDeviation": { + "total": "269", + "ok": "269", + "ko": "-" + }, + "percentiles1": { + "total": "145", + "ok": "145", + "ko": "-" + }, + "percentiles2": { + "total": "194", + "ok": "194", + "ko": "-" + }, + "percentiles3": { + "total": "793", + "ok": "793", + "ko": "-" + }, + "percentiles4": { + "total": "1298", + "ok": "1298", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 47, + "percentage": 94 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-5-48829": { + type: "REQUEST", + name: "request_5", +path: "request_5", +pathFormatted: "req_request-5-48829", +stats: { + "name": "request_5", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "362", + "ok": "362", + "ko": "-" + }, + "maxResponseTime": { + "total": "2318", + "ok": "2318", + "ko": "-" + }, + "meanResponseTime": { + "total": "615", + "ok": "615", + "ko": "-" + }, + "standardDeviation": { + "total": "425", + "ok": "425", + "ko": "-" + }, + "percentiles1": { + "total": "461", + "ok": "461", + "ko": "-" + }, + "percentiles2": { + "total": "555", + "ok": "555", + "ko": "-" + }, + "percentiles3": { + "total": "1730", + "ok": "1730", + "ko": "-" + }, + "percentiles4": { + "total": "2163", + "ok": "2163", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 43, + "percentage": 86 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-4-e7d1b": { + type: "REQUEST", + name: "request_4", +path: "request_4", +pathFormatted: "req_request-4-e7d1b", +stats: { + "name": "request_4", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "414", + "ok": "414", + "ko": "-" + }, + "maxResponseTime": { + "total": "1897", + "ok": "1897", + "ko": "-" + }, + "meanResponseTime": { + "total": "593", + "ok": "593", + "ko": "-" + }, + "standardDeviation": { + "total": "300", + "ok": "300", + "ko": "-" + }, + "percentiles1": { + "total": "479", + "ok": "479", + "ko": "-" + }, + "percentiles2": { + "total": "541", + "ok": "541", + "ko": "-" + }, + "percentiles3": { + "total": "1362", + "ok": "1362", + "ko": "-" + }, + "percentiles4": { + "total": "1679", + "ok": "1679", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 88 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-7-f222f": { + type: "REQUEST", + name: "request_7", +path: "request_7", +pathFormatted: "req_request-7-f222f", +stats: { + "name": "request_7", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "382", + "ok": "382", + "ko": "-" + }, + "maxResponseTime": { + "total": "2133", + "ok": "2133", + "ko": "-" + }, + "meanResponseTime": { + "total": "580", + "ok": "580", + "ko": "-" + }, + "standardDeviation": { + "total": "366", + "ok": "366", + "ko": "-" + }, + "percentiles1": { + "total": "450", + "ok": "450", + "ko": "-" + }, + "percentiles2": { + "total": "527", + "ok": "527", + "ko": "-" + }, + "percentiles3": { + "total": "1482", + "ok": "1482", + "ko": "-" + }, + "percentiles4": { + "total": "1944", + "ok": "1944", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 88 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-6-027a9": { + type: "REQUEST", + name: "request_6", +path: "request_6", +pathFormatted: "req_request-6-027a9", +stats: { + "name": "request_6", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "549", + "ok": "549", + "ko": "-" + }, + "maxResponseTime": { + "total": "2650", + "ok": "2650", + "ko": "-" + }, + "meanResponseTime": { + "total": "834", + "ok": "834", + "ko": "-" + }, + "standardDeviation": { + "total": "456", + "ok": "456", + "ko": "-" + }, + "percentiles1": { + "total": "656", + "ok": "656", + "ko": "-" + }, + "percentiles2": { + "total": "801", + "ok": "801", + "ko": "-" + }, + "percentiles3": { + "total": "2021", + "ok": "2021", + "ko": "-" + }, + "percentiles4": { + "total": "2460", + "ok": "2460", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 37, + "percentage": 74 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 6, + "percentage": 12 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-5-redir-affb3": { + type: "REQUEST", + name: "request_5 Redirect 1", +path: "request_5 Redirect 1", +pathFormatted: "req_request-5-redir-affb3", +stats: { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "maxResponseTime": { + "total": "3400", + "ok": "3400", + "ko": "-" + }, + "meanResponseTime": { + "total": "377", + "ok": "377", + "ko": "-" + }, + "standardDeviation": { + "total": "536", + "ok": "536", + "ko": "-" + }, + "percentiles1": { + "total": "154", + "ok": "154", + "ko": "-" + }, + "percentiles2": { + "total": "482", + "ok": "482", + "ko": "-" + }, + "percentiles3": { + "total": "1110", + "ok": "1110", + "ko": "-" + }, + "percentiles4": { + "total": "2550", + "ok": "2550", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 46, + "percentage": 92 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-8-ef0c8": { + type: "REQUEST", + name: "request_8", +path: "request_8", +pathFormatted: "req_request-8-ef0c8", +stats: { + "name": "request_8", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "427", + "ok": "427", + "ko": "-" + }, + "maxResponseTime": { + "total": "2456", + "ok": "2456", + "ko": "-" + }, + "meanResponseTime": { + "total": "756", + "ok": "756", + "ko": "-" + }, + "standardDeviation": { + "total": "514", + "ok": "514", + "ko": "-" + }, + "percentiles1": { + "total": "563", + "ok": "563", + "ko": "-" + }, + "percentiles2": { + "total": "700", + "ok": "700", + "ko": "-" + }, + "percentiles3": { + "total": "2060", + "ok": "2060", + "ko": "-" + }, + "percentiles4": { + "total": "2455", + "ok": "2455", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 40, + "percentage": 80 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 8, + "percentage": 16 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-8-redir-98b2a": { + type: "REQUEST", + name: "request_8 Redirect 1", +path: "request_8 Redirect 1", +pathFormatted: "req_request-8-redir-98b2a", +stats: { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": "50", + "ok": "49", + "ko": "1" + }, + "minResponseTime": { + "total": "204", + "ok": "380", + "ko": "204" + }, + "maxResponseTime": { + "total": "2807", + "ok": "2807", + "ko": "204" + }, + "meanResponseTime": { + "total": "663", + "ok": "673", + "ko": "204" + }, + "standardDeviation": { + "total": "515", + "ok": "516", + "ko": "0" + }, + "percentiles1": { + "total": "493", + "ok": "494", + "ko": "204" + }, + "percentiles2": { + "total": "615", + "ok": "625", + "ko": "204" + }, + "percentiles3": { + "total": "1631", + "ok": "1648", + "ko": "204" + }, + "percentiles4": { + "total": "2781", + "ok": "2782", + "ko": "204" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 40, + "percentage": 80 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.521", + "ko": "0.011" + } +} + },"req_request-8-redir-fc911": { + type: "REQUEST", + name: "request_8 Redirect 2", +path: "request_8 Redirect 2", +pathFormatted: "req_request-8-redir-fc911", +stats: { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "404", + "ok": "404", + "ko": "-" + }, + "maxResponseTime": { + "total": "1610", + "ok": "1610", + "ko": "-" + }, + "meanResponseTime": { + "total": "669", + "ok": "669", + "ko": "-" + }, + "standardDeviation": { + "total": "265", + "ok": "265", + "ko": "-" + }, + "percentiles1": { + "total": "551", + "ok": "551", + "ko": "-" + }, + "percentiles2": { + "total": "812", + "ok": "812", + "ko": "-" + }, + "percentiles3": { + "total": "1137", + "ok": "1137", + "ko": "-" + }, + "percentiles4": { + "total": "1463", + "ok": "1463", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 34, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 27 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-8-redir-e875c": { + type: "REQUEST", + name: "request_8 Redirect 3", +path: "request_8 Redirect 3", +pathFormatted: "req_request-8-redir-e875c", +stats: { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "2", + "ok": "2", + "ko": "-" + }, + "maxResponseTime": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "meanResponseTime": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "standardDeviation": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles1": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "percentiles2": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles3": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles4": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-12-61da2": { + type: "REQUEST", + name: "request_12", +path: "request_12", +pathFormatted: "req_request-12-61da2", +stats: { + "name": "request_12", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "meanResponseTime": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles2": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles3": { + "total": "24", + "ok": "24", + "ko": "-" + }, + "percentiles4": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-14-a0e30": { + type: "REQUEST", + name: "request_14", +path: "request_14", +pathFormatted: "req_request-14-a0e30", +stats: { + "name": "request_14", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "maxResponseTime": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "meanResponseTime": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "standardDeviation": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles1": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles2": { + "total": "18", + "ok": "18", + "ko": "-" + }, + "percentiles3": { + "total": "29", + "ok": "29", + "ko": "-" + }, + "percentiles4": { + "total": "49", + "ok": "49", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-21-be4cb": { + type: "REQUEST", + name: "request_21", +path: "request_21", +pathFormatted: "req_request-21-be4cb", +stats: { + "name": "request_21", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "maxResponseTime": { + "total": "94", + "ok": "94", + "ko": "-" + }, + "meanResponseTime": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "standardDeviation": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles1": { + "total": "47", + "ok": "47", + "ko": "-" + }, + "percentiles2": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles3": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "percentiles4": { + "total": "83", + "ok": "83", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-22-8ecb1": { + type: "REQUEST", + name: "request_22", +path: "request_22", +pathFormatted: "req_request-22-8ecb1", +stats: { + "name": "request_22", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "maxResponseTime": { + "total": "115", + "ok": "115", + "ko": "-" + }, + "meanResponseTime": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "standardDeviation": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles1": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "percentiles2": { + "total": "57", + "ok": "57", + "ko": "-" + }, + "percentiles3": { + "total": "71", + "ok": "71", + "ko": "-" + }, + "percentiles4": { + "total": "104", + "ok": "104", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-24-dd0c9": { + type: "REQUEST", + name: "request_24", +path: "request_24", +pathFormatted: "req_request-24-dd0c9", +stats: { + "name": "request_24", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "42", + "ok": "42", + "ko": "-" + }, + "maxResponseTime": { + "total": "124", + "ok": "124", + "ko": "-" + }, + "meanResponseTime": { + "total": "57", + "ok": "57", + "ko": "-" + }, + "standardDeviation": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles1": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles2": { + "total": "62", + "ok": "62", + "ko": "-" + }, + "percentiles3": { + "total": "76", + "ok": "76", + "ko": "-" + }, + "percentiles4": { + "total": "113", + "ok": "113", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-13-5cca6": { + type: "REQUEST", + name: "request_13", +path: "request_13", +pathFormatted: "req_request-13-5cca6", +stats: { + "name": "request_13", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "maxResponseTime": { + "total": "224", + "ok": "224", + "ko": "-" + }, + "meanResponseTime": { + "total": "89", + "ok": "89", + "ko": "-" + }, + "standardDeviation": { + "total": "30", + "ok": "30", + "ko": "-" + }, + "percentiles1": { + "total": "82", + "ok": "82", + "ko": "-" + }, + "percentiles2": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "percentiles3": { + "total": "133", + "ok": "133", + "ko": "-" + }, + "percentiles4": { + "total": "205", + "ok": "205", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-200-636fa": { + type: "REQUEST", + name: "request_200", +path: "request_200", +pathFormatted: "req_request-200-636fa", +stats: { + "name": "request_200", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "maxResponseTime": { + "total": "121", + "ok": "121", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "percentiles1": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "percentiles2": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "percentiles3": { + "total": "72", + "ok": "72", + "ko": "-" + }, + "percentiles4": { + "total": "112", + "ok": "112", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-16-24733": { + type: "REQUEST", + name: "request_16", +path: "request_16", +pathFormatted: "req_request-16-24733", +stats: { + "name": "request_16", + "numberOfRequests": { + "total": "49", + "ok": "48", + "ko": "1" + }, + "minResponseTime": { + "total": "201", + "ok": "409", + "ko": "201" + }, + "maxResponseTime": { + "total": "1457", + "ok": "1457", + "ko": "201" + }, + "meanResponseTime": { + "total": "638", + "ok": "647", + "ko": "201" + }, + "standardDeviation": { + "total": "207", + "ok": "199", + "ko": "0" + }, + "percentiles1": { + "total": "578", + "ok": "578", + "ko": "201" + }, + "percentiles2": { + "total": "700", + "ok": "702", + "ko": "201" + }, + "percentiles3": { + "total": "1005", + "ok": "1016", + "ko": "201" + }, + "percentiles4": { + "total": "1409", + "ok": "1410", + "ko": "201" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 90 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.511", + "ko": "0.011" + } +} + },"req_request-15-56eac": { + type: "REQUEST", + name: "request_15", +path: "request_15", +pathFormatted: "req_request-15-56eac", +stats: { + "name": "request_15", + "numberOfRequests": { + "total": "49", + "ok": "47", + "ko": "2" + }, + "minResponseTime": { + "total": "201", + "ok": "437", + "ko": "201" + }, + "maxResponseTime": { + "total": "1791", + "ok": "1791", + "ko": "204" + }, + "meanResponseTime": { + "total": "654", + "ok": "673", + "ko": "203" + }, + "standardDeviation": { + "total": "262", + "ok": "250", + "ko": "2" + }, + "percentiles1": { + "total": "578", + "ok": "582", + "ko": "203" + }, + "percentiles2": { + "total": "732", + "ok": "737", + "ko": "203" + }, + "percentiles3": { + "total": "1055", + "ok": "1067", + "ko": "204" + }, + "percentiles4": { + "total": "1651", + "ok": "1657", + "ko": "204" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 40, + "percentage": 82 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 4 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.5", + "ko": "0.021" + } +} + },"req_request-18-f5b64": { + type: "REQUEST", + name: "request_18", +path: "request_18", +pathFormatted: "req_request-18-f5b64", +stats: { + "name": "request_18", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "178", + "ok": "178", + "ko": "-" + }, + "maxResponseTime": { + "total": "998", + "ok": "998", + "ko": "-" + }, + "meanResponseTime": { + "total": "257", + "ok": "257", + "ko": "-" + }, + "standardDeviation": { + "total": "146", + "ok": "146", + "ko": "-" + }, + "percentiles1": { + "total": "200", + "ok": "200", + "ko": "-" + }, + "percentiles2": { + "total": "257", + "ok": "257", + "ko": "-" + }, + "percentiles3": { + "total": "568", + "ok": "568", + "ko": "-" + }, + "percentiles4": { + "total": "805", + "ok": "805", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 48, + "percentage": 98 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_bundle-js-0b837": { + type: "REQUEST", + name: "bundle.js", +path: "bundle.js", +pathFormatted: "req_bundle-js-0b837", +stats: { + "name": "bundle.js", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "11", + "ok": "11", + "ko": "-" + }, + "maxResponseTime": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "meanResponseTime": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "standardDeviation": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles1": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "percentiles2": { + "total": "16", + "ok": "16", + "ko": "-" + }, + "percentiles3": { + "total": "26", + "ok": "26", + "ko": "-" + }, + "percentiles4": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_logo-png-c9c2b": { + type: "REQUEST", + name: "Logo.png", +path: "Logo.png", +pathFormatted: "req_logo-png-c9c2b", +stats: { + "name": "Logo.png", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "3", + "ok": "3", + "ko": "-" + }, + "maxResponseTime": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "meanResponseTime": { + "total": "12", + "ok": "12", + "ko": "-" + }, + "standardDeviation": { + "total": "8", + "ok": "8", + "ko": "-" + }, + "percentiles1": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles2": { + "total": "17", + "ok": "17", + "ko": "-" + }, + "percentiles3": { + "total": "27", + "ok": "27", + "ko": "-" + }, + "percentiles4": { + "total": "31", + "ok": "31", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-9-d127e": { + type: "REQUEST", + name: "request_9", +path: "request_9", +pathFormatted: "req_request-9-d127e", +stats: { + "name": "request_9", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "maxResponseTime": { + "total": "48", + "ok": "48", + "ko": "-" + }, + "meanResponseTime": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "standardDeviation": { + "total": "6", + "ok": "6", + "ko": "-" + }, + "percentiles1": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles2": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "percentiles3": { + "total": "32", + "ok": "32", + "ko": "-" + }, + "percentiles4": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-10-1cfbe": { + type: "REQUEST", + name: "request_10", +path: "request_10", +pathFormatted: "req_request-10-1cfbe", +stats: { + "name": "request_10", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "maxResponseTime": { + "total": "52", + "ok": "52", + "ko": "-" + }, + "meanResponseTime": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "standardDeviation": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles1": { + "total": "19", + "ok": "19", + "ko": "-" + }, + "percentiles2": { + "total": "22", + "ok": "22", + "ko": "-" + }, + "percentiles3": { + "total": "32", + "ok": "32", + "ko": "-" + }, + "percentiles4": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-11-f11e8": { + type: "REQUEST", + name: "request_11", +path: "request_11", +pathFormatted: "req_request-11-f11e8", +stats: { + "name": "request_11", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "23", + "ok": "23", + "ko": "-" + }, + "maxResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "meanResponseTime": { + "total": "40", + "ok": "40", + "ko": "-" + }, + "standardDeviation": { + "total": "14", + "ok": "14", + "ko": "-" + }, + "percentiles1": { + "total": "37", + "ok": "37", + "ko": "-" + }, + "percentiles2": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "percentiles3": { + "total": "67", + "ok": "67", + "ko": "-" + }, + "percentiles4": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-242-d6d33": { + type: "REQUEST", + name: "request_242", +path: "request_242", +pathFormatted: "req_request-242-d6d33", +stats: { + "name": "request_242", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "maxResponseTime": { + "total": "49", + "ok": "49", + "ko": "-" + }, + "meanResponseTime": { + "total": "20", + "ok": "20", + "ko": "-" + }, + "standardDeviation": { + "total": "7", + "ok": "7", + "ko": "-" + }, + "percentiles1": { + "total": "18", + "ok": "18", + "ko": "-" + }, + "percentiles2": { + "total": "21", + "ok": "21", + "ko": "-" + }, + "percentiles3": { + "total": "33", + "ok": "33", + "ko": "-" + }, + "percentiles4": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_css2-family-rob-cf8a9": { + type: "REQUEST", + name: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +path: "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +pathFormatted: "req_css2-family-rob-cf8a9", +stats: { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "96", + "ok": "96", + "ko": "-" + }, + "maxResponseTime": { + "total": "176", + "ok": "176", + "ko": "-" + }, + "meanResponseTime": { + "total": "119", + "ok": "119", + "ko": "-" + }, + "standardDeviation": { + "total": "15", + "ok": "15", + "ko": "-" + }, + "percentiles1": { + "total": "116", + "ok": "116", + "ko": "-" + }, + "percentiles2": { + "total": "131", + "ok": "131", + "ko": "-" + }, + "percentiles3": { + "total": "140", + "ok": "140", + "ko": "-" + }, + "percentiles4": { + "total": "160", + "ok": "160", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-19-10d85": { + type: "REQUEST", + name: "request_19", +path: "request_19", +pathFormatted: "req_request-19-10d85", +stats: { + "name": "request_19", + "numberOfRequests": { + "total": "49", + "ok": "47", + "ko": "2" + }, + "minResponseTime": { + "total": "201", + "ok": "476", + "ko": "201" + }, + "maxResponseTime": { + "total": "4933", + "ok": "4933", + "ko": "204" + }, + "meanResponseTime": { + "total": "1138", + "ok": "1178", + "ko": "203" + }, + "standardDeviation": { + "total": "840", + "ok": "835", + "ko": "2" + }, + "percentiles1": { + "total": "916", + "ok": "922", + "ko": "203" + }, + "percentiles2": { + "total": "1309", + "ok": "1313", + "ko": "203" + }, + "percentiles3": { + "total": "1926", + "ok": "1970", + "ko": "204" + }, + "percentiles4": { + "total": "4818", + "ok": "4823", + "ko": "204" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 20 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 23, + "percentage": 47 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 29 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 4 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.5", + "ko": "0.021" + } +} + },"req_request-20-6804b": { + type: "REQUEST", + name: "request_20", +path: "request_20", +pathFormatted: "req_request-20-6804b", +stats: { + "name": "request_20", + "numberOfRequests": { + "total": "49", + "ok": "46", + "ko": "3" + }, + "minResponseTime": { + "total": "181", + "ok": "441", + "ko": "181" + }, + "maxResponseTime": { + "total": "1519", + "ok": "1519", + "ko": "207" + }, + "meanResponseTime": { + "total": "652", + "ok": "681", + "ko": "197" + }, + "standardDeviation": { + "total": "242", + "ok": "219", + "ko": "11" + }, + "percentiles1": { + "total": "598", + "ok": "604", + "ko": "202" + }, + "percentiles2": { + "total": "731", + "ok": "739", + "ko": "205" + }, + "percentiles3": { + "total": "1047", + "ok": "1068", + "ko": "207" + }, + "percentiles4": { + "total": "1503", + "ok": "1504", + "ko": "207" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 39, + "percentage": 80 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 6 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.489", + "ko": "0.032" + } +} + },"req_request-23-98f5d": { + type: "REQUEST", + name: "request_23", +path: "request_23", +pathFormatted: "req_request-23-98f5d", +stats: { + "name": "request_23", + "numberOfRequests": { + "total": "49", + "ok": "47", + "ko": "2" + }, + "minResponseTime": { + "total": "190", + "ok": "443", + "ko": "190" + }, + "maxResponseTime": { + "total": "5617", + "ok": "5617", + "ko": "192" + }, + "meanResponseTime": { + "total": "1221", + "ok": "1265", + "ko": "191" + }, + "standardDeviation": { + "total": "948", + "ok": "943", + "ko": "1" + }, + "percentiles1": { + "total": "933", + "ok": "944", + "ko": "191" + }, + "percentiles2": { + "total": "1369", + "ok": "1393", + "ko": "192" + }, + "percentiles3": { + "total": "2051", + "ok": "2066", + "ko": "192" + }, + "percentiles4": { + "total": "5398", + "ok": "5407", + "ko": "192" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 7, + "percentage": 14 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 25, + "percentage": 51 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 15, + "percentage": 31 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 4 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.5", + "ko": "0.021" + } +} + },"req_request-222-24864": { + type: "REQUEST", + name: "request_222", +path: "request_222", +pathFormatted: "req_request-222-24864", +stats: { + "name": "request_222", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "36", + "ok": "36", + "ko": "-" + }, + "maxResponseTime": { + "total": "88", + "ok": "88", + "ko": "-" + }, + "meanResponseTime": { + "total": "49", + "ok": "49", + "ko": "-" + }, + "standardDeviation": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles1": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "percentiles2": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "percentiles3": { + "total": "63", + "ok": "63", + "ko": "-" + }, + "percentiles4": { + "total": "77", + "ok": "77", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-227-2507b": { + type: "REQUEST", + name: "request_227", +path: "request_227", +pathFormatted: "req_request-227-2507b", +stats: { + "name": "request_227", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "maxResponseTime": { + "total": "93", + "ok": "93", + "ko": "-" + }, + "meanResponseTime": { + "total": "45", + "ok": "45", + "ko": "-" + }, + "standardDeviation": { + "total": "9", + "ok": "9", + "ko": "-" + }, + "percentiles1": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "percentiles2": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "percentiles3": { + "total": "55", + "ok": "55", + "ko": "-" + }, + "percentiles4": { + "total": "76", + "ok": "76", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-241-2919b": { + type: "REQUEST", + name: "request_241", +path: "request_241", +pathFormatted: "req_request-241-2919b", +stats: { + "name": "request_241", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "292", + "ok": "292", + "ko": "-" + }, + "maxResponseTime": { + "total": "5142", + "ok": "5142", + "ko": "-" + }, + "meanResponseTime": { + "total": "928", + "ok": "928", + "ko": "-" + }, + "standardDeviation": { + "total": "769", + "ok": "769", + "ko": "-" + }, + "percentiles1": { + "total": "701", + "ok": "701", + "ko": "-" + }, + "percentiles2": { + "total": "936", + "ok": "936", + "ko": "-" + }, + "percentiles3": { + "total": "1920", + "ok": "1920", + "ko": "-" + }, + "percentiles4": { + "total": "4041", + "ok": "4041", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 9, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-240-e27d8": { + type: "REQUEST", + name: "request_240", +path: "request_240", +pathFormatted: "req_request-240-e27d8", +stats: { + "name": "request_240", + "numberOfRequests": { + "total": "49", + "ok": "48", + "ko": "1" + }, + "minResponseTime": { + "total": "216", + "ok": "324", + "ko": "216" + }, + "maxResponseTime": { + "total": "4880", + "ok": "4880", + "ko": "216" + }, + "meanResponseTime": { + "total": "768", + "ok": "780", + "ko": "216" + }, + "standardDeviation": { + "total": "740", + "ok": "744", + "ko": "0" + }, + "percentiles1": { + "total": "582", + "ok": "593", + "ko": "216" + }, + "percentiles2": { + "total": "863", + "ok": "866", + "ko": "216" + }, + "percentiles3": { + "total": "1896", + "ok": "1923", + "ko": "216" + }, + "percentiles4": { + "total": "3582", + "ok": "3609", + "ko": "216" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 34, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 7, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.511", + "ko": "0.011" + } +} + },"req_request-243-b078b": { + type: "REQUEST", + name: "request_243", +path: "request_243", +pathFormatted: "req_request-243-b078b", +stats: { + "name": "request_243", + "numberOfRequests": { + "total": "38", + "ok": "38", + "ko": "0" + }, + "minResponseTime": { + "total": "34", + "ok": "34", + "ko": "-" + }, + "maxResponseTime": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "meanResponseTime": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "standardDeviation": { + "total": "5", + "ok": "5", + "ko": "-" + }, + "percentiles1": { + "total": "37", + "ok": "37", + "ko": "-" + }, + "percentiles2": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "percentiles3": { + "total": "44", + "ok": "44", + "ko": "-" + }, + "percentiles4": { + "total": "58", + "ok": "58", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 38, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.404", + "ok": "0.404", + "ko": "-" + } +} + },"req_request-250-8cb1f": { + type: "REQUEST", + name: "request_250", +path: "request_250", +pathFormatted: "req_request-250-8cb1f", +stats: { + "name": "request_250", + "numberOfRequests": { + "total": "49", + "ok": "48", + "ko": "1" + }, + "minResponseTime": { + "total": "284", + "ok": "284", + "ko": "2036" + }, + "maxResponseTime": { + "total": "5166", + "ok": "5166", + "ko": "2036" + }, + "meanResponseTime": { + "total": "901", + "ok": "877", + "ko": "2036" + }, + "standardDeviation": { + "total": "759", + "ok": "749", + "ko": "0" + }, + "percentiles1": { + "total": "615", + "ok": "615", + "ko": "2036" + }, + "percentiles2": { + "total": "900", + "ok": "884", + "ko": "2036" + }, + "percentiles3": { + "total": "1963", + "ok": "1769", + "ko": "2036" + }, + "percentiles4": { + "total": "3905", + "ok": "3931", + "ko": "2036" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 12, + "percentage": 24 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 7, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.511", + "ko": "0.011" + } +} + },"req_request-252-38647": { + type: "REQUEST", + name: "request_252", +path: "request_252", +pathFormatted: "req_request-252-38647", +stats: { + "name": "request_252", + "numberOfRequests": { + "total": "49", + "ok": "48", + "ko": "1" + }, + "minResponseTime": { + "total": "221", + "ok": "483", + "ko": "221" + }, + "maxResponseTime": { + "total": "4985", + "ok": "4985", + "ko": "221" + }, + "meanResponseTime": { + "total": "963", + "ok": "978", + "ko": "221" + }, + "standardDeviation": { + "total": "725", + "ok": "724", + "ko": "0" + }, + "percentiles1": { + "total": "693", + "ok": "711", + "ko": "221" + }, + "percentiles2": { + "total": "1048", + "ok": "1069", + "ko": "221" + }, + "percentiles3": { + "total": "1991", + "ok": "2003", + "ko": "221" + }, + "percentiles4": { + "total": "3825", + "ok": "3849", + "ko": "221" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 10, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 9, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.511", + "ko": "0.011" + } +} + },"req_request-260-43b5f": { + type: "REQUEST", + name: "request_260", +path: "request_260", +pathFormatted: "req_request-260-43b5f", +stats: { + "name": "request_260", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "314", + "ok": "314", + "ko": "-" + }, + "maxResponseTime": { + "total": "5187", + "ok": "5187", + "ko": "-" + }, + "meanResponseTime": { + "total": "967", + "ok": "967", + "ko": "-" + }, + "standardDeviation": { + "total": "835", + "ok": "835", + "ko": "-" + }, + "percentiles1": { + "total": "650", + "ok": "650", + "ko": "-" + }, + "percentiles2": { + "total": "989", + "ok": "989", + "ko": "-" + }, + "percentiles3": { + "total": "2598", + "ok": "2598", + "ko": "-" + }, + "percentiles4": { + "total": "4210", + "ok": "4210", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 9, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-265-cf160": { + type: "REQUEST", + name: "request_265", +path: "request_265", +pathFormatted: "req_request-265-cf160", +stats: { + "name": "request_265", + "numberOfRequests": { + "total": "49", + "ok": "49", + "ko": "0" + }, + "minResponseTime": { + "total": "425", + "ok": "425", + "ko": "-" + }, + "maxResponseTime": { + "total": "5040", + "ok": "5040", + "ko": "-" + }, + "meanResponseTime": { + "total": "1157", + "ok": "1157", + "ko": "-" + }, + "standardDeviation": { + "total": "959", + "ok": "959", + "ko": "-" + }, + "percentiles1": { + "total": "767", + "ok": "767", + "ko": "-" + }, + "percentiles2": { + "total": "1309", + "ok": "1309", + "ko": "-" + }, + "percentiles3": { + "total": "3130", + "ok": "3130", + "ko": "-" + }, + "percentiles4": { + "total": "4802", + "ok": "4802", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 28, + "percentage": 57 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 29 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.521", + "ok": "0.521", + "ko": "-" + } +} + },"req_request-270-e02a1": { + type: "REQUEST", + name: "request_270", +path: "request_270", +pathFormatted: "req_request-270-e02a1", +stats: { + "name": "request_270", + "numberOfRequests": { + "total": "30", + "ok": "30", + "ko": "0" + }, + "minResponseTime": { + "total": "307", + "ok": "307", + "ko": "-" + }, + "maxResponseTime": { + "total": "3659", + "ok": "3659", + "ko": "-" + }, + "meanResponseTime": { + "total": "789", + "ok": "789", + "ko": "-" + }, + "standardDeviation": { + "total": "620", + "ok": "620", + "ko": "-" + }, + "percentiles1": { + "total": "624", + "ok": "624", + "ko": "-" + }, + "percentiles2": { + "total": "843", + "ok": "843", + "ko": "-" + }, + "percentiles3": { + "total": "1591", + "ok": "1591", + "ko": "-" + }, + "percentiles4": { + "total": "3106", + "ok": "3106", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.319", + "ok": "0.319", + "ko": "-" + } +} + },"req_request-244-416e5": { + type: "REQUEST", + name: "request_244", +path: "request_244", +pathFormatted: "req_request-244-416e5", +stats: { + "name": "request_244", + "numberOfRequests": { + "total": "30", + "ok": "30", + "ko": "0" + }, + "minResponseTime": { + "total": "33", + "ok": "33", + "ko": "-" + }, + "maxResponseTime": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "meanResponseTime": { + "total": "39", + "ok": "39", + "ko": "-" + }, + "standardDeviation": { + "total": "4", + "ok": "4", + "ko": "-" + }, + "percentiles1": { + "total": "38", + "ok": "38", + "ko": "-" + }, + "percentiles2": { + "total": "41", + "ok": "41", + "ko": "-" + }, + "percentiles3": { + "total": "43", + "ok": "43", + "ko": "-" + }, + "percentiles4": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 30, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.319", + "ok": "0.319", + "ko": "-" + } +} + },"req_request-273-0cd3c": { + type: "REQUEST", + name: "request_273", +path: "request_273", +pathFormatted: "req_request-273-0cd3c", +stats: { + "name": "request_273", + "numberOfRequests": { + "total": "19", + "ok": "19", + "ko": "0" + }, + "minResponseTime": { + "total": "330", + "ok": "330", + "ko": "-" + }, + "maxResponseTime": { + "total": "2795", + "ok": "2795", + "ko": "-" + }, + "meanResponseTime": { + "total": "892", + "ok": "892", + "ko": "-" + }, + "standardDeviation": { + "total": "569", + "ok": "569", + "ko": "-" + }, + "percentiles1": { + "total": "787", + "ok": "787", + "ko": "-" + }, + "percentiles2": { + "total": "1051", + "ok": "1051", + "ko": "-" + }, + "percentiles3": { + "total": "1663", + "ok": "1663", + "ko": "-" + }, + "percentiles4": { + "total": "2569", + "ok": "2569", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 53 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 32 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 16 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.202", + "ok": "0.202", + "ko": "-" + } +} + },"req_request-277-d0ec5": { + type: "REQUEST", + name: "request_277", +path: "request_277", +pathFormatted: "req_request-277-d0ec5", +stats: { + "name": "request_277", + "numberOfRequests": { + "total": "15", + "ok": "15", + "ko": "0" + }, + "minResponseTime": { + "total": "335", + "ok": "335", + "ko": "-" + }, + "maxResponseTime": { + "total": "1589", + "ok": "1589", + "ko": "-" + }, + "meanResponseTime": { + "total": "723", + "ok": "723", + "ko": "-" + }, + "standardDeviation": { + "total": "402", + "ok": "402", + "ko": "-" + }, + "percentiles1": { + "total": "521", + "ok": "521", + "ko": "-" + }, + "percentiles2": { + "total": "871", + "ok": "871", + "ko": "-" + }, + "percentiles3": { + "total": "1573", + "ok": "1573", + "ko": "-" + }, + "percentiles4": { + "total": "1586", + "ok": "1586", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 11, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.16", + "ok": "0.16", + "ko": "-" + } +} + },"req_request-322-a2de9": { + type: "REQUEST", + name: "request_322", +path: "request_322", +pathFormatted: "req_request-322-a2de9", +stats: { + "name": "request_322", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "46", + "ok": "46", + "ko": "-" + }, + "maxResponseTime": { + "total": "107", + "ok": "107", + "ko": "-" + }, + "meanResponseTime": { + "total": "56", + "ok": "56", + "ko": "-" + }, + "standardDeviation": { + "total": "13", + "ok": "13", + "ko": "-" + }, + "percentiles1": { + "total": "51", + "ok": "51", + "ko": "-" + }, + "percentiles2": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "percentiles3": { + "total": "87", + "ok": "87", + "ko": "-" + }, + "percentiles4": { + "total": "104", + "ok": "104", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + },"req_request-323-2fefc": { + type: "REQUEST", + name: "request_323", +path: "request_323", +pathFormatted: "req_request-323-2fefc", +stats: { + "name": "request_323", + "numberOfRequests": { + "total": "50", + "ok": "50", + "ko": "0" + }, + "minResponseTime": { + "total": "50", + "ok": "50", + "ko": "-" + }, + "maxResponseTime": { + "total": "97", + "ok": "97", + "ko": "-" + }, + "meanResponseTime": { + "total": "59", + "ok": "59", + "ko": "-" + }, + "standardDeviation": { + "total": "10", + "ok": "10", + "ko": "-" + }, + "percentiles1": { + "total": "54", + "ok": "54", + "ko": "-" + }, + "percentiles2": { + "total": "66", + "ok": "66", + "ko": "-" + }, + "percentiles3": { + "total": "75", + "ok": "75", + "ko": "-" + }, + "percentiles4": { + "total": "90", + "ok": "90", + "ko": "-" + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": "0.532", + "ok": "0.532", + "ko": "-" + } +} + } +} + +} + +function fillStats(stat){ + $("#numberOfRequests").append(stat.numberOfRequests.total); + $("#numberOfRequestsOK").append(stat.numberOfRequests.ok); + $("#numberOfRequestsKO").append(stat.numberOfRequests.ko); + + $("#minResponseTime").append(stat.minResponseTime.total); + $("#minResponseTimeOK").append(stat.minResponseTime.ok); + $("#minResponseTimeKO").append(stat.minResponseTime.ko); + + $("#maxResponseTime").append(stat.maxResponseTime.total); + $("#maxResponseTimeOK").append(stat.maxResponseTime.ok); + $("#maxResponseTimeKO").append(stat.maxResponseTime.ko); + + $("#meanResponseTime").append(stat.meanResponseTime.total); + $("#meanResponseTimeOK").append(stat.meanResponseTime.ok); + $("#meanResponseTimeKO").append(stat.meanResponseTime.ko); + + $("#standardDeviation").append(stat.standardDeviation.total); + $("#standardDeviationOK").append(stat.standardDeviation.ok); + $("#standardDeviationKO").append(stat.standardDeviation.ko); + + $("#percentiles1").append(stat.percentiles1.total); + $("#percentiles1OK").append(stat.percentiles1.ok); + $("#percentiles1KO").append(stat.percentiles1.ko); + + $("#percentiles2").append(stat.percentiles2.total); + $("#percentiles2OK").append(stat.percentiles2.ok); + $("#percentiles2KO").append(stat.percentiles2.ko); + + $("#percentiles3").append(stat.percentiles3.total); + $("#percentiles3OK").append(stat.percentiles3.ok); + $("#percentiles3KO").append(stat.percentiles3.ko); + + $("#percentiles4").append(stat.percentiles4.total); + $("#percentiles4OK").append(stat.percentiles4.ok); + $("#percentiles4KO").append(stat.percentiles4.ko); + + $("#meanNumberOfRequestsPerSecond").append(stat.meanNumberOfRequestsPerSecond.total); + $("#meanNumberOfRequestsPerSecondOK").append(stat.meanNumberOfRequestsPerSecond.ok); + $("#meanNumberOfRequestsPerSecondKO").append(stat.meanNumberOfRequestsPerSecond.ko); +} diff --git a/webapp/loadTests/50users1minute/js/stats.json b/webapp/loadTests/50users1minute/js/stats.json new file mode 100644 index 0000000..3c087d7 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/stats.json @@ -0,0 +1,4023 @@ +{ + "type": "GROUP", +"name": "All Requests", +"path": "", +"pathFormatted": "group_missing-name-b06d1", +"stats": { + "name": "All Requests", + "numberOfRequests": { + "total": 2252, + "ok": 2238, + "ko": 14 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 181 + }, + "maxResponseTime": { + "total": 5617, + "ok": 5617, + "ko": 2036 + }, + "meanResponseTime": { + "total": 396, + "ok": 396, + "ko": 333 + }, + "standardDeviation": { + "total": 569, + "ok": 569, + "ko": 472 + }, + "percentiles1": { + "total": 125, + "ok": 121, + "ko": 203 + }, + "percentiles2": { + "total": 593, + "ok": 594, + "ko": 206 + }, + "percentiles3": { + "total": 1343, + "ok": 1343, + "ko": 856 + }, + "percentiles4": { + "total": 2553, + "ok": 2557, + "ko": 1800 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 1931, + "percentage": 86 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 167, + "percentage": 7 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 140, + "percentage": 6 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 14, + "percentage": 1 +}, + "meanNumberOfRequestsPerSecond": { + "total": 23.95744680851064, + "ok": 23.80851063829787, + "ko": 0.14893617021276595 + } +}, +"contents": { +"req_request-0-684d2": { + "type": "REQUEST", + "name": "request_0", +"path": "request_0", +"pathFormatted": "req_request-0-684d2", +"stats": { + "name": "request_0", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 1, + "ok": 1, + "ko": 0 + }, + "maxResponseTime": { + "total": 37, + "ok": 37, + "ko": 0 + }, + "meanResponseTime": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "standardDeviation": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles1": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles2": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "percentiles3": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles4": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-1-46da4": { + "type": "REQUEST", + "name": "request_1", +"path": "request_1", +"pathFormatted": "req_request-1-46da4", +"stats": { + "name": "request_1", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "meanResponseTime": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "standardDeviation": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles3": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles4": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-2-93baf": { + "type": "REQUEST", + "name": "request_2", +"path": "request_2", +"pathFormatted": "req_request-2-93baf", +"stats": { + "name": "request_2", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 412, + "ok": 412, + "ko": 0 + }, + "maxResponseTime": { + "total": 1649, + "ok": 1649, + "ko": 0 + }, + "meanResponseTime": { + "total": 602, + "ok": 602, + "ko": 0 + }, + "standardDeviation": { + "total": 260, + "ok": 260, + "ko": 0 + }, + "percentiles1": { + "total": 537, + "ok": 537, + "ko": 0 + }, + "percentiles2": { + "total": 614, + "ok": 614, + "ko": 0 + }, + "percentiles3": { + "total": 1307, + "ok": 1307, + "ko": 0 + }, + "percentiles4": { + "total": 1552, + "ok": 1552, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 46, + "percentage": 92 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-3-d0973": { + "type": "REQUEST", + "name": "request_3", +"path": "request_3", +"pathFormatted": "req_request-3-d0973", +"stats": { + "name": "request_3", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 91, + "ok": 91, + "ko": 0 + }, + "maxResponseTime": { + "total": 1334, + "ok": 1334, + "ko": 0 + }, + "meanResponseTime": { + "total": 241, + "ok": 241, + "ko": 0 + }, + "standardDeviation": { + "total": 269, + "ok": 269, + "ko": 0 + }, + "percentiles1": { + "total": 145, + "ok": 145, + "ko": 0 + }, + "percentiles2": { + "total": 194, + "ok": 194, + "ko": 0 + }, + "percentiles3": { + "total": 793, + "ok": 793, + "ko": 0 + }, + "percentiles4": { + "total": 1298, + "ok": 1298, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 47, + "percentage": 94 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-5-48829": { + "type": "REQUEST", + "name": "request_5", +"path": "request_5", +"pathFormatted": "req_request-5-48829", +"stats": { + "name": "request_5", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 362, + "ok": 362, + "ko": 0 + }, + "maxResponseTime": { + "total": 2318, + "ok": 2318, + "ko": 0 + }, + "meanResponseTime": { + "total": 615, + "ok": 615, + "ko": 0 + }, + "standardDeviation": { + "total": 425, + "ok": 425, + "ko": 0 + }, + "percentiles1": { + "total": 461, + "ok": 461, + "ko": 0 + }, + "percentiles2": { + "total": 555, + "ok": 555, + "ko": 0 + }, + "percentiles3": { + "total": 1730, + "ok": 1730, + "ko": 0 + }, + "percentiles4": { + "total": 2163, + "ok": 2163, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 43, + "percentage": 86 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 5, + "percentage": 10 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-4-e7d1b": { + "type": "REQUEST", + "name": "request_4", +"path": "request_4", +"pathFormatted": "req_request-4-e7d1b", +"stats": { + "name": "request_4", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 414, + "ok": 414, + "ko": 0 + }, + "maxResponseTime": { + "total": 1897, + "ok": 1897, + "ko": 0 + }, + "meanResponseTime": { + "total": 593, + "ok": 593, + "ko": 0 + }, + "standardDeviation": { + "total": 300, + "ok": 300, + "ko": 0 + }, + "percentiles1": { + "total": 479, + "ok": 479, + "ko": 0 + }, + "percentiles2": { + "total": 541, + "ok": 541, + "ko": 0 + }, + "percentiles3": { + "total": 1362, + "ok": 1362, + "ko": 0 + }, + "percentiles4": { + "total": 1679, + "ok": 1679, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 88 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-7-f222f": { + "type": "REQUEST", + "name": "request_7", +"path": "request_7", +"pathFormatted": "req_request-7-f222f", +"stats": { + "name": "request_7", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 382, + "ok": 382, + "ko": 0 + }, + "maxResponseTime": { + "total": 2133, + "ok": 2133, + "ko": 0 + }, + "meanResponseTime": { + "total": 580, + "ok": 580, + "ko": 0 + }, + "standardDeviation": { + "total": 366, + "ok": 366, + "ko": 0 + }, + "percentiles1": { + "total": 450, + "ok": 450, + "ko": 0 + }, + "percentiles2": { + "total": 527, + "ok": 527, + "ko": 0 + }, + "percentiles3": { + "total": 1482, + "ok": 1482, + "ko": 0 + }, + "percentiles4": { + "total": 1944, + "ok": 1944, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 88 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-6-027a9": { + "type": "REQUEST", + "name": "request_6", +"path": "request_6", +"pathFormatted": "req_request-6-027a9", +"stats": { + "name": "request_6", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 549, + "ok": 549, + "ko": 0 + }, + "maxResponseTime": { + "total": 2650, + "ok": 2650, + "ko": 0 + }, + "meanResponseTime": { + "total": 834, + "ok": 834, + "ko": 0 + }, + "standardDeviation": { + "total": 456, + "ok": 456, + "ko": 0 + }, + "percentiles1": { + "total": 656, + "ok": 656, + "ko": 0 + }, + "percentiles2": { + "total": 801, + "ok": 801, + "ko": 0 + }, + "percentiles3": { + "total": 2021, + "ok": 2021, + "ko": 0 + }, + "percentiles4": { + "total": 2460, + "ok": 2460, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 37, + "percentage": 74 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 6, + "percentage": 12 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-5-redir-affb3": { + "type": "REQUEST", + "name": "request_5 Redirect 1", +"path": "request_5 Redirect 1", +"pathFormatted": "req_request-5-redir-affb3", +"stats": { + "name": "request_5 Redirect 1", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "maxResponseTime": { + "total": 3400, + "ok": 3400, + "ko": 0 + }, + "meanResponseTime": { + "total": 377, + "ok": 377, + "ko": 0 + }, + "standardDeviation": { + "total": 536, + "ok": 536, + "ko": 0 + }, + "percentiles1": { + "total": 154, + "ok": 154, + "ko": 0 + }, + "percentiles2": { + "total": 482, + "ok": 482, + "ko": 0 + }, + "percentiles3": { + "total": 1110, + "ok": 1110, + "ko": 0 + }, + "percentiles4": { + "total": 2550, + "ok": 2550, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 46, + "percentage": 92 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-8-ef0c8": { + "type": "REQUEST", + "name": "request_8", +"path": "request_8", +"pathFormatted": "req_request-8-ef0c8", +"stats": { + "name": "request_8", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 427, + "ok": 427, + "ko": 0 + }, + "maxResponseTime": { + "total": 2456, + "ok": 2456, + "ko": 0 + }, + "meanResponseTime": { + "total": 756, + "ok": 756, + "ko": 0 + }, + "standardDeviation": { + "total": 514, + "ok": 514, + "ko": 0 + }, + "percentiles1": { + "total": 563, + "ok": 563, + "ko": 0 + }, + "percentiles2": { + "total": 700, + "ok": 700, + "ko": 0 + }, + "percentiles3": { + "total": 2060, + "ok": 2060, + "ko": 0 + }, + "percentiles4": { + "total": 2455, + "ok": 2455, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 40, + "percentage": 80 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 8, + "percentage": 16 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-8-redir-98b2a": { + "type": "REQUEST", + "name": "request_8 Redirect 1", +"path": "request_8 Redirect 1", +"pathFormatted": "req_request-8-redir-98b2a", +"stats": { + "name": "request_8 Redirect 1", + "numberOfRequests": { + "total": 50, + "ok": 49, + "ko": 1 + }, + "minResponseTime": { + "total": 204, + "ok": 380, + "ko": 204 + }, + "maxResponseTime": { + "total": 2807, + "ok": 2807, + "ko": 204 + }, + "meanResponseTime": { + "total": 663, + "ok": 673, + "ko": 204 + }, + "standardDeviation": { + "total": 515, + "ok": 516, + "ko": 0 + }, + "percentiles1": { + "total": 493, + "ok": 494, + "ko": 204 + }, + "percentiles2": { + "total": 615, + "ok": 625, + "ko": 204 + }, + "percentiles3": { + "total": 1631, + "ok": 1648, + "ko": 204 + }, + "percentiles4": { + "total": 2781, + "ok": 2782, + "ko": 204 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 40, + "percentage": 80 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 8 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5212765957446809, + "ko": 0.010638297872340425 + } +} + },"req_request-8-redir-fc911": { + "type": "REQUEST", + "name": "request_8 Redirect 2", +"path": "request_8 Redirect 2", +"pathFormatted": "req_request-8-redir-fc911", +"stats": { + "name": "request_8 Redirect 2", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 404, + "ok": 404, + "ko": 0 + }, + "maxResponseTime": { + "total": 1610, + "ok": 1610, + "ko": 0 + }, + "meanResponseTime": { + "total": 669, + "ok": 669, + "ko": 0 + }, + "standardDeviation": { + "total": 265, + "ok": 265, + "ko": 0 + }, + "percentiles1": { + "total": 551, + "ok": 551, + "ko": 0 + }, + "percentiles2": { + "total": 812, + "ok": 812, + "ko": 0 + }, + "percentiles3": { + "total": 1137, + "ok": 1137, + "ko": 0 + }, + "percentiles4": { + "total": 1463, + "ok": 1463, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 34, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 13, + "percentage": 27 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-8-redir-e875c": { + "type": "REQUEST", + "name": "request_8 Redirect 3", +"path": "request_8 Redirect 3", +"pathFormatted": "req_request-8-redir-e875c", +"stats": { + "name": "request_8 Redirect 3", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 2, + "ok": 2, + "ko": 0 + }, + "maxResponseTime": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "meanResponseTime": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "standardDeviation": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles1": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "percentiles2": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles3": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles4": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-12-61da2": { + "type": "REQUEST", + "name": "request_12", +"path": "request_12", +"pathFormatted": "req_request-12-61da2", +"stats": { + "name": "request_12", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "meanResponseTime": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles2": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles3": { + "total": 24, + "ok": 24, + "ko": 0 + }, + "percentiles4": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-14-a0e30": { + "type": "REQUEST", + "name": "request_14", +"path": "request_14", +"pathFormatted": "req_request-14-a0e30", +"stats": { + "name": "request_14", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "maxResponseTime": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "meanResponseTime": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "standardDeviation": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles1": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles2": { + "total": 18, + "ok": 18, + "ko": 0 + }, + "percentiles3": { + "total": 29, + "ok": 29, + "ko": 0 + }, + "percentiles4": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-21-be4cb": { + "type": "REQUEST", + "name": "request_21", +"path": "request_21", +"pathFormatted": "req_request-21-be4cb", +"stats": { + "name": "request_21", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "maxResponseTime": { + "total": 94, + "ok": 94, + "ko": 0 + }, + "meanResponseTime": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "standardDeviation": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles1": { + "total": 47, + "ok": 47, + "ko": 0 + }, + "percentiles2": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles3": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "percentiles4": { + "total": 83, + "ok": 83, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-22-8ecb1": { + "type": "REQUEST", + "name": "request_22", +"path": "request_22", +"pathFormatted": "req_request-22-8ecb1", +"stats": { + "name": "request_22", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "maxResponseTime": { + "total": 115, + "ok": 115, + "ko": 0 + }, + "meanResponseTime": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "standardDeviation": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles1": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "percentiles2": { + "total": 57, + "ok": 57, + "ko": 0 + }, + "percentiles3": { + "total": 71, + "ok": 71, + "ko": 0 + }, + "percentiles4": { + "total": 104, + "ok": 104, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-24-dd0c9": { + "type": "REQUEST", + "name": "request_24", +"path": "request_24", +"pathFormatted": "req_request-24-dd0c9", +"stats": { + "name": "request_24", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 42, + "ok": 42, + "ko": 0 + }, + "maxResponseTime": { + "total": 124, + "ok": 124, + "ko": 0 + }, + "meanResponseTime": { + "total": 57, + "ok": 57, + "ko": 0 + }, + "standardDeviation": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles1": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles2": { + "total": 62, + "ok": 62, + "ko": 0 + }, + "percentiles3": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "percentiles4": { + "total": 113, + "ok": 113, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-13-5cca6": { + "type": "REQUEST", + "name": "request_13", +"path": "request_13", +"pathFormatted": "req_request-13-5cca6", +"stats": { + "name": "request_13", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "maxResponseTime": { + "total": 224, + "ok": 224, + "ko": 0 + }, + "meanResponseTime": { + "total": 89, + "ok": 89, + "ko": 0 + }, + "standardDeviation": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "percentiles1": { + "total": 82, + "ok": 82, + "ko": 0 + }, + "percentiles2": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "percentiles3": { + "total": 133, + "ok": 133, + "ko": 0 + }, + "percentiles4": { + "total": 205, + "ok": 205, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-200-636fa": { + "type": "REQUEST", + "name": "request_200", +"path": "request_200", +"pathFormatted": "req_request-200-636fa", +"stats": { + "name": "request_200", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "maxResponseTime": { + "total": 121, + "ok": 121, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "percentiles1": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "percentiles2": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "percentiles3": { + "total": 72, + "ok": 72, + "ko": 0 + }, + "percentiles4": { + "total": 112, + "ok": 112, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-16-24733": { + "type": "REQUEST", + "name": "request_16", +"path": "request_16", +"pathFormatted": "req_request-16-24733", +"stats": { + "name": "request_16", + "numberOfRequests": { + "total": 49, + "ok": 48, + "ko": 1 + }, + "minResponseTime": { + "total": 201, + "ok": 409, + "ko": 201 + }, + "maxResponseTime": { + "total": 1457, + "ok": 1457, + "ko": 201 + }, + "meanResponseTime": { + "total": 638, + "ok": 647, + "ko": 201 + }, + "standardDeviation": { + "total": 207, + "ok": 199, + "ko": 0 + }, + "percentiles1": { + "total": 578, + "ok": 578, + "ko": 201 + }, + "percentiles2": { + "total": 700, + "ok": 702, + "ko": 201 + }, + "percentiles3": { + "total": 1005, + "ok": 1016, + "ko": 201 + }, + "percentiles4": { + "total": 1409, + "ok": 1410, + "ko": 201 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 44, + "percentage": 90 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 4 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5106382978723404, + "ko": 0.010638297872340425 + } +} + },"req_request-15-56eac": { + "type": "REQUEST", + "name": "request_15", +"path": "request_15", +"pathFormatted": "req_request-15-56eac", +"stats": { + "name": "request_15", + "numberOfRequests": { + "total": 49, + "ok": 47, + "ko": 2 + }, + "minResponseTime": { + "total": 201, + "ok": 437, + "ko": 201 + }, + "maxResponseTime": { + "total": 1791, + "ok": 1791, + "ko": 204 + }, + "meanResponseTime": { + "total": 654, + "ok": 673, + "ko": 203 + }, + "standardDeviation": { + "total": 262, + "ok": 250, + "ko": 2 + }, + "percentiles1": { + "total": 578, + "ok": 582, + "ko": 203 + }, + "percentiles2": { + "total": 732, + "ok": 737, + "ko": 203 + }, + "percentiles3": { + "total": 1055, + "ok": 1067, + "ko": 204 + }, + "percentiles4": { + "total": 1651, + "ok": 1657, + "ko": 204 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 40, + "percentage": 82 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 4 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5, + "ko": 0.02127659574468085 + } +} + },"req_request-18-f5b64": { + "type": "REQUEST", + "name": "request_18", +"path": "request_18", +"pathFormatted": "req_request-18-f5b64", +"stats": { + "name": "request_18", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 178, + "ok": 178, + "ko": 0 + }, + "maxResponseTime": { + "total": 998, + "ok": 998, + "ko": 0 + }, + "meanResponseTime": { + "total": 257, + "ok": 257, + "ko": 0 + }, + "standardDeviation": { + "total": 146, + "ok": 146, + "ko": 0 + }, + "percentiles1": { + "total": 200, + "ok": 200, + "ko": 0 + }, + "percentiles2": { + "total": 257, + "ok": 257, + "ko": 0 + }, + "percentiles3": { + "total": 568, + "ok": 568, + "ko": 0 + }, + "percentiles4": { + "total": 805, + "ok": 805, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 48, + "percentage": 98 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 1, + "percentage": 2 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_bundle-js-0b837": { + "type": "REQUEST", + "name": "bundle.js", +"path": "bundle.js", +"pathFormatted": "req_bundle-js-0b837", +"stats": { + "name": "bundle.js", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 11, + "ok": 11, + "ko": 0 + }, + "maxResponseTime": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "meanResponseTime": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "standardDeviation": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles1": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "percentiles2": { + "total": 16, + "ok": 16, + "ko": 0 + }, + "percentiles3": { + "total": 26, + "ok": 26, + "ko": 0 + }, + "percentiles4": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_logo-png-c9c2b": { + "type": "REQUEST", + "name": "Logo.png", +"path": "Logo.png", +"pathFormatted": "req_logo-png-c9c2b", +"stats": { + "name": "Logo.png", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 3, + "ok": 3, + "ko": 0 + }, + "maxResponseTime": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "meanResponseTime": { + "total": 12, + "ok": 12, + "ko": 0 + }, + "standardDeviation": { + "total": 8, + "ok": 8, + "ko": 0 + }, + "percentiles1": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles2": { + "total": 17, + "ok": 17, + "ko": 0 + }, + "percentiles3": { + "total": 27, + "ok": 27, + "ko": 0 + }, + "percentiles4": { + "total": 31, + "ok": 31, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-9-d127e": { + "type": "REQUEST", + "name": "request_9", +"path": "request_9", +"pathFormatted": "req_request-9-d127e", +"stats": { + "name": "request_9", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "maxResponseTime": { + "total": 48, + "ok": 48, + "ko": 0 + }, + "meanResponseTime": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "standardDeviation": { + "total": 6, + "ok": 6, + "ko": 0 + }, + "percentiles1": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles2": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "percentiles3": { + "total": 32, + "ok": 32, + "ko": 0 + }, + "percentiles4": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-10-1cfbe": { + "type": "REQUEST", + "name": "request_10", +"path": "request_10", +"pathFormatted": "req_request-10-1cfbe", +"stats": { + "name": "request_10", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "maxResponseTime": { + "total": 52, + "ok": 52, + "ko": 0 + }, + "meanResponseTime": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "standardDeviation": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles1": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "percentiles2": { + "total": 22, + "ok": 22, + "ko": 0 + }, + "percentiles3": { + "total": 32, + "ok": 32, + "ko": 0 + }, + "percentiles4": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-11-f11e8": { + "type": "REQUEST", + "name": "request_11", +"path": "request_11", +"pathFormatted": "req_request-11-f11e8", +"stats": { + "name": "request_11", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 23, + "ok": 23, + "ko": 0 + }, + "maxResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "meanResponseTime": { + "total": 40, + "ok": 40, + "ko": 0 + }, + "standardDeviation": { + "total": 14, + "ok": 14, + "ko": 0 + }, + "percentiles1": { + "total": 37, + "ok": 37, + "ko": 0 + }, + "percentiles2": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "percentiles3": { + "total": 67, + "ok": 67, + "ko": 0 + }, + "percentiles4": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-242-d6d33": { + "type": "REQUEST", + "name": "request_242", +"path": "request_242", +"pathFormatted": "req_request-242-d6d33", +"stats": { + "name": "request_242", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "maxResponseTime": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "meanResponseTime": { + "total": 20, + "ok": 20, + "ko": 0 + }, + "standardDeviation": { + "total": 7, + "ok": 7, + "ko": 0 + }, + "percentiles1": { + "total": 18, + "ok": 18, + "ko": 0 + }, + "percentiles2": { + "total": 21, + "ok": 21, + "ko": 0 + }, + "percentiles3": { + "total": 33, + "ok": 33, + "ko": 0 + }, + "percentiles4": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_css2-family-rob-cf8a9": { + "type": "REQUEST", + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"path": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", +"pathFormatted": "req_css2-family-rob-cf8a9", +"stats": { + "name": "css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,500&display=swap", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 96, + "ok": 96, + "ko": 0 + }, + "maxResponseTime": { + "total": 176, + "ok": 176, + "ko": 0 + }, + "meanResponseTime": { + "total": 119, + "ok": 119, + "ko": 0 + }, + "standardDeviation": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "percentiles1": { + "total": 116, + "ok": 116, + "ko": 0 + }, + "percentiles2": { + "total": 131, + "ok": 131, + "ko": 0 + }, + "percentiles3": { + "total": 140, + "ok": 140, + "ko": 0 + }, + "percentiles4": { + "total": 160, + "ok": 160, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-19-10d85": { + "type": "REQUEST", + "name": "request_19", +"path": "request_19", +"pathFormatted": "req_request-19-10d85", +"stats": { + "name": "request_19", + "numberOfRequests": { + "total": 49, + "ok": 47, + "ko": 2 + }, + "minResponseTime": { + "total": 201, + "ok": 476, + "ko": 201 + }, + "maxResponseTime": { + "total": 4933, + "ok": 4933, + "ko": 204 + }, + "meanResponseTime": { + "total": 1138, + "ok": 1178, + "ko": 203 + }, + "standardDeviation": { + "total": 840, + "ok": 835, + "ko": 2 + }, + "percentiles1": { + "total": 916, + "ok": 922, + "ko": 203 + }, + "percentiles2": { + "total": 1309, + "ok": 1313, + "ko": 203 + }, + "percentiles3": { + "total": 1926, + "ok": 1970, + "ko": 204 + }, + "percentiles4": { + "total": 4818, + "ok": 4823, + "ko": 204 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 20 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 23, + "percentage": 47 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 29 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 4 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5, + "ko": 0.02127659574468085 + } +} + },"req_request-20-6804b": { + "type": "REQUEST", + "name": "request_20", +"path": "request_20", +"pathFormatted": "req_request-20-6804b", +"stats": { + "name": "request_20", + "numberOfRequests": { + "total": 49, + "ok": 46, + "ko": 3 + }, + "minResponseTime": { + "total": 181, + "ok": 441, + "ko": 181 + }, + "maxResponseTime": { + "total": 1519, + "ok": 1519, + "ko": 207 + }, + "meanResponseTime": { + "total": 652, + "ok": 681, + "ko": 197 + }, + "standardDeviation": { + "total": 242, + "ok": 219, + "ko": 11 + }, + "percentiles1": { + "total": 598, + "ok": 604, + "ko": 202 + }, + "percentiles2": { + "total": 731, + "ok": 739, + "ko": 205 + }, + "percentiles3": { + "total": 1047, + "ok": 1068, + "ko": 207 + }, + "percentiles4": { + "total": 1503, + "ok": 1504, + "ko": 207 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 39, + "percentage": 80 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 5, + "percentage": 10 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 4 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 3, + "percentage": 6 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.48936170212765956, + "ko": 0.031914893617021274 + } +} + },"req_request-23-98f5d": { + "type": "REQUEST", + "name": "request_23", +"path": "request_23", +"pathFormatted": "req_request-23-98f5d", +"stats": { + "name": "request_23", + "numberOfRequests": { + "total": 49, + "ok": 47, + "ko": 2 + }, + "minResponseTime": { + "total": 190, + "ok": 443, + "ko": 190 + }, + "maxResponseTime": { + "total": 5617, + "ok": 5617, + "ko": 192 + }, + "meanResponseTime": { + "total": 1221, + "ok": 1265, + "ko": 191 + }, + "standardDeviation": { + "total": 948, + "ok": 943, + "ko": 1 + }, + "percentiles1": { + "total": 933, + "ok": 944, + "ko": 191 + }, + "percentiles2": { + "total": 1369, + "ok": 1393, + "ko": 192 + }, + "percentiles3": { + "total": 2051, + "ok": 2066, + "ko": 192 + }, + "percentiles4": { + "total": 5398, + "ok": 5407, + "ko": 192 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 7, + "percentage": 14 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 25, + "percentage": 51 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 15, + "percentage": 31 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 2, + "percentage": 4 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5, + "ko": 0.02127659574468085 + } +} + },"req_request-222-24864": { + "type": "REQUEST", + "name": "request_222", +"path": "request_222", +"pathFormatted": "req_request-222-24864", +"stats": { + "name": "request_222", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 36, + "ok": 36, + "ko": 0 + }, + "maxResponseTime": { + "total": 88, + "ok": 88, + "ko": 0 + }, + "meanResponseTime": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "standardDeviation": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles1": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "percentiles2": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "percentiles3": { + "total": 63, + "ok": 63, + "ko": 0 + }, + "percentiles4": { + "total": 77, + "ok": 77, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-227-2507b": { + "type": "REQUEST", + "name": "request_227", +"path": "request_227", +"pathFormatted": "req_request-227-2507b", +"stats": { + "name": "request_227", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "maxResponseTime": { + "total": 93, + "ok": 93, + "ko": 0 + }, + "meanResponseTime": { + "total": 45, + "ok": 45, + "ko": 0 + }, + "standardDeviation": { + "total": 9, + "ok": 9, + "ko": 0 + }, + "percentiles1": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "percentiles2": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "percentiles3": { + "total": 55, + "ok": 55, + "ko": 0 + }, + "percentiles4": { + "total": 76, + "ok": 76, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 49, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-241-2919b": { + "type": "REQUEST", + "name": "request_241", +"path": "request_241", +"pathFormatted": "req_request-241-2919b", +"stats": { + "name": "request_241", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 292, + "ok": 292, + "ko": 0 + }, + "maxResponseTime": { + "total": 5142, + "ok": 5142, + "ko": 0 + }, + "meanResponseTime": { + "total": 928, + "ok": 928, + "ko": 0 + }, + "standardDeviation": { + "total": 769, + "ok": 769, + "ko": 0 + }, + "percentiles1": { + "total": 701, + "ok": 701, + "ko": 0 + }, + "percentiles2": { + "total": 936, + "ok": 936, + "ko": 0 + }, + "percentiles3": { + "total": 1920, + "ok": 1920, + "ko": 0 + }, + "percentiles4": { + "total": 4041, + "ok": 4041, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 9, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-240-e27d8": { + "type": "REQUEST", + "name": "request_240", +"path": "request_240", +"pathFormatted": "req_request-240-e27d8", +"stats": { + "name": "request_240", + "numberOfRequests": { + "total": 49, + "ok": 48, + "ko": 1 + }, + "minResponseTime": { + "total": 216, + "ok": 324, + "ko": 216 + }, + "maxResponseTime": { + "total": 4880, + "ok": 4880, + "ko": 216 + }, + "meanResponseTime": { + "total": 768, + "ok": 780, + "ko": 216 + }, + "standardDeviation": { + "total": 740, + "ok": 744, + "ko": 0 + }, + "percentiles1": { + "total": 582, + "ok": 593, + "ko": 216 + }, + "percentiles2": { + "total": 863, + "ok": 866, + "ko": 216 + }, + "percentiles3": { + "total": 1896, + "ok": 1923, + "ko": 216 + }, + "percentiles4": { + "total": 3582, + "ok": 3609, + "ko": 216 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 34, + "percentage": 69 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 7, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5106382978723404, + "ko": 0.010638297872340425 + } +} + },"req_request-243-b078b": { + "type": "REQUEST", + "name": "request_243", +"path": "request_243", +"pathFormatted": "req_request-243-b078b", +"stats": { + "name": "request_243", + "numberOfRequests": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "minResponseTime": { + "total": 34, + "ok": 34, + "ko": 0 + }, + "maxResponseTime": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "meanResponseTime": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "standardDeviation": { + "total": 5, + "ok": 5, + "ko": 0 + }, + "percentiles1": { + "total": 37, + "ok": 37, + "ko": 0 + }, + "percentiles2": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "percentiles3": { + "total": 44, + "ok": 44, + "ko": 0 + }, + "percentiles4": { + "total": 58, + "ok": 58, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 38, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.40425531914893614, + "ok": 0.40425531914893614, + "ko": 0 + } +} + },"req_request-250-8cb1f": { + "type": "REQUEST", + "name": "request_250", +"path": "request_250", +"pathFormatted": "req_request-250-8cb1f", +"stats": { + "name": "request_250", + "numberOfRequests": { + "total": 49, + "ok": 48, + "ko": 1 + }, + "minResponseTime": { + "total": 284, + "ok": 284, + "ko": 2036 + }, + "maxResponseTime": { + "total": 5166, + "ok": 5166, + "ko": 2036 + }, + "meanResponseTime": { + "total": 901, + "ok": 877, + "ko": 2036 + }, + "standardDeviation": { + "total": 759, + "ok": 749, + "ko": 0 + }, + "percentiles1": { + "total": 615, + "ok": 615, + "ko": 2036 + }, + "percentiles2": { + "total": 900, + "ok": 884, + "ko": 2036 + }, + "percentiles3": { + "total": 1963, + "ok": 1769, + "ko": 2036 + }, + "percentiles4": { + "total": 3905, + "ok": 3931, + "ko": 2036 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 12, + "percentage": 24 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 7, + "percentage": 14 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5106382978723404, + "ko": 0.010638297872340425 + } +} + },"req_request-252-38647": { + "type": "REQUEST", + "name": "request_252", +"path": "request_252", +"pathFormatted": "req_request-252-38647", +"stats": { + "name": "request_252", + "numberOfRequests": { + "total": 49, + "ok": 48, + "ko": 1 + }, + "minResponseTime": { + "total": 221, + "ok": 483, + "ko": 221 + }, + "maxResponseTime": { + "total": 4985, + "ok": 4985, + "ko": 221 + }, + "meanResponseTime": { + "total": 963, + "ok": 978, + "ko": 221 + }, + "standardDeviation": { + "total": 725, + "ok": 724, + "ko": 0 + }, + "percentiles1": { + "total": 693, + "ok": 711, + "ko": 221 + }, + "percentiles2": { + "total": 1048, + "ok": 1069, + "ko": 221 + }, + "percentiles3": { + "total": 1991, + "ok": 2003, + "ko": 221 + }, + "percentiles4": { + "total": 3825, + "ok": 3849, + "ko": 221 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 10, + "percentage": 20 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 9, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 1, + "percentage": 2 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5106382978723404, + "ko": 0.010638297872340425 + } +} + },"req_request-260-43b5f": { + "type": "REQUEST", + "name": "request_260", +"path": "request_260", +"pathFormatted": "req_request-260-43b5f", +"stats": { + "name": "request_260", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 314, + "ok": 314, + "ko": 0 + }, + "maxResponseTime": { + "total": 5187, + "ok": 5187, + "ko": 0 + }, + "meanResponseTime": { + "total": 967, + "ok": 967, + "ko": 0 + }, + "standardDeviation": { + "total": 835, + "ok": 835, + "ko": 0 + }, + "percentiles1": { + "total": 650, + "ok": 650, + "ko": 0 + }, + "percentiles2": { + "total": 989, + "ok": 989, + "ko": 0 + }, + "percentiles3": { + "total": 2598, + "ok": 2598, + "ko": 0 + }, + "percentiles4": { + "total": 4210, + "ok": 4210, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 29, + "percentage": 59 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 11, + "percentage": 22 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 9, + "percentage": 18 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-265-cf160": { + "type": "REQUEST", + "name": "request_265", +"path": "request_265", +"pathFormatted": "req_request-265-cf160", +"stats": { + "name": "request_265", + "numberOfRequests": { + "total": 49, + "ok": 49, + "ko": 0 + }, + "minResponseTime": { + "total": 425, + "ok": 425, + "ko": 0 + }, + "maxResponseTime": { + "total": 5040, + "ok": 5040, + "ko": 0 + }, + "meanResponseTime": { + "total": 1157, + "ok": 1157, + "ko": 0 + }, + "standardDeviation": { + "total": 959, + "ok": 959, + "ko": 0 + }, + "percentiles1": { + "total": 767, + "ok": 767, + "ko": 0 + }, + "percentiles2": { + "total": 1309, + "ok": 1309, + "ko": 0 + }, + "percentiles3": { + "total": 3130, + "ok": 3130, + "ko": 0 + }, + "percentiles4": { + "total": 4802, + "ok": 4802, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 28, + "percentage": 57 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 7, + "percentage": 14 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 14, + "percentage": 29 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5212765957446809, + "ok": 0.5212765957446809, + "ko": 0 + } +} + },"req_request-270-e02a1": { + "type": "REQUEST", + "name": "request_270", +"path": "request_270", +"pathFormatted": "req_request-270-e02a1", +"stats": { + "name": "request_270", + "numberOfRequests": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "minResponseTime": { + "total": 307, + "ok": 307, + "ko": 0 + }, + "maxResponseTime": { + "total": 3659, + "ok": 3659, + "ko": 0 + }, + "meanResponseTime": { + "total": 789, + "ok": 789, + "ko": 0 + }, + "standardDeviation": { + "total": 620, + "ok": 620, + "ko": 0 + }, + "percentiles1": { + "total": 624, + "ok": 624, + "ko": 0 + }, + "percentiles2": { + "total": 843, + "ok": 843, + "ko": 0 + }, + "percentiles3": { + "total": 1591, + "ok": 1591, + "ko": 0 + }, + "percentiles4": { + "total": 3106, + "ok": 3106, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 22, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 4, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 4, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.3191489361702128, + "ok": 0.3191489361702128, + "ko": 0 + } +} + },"req_request-244-416e5": { + "type": "REQUEST", + "name": "request_244", +"path": "request_244", +"pathFormatted": "req_request-244-416e5", +"stats": { + "name": "request_244", + "numberOfRequests": { + "total": 30, + "ok": 30, + "ko": 0 + }, + "minResponseTime": { + "total": 33, + "ok": 33, + "ko": 0 + }, + "maxResponseTime": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "meanResponseTime": { + "total": 39, + "ok": 39, + "ko": 0 + }, + "standardDeviation": { + "total": 4, + "ok": 4, + "ko": 0 + }, + "percentiles1": { + "total": 38, + "ok": 38, + "ko": 0 + }, + "percentiles2": { + "total": 41, + "ok": 41, + "ko": 0 + }, + "percentiles3": { + "total": 43, + "ok": 43, + "ko": 0 + }, + "percentiles4": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 30, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.3191489361702128, + "ok": 0.3191489361702128, + "ko": 0 + } +} + },"req_request-273-0cd3c": { + "type": "REQUEST", + "name": "request_273", +"path": "request_273", +"pathFormatted": "req_request-273-0cd3c", +"stats": { + "name": "request_273", + "numberOfRequests": { + "total": 19, + "ok": 19, + "ko": 0 + }, + "minResponseTime": { + "total": 330, + "ok": 330, + "ko": 0 + }, + "maxResponseTime": { + "total": 2795, + "ok": 2795, + "ko": 0 + }, + "meanResponseTime": { + "total": 892, + "ok": 892, + "ko": 0 + }, + "standardDeviation": { + "total": 569, + "ok": 569, + "ko": 0 + }, + "percentiles1": { + "total": 787, + "ok": 787, + "ko": 0 + }, + "percentiles2": { + "total": 1051, + "ok": 1051, + "ko": 0 + }, + "percentiles3": { + "total": 1663, + "ok": 1663, + "ko": 0 + }, + "percentiles4": { + "total": 2569, + "ok": 2569, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 10, + "percentage": 53 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 6, + "percentage": 32 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 3, + "percentage": 16 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.20212765957446807, + "ok": 0.20212765957446807, + "ko": 0 + } +} + },"req_request-277-d0ec5": { + "type": "REQUEST", + "name": "request_277", +"path": "request_277", +"pathFormatted": "req_request-277-d0ec5", +"stats": { + "name": "request_277", + "numberOfRequests": { + "total": 15, + "ok": 15, + "ko": 0 + }, + "minResponseTime": { + "total": 335, + "ok": 335, + "ko": 0 + }, + "maxResponseTime": { + "total": 1589, + "ok": 1589, + "ko": 0 + }, + "meanResponseTime": { + "total": 723, + "ok": 723, + "ko": 0 + }, + "standardDeviation": { + "total": 402, + "ok": 402, + "ko": 0 + }, + "percentiles1": { + "total": 521, + "ok": 521, + "ko": 0 + }, + "percentiles2": { + "total": 871, + "ok": 871, + "ko": 0 + }, + "percentiles3": { + "total": 1573, + "ok": 1573, + "ko": 0 + }, + "percentiles4": { + "total": 1586, + "ok": 1586, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 11, + "percentage": 73 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 2, + "percentage": 13 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 2, + "percentage": 13 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.1595744680851064, + "ok": 0.1595744680851064, + "ko": 0 + } +} + },"req_request-322-a2de9": { + "type": "REQUEST", + "name": "request_322", +"path": "request_322", +"pathFormatted": "req_request-322-a2de9", +"stats": { + "name": "request_322", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 46, + "ok": 46, + "ko": 0 + }, + "maxResponseTime": { + "total": 107, + "ok": 107, + "ko": 0 + }, + "meanResponseTime": { + "total": 56, + "ok": 56, + "ko": 0 + }, + "standardDeviation": { + "total": 13, + "ok": 13, + "ko": 0 + }, + "percentiles1": { + "total": 51, + "ok": 51, + "ko": 0 + }, + "percentiles2": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "percentiles3": { + "total": 87, + "ok": 87, + "ko": 0 + }, + "percentiles4": { + "total": 104, + "ok": 104, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + },"req_request-323-2fefc": { + "type": "REQUEST", + "name": "request_323", +"path": "request_323", +"pathFormatted": "req_request-323-2fefc", +"stats": { + "name": "request_323", + "numberOfRequests": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "minResponseTime": { + "total": 50, + "ok": 50, + "ko": 0 + }, + "maxResponseTime": { + "total": 97, + "ok": 97, + "ko": 0 + }, + "meanResponseTime": { + "total": 59, + "ok": 59, + "ko": 0 + }, + "standardDeviation": { + "total": 10, + "ok": 10, + "ko": 0 + }, + "percentiles1": { + "total": 54, + "ok": 54, + "ko": 0 + }, + "percentiles2": { + "total": 66, + "ok": 66, + "ko": 0 + }, + "percentiles3": { + "total": 75, + "ok": 75, + "ko": 0 + }, + "percentiles4": { + "total": 90, + "ok": 90, + "ko": 0 + }, + "group1": { + "name": "t < 800 ms", + "htmlName": "t < 800 ms", + "count": 50, + "percentage": 100 +}, + "group2": { + "name": "800 ms <= t < 1200 ms", + "htmlName": "t >= 800 ms
    t < 1200 ms", + "count": 0, + "percentage": 0 +}, + "group3": { + "name": "t >= 1200 ms", + "htmlName": "t >= 1200 ms", + "count": 0, + "percentage": 0 +}, + "group4": { + "name": "failed", + "htmlName": "failed", + "count": 0, + "percentage": 0 +}, + "meanNumberOfRequestsPerSecond": { + "total": 0.5319148936170213, + "ok": 0.5319148936170213, + "ko": 0 + } +} + } +} + +} \ No newline at end of file diff --git a/webapp/loadTests/50users1minute/js/theme.js b/webapp/loadTests/50users1minute/js/theme.js new file mode 100644 index 0000000..b95a7b3 --- /dev/null +++ b/webapp/loadTests/50users1minute/js/theme.js @@ -0,0 +1,127 @@ +/* + * Copyright 2011-2022 Gatling Corp + * + * Licensed under the Gatling Highcharts License + */ +Highcharts.theme = { + chart: { + backgroundColor: '#f7f7f7', + borderWidth: 0, + borderRadius: 8, + plotBackgroundColor: null, + plotShadow: false, + plotBorderWidth: 0 + }, + xAxis: { + gridLineWidth: 0, + lineColor: '#666', + tickColor: '#666', + labels: { + style: { + color: '#666' + } + }, + title: { + style: { + color: '#666' + } + } + }, + yAxis: { + alternateGridColor: null, + minorTickInterval: null, + gridLineColor: '#999', + lineWidth: 0, + tickWidth: 0, + labels: { + style: { + color: '#666', + fontWeight: 'bold' + } + }, + title: { + style: { + color: '#666', + font: 'bold 12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif' + } + } + }, + labels: { + style: { + color: '#CCC' + } + }, + + + rangeSelector: { + buttonTheme: { + fill: '#cfc9c6', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#b2b2a9' + }, + states: { + hover: { + fill: '#92918C', + stroke: '#000000', + style: { + color: '#34332e', + fontWeight: 'bold', + borderColor: '#8b897d' + } + }, + select: { + fill: '#E37400', + stroke: '#000000', + style: { + color: '#FFF' + } + } + } + }, + inputStyle: { + backgroundColor: '#333', + color: 'silver' + }, + labelStyle: { + color: '#8b897d' + } + }, + + navigator: { + handles: { + backgroundColor: '#f7f7f7', + borderColor: '#92918C' + }, + outlineColor: '#92918C', + outlineWidth: 1, + maskFill: 'rgba(146, 145, 140, 0.5)', + series: { + color: '#5E7BE2', + lineColor: '#5E7BE2' + } + }, + + scrollbar: { + buttonBackgroundColor: '#f7f7f7', + buttonBorderWidth: 1, + buttonBorderColor: '#92918C', + buttonArrowColor: '#92918C', + buttonBorderRadius: 2, + + barBorderWidth: 1, + barBorderRadius: 0, + barBackgroundColor: '#92918C', + barBorderColor: '#92918C', + + rifleColor: '#92918C', + + trackBackgroundColor: '#b0b0a8', + trackBorderWidth: 1, + trackBorderColor: '#b0b0a8' + } +}; + +Highcharts.setOptions(Highcharts.theme); diff --git a/webapp/loadTests/50users1minute/js/unpack.js b/webapp/loadTests/50users1minute/js/unpack.js new file mode 100644 index 0000000..883c33e --- /dev/null +++ b/webapp/loadTests/50users1minute/js/unpack.js @@ -0,0 +1,38 @@ +'use strict'; + +var unpack = function (array) { + var findNbSeries = function (array) { + var currentPlotPack; + var length = array.length; + + for (var i = 0; i < length; i++) { + currentPlotPack = array[i][1]; + if(currentPlotPack !== null) { + return currentPlotPack.length; + } + } + return 0; + }; + + var i, j; + var nbPlots = array.length; + var nbSeries = findNbSeries(array); + + // Prepare unpacked array + var unpackedArray = new Array(nbSeries); + + for (i = 0; i < nbSeries; i++) { + unpackedArray[i] = new Array(nbPlots); + } + + // Unpack the array + for (i = 0; i < nbPlots; i++) { + var timestamp = array[i][0]; + var values = array[i][1]; + for (j = 0; j < nbSeries; j++) { + unpackedArray[j][i] = [timestamp * 1000, values === null ? null : values[j]]; + } + } + + return unpackedArray; +}; diff --git a/webapp/loadTests/50users1minute/style/arrow_down.png b/webapp/loadTests/50users1minute/style/arrow_down.png new file mode 100644 index 0000000000000000000000000000000000000000..3efdbc86e36d0d025402710734046405455ba300 GIT binary patch literal 983 zcmaJ=U2D@&7>;fZDHd;a3La7~Hn92V+O!GFMw@i5vXs(R?8T6!$!Qz9_ z=Rer5@K(VKz41c*2SY&wuf1>zUd=aM+wH=7NOI13d7tNf-jBSfRqrPg%L#^Il9g?} z4*PX@6IU1DyZip+6KpqWxkVeKLkDJnnW9bF7*$-ei|g35hfhA>b%t5E>oi-mW$Y*x zaXB;g;Ud=uG{dZKM!sqFF-2|Mbv%{*@#Zay99v}{(6Mta8f2H7$2EFFLFYh($vu~ z{_pC#Gw+br@wwiA5{J#9kNG+d$w6R2<2tE0l&@$3HYo|3gzQhNSnCl=!XELF){xMO zVOowC8&<~%!%!+-NKMbe6nl*YcI5V zYJ&NRkF&vr%WU+q2lF1lU?-O^-GZNDskYNBpN`kV!(aPgxlHTT#wqjtmGA&=s};T2 zjE>uT`ju-(hf9m^K6dqQrIXa_+Rv}MM}GwF^TyKc-wTU3m^&*>@7eL=F92dH<*NR& HwDFdgVhf9Ks!(i$ny>OtAWQl7;iF1B#Zfaf$gL6@8Vo7R> zLV0FMhJw4NZ$Nk>pEyvFlc$Sgh{pM)L8rMG3^=@Q{{O$p`t7BNW1mD+?G!w^;tkj$ z(itxFDR3sIr)^#L`so{%PjmYM-riK)$MRAsEYzTK67RjU>c3}HyQct6WAJqKb6Mw< G&;$UsBSU@w literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/arrow_right.png b/webapp/loadTests/50users1minute/style/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..a609f80fe17e6f185e1b6373f668fc1f28baae2c GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu@pObhHwBu4M$1`knic~;uxYa zvG@EzE(Qe-<_o&N{>R5n@3?e|Q?{o)*sCe{Y!G9XUG*c;{fmVEy{&lgYDVka)lZ$Q rCit0rf5s|lpJ$-R@IrLOqF~-LT3j-WcUP(c4Q23j^>bP0l+XkKUN$bz literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/arrow_right_black.png b/webapp/loadTests/50users1minute/style/arrow_right_black.png new file mode 100644 index 0000000000000000000000000000000000000000..651bd5d27675d9e92ac8d477f2db9efa89c2b355 GIT binary patch literal 225 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-8<4#FKaLMbu_bxCyDx`7I;J! zGca%qgD@k*tT_@uLG}_)Usv`!T#~#}T5FGAlLHD#mbgZgIOpf)rskC}I2WZRmZYXA zlxLP?D7bt2281{Ai31gRdb&7a_JLSF1VWMQKse&#dLi5wlM1_0 z{FM;Ti|sk&y~DuuWXc=~!vbOZMy|V())CrJpY;0L8wi!QM>m&zYv9kY5B?3u;2c!O zs6ZM%Cwv?}ZUCR5a}lC&3CiHSi?f8KBR+xu!araKY=q^sqfcTxa>ExJ5kHFbN8w@G zFbUZkx(k2U9zdM>;c2eb9<@Vt5POLKHVlK|b%E|Ae7gwwDx3hf9oZ^{qwoRjg6;52 zcpeJLI}f_J>rdS@R>r_B=yd$%s`3!zFD&bhZdZTkLaK?cPhvA2 zKl><4eGxC4a;Mdo*PR{+mo_KQ0&Hlk7(2(YeOGR{yx#iw!sRK{pC^Z_`%&gZIOHn( z0A)|bA46eyt%M^3$D@Q6QTcTUVt9h#E14pioqpnJ5Fv4vueCTp(_y(W_1RLr&f2 zqI)=IL-U*F1Lco^e7uSJ_DHlro5zyo?tjgxFM|B=QxDdXXQn?~UhTf54G*EKdD-|u zWftJKwuxmXUXwQ)-H%*()s8zUXDUnsXPpUz?CyzqH4f0-=E{2#{o&G^u_}`4MWPK| zGcOFrhQ_|B|0!d~OW(w?ZnYrKW>-GtKStgfYlX>^DA8Z$%3n^K?&qG-Jk_EOS}M&~ zSmyKt;kMY&T4m~Q6TU}wa>8Y`&PSBh4?T@@lTT9pxFoTjwOyl|2O4L_#y<(a2I`l( z_!a5jhgQ_TIdUr)8=4RH#^M$;j#_w?Px@py3nrhDhiKc)UU?GZD0>?D-D{Dt(GYo> z{mz&`fvtJyWsiEu#tG^&D6w2!Q}%77YrgU->oD<47@K|3>re}AiN6y)?PZJ&g*E?a zKTsDRQLmTaI&A1ZdIO9NN$rJnU;Z3Adexu2ePcTAeC}{L>Br!2@E6#XfZ{#`%~>X& z=AN$5tsc5kzOxRXr#W;#7#o`Z7J&8>o@2-Hf7Kkm!IjVCzgl^TIpI5AzN#yZ@~41% z3?8H2{p-qO(%6fPB=3LfX@mT$KG1!s`_Axt!dfRxdvzbLVLaRm@%_FltoUKGf*0d+ ziZ5(8A*2esb2%T!qR?L?zjmkbm{QqUbpo+5Y;bl<5@UZ>vksWYd= z)qkY5f?t3sS9McgxSvZB!y4B+m=m1+1HSLY^_yU9NU9HI=MZCKZ1qyBuJVc^sZe8I z76_F!A|Lxc=ickgKD?!mwk6ugVUJ6j9zaj^F=hXOxLKez+Y7DZig(sV+HgH#tq*Fq zv9Xu9c`>~afx=SHJ#wJXPWJ`Nn9dG0~%k(XL|0)b(fP9EKlYB(7M_h zTG8GN*3cg0nE{&5KXv6lO?Vx8{oFR{3;PP4=f?@yR=;-h)v?bYy(tW%oae#4-W?$S z^qDI!&nGH(RS)ppgpSgYFay zfX-0*!FbR*qP1P)#q_s)rf1k8c`Iw)A8G^pRqYAB!v3HiWsHnrp7XVCwx{i$<6HT! z!K7 zY1Mc-Co%a;dLZe6FN_B`E73b>oe7VIDLfDA+(FWyvn4$zdST9EFRHo+DTeofqdI0t$jFNyI9 zQfKTs`+N&tf;p7QOzXUtYC?Dr<*UBkb@qhhywuir2b~Ddgzcd7&O_93j-H`?=(!=j z1?gFE7pUGk$EX0k7tBH43ZtM8*X?+Z>zw&fPHW1kb9TfwXB^HsjQpVUhS`Cj-I%lA zbT_kuk;YD&cxR8!i=aB3BLDon2E1oRHx)XraG zuGLrVtNJ!Ffw11ONMCIBde24Mnv(V`$X}}Klc4h|z4z9q$?+f8KLXj(dr-YU?E^Z0 zGQ{8Gs4Vn;7t=q592Ga@3J|ZeqBAi)wOyY%d;Un91$yUG28$_o1dMi}Gre)7_45VK zryy5>>KlQFNV}f)#`{%;5Wgg*WBl|S?^s%SRRBHNHg(lKdBFpfrT*&$ZriH&9>{dt z=K2vZWlO4UTS4!rZwE8~e1o`0L1ju$=aV`&d?kU6To*82GLSz2>FVD36XXNCt;;{I zvq57=dTunvROdvbqqtd@t<(%LcAKMP`u}6Xp5IFF4xtHY8gr_nyL?^04*8(5sJZc9 zARYN=GpqrfH;SLYgDO|GA*^v_+NFDBKJ!ks?+Q$<858o=!|*N~fnD$zzIX1Wn7u*7 z6@$uGA84*U@1m5j@-ffb9g)8U>8c&l+e%yG?+W#PgfseheRwyb@!A&nt}D_mr@)TC z7vWw~{3ejS!{A3}400?;YTQfqhMu4?q5D~5@d?s2ZnI2#jih|Og|gfGYdK?%wYv*> z*MY{vX>83k`B@9}9YF@Dekyw*>;aXndM*a1KTICC^cUJ%e}<>k`j> z&a;&EIBlRiq{Dc44?=J^+zYuNTOWY-tv!wV36BKrC$tVvQathjI1A5#_IcXhYR{#5 zXuolbqsM-i@OsdmWd=IVH#3CQ?&I(>JPALBr7#E1fa3Ihz4E^RQPBQp13Uv-XFmt6 znG0h~jmgiD_k;5e7^$+h!$Eiow7$Ixs{d=C=Tfb)^3OIn3Ad{L_>Vn;-IVKA(2@G+ z8!hM&P7LH*?Hb7SjjFRsUd%6%NRz+7xKmOnt_Vj9eV__wnvUqALE y@<9iX-XLgKmGb5P*V(C?vZI{Ap0ljoe9iI#Pp2!ETh`m`k}sX$tTjPb`Thqd2I;E+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/little_arrow_right.png b/webapp/loadTests/50users1minute/style/little_arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..252abe66d3a92aced2cff2df88e8a23d91459251 GIT binary patch literal 212 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd;O^<-7$PB=oN$2m z-(ru2pAv$OC-6w{28nSzPFOlManYH8W7Z01d5`Q)6p~NiIh8RX*um{#37-cePkG{I i?kCneiZ^N=&|+f{`pw(F`1}WPkkOv5elF{r5}E)*4>EfI literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/logo-enterprise.svg b/webapp/loadTests/50users1minute/style/logo-enterprise.svg new file mode 100644 index 0000000..4a6e1de --- /dev/null +++ b/webapp/loadTests/50users1minute/style/logo-enterprise.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/webapp/loadTests/50users1minute/style/logo.svg b/webapp/loadTests/50users1minute/style/logo.svg new file mode 100644 index 0000000..f519eef --- /dev/null +++ b/webapp/loadTests/50users1minute/style/logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/webapp/loadTests/50users1minute/style/sortable.png b/webapp/loadTests/50users1minute/style/sortable.png new file mode 100644 index 0000000000000000000000000000000000000000..a8bb54f9acddb8848e68b640d416bf959cb18b6a GIT binary patch literal 230 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxd5b5dS7$PCr+ka7z zL4e13=24exMiQ@YG*qwKncdI-GfUZ1Rki=vCY#SQRzF`R>17u7PVwr=D?vVeZ+UA{ zG@h@BI20Mdp}F2&UODjiSKfWA%2W&v$1X_F*vS}sO7fVb_47iIWuC5nF6*2Ung9-k BJ)r;q literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/sorted-down.png b/webapp/loadTests/50users1minute/style/sorted-down.png new file mode 100644 index 0000000000000000000000000000000000000000..5100cc8efd490cf534a6186f163143bc59de3036 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVDIVT7$PB=oN$2m z-{GYajXDDFEn-;Il?7IbEN2SgoY1K-S+LB}QlU75b4p`dJwwurrwV2sJj^AGt`0LQ Z7#M<{@}@-BSMLEC>FMg{vd$@?2>{QlDr5iv literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/sorted-up.png b/webapp/loadTests/50users1minute/style/sorted-up.png new file mode 100644 index 0000000000000000000000000000000000000000..340a5f0370f1a74439459179e9c4cf1610de75d1 GIT binary patch literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^96-#)!N$PA`0s$e7?8t~?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2T%-EjEzyf430EQxdVD0JR7$PB=oN$2m z-(rtihEG!hT@vQ#Ni?%SDB=JB literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/stat-fleche-bas.png b/webapp/loadTests/50users1minute/style/stat-fleche-bas.png new file mode 100644 index 0000000000000000000000000000000000000000..8e0b501a37f521fa56ce790b5279b204cf16f275 GIT binary patch literal 625 zcmV-%0*?KOP)X1^@s6HR9gx0000PbVXQnQ*UN; zcVTj606}DLVr3vnZDD6+Qe|Oed2z{QJOBU!6G=otRCwBaRk3XYF$@$1uayA|xJs2O zh6iw!${V;%XBun$AzDJ_5hsobnt%D0lR{6AC-TZ=qQYNSE%4fZr(r%*U%{3#@fMV-wZ|U32I`2RVTet9ov9a1><;a zc490LC;}x<)W9HSa|@E2D5Q~wPER)4Hd~) z7a}hi*bPEZ3E##6tEpfWilBDoTvc z!^R~Z;5%h77OwQK2sCp1=!WSe*z2u-)=XU8l4MF00000 LNkvXXu0mjfMhXuu literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/stat-l-roue.png b/webapp/loadTests/50users1minute/style/stat-l-roue.png new file mode 100644 index 0000000000000000000000000000000000000000..c9a3aae0169d62a079278f0a6737f3376f1b45ae GIT binary patch literal 471 zcmeAS@N?(olHy`uVBq!ia0vp^0zk~q!N$PAIIE<7Cy>LE?&#~tz_78O`%fY(kZ+M1 z;hE;^%b*2hb1*QrXELw=S&Tp|1;h*tObeLcA_5DT;cR}8^0f~MUKVSdnX!bNbd8LT)Sw-%(F%_zr0N|UagV3xWgqvH;8K?&n0oOR41jMpR4np z@3~veKIhln&vTy7`M&S_y+s{K$4a+%SBakr4tulXXK%nlnMZA<7fW86CAV}Io#FMZ zJKEZlXuR&E=;dFVn4ON?-myI9m-fc)cdfl=xStxmHlE_%*ZyqH3w8e^yf4K+{I{K9 z7w&AxcaMk7ySZ|)QCy;@Qg`etYuie0o>bqd-!G^vY&6qP5x86+IYoDN%G}3H>wNMj zPL^13>44!EmANYvNU$)%J@GUM4J8`33?}zp?$qRpGv)z8kkP`CHe&Oqvvu;}m~M yv&%5+ugjcD{r&Hid!>2~a6b9iXUJ`u|A%4w{h$p3k*sGyq3h}D=d#Wzp$Py=EVp6+ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/stat-l-temps.png b/webapp/loadTests/50users1minute/style/stat-l-temps.png new file mode 100644 index 0000000000000000000000000000000000000000..1ce268037f94ef73f56cd658d392ef393d562db3 GIT binary patch literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^{2w#$-&vQnwtC-_ zkh{O~uCAT`QnSlTzs$^@t=jDWl)1cj-p;w{budGVRji^Z`nX^5u3Kw&?Kk^Y?fZDw zg5!e%<_ApQ}k@w$|KtRPs~#LkYapu zf%*GA`~|UpRDQGRR`SL_+3?i5Es{UA^j&xb|x=ujSRd8$p5V>FVdQ&MBb@04c<~BLDyZ literal 0 HcmV?d00001 diff --git a/webapp/loadTests/50users1minute/style/style.css b/webapp/loadTests/50users1minute/style/style.css new file mode 100644 index 0000000..7f50e1b --- /dev/null +++ b/webapp/loadTests/50users1minute/style/style.css @@ -0,0 +1,988 @@ +/* + * Copyright 2011-2022 GatlingCorp (https://gatling.io) + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +:root { + --gatling-background-color: #f2f2f2; + --gatling-background-light-color: #f7f7f7; + --gatling-border-color: #dddddd; + --gatling-blue-color: #4a9fe5; + --gatling-dark-blue-color: #24275e; + --gatling-danger-color: #f15b4f; + --gatling-danger-light-color: #f5d1ce; + --gatling-enterprise-color: #6161d6; + --gatling-enterprise-light-color: #c4c4ed; + --gatling-gray-medium-color: #bbb; + --gatling-hover-color: #e6e6e6; + --gatling-light-color: #ffffff; + --gatling-orange-color: #f78557; + --gatling-success-color: #68b65c; + --gatling-text-color: #1f2024; + --gatling-total-color: #ffa900; + + --gatling-border-radius: 2px; + --gatling-spacing-small: 5px; + --gatling-spacing: 10px; + --gatling-spacing-layout: 20px; + + --gatling-font-weight-normal: 400; + --gatling-font-weight-medium: 500; + --gatling-font-weight-bold: 700; + --gatling-font-size-secondary: 12px; + --gatling-font-size-default: 14px; + --gatling-font-size-heading: 16px; + --gatling-font-size-section: 22px; + --gatling-font-size-header: 34px; + + --gatling-media-desktop-large: 1920px; +} + +* { + min-height: 0; + min-width: 0; +} + +html, +body { + height: 100%; + width: 100%; +} + +body { + color: var(--gatling-text-color); + font-family: arial; + font-size: var(--gatling-font-size-secondary); + margin: 0; +} + +.app-container { + display: flex; + flex-direction: column; + + height: 100%; + width: 100%; +} + +.head { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + + flex: 1; + + background-color: var(--gatling-light-color); + border-bottom: 1px solid var(--gatling-border-color); + min-height: 69px; + padding: 0 var(--gatling-spacing-layout); +} + +.gatling-open-source { + display: flex; + align-items: center; + justify-content: space-between; + flex-direction: row; + gap: var(--gatling-spacing-layout); +} + +.gatling-documentation { + display: flex; + align-items: center; + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-orange-color); + border: 1px solid var(--gatling-orange-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 23px; +} + +.gatling-documentation:hover { + background-color: var(--gatling-orange-color); + color: var(--gatling-light-color); +} + +.gatling-logo { + height: 35px; +} + +.gatling-logo img { + height: 100%; +} + +.container { + display: flex; + align-items: stretch; + height: 100%; +} + +.nav { + min-width: 210px; + width: 210px; + max-height: calc(100vh - var(--gatling-spacing-layout) - var(--gatling-spacing-layout)); + background: var(--gatling-light-color); + border-right: 1px solid var(--gatling-border-color); + overflow-y: auto; +} + +@media print { + .nav { + display: none; + } +} + +@media screen and (min-width: 1920px) { + .nav { + min-width: 310px; + width: 310px; + } +} + +.nav ul { + display: flex; + flex-direction: column; + + padding: 0; + margin: 0; +} + +.nav li { + display: flex; + list-style: none; + width: 100%; + padding: 0; +} + +.nav .item { + display: inline-flex; + align-items: center; + margin: 0 auto; + white-space: nowrap; + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + margin: 0; + width: 100%; +} + +.nav .item .nav-label { + padding: var(--gatling-spacing) var(--gatling-spacing-layout); +} + +.nav .item:hover { + background-color: var(--gatling-hover-color); +} + +.nav .on .item { + background-color: var(--gatling-orange-color); +} + +.nav .on .item span { + color: var(--gatling-light-color); +} + +.cadre { + width: 100%; + height: 100%; + overflow-y: scroll; + scroll-behavior: smooth; +} + +@media print { + .cadre { + overflow-y: unset; + } +} + +.frise { + position: absolute; + top: 60px; + z-index: -1; + + background-color: var(--gatling-background-color); + height: 530px; +} + +.global { + height: 650px +} + +a { + text-decoration: none; +} + +a:hover { + color: var(--gatling-hover-color); +} + +img { + border: 0; +} + +h1 { + color: var(--gatling-dark-blue-color); + font-size: var(--gatling-font-size-section); + font-weight: var(--gatling-font-weight-medium); + text-align: center; + margin: 0; +} + +h1 span { + color: var(--gatling-hover-color); +} + +.enterprise { + display: flex; + align-items: center; + justify-content: center; + gap: var(--gatling-spacing-small); + + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-enterprise-color); + color: var(--gatling-enterprise-color); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); + height: 25px; +} + +.enterprise:hover { + background-color: var(--gatling-enterprise-light-color); + color: var(--gatling-enterprise-color); +} + +.enterprise img { + display: block; + width: 160px; +} + +.simulation-card { + display: flex; + flex-direction: column; + align-self: stretch; + flex: 1; + gap: var(--gatling-spacing-layout); + max-height: 375px; +} + +#simulation-information { + flex: 1; +} + +.simulation-version-information { + display: flex; + flex-direction: column; + + gap: var(--gatling-spacing); + font-size: var(--gatling-font-size-default); + + background-color: var(--gatling-background-color); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing); +} + +.simulation-information-container { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing); +} + +.withTooltip .popover-title { + display: none; +} + +.popover-content p { + margin: 0; +} + +.ellipsed-name { + display: block; + + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.simulation-information-item { + display: flex; + flex-direction: row; + align-items: flex-start; + gap: var(--gatling-spacing-small); +} + +.simulation-information-item.description { + flex-direction: column; +} + +.simulation-information-label { + display: inline-block; + font-weight: var(--gatling-font-weight-bold); + min-width: fit-content; +} + +.simulation-information-title { + display: block; + text-align: center; + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + width: 100%; +} + +.simulation-tooltip span { + display: inline-block; + word-wrap: break-word; + overflow: hidden; + text-overflow: ellipsis; +} + +.content { + display: flex; + flex-direction: column; +} + +.content-in { + width: 100%; + height: 100%; + + overflow-x: scroll; +} + +@media print { + .content-in { + overflow-x: unset; + } +} + +.container-article { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + min-width: 1050px; + width: 1050px; + margin: 0 auto; + padding: var(--gatling-spacing-layout); + box-sizing: border-box; +} + +@media screen and (min-width: 1920px) { + .container-article { + min-width: 1350px; + width: 1350px; + } + + #responses * .highcharts-tracker { + transform: translate(400px, 70px); + } +} + +.content-header { + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); + + background-color: var(--gatling-background-light-color); + border-bottom: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-layout) var(--gatling-spacing-layout) 0; +} + +.onglet { + font-size: var(--gatling-font-size-header); + font-weight: var(--gatling-font-weight-medium); + text-align: center; +} + +.sous-menu { + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; +} + +.sous-menu-spacer { + display: flex; + align-items: center; + flex-direction: row; +} + +.sous-menu .item { + margin-bottom: -1px; +} + +.sous-menu a { + display: block; + + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-normal); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border-bottom: 2px solid transparent; + color: var(--gatling-text-color); + text-align: center; + width: 100px; +} + +.sous-menu a:hover { + border-bottom-color: var(--gatling-text-color); +} + +.sous-menu .ouvert a { + border-bottom-color: var(--gatling-orange-color); + font-weight: var(--gatling-font-weight-bold); +} + +.article { + position: relative; + + display: flex; + flex-direction: column; + gap: var(--gatling-spacing-layout); +} + +.infos { + width: 340px; + color: var(--gatling-light-color); +} + +.infos-title { + background-color: var(--gatling-background-light-color); + border: 1px solid var(--gatling-border-color); + border-bottom: 0; + border-top-left-radius: var(--gatling-border-radius); + border-top-right-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.info { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + height: 100%; + margin: 0; +} + +.info table { + margin: auto; + padding-right: 15px; +} + +.alert-danger { + background-color: var(--gatling-danger-light-color); + border: 1px solid var(--gatling-danger-color); + border-radius: var(--gatling-border-radius); + color: var(--gatling-text-color); + padding: var(--gatling-spacing-layout); + font-weight: var(--gatling-font-weight-bold); +} + +.repli { + position: absolute; + bottom: 0; + right: 0; + + background: url('stat-fleche-bas.png') no-repeat top left; + height: 25px; + width: 22px; +} + +.infos h2 { + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + height: 19px; + margin: 0; + padding: 3.5px 0 0 35px; +} + +.infos .first { + background: url('stat-l-roue.png') no-repeat 15px 5px; +} + +.infos .second { + background: url('stat-l-temps.png') no-repeat 15px 3px; + border-top: 1px solid var(--gatling-border-color); +} + +.infos th { + text-align: center; +} + +.infos td { + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing-small); + -webkit-border-radius: var(--gatling-border-radius); + -moz-border-radius: var(--gatling-border-radius); + -ms-border-radius: var(--gatling-border-radius); + -o-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + text-align: right; + width: 50px; +} + +.infos .title { + width: 120px; +} + +.infos .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); +} + +.infos .total { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); +} + +.infos .ko { + background-color: var(--gatling-danger-color); + -webkit-border-radius: var(--gatling-border-radius); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); +} + +.schema-container { + display: flex; + align-items: center; + justify-content: space-between; + gap: var(--gatling-spacing-layout); +} + +.schema { + background: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); +} + +.ranges { + height: 375px; + width: 500px; +} + +.ranges-large { + height: 375px; + width: 530px; +} + +.geant { + height: 362px; +} + +.extensible-geant { + width: 100%; +} + +.polar { + height: 375px; + width: 230px; +} + +.chart_title { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); + font-size: var(--gatling-font-size-heading); + padding: 2px var(--gatling-spacing); +} + +.statistics { + display: flex; + flex-direction: column; + + background-color: var(--gatling-background-light-color); + border-radius: var(--gatling-border-radius); + border-collapse: collapse; + color: var(--gatling-text-color); + max-height: 100%; +} + +.statistics .title { + display: flex; + text-align: center; + justify-content: space-between; + + min-height: 49.5px; + box-sizing: border-box; + + border: 1px solid var(--gatling-border-color); + color: var(--gatling-text-color); + font-size: var(--gatling-font-size-heading); + font-weight: var(--gatling-font-weight-bold); + padding: var(--gatling-spacing); +} + +.title_base { + display: flex; + align-items: center; + text-align: left; + user-select: none; +} + +.title_base_stats { + color: var(--gatling-text-color); + margin-right: 20px; +} + +.toggle-table { + position: relative; + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: 25px; + width: 40px; + height: 20px; + margin: 0 var(--gatling-spacing-small); +} + +.toggle-table::before { + position: absolute; + top: calc(50% - 9px); + left: 1px; + content: ""; + width: 50%; + height: 18px; + border-radius: 50%; + background-color: var(--gatling-text-color); +} + +.toggle-table.off::before { + left: unset; + right: 1px; +} + +.title_expanded { + cursor: pointer; + color: var(--gatling-text-color); +} + +.expand-table, +.collapse-table { + font-size: var(--gatling-font-size-secondary); + font-weight: var(--gatling-font-weight-normal); +} + +.title_expanded span.expand-table { + color: var(--gatling-gray-medium-color); +} + +.title_collapsed { + cursor: pointer; + color: var(--gatling-text-color); +} + +.title_collapsed span.collapse-table { + color: var(--gatling-gray-medium-color); +} + +#container_statistics_head { + position: sticky; + top: -1px; + + background: var(--gatling-background-light-color); + margin-top: -1px; + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); +} + +#container_statistics_body { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + margin-top: -1px; + padding: 0px var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small); +} + +#container_errors { + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) 0px var(--gatling-spacing-small); + margin-top: -1px; +} + +#container_assertions { + background-color: var(--gatling-background-light-color); + border-bottom-left-radius: var(--gatling-border-radius); + border-bottom-right-radius: var(--gatling-border-radius); + padding: var(--gatling-spacing-small); + margin-top: -1px; +} + +.statistics-in { + border-spacing: var(--gatling-spacing-small); + border-collapse: collapse; + margin: 0; +} + +.statistics .scrollable { + max-height: 100%; + overflow-y: auto; +} + +#statistics_table_container .statistics .scrollable { + max-height: 785px; +} + +.statistics-in a { + color: var(--gatling-text-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .header { + border-radius: var(--gatling-border-radius); + border: 1px solid var(--gatling-border-color); + font-size: var(--gatling-font-size-default); + font-weight: var(--gatling-font-weight-bold); + text-align: center; + padding: var(--gatling-spacing-small); +} + +.sortable { + cursor: pointer; +} + +.sortable span { + background: url('sortable.png') no-repeat right 3px; + padding-right: 10px; +} + +.sorted-up span { + background-image: url('sorted-up.png'); +} + +.sorted-down span { + background-image: url('sorted-down.png'); +} + +.executions { + background: url('stat-l-roue.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.response-time { + background: url('stat-l-temps.png') no-repeat var(--gatling-spacing-small) var(--gatling-spacing-small); + padding: var(--gatling-spacing-small) var(--gatling-spacing-small) var(--gatling-spacing-small) 25px; +} + +.statistics-in td { + background-color: var(--gatling-light-color); + border: 1px solid var(--gatling-border-color); + padding: var(--gatling-spacing-small); + min-width: 50px; +} + +.statistics-in .col-1 { + width: 175px; + max-width: 175px; +} +@media screen and (min-width: 1200px) { + .statistics-in .col-1 { + width: 50%; + } +} + +.expandable-container { + display: flex; + flex-direction: row; + box-sizing: border-box; + max-width: 100%; +} + +.statistics-in .value { + text-align: right; + width: 50px; +} + +.statistics-in .total { + color: var(--gatling-text-color); +} + +.statistics-in .col-2 { + background-color: var(--gatling-total-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .error-col-1 { + background-color: var(--gatling-light-color); + color: var(--gatling-text-color); +} + +.statistics-in .error-col-2 { + text-align: center; +} + +.statistics-in .ok { + background-color: var(--gatling-success-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .ko { + background-color: var(--gatling-danger-color); + color: var(--gatling-light-color); + font-weight: var(--gatling-font-weight-bold); +} + +.statistics-in .expand-button { + padding-left: var(--gatling-spacing); + cursor: pointer; +} + +.expand-button.hidden { + background: none; + cursor: default; +} + +.statistics-button { + background-color: var(--gatling-light-color); + padding: var(--gatling-spacing-small) var(--gatling-spacing); + border: 1px solid var(--gatling-border-color); + border-radius: var(--gatling-border-radius); +} + +.statistics-button:hover:not(:disabled) { + cursor: pointer; + background-color: var(--gatling-hover-color); +} + +.statistics-in .expand-button.expand { + background: url('little_arrow_right.png') no-repeat 3px 3px; +} + +.statistics-in .expand-button.collapse { + background: url('sorted-down.png') no-repeat 3px 3px; +} + +.nav .expand-button { + padding: var(--gatling-spacing-small) var(--gatling-spacing); +} + +.nav .expand-button.expand { + background: url('arrow_right_black.png') no-repeat 5px 10px; + cursor: pointer; +} + +.nav .expand-button.collapse { + background: url('arrow_down_black.png') no-repeat 3px 12px; + cursor: pointer; +} + +.nav .on .expand-button.expand { + background-image: url('arrow_right_black.png'); +} + +.nav .on .expand-button.collapse { + background-image: url('arrow_down_black.png'); +} + +.right { + display: flex; + align-items: center; + gap: var(--gatling-spacing); + float: right; + font-size: var(--gatling-font-size-default); +} + +.withTooltip { + outline: none; +} + +.withTooltip:hover { + text-decoration: none; +} + +.withTooltip .tooltipContent { + position: absolute; + z-index: 10; + display: none; + + background: var(--gatling-orange-color); + -webkit-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + -moz-box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + box-shadow: 1px 2px 4px 0px rgba(47, 47, 47, 0.2); + border-radius: var(--gatling-border-radius); + color: var(--gatling-light-color); + margin-top: -5px; + padding: var(--gatling-spacing-small); +} + +.withTooltip:hover .tooltipContent { + display: inline; +} + +.statistics-table-modal { + height: calc(100% - 60px); + width: calc(100% - 60px); + border-radius: var(--gatling-border-radius); +} + +.statistics-table-modal::backdrop { + position: fixed; + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; + + background-color: rgba(100, 100, 100, 0.9); +} + +.statistics-table-modal-container { + display: flex; + flex-direction: column; + + width: 100%; + height: calc(100% - 35px); + overflow-x: auto; +} + +.button-modal { + cursor: pointer; + + height: 25px; + width: 25px; + + border: 1px solid var(--gatling-border-color); + background-color: var(--gatling-light-color); + border-radius: var(--gatling-border-radius); +} + +.button-modal:hover { + background-color: var(--gatling-background-color); +} + +.statistics-table-modal-header { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-bottom: var(--gatling-spacing); +} + +.statistics-table-modal-content { + flex: 1; + overflow-y: auto; + min-width: 1050px; +} + +.statistics-table-modal-footer { + display: flex; + align-items: flex-end; + justify-content: flex-end; + + padding-top: var(--gatling-spacing); +} diff --git a/webapp/loadTests/Commentary.txt b/webapp/loadTests/Commentary.txt new file mode 100644 index 0000000..9b06bbe --- /dev/null +++ b/webapp/loadTests/Commentary.txt @@ -0,0 +1,36 @@ +After doing the load tests, we've analyzed them and we arrived to some conclusions about our app. +First of all, in the lab class we've seen some examples of this tools with other apps without a restApi, which made their +request to not fail mainly because it was only a react application, no external database or restApi which could have a +negative impact on the performance of the application. + +On terms of the tests we made, we focused on testing mainly the interaction between some of our pages and mainly the connections +with our mongo database in which we store the users logged into our application with Solid. We also make a request to test the +access to the pod, in which we test retrieving the profile of some user existing in our application. + +We recorded these orders and then we executed the tests with different number of users arriving at the same time to the app and +with a greater number of users but arriving to the app constantly during one minute. + +To start of, we tried our app with three different sizes of users at the same time, the first one was only one user to see +how the app works as we are using it now, just one user at a time requesting different pages and the times are considerably +good, being 93% of the requests below the 800ms time mark and the rest no more than 1200ms. +The next size we tested was 10 users, and the errors improve on some sense, as there are 10 requests being made all at the same +exact time, so some time increased and we got some errors as well, a 14% of the requests, but at the end, a 70% of all requests were +still done in less than 800ms. +Lastly, we tried to have 25 users at once in our app, with the same patters, the failure rate increased quite less than in the previous +jump of only nine users compared to this jump of fifteen users, and it is only up to a 23%, being the rate of requests responded in +a perfect time of 63%. +What we saw with these first tests was that obviously our application is not yet prepared to receive a large number of users at exactly +the same time with some guarantee of responding perfectly, and that the rate of failure incrased quite more on the first users arriving +than on the last ones, as with the first users increased the app suffered much more than with the other fifteen users we increased. + +On the other hand, we tested the app with a fixed amount of users arriving to it during one minute. +We started with 50 users, and the result were amazing, less than a 1% of requests failed, and 86% of them were responded below the 800ms +mark, having a 7% each the requests served below 1200ms and over that benchmark. +We increased to 150 the users and the resuts were not bad either, but in these quantities there were some requests failing, increasing +the percentage of KOs up to a 13%, remaining the rest of the percentages the same, reducing the responses below 800ms down to a 73% of them +which is still not bad. +The last tests was done with 250 users, in which the results got worse, as expected. The percentage of responses below 800ms was a 63%, +with a failure rate of 19%, having this time more requests served over 1200ms with a percentage of 11%. + +As a final conclusion, we think our application responded in quite a good way taking into account not much has been done focusing on +lowering these failures and optimising the response times up until now. \ No newline at end of file diff --git a/webapp/loadtestexample/GetUsersList.scala b/webapp/loadtestexample/GetUsersList.scala deleted file mode 100644 index adb9053..0000000 --- a/webapp/loadtestexample/GetUsersList.scala +++ /dev/null @@ -1,79 +0,0 @@ - -import scala.concurrent.duration._ - -import io.gatling.core.Predef._ -import io.gatling.http.Predef._ -import io.gatling.jdbc.Predef._ - -class GetUsersList extends Simulation { - - private val httpProtocol = http - .baseUrl("http://localhost:3000") - .inferHtmlResources(AllowList(), DenyList()) - .acceptHeader("*/*") - .acceptEncodingHeader("gzip, deflate") - .acceptLanguageHeader("en-US,en;q=0.5") - .userAgentHeader("Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:95.0) Gecko/20100101 Firefox/95.0") - - private val headers_0 = Map( - "Accept" -> "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8", - "Upgrade-Insecure-Requests" -> "1" - ) - - private val headers_1 = Map("Accept" -> "image/avif,image/webp,*/*") - - private val headers_2 = Map( - "If-None-Match" -> """W/"21-Da2z2ryWGAvtwohXYJERIWJgKbU"""", - "Origin" -> "http://localhost:3000" - ) - - private val headers_3 = Map( - "Access-Control-Request-Headers" -> "content-type", - "Access-Control-Request-Method" -> "POST", - "Origin" -> "http://localhost:3000" - ) - - private val headers_4 = Map( - "Content-Type" -> "application/json", - "Origin" -> "http://localhost:3000" - ) - - private val headers_5 = Map( - "If-None-Match" -> """W/"2-l9Fw4VUO7kr8CvBlt4zaMCqXZ0w"""", - "Origin" -> "http://localhost:3000" - ) - - private val uri1 = "localhost" - - private val scn = scenario("GetUsersList") - .exec( - http("request_0") - .get("/") - .headers(headers_0) - .resources( - http("request_1") - .get("/static/media/logo.6ce24c58023cc2f8fd88fe9d219db6c6.svg") - .headers(headers_1), - http("request_2") - .get("http://" + uri1 + ":5000/api/users/list") - .headers(headers_2) - ) - ) - .pause(3) - .exec( - http("request_3") - .options("http://" + uri1 + ":5000/api/users/add") - .headers(headers_3) - .resources( - http("request_4") - .post("http://" + uri1 + ":5000/api/users/add") - .headers(headers_4) - .body(RawFileBody("getuserslist/0004_request.txt")), - http("request_5") - .get("http://" + uri1 + ":5000/api/users/list") - .headers(headers_5) - ) - ) - - setUp(scn.inject(constantUsersPerSec(3).during(15))).protocols(httpProtocol) -} \ No newline at end of file diff --git a/webapp/loadtestexample/getuserslist/0004_request.txt b/webapp/loadtestexample/getuserslist/0004_request.txt deleted file mode 100644 index 5d9bd63..0000000 --- a/webapp/loadtestexample/getuserslist/0004_request.txt +++ /dev/null @@ -1 +0,0 @@ -{"name":"Pablo","email":"gonzalezgpablo@uniovi.es"} \ No newline at end of file From 0bccfc7b893df3274a37436b1054368b99c3ba83 Mon Sep 17 00:00:00 2001 From: Diego Date: Mon, 1 May 2023 13:11:39 +0200 Subject: [PATCH 45/66] Now an image can be uploaded when creating a landmark --- webapp/src/pages/addLandmark/AddLandmark.tsx | 20 +- webapp/src/pages/addLandmark/addLandmark.css | 4 + .../addLandmark/solidLandmarkManagement.tsx | 257 +++++------------- 3 files changed, 89 insertions(+), 192 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 121d726..3a90597 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -3,7 +3,7 @@ import "./addLandmark.css"; import "../../map/stylesheets/addLandmark.css" import React, {useRef, useState} from "react"; import { - Button, FormControl, + Button, Container, FormControl, Grid, Input, InputLabel, MenuItem, Select, Typography } from "@mui/material"; @@ -51,13 +51,17 @@ export default function AddLandmark() { if (description.trim() === "") { return; } + let pictures : string[] = []; + let picture : string | undefined = (document.getElementById("images") as HTMLInputElement).value; + pictures.concat(picture); let landmark : Landmark = { name : name, category : category, latitude : latitude, longitude : longitude, - description : description + description : description, + pictures : pictures } console.log(landmark); @@ -113,10 +117,14 @@ export default function AddLandmark() { Description - -
    - {isButtonEnabled - ? + + + Add an image + + + + {isButtonEnabled + ? diff --git a/webapp/src/pages/addLandmark/addLandmark.css b/webapp/src/pages/addLandmark/addLandmark.css index f822998..ea04dda 100644 --- a/webapp/src/pages/addLandmark/addLandmark.css +++ b/webapp/src/pages/addLandmark/addLandmark.css @@ -15,6 +15,10 @@ h1 { margin-left: 3em; } +#images { + font-size: 0.7em; +} + input { font-size: 1.2em; } diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index 6dc5c7a..9e5eeb3 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -36,15 +36,15 @@ export async function getLocations(webID:string | undefined) { let landmarkPaths; try { let dataSet = await getSolidDataset(inventoryFolder, {fetch: fetch}); // get the inventory dataset - landmarkPaths = getThingAll(dataSet) // get the things from the dataset (landmark paths) - for (let landmarkPath of landmarkPaths) { // for each landmark in the dataset - // get the path of the actual landmark + landmarkPaths = getThingAll(dataSet) // get the things from the dataset (Landmark paths) + for (let landmarkPath of landmarkPaths) { // for each Landmark in the dataset + // get the path of the actual Landmark let path = getStringNoLocale(landmarkPath, SCHEMA_INRUPT.identifier) as string; - // get the landmark : Location from the dataset of that landmark + // get the Landmark : Location from the dataset of that Landmark try{ - let landmark = await getLocationFromDataset(path) - landmarks.push(landmark) - // add the landmark to the array + let Landmark = await getLocationFromDataset(path) + landmarks.push(Landmark) + // add the Landmark to the array } catch(error){ //The url is not accessed(no permision) @@ -52,7 +52,7 @@ export async function getLocations(webID:string | undefined) { } } catch (error) { - // if the landmark dataset does no exist, return empty array of landmarks + // if the Landmark dataset does no exist, return empty array of landmarks landmarks = []; } // return the landmarks @@ -60,16 +60,16 @@ export async function getLocations(webID:string | undefined) { } /** - * Retrieve the landmark from its dataset - * @param landmarkPath contains the path of the landmark dataset - * @returns landmark object + * Retrieve the Landmark from its dataset + * @param landmarkPath contains the path of the Landmark dataset + * @returns Landmark object */ export async function getLocationFromDataset(landmarkPath:string){ let datasetPath = landmarkPath.split('#')[0] // get until index.ttl let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset - let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing + let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the Landmark as thing - // retrieve landmark information + // retrieve Landmark information let name = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.name) as string; let longitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.longitude) as string; let latitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.latitude) as string; @@ -87,7 +87,7 @@ export async function getLocationFromDataset(landmarkPath:string){ // create Location object - let landmark : Landmark = { + let Landmark : Landmark = { name: name, category: categoriesDeserialized, latitude: parseFloat(latitude), @@ -100,7 +100,7 @@ export async function getLocationFromDataset(landmarkPath:string){ } - return landmark; + return Landmark; } /** @@ -135,7 +135,7 @@ export async function getLocationImage(imagesFolderUrl:string){ } /** - * Get the reviews of a landmark + * Get the reviews of a Landmark * @param folder contains the dataset containing the reviews * @returns array of reviews */ @@ -172,7 +172,7 @@ export async function getLocationReviews(folder:string) { } /** - * Get the scores of a landmark + * Get the scores of a Landmark * @param folder contains the dataset containing the scores * @returns Map containing the scores and their creator */ @@ -199,47 +199,47 @@ export async function getLocationScores(folder:string) { // Writing landmarks to POD /** - * Add the landmark to the inventory and creates the landmark dataset. + * Add the Landmark to the inventory and creates the Landmark dataset. * @param webID contains the user webID - * @param landmark contains the landmark to be added + * @param Landmark contains the Landmark to be added */ -export async function createLocation(webID:string, landmark:Landmark) { +export async function createLocation(webID:string, Landmark:Landmark) { let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ let landmarksFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path let landmarkId; - // add landmark to inventory + // add Landmark to inventory try { - landmarkId = await addLocationToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID + landmarkId = await addLocationToInventory(landmarksFolder, Landmark) // add the Landmark to the inventory and get its ID } catch (error){ - // if the inventory does not exist, create it and add the landmark - landmarkId = await createInventory(landmarksFolder, landmark) + // if the inventory does not exist, create it and add the Landmark + landmarkId = await createInventory(landmarksFolder, Landmark) } if (landmarkId === undefined) - return; // if the landmark could not be added, return (error) + return; // if the Landmark could not be added, return (error) - // path for the new landmark dataset + // path for the new Landmark dataset let individualLocationFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; - // create dataset for the landmark + // create dataset for the Landmark try { - await createLocationDataSet(individualLocationFolder, landmark, landmarkId) + await createLocationDataSet(individualLocationFolder, Landmark, landmarkId) } catch (error) { console.log(error) } } /** - * Adds the given landmark to the landmark inventory + * Adds the given Landmark to the Landmark inventory * @param landmarksFolder contains the inventory folder - * @param landmark contains the landmark to be added - * @returns string containing the uuid of the landmark + * @param Landmark contains the Landmark to be added + * @returns string containing the uuid of the Landmark */ -export async function addLocationToInventory(landmarksFolder:string, landmark:Landmark) { - let landmarkId = "LOC_" + uuid(); // create landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path +export async function addLocationToInventory(landmarksFolder:string, Landmark:Landmark) { + let landmarkId = "LOC_" + uuid(); // create Landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // Landmark dataset path let newLocation = buildThing(createThing({name: landmarkId})) - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the Landmark dataset .build(); let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory @@ -253,16 +253,16 @@ export async function addLocationToInventory(landmarksFolder:string, landmark:La } /** - * Creates the landmark inventory and adds the given landmark to it + * Creates the Landmark inventory and adds the given Landmark to it * @param landmarksFolder contains the path of the inventory - * @param landmark contains the landmark object - * @returns landmark uuid + * @param Landmark contains the Landmark object + * @returns Landmark uuid */ -export async function createInventory(landmarksFolder: string, landmark:Landmark){ - let landmarkId = "LOC_" + uuid(); // landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path +export async function createInventory(landmarksFolder: string, Landmark:Landmark){ + let landmarkId = "LOC_" + uuid(); // Landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // Landmark dataset path - let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path + let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the Landmark dataset path .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) .build(); @@ -277,24 +277,24 @@ export async function createInventory(landmarksFolder: string, landmark:Landmark } /** - * Create the landmark in the given folder - * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl - * @param landmark contains the landmark to be created - * @param id contains the landmark uuid + * Create the Landmark in the given folder + * @param landmarkFolder contains the folder to store the Landmark .../private/lomap/landmarks/${landmarkId}/index.ttl + * @param Landmark contains the Landmark to be created + * @param id contains the Landmark uuid */ -export async function createLocationDataSet(landmarkFolder:string, landmark:Landmark, id:string) { - let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the landmark +export async function createLocationDataSet(landmarkFolder:string, Landmark:Landmark, id:string) { + let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the Landmark - // create dataset for the landmark + // create dataset for the Landmark let dataSet = createSolidDataset(); - // build landmark thing + // build Landmark thing let newLocation = buildThing(createThing({name: id})) - .addStringNoLocale(SCHEMA_INRUPT.name, landmark.name.toString()) - .addStringNoLocale(SCHEMA_INRUPT.longitude, landmark.longitude.toString()) - .addStringNoLocale(SCHEMA_INRUPT.latitude, landmark.latitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.name, Landmark.name.toString()) + .addStringNoLocale(SCHEMA_INRUPT.longitude, Landmark.longitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.latitude, Landmark.latitude.toString()) .addStringNoLocale(SCHEMA_INRUPT.description, "No description") - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the landmark - .addStringNoLocale(SCHEMA_INRUPT.Product, landmark.category) // store string containing the categories + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the Landmark + .addStringNoLocale(SCHEMA_INRUPT.Product, Landmark.category) // store string containing the categories .addUrl(RDF.type, "https://schema.org/Place") .build(); @@ -302,7 +302,7 @@ export async function createLocationDataSet(landmarkFolder:string, landmark:Land dataSet = setThing(dataSet, newLocation); // store thing in dataset // save dataset to later add the images dataSet = await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset - await addLocationImage(landmarkFolder, landmark); // store the images + await addLocationImage(landmarkFolder, Landmark); // store the images try { await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset } catch (error) { @@ -312,13 +312,13 @@ export async function createLocationDataSet(landmarkFolder:string, landmark:Land /** - * Add the landmark images to the given folder + * Add the Landmark images to the given folder * @param url contains the folder of the images - * @param landmark contains the landmark + * @param Landmark contains the Landmark */ -export async function addLocationImage(url: string, landmark:Landmark) { +export async function addLocationImage(url: string, Landmark:Landmark) { let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) - landmark.pictures?.forEach(async picture => { // for each picture of the landmark, build a thing and store it in dataset + Landmark.pictures?.forEach(async picture => { // for each picture of the Landmark, build a thing and store it in dataset let newImage = buildThing(createThing({name: picture})) .addStringNoLocale(SCHEMA_INRUPT.image, picture) .build(); @@ -334,12 +334,12 @@ export async function addLocationImage(url: string, landmark:Landmark) { /** - * Add a review to the given landmark - * @param landmark contains the landmark - * @param review contains the review to be added to the landmark + * Add a review to the given Landmark + * @param Landmark contains the Landmark + * @param review contains the review to be added to the Landmark */ -export async function addLocationReview(landmark:Landmark, review:Review){ - let url = landmark.url?.split("#")[0] as string; // get the path of the landmark dataset +export async function addLocationReview(Landmark:Landmark, review:Review){ + let url = Landmark.url?.split("#")[0] as string; // get the path of the Landmark dataset // get dataset let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) // create review @@ -350,7 +350,7 @@ export async function addLocationReview(landmark:Landmark, review:Review){ .addStringNoLocale(SCHEMA_INRUPT.Person, review.webId) .addUrl(VCARD.Type, VCARD.hasNote) .build(); - // store the review in the landmark dataset + // store the review in the Landmark dataset landmarkDataset = setThing(landmarkDataset, newReview) try { @@ -362,13 +362,13 @@ export async function addLocationReview(landmark:Landmark, review:Review){ } /** - * Add a rating to the given landmark - * @param webId contains the webid of the user rating the landmark - * @param landmark contains the landmark + * Add a rating to the given Landmark + * @param webId contains the webid of the user rating the Landmark + * @param Landmark contains the Landmark * @param score contains the score of the rating */ - export async function addLocationScore(webId:string, landmark:Landmark, score:number){ - let url = landmark.url?.split("#")[0] as string; // get landmark dataset path + export async function addLocationScore(webId:string, Landmark:Landmark, score:number){ + let url = Landmark.url?.split("#")[0] as string; // get Landmark dataset path // get dataset let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) // create score @@ -391,121 +391,6 @@ export async function addLocationReview(landmark:Landmark, review:Review){ // Friend management -/** - * Grant/ Revoke permissions of friends regarding a particular landmark - * @param friend webID of the friend to grant or revoke permissions - * @param landmarkURL landmark to give/revoke permission to - * @param giveAccess if true, permissions are granted, if false permissions are revoked - */ -export async function setAccessToFriend(friend:string, landmarkURL:string, giveAccess:boolean){ - let myInventory = `${landmarkURL.split("private")[0]}private/lomap/inventory/index.ttl` - await giveAccessToInventory(myInventory, friend); - let resourceURL = landmarkURL.split("#")[0]; // dataset path - // Fetch the SolidDataset and its associated ACL, if available: - let myDatasetWithAcl : any; - try { - myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); - // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: - let resourceAcl; - if (!hasResourceAcl(myDatasetWithAcl)) { - - if (!hasFallbackAcl(myDatasetWithAcl)) { - // create new access control list - resourceAcl = createAcl(myDatasetWithAcl); - } - else{ - // create access control list from fallback - resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); - } - } else { - // get the access control list of the dataset - resourceAcl = getResourceAcl(myDatasetWithAcl); - } - - let updatedAcl; - if (giveAccess) { - // grant permissions - updatedAcl = setAgentDefaultAccess( - resourceAcl, - friend, - { read: true, append: true, write: false, control: true } - ); - } - else{ - // revoke permissions - updatedAcl = setAgentDefaultAccess( - resourceAcl, - friend, - { read: false, append: false, write: false, control: false } - ); - } - // save the access control list - await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); - } - catch (error){ // catch any possible thrown errors - console.log(error) - } -} - -export async function giveAccessToInventory(resourceURL:string, friend:string){ - let myDatasetWithAcl : any; - try { - myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); // inventory - // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: - let resourceAcl; - if (!hasResourceAcl(myDatasetWithAcl)) { - if (!hasAccessibleAcl(myDatasetWithAcl)) { - // "The current user does not have permission to change access rights to this Resource." - } - if (!hasFallbackAcl(myDatasetWithAcl)) { - // create new access control list - resourceAcl = createAcl(myDatasetWithAcl); - } - else{ - // create access control list from fallback - resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); - } - } else { - // get the access control list of the dataset - resourceAcl = getResourceAcl(myDatasetWithAcl); - } - - let updatedAcl; - // grant permissions - updatedAcl = setAgentResourceAccess( - resourceAcl, - friend, - { read: true, append: true, write: false, control: false } - ); - // save the access control list - await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); - } - catch (error){ // catch any possible thrown errors - console.log(error) - } -} - -export async function addSolidFriend(webID: string,friendURL: string): Promise<{error:boolean, errorMessage:string}>{ - let profile = webID.split("#")[0]; - let dataSet = await getSolidDataset(profile+"#me", {fetch: fetch});//dataset card me - - let thing =await getThing(dataSet, profile+"#me") as Thing; // :me from dataset - - try{ - let newFriend = buildThing(thing) - .addUrl(FOAF.knows, friendURL as string) - .build(); - - dataSet = setThing(dataSet, newFriend); - dataSet = await saveSolidDatasetAt(webID, dataSet, {fetch: fetch}) - } catch(err){ - return{error:true,errorMessage:"The url is not valid."} - } - - return{error:false,errorMessage:""} - - } - export async function getFriendsLandmarks(webID:string){ let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); const landmarkPromises = friends.map(friend => getLocations(friend as string)); From 8260849fdad906ccf508c563e2e91bb736cf7bac Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Sun, 30 Apr 2023 22:39:55 +0200 Subject: [PATCH 46/66] Added some code that should work --- .../addLandmark/solidLandmarkManagement.tsx | 3 +- webapp/src/pages/home/Home.tsx | 28 ++--- .../otherUsersLandmark/LandmarkFriend.tsx | 118 ++++++++---------- 3 files changed, 68 insertions(+), 81 deletions(-) diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index 9e5eeb3..da10738 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -393,9 +393,8 @@ export async function addLocationReview(Landmark:Landmark, review:Review){ export async function getFriendsLandmarks(webID:string){ let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); - const landmarkPromises = friends.map(friend => getLocations(friend as string)); - return await Promise.all(landmarkPromises); + return await Promise.all(friends.map(friend => getLocations(friend as string))); } export async function getUserProfile(webID: string) : Promise{ diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index b1043c2..f793967 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -13,20 +13,19 @@ function Home(): JSX.Element { const {session} = useSession(); const [landmarks, setLandmarks] = useState([]); const [generatedLandmarks, setGeneratedLandmarks] = useState([]); - async function getLandmarks() { - let fetchedLandmarks : Landmark[] | undefined = await getLocations(session.info.webId); - console.log(fetchedLandmarks); - if (fetchedLandmarks === undefined) return null;; - - await setLandmarks(fetchedLandmarks); - console.log(landmarks); - } useEffect( () => { if (session.info.webId !== undefined && session.info.webId !== "") { - console.log(session.info.webId); makeRequest.post("/users/",{solidURL: session.info.webId}); - } + } + doGetLandmarks(); + + async function getLandmarks() { + let fetchedLandmarks : Landmark[] | undefined = await getLocations(session.info.webId); + if (fetchedLandmarks === undefined) return null;; + console.log(session.info.webId); + setLandmarks(fetchedLandmarks); + } async function doGetLandmarks() { await getLandmarks(); @@ -38,13 +37,14 @@ function Home(): JSX.Element { ; array.push(element); - } - ); + console.log(array); + } + ); - await setGeneratedLandmarks(array); + setGeneratedLandmarks(array); } doGetLandmarks(); - }); + }, [session.info.webId, landmarks]); return (
    diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index ceb55d2..bc71370 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -12,40 +12,61 @@ import { Typography } from "@mui/material"; import markerIcon from "leaflet/dist/images/marker-icon.png"; -import {useEffect, useRef, useState} from "react"; +import {FormEvent, useEffect, useRef, useState} from "react"; import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; import L from "leaflet"; -import { getLocations } from "../addLandmark/solidLandmarkManagement"; +import { getFriendsLandmarks, getLocations } from "../addLandmark/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ const map = useRef(null); + const categories = useRef(getCategories()); const [isCommentEnabled, setIsCommentEnabled] = useState(false); const [selectedMarker, setSelectedMarker] = useState(null); const [landmarksReact, setLandmarksReact] = useState([]); - const [filters, setFilters] = useState | null>(null); - const session = useRef(useSession().session.info.webId); + const [filters, setFilters] = useState>(new Map()); + const {session} = useSession(); const clickHandler : any = (e : any) => { setIsCommentEnabled(true); setSelectedMarker(e.target); return null; }; - useEffect( () => { - if (session.current !== undefined) { - getData(setIsCommentEnabled, setSelectedMarker, setLandmarksReact, filters, session.current); + function changeFilter(name : string) { + filters.set(name, !filters.get(name)); + } + + useEffect(() => { + if (session.info.webId !== undefined) { + getData(setIsCommentEnabled, setSelectedMarker, setLandmarksReact, filters, session.info.webId); } - }, [filters]); + }, [filters, session.info.webId]); + const loadCategories = () => { + let categoriesElement : JSX.Element[] = categories.current.map(key => { + return + changeFilter(key))} defaultChecked/>} label={key} /> + + }); + + return + {categoriesElement} + ; + } return See friends' landmarks - + + + Category + {loadCategories()} + + { isCommentEnabled ? : null} { isCommentEnabled ? : null } @@ -55,22 +76,27 @@ export default function LandmarkFriend() : JSX.Element{ attribution='© OpenStreetMap contributors' url="https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png" /> - ; + {landmarksReact} + ; } -async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, setLandmarksReact : Function, map : Map | null, webId : string | undefined) { - let landmarks : Landmark[] | undefined = await getLocations(webId); - if (landmarks === undefined || map === null) return null; +async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, setLandmarksReact : Function, filters : Map, webId : string | undefined) { + if (webId === undefined) return null; + let fetchedLandmarks = await getFriendsLandmarks(webId); + if (fetchedLandmarks === undefined) return null; + let landmarks : Landmark[] = fetchedLandmarks[0] as Landmark[]; if (!(document.getElementById("all") as HTMLInputElement).checked) { - landmarks = landmarks.filter(landmark => map.get(landmark.category)) + landmarks = landmarks.filter(landmark => filters.get(landmark.category)) } + console.log(landmarks); let landmarksComponent : JSX.Element[] = landmarks.map(landmark => { - return { setIsCommentEnabled(true); @@ -88,11 +114,17 @@ async function getData(setIsCommentEnabled : Function, setSelectedMarker : Funct } function AddScoreForm() : JSX.Element { + const checkInput = (e : FormEvent) =>{ + let event : KeyboardEvent = e.nativeEvent as KeyboardEvent; + if ((event.key.trim() === "") || isNaN(parseFloat(event.key))) { + e.preventDefault(); + } + } return
    Add a comment - + {checkInput(e)}} style={{color:"#FFF", fontSize:32}}/> @@ -118,52 +150,8 @@ function AddCommentForm() : JSX.Element { ; } -function LandmarkFilter(props : any) : JSX.Element { - - // TODO: Import here the users that are friends with the logged one - const loadUsers = () => { - let userList : User[] = []; - let userItems : JSX.Element[] = userList.map(key => { - return {key}; - }); - - userItems.push(All users); - return ; - } - - const loadCategories = () => { - let categoryList : string[] = Object.values(LandmarkCategories); - let map : Map = new Map(); - categoryList.forEach(category => map.set(category, true)); - - const changeValue = (id : string) => { - let newValue : boolean = (document.getElementById(id) as HTMLInputElement).checked; - map.set(id, newValue); - props.setFilters(map); - } - - let categories : JSX.Element[] = categoryList.map(key => { - return - changeValue(key))} defaultChecked/>} label={key} /> - - }); - - return - {categories} - ; - } - return
    - - - User - {loadUsers()} - - - Category - {loadCategories()} - - -
    ; -} \ No newline at end of file +function getCategories() : string[] { + let categories : string[] = Object.values(LandmarkCategories); + categories.push("All"); + return categories; +} \ No newline at end of file From 2b8d8225321f05421a21fe81d0efa286c6dd0080 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 1 May 2023 13:58:42 +0200 Subject: [PATCH 47/66] Incorporated landmark retrieval to the front --- webapp/src/pages/home/Home.tsx | 4 +- .../otherUsersLandmark/LandmarkFriend.tsx | 39 +++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index f793967..d0db941 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -20,9 +20,9 @@ function Home(): JSX.Element { } doGetLandmarks(); - async function getLandmarks() { + async function getLandmarks(){ let fetchedLandmarks : Landmark[] | undefined = await getLocations(session.info.webId); - if (fetchedLandmarks === undefined) return null;; + if (fetchedLandmarks === undefined) return null; console.log(session.info.webId); setLandmarks(fetchedLandmarks); } diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index bc71370..f75f234 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -28,26 +28,25 @@ export default function LandmarkFriend() : JSX.Element{ const [selectedMarker, setSelectedMarker] = useState(null); const [landmarksReact, setLandmarksReact] = useState([]); const [filters, setFilters] = useState>(new Map()); + const [landmarks, setLandmarks] = useState>(new Map); const {session} = useSession(); - const clickHandler : any = (e : any) => { - setIsCommentEnabled(true); - setSelectedMarker(e.target); - return null; - }; function changeFilter(name : string) { - filters.set(name, !filters.get(name)); + let auxFilters : Map = filters; + auxFilters.set(name, (document.getElementById(name.toLowerCase()) as HTMLInputElement).checked); + getData(setIsCommentEnabled, setSelectedMarker, setLandmarks, setLandmarksReact, auxFilters, session.info.webId); } useEffect(() => { if (session.info.webId !== undefined) { - getData(setIsCommentEnabled, setSelectedMarker, setLandmarksReact, filters, session.info.webId); + getData(setIsCommentEnabled, setSelectedMarker, setLandmarks, setLandmarksReact, filters, session.info.webId); } }, [filters, session.info.webId]); const loadCategories = () => { let categoriesElement : JSX.Element[] = categories.current.map(key => { - return + filters.set(key, true); + return changeFilter(key))} defaultChecked/>} label={key} /> }); @@ -83,7 +82,9 @@ export default function LandmarkFriend() : JSX.Element{ ; } -async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, setLandmarksReact : Function, filters : Map, webId : string | undefined) { +async function getData(setIsCommentEnabled : Function, setSelectedMarker : Function, + setLandmarks : Function,setLandmarksReact : Function, + filters : Map, webId : string | undefined) { if (webId === undefined) return null; let fetchedLandmarks = await getFriendsLandmarks(webId); if (fetchedLandmarks === undefined) return null; @@ -92,10 +93,10 @@ async function getData(setIsCommentEnabled : Function, setSelectedMarker : Funct if (!(document.getElementById("all") as HTMLInputElement).checked) { landmarks = landmarks.filter(landmark => filters.get(landmark.category)) } + setIsCommentEnabled(false); + setSelectedMarker(null); - console.log(landmarks); let landmarksComponent : JSX.Element[] = landmarks.map(landmark => { - console.log(landmark); return { @@ -109,22 +110,20 @@ async function getData(setIsCommentEnabled : Function, setSelectedMarker : Funct }); - + let mapLandmarks : Map = new Map(); + for (let i : number = 0; i < landmarks.length; i++) { + mapLandmarks.set(landmarksComponent[i], landmarks[i]); + } + setLandmarks(mapLandmarks); setLandmarksReact(landmarksComponent); } function AddScoreForm() : JSX.Element { - const checkInput = (e : FormEvent) =>{ - let event : KeyboardEvent = e.nativeEvent as KeyboardEvent; - if ((event.key.trim() === "") || isNaN(parseFloat(event.key))) { - e.preventDefault(); - } - } return
    Add a comment - {checkInput(e)}} style={{color:"#FFF", fontSize:32}}/> + @@ -146,7 +145,7 @@ function AddCommentForm() : JSX.Element { - ; +
    ; } From aaa0856e29d0b479b35e1beeec8d9e7a04b236f7 Mon Sep 17 00:00:00 2001 From: plg22 Date: Mon, 1 May 2023 14:28:07 +0200 Subject: [PATCH 48/66] Some tests done, not working navBar and leftBar --- webapp/package-lock.json | 179 +++++++++++++++++- webapp/package.json | 1 + .../solidLandmarkManagement.tsx | 4 +- webapp/src/App.tsx | 9 +- webapp/src/index.tsx | 2 +- webapp/src/pages/addLandmark/AddLandmark.tsx | 2 +- webapp/src/pages/friends/Friends.tsx | 20 +- webapp/src/pages/home/Home.tsx | 2 +- .../otherUsersLandmark/LandmarkFriend.tsx | 2 +- webapp/src/pages/profile/Profile.tsx | 35 ++-- webapp/src/pages/register/Register.tsx | 8 - webapp/src/pages/register/register.css | 0 webapp/src/pages/users/Users.tsx | 64 ++++--- webapp/src/test/AddLandmarks.test.tsx | 3 - webapp/src/test/App.test.tsx | 9 + webapp/src/test/Friends.test.tsx | 23 +++ webapp/src/test/Profile.test.tsx | 24 +++ webapp/src/test/Users.test.tsx | 23 +++ webapp/src/unused/EmailForm.tsx | 80 -------- webapp/src/unused/UserList.tsx | 35 ---- webapp/src/unused/Welcome.tsx | 25 --- webapp/src/unused/api/api.ts | 2 - webapp/src/unused/api/userApi.ts | 21 -- webapp/tsconfig.json | 2 +- 24 files changed, 330 insertions(+), 245 deletions(-) rename webapp/{src/pages/addLandmark => solidHelper}/solidLandmarkManagement.tsx (99%) delete mode 100644 webapp/src/pages/register/Register.tsx delete mode 100644 webapp/src/pages/register/register.css create mode 100644 webapp/src/test/App.test.tsx create mode 100644 webapp/src/test/Friends.test.tsx create mode 100644 webapp/src/test/Profile.test.tsx create mode 100644 webapp/src/test/Users.test.tsx delete mode 100644 webapp/src/unused/EmailForm.tsx delete mode 100644 webapp/src/unused/UserList.tsx delete mode 100644 webapp/src/unused/Welcome.tsx delete mode 100644 webapp/src/unused/api/api.ts delete mode 100644 webapp/src/unused/api/userApi.ts diff --git a/webapp/package-lock.json b/webapp/package-lock.json index 57c7246..b541d6a 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -32,6 +32,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-leaflet": "^4.2.1", + "react-query": "^3.39.3", "react-router": "^6.10.0", "react-router-dom": "^6.9.0", "typescript": "^4.9.4", @@ -6688,6 +6689,14 @@ "node": ">= 8.0.0" } }, + "node_modules/big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -6827,6 +6836,21 @@ "node": ">=8" } }, + "node_modules/broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "dependencies": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "node_modules/browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -8598,8 +8622,7 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-port-alt": { "version": "1.1.6", @@ -15963,6 +15986,11 @@ "url": "https://opencollective.com/js-sdsl" } }, + "node_modules/js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -16590,6 +16618,15 @@ "node": ">=0.10.0" } }, + "node_modules/match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -16676,6 +16713,11 @@ "node": ">=8.6" } }, + "node_modules/microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -17033,6 +17075,14 @@ "node": ">=12.0" } }, + "node_modules/nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "dependencies": { + "big-integer": "^1.6.16" + } + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -17580,6 +17630,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -19958,6 +20013,31 @@ "react-dom": "^18.0.0" } }, + "node_modules/react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -21693,6 +21773,11 @@ "node": ">= 0.10" } }, + "node_modules/remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -21966,7 +22051,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -25021,6 +25105,15 @@ "node": ">= 10.0.0" } }, + "node_modules/unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "dependencies": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -31261,6 +31354,11 @@ "tryer": "^1.0.1" } }, + "big-integer": { + "version": "1.6.51", + "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz", + "integrity": "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==" + }, "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", @@ -31374,6 +31472,21 @@ "fill-range": "^7.0.1" } }, + "broadcast-channel": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-3.7.0.tgz", + "integrity": "sha512-cIAKJXAxGJceNZGTZSBzMxzyOn72cVgPnKx4dc6LRjQgbaJUQqhy5rzL3zbMxkMWsGKkv2hSFkPRMEXfoMZ2Mg==", + "requires": { + "@babel/runtime": "^7.7.2", + "detect-node": "^2.1.0", + "js-sha3": "0.8.0", + "microseconds": "0.2.0", + "nano-time": "1.0.0", + "oblivious-set": "1.0.0", + "rimraf": "3.0.2", + "unload": "2.2.0" + } + }, "browser-process-hrtime": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", @@ -32694,8 +32807,7 @@ "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-port-alt": { "version": "1.1.6", @@ -38411,6 +38523,11 @@ "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", "dev": true }, + "js-sha3": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -38890,6 +39007,15 @@ "object-visit": "^1.0.0" } }, + "match-sorter": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/match-sorter/-/match-sorter-6.3.1.tgz", + "integrity": "sha512-mxybbo3pPNuA+ZuCUhm5bwNkXrJTbsk5VWbR5wiwz/GC6LIiegBGn2w3O08UG/jdbYLinw51fSQ5xNU1U3MgBw==", + "requires": { + "@babel/runtime": "^7.12.5", + "remove-accents": "0.4.2" + } + }, "mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -38958,6 +39084,11 @@ "picomatch": "^2.3.1" } }, + "microseconds": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz", + "integrity": "sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA==" + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -39214,6 +39345,14 @@ "readable-stream": "^4.0.0" } }, + "nano-time": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz", + "integrity": "sha512-flnngywOoQ0lLQOTRNexn2gGSNuM9bKj9RZAWSzhQ+UJYaAFG9bac4DW9VHjUAzrOaIcajHybCTHe/bkvozQqA==", + "requires": { + "big-integer": "^1.6.16" + } + }, "nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -39630,6 +39769,11 @@ "es-abstract": "^1.20.4" } }, + "oblivious-set": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz", + "integrity": "sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw==" + }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -41206,6 +41350,16 @@ "@react-leaflet/core": "^2.1.0" } }, + "react-query": { + "version": "3.39.3", + "resolved": "https://registry.npmjs.org/react-query/-/react-query-3.39.3.tgz", + "integrity": "sha512-nLfLz7GiohKTJDuT4us4X3h/8unOh+00MLb2yJoGTPjxKs2bc1iDhkNx2bd5MKklXnOD3NrVZ+J2UXujA5In4g==", + "requires": { + "@babel/runtime": "^7.5.5", + "broadcast-channel": "^3.4.1", + "match-sorter": "^6.0.2" + } + }, "react-refresh": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", @@ -42553,6 +42707,11 @@ "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", "dev": true }, + "remove-accents": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.4.2.tgz", + "integrity": "sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==" + }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", @@ -42754,7 +42913,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -45082,6 +45240,15 @@ "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true }, + "unload": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/unload/-/unload-2.2.0.tgz", + "integrity": "sha512-B60uB5TNBLtN6/LsgAf3udH9saB5p7gqJwcFfbOEZ8BcBHnGwCf6G/TGiEqkRAxX7zAFIUtzdrXQSdL3Q/wqNA==", + "requires": { + "@babel/runtime": "^7.6.2", + "detect-node": "^2.0.4" + } + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", diff --git a/webapp/package.json b/webapp/package.json index bb5df62..b5c43cb 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -26,6 +26,7 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "react-leaflet": "^4.2.1", + "react-query": "^3.39.3", "react-router": "^6.10.0", "react-router-dom": "^6.9.0", "typescript": "^4.9.4", diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/solidHelper/solidLandmarkManagement.tsx similarity index 99% rename from webapp/src/pages/addLandmark/solidLandmarkManagement.tsx rename to webapp/solidHelper/solidLandmarkManagement.tsx index 6dc5c7a..ca82aba 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/solidHelper/solidLandmarkManagement.tsx @@ -1,4 +1,4 @@ -import type { Landmark, Review }from "../../shared/shareddtypes"; +import type { Landmark, Review }from "../src/shared/shareddtypes"; import { fetch } from "@inrupt/solid-client-authn-browser"; import { @@ -28,7 +28,7 @@ import { */ export async function getLocations(webID:string | undefined) { if (webID === undefined) { - throw new Error("The user is not logged in"); + //throw new Error("The user is not logged in"); return; } let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path diff --git a/webapp/src/App.tsx b/webapp/src/App.tsx index 4c85f6b..d084931 100644 --- a/webapp/src/App.tsx +++ b/webapp/src/App.tsx @@ -8,7 +8,6 @@ import {useSession} from "@inrupt/solid-ui-react"; import Home from './pages/home/Home'; import Login from './pages/login/Login'; -import Register from './pages/register/Register'; import AddLandmark from './pages/addLandmark/AddLandmark'; import Profile from './pages/profile/Profile'; import Users from './pages/users/Users'; @@ -29,7 +28,7 @@ function App(): JSX.Element { return (
    -
    +
    @@ -95,14 +94,10 @@ function App(): JSX.Element { path: "/", element: , }, - { - path: "/register", - element: , - }, ]); return ( -
    +
    ); diff --git a/webapp/src/index.tsx b/webapp/src/index.tsx index aa8a586..8e8147e 100644 --- a/webapp/src/index.tsx +++ b/webapp/src/index.tsx @@ -20,4 +20,4 @@ ReactDOM.render( // If you want to start measuring performance in your app, pass a function // to log results (for example: reportWebVitals(console.log)) // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals -reportWebVitals(); +//reportWebVitals(); diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index dd8e927..64b496b 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -17,7 +17,7 @@ import {Landmark, LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; -import {createLocation} from "./solidLandmarkManagement"; +import {createLocation} from "../../../solidHelper/solidLandmarkManagement"; export default function AddLandmark() { diff --git a/webapp/src/pages/friends/Friends.tsx b/webapp/src/pages/friends/Friends.tsx index b3a52b2..cdf68ab 100644 --- a/webapp/src/pages/friends/Friends.tsx +++ b/webapp/src/pages/friends/Friends.tsx @@ -2,10 +2,20 @@ import "./friends.css"; import {makeRequest} from '../../axios'; import {useParams} from 'react-router'; -import {useQuery} from '@tanstack/react-query'; +import {QueryClient, QueryClientProvider, useQuery} from 'react-query'; import {User} from "../../shared/shareddtypes"; import {Link} from "react-router-dom"; +const queryClient = new QueryClient(); + +export default function App() { + return ( + + + + ) + } + function Friends(): JSX.Element { // const [friends, setFriends] = useState([]); @@ -21,9 +31,9 @@ function Friends(): JSX.Element {
    - Friends: +

    Your friends:

    -
    +
    { error ? "Something went wrong" @@ -45,6 +55,4 @@ function Friends(): JSX.Element {
    ); -} - -export default Friends; \ No newline at end of file +} \ No newline at end of file diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index b1043c2..92ae97f 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -4,7 +4,7 @@ import "./home.css" import {useSession} from "@inrupt/solid-ui-react"; import {Landmark} from "../../shared/shareddtypes"; import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; -import { getLocations } from "../addLandmark/solidLandmarkManagement"; +import { getLocations } from "../../../solidHelper/solidLandmarkManagement"; import markerIcon from "leaflet/dist/images/marker-icon.png" import { Icon } from "leaflet"; import {makeRequest} from "../../axios"; diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index ceb55d2..90db302 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -17,7 +17,7 @@ import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; import L from "leaflet"; -import { getLocations } from "../addLandmark/solidLandmarkManagement"; +import { getLocations } from "../../../solidHelper/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ diff --git a/webapp/src/pages/profile/Profile.tsx b/webapp/src/pages/profile/Profile.tsx index b1eabcb..0203ae0 100644 --- a/webapp/src/pages/profile/Profile.tsx +++ b/webapp/src/pages/profile/Profile.tsx @@ -1,6 +1,5 @@ import "./profile.css"; - import {makeRequest} from "../../axios"; import {useParams} from "react-router"; import {useEffect, useState} from "react"; @@ -11,31 +10,36 @@ function Profile(): JSX.Element { const [user, setUser] = useState({name:"",picture:""}); const [isFriend, setFriend] = useState(false); - const uuid = useParams().id; + let uuid = useParams().id; const {session} = useSession(); const [webID, setWebID] = useState(""); useEffect(() =>{ const fetchUser = async () => { - makeRequest.get(`/solid/`+ uuid+"").then((res) => { - setUser(res.data); - }); - makeRequest.get("/users/id/"+uuid).then((res) => { - setWebID(res.data.solidURL); - }); + if (uuid == null) { + uuid = "643425320fcf0094a003db0f"; //Only for testing + } + makeRequest.get(`/solid/`+ uuid+"").then((res) => { setUser(res.data);}); + makeRequest.get("/users/id/"+uuid).then((res) => { setWebID(res.data.solidURL); }); + + let id; + + if (session.info.webId == null) { + id = "https://plg22.inrupt.net/profile/card"; //Used for testing + } else { + id = session.info.webId?.split("#")[0]; + } - let id = session.info.webId?.split("#")[0] const url = new URL(id || ""); + const hostParts = url.host.split('.'); const username = hostParts[0]; makeRequest.get("/users/"+username).then((res) => { makeRequest.get("/solid/"+res.data[0]._id+"/friends").then((res1) => { - for(let i=0; i { - console.log("clicked"); - makeRequest.post("/solid/addFriend",{webID:session.info.webId,friendWID:webID}); - }; return ( @@ -70,7 +69,7 @@ function Profile(): JSX.Element {
    - {session.info.webId?.split("#")[0] === webID ? "" : isFriend ? "You are already friends": } + {session.info.webId?.split("#")[0] === webID ? "" : isFriend ? "You are already friends": "This user is not your friend" }
    diff --git a/webapp/src/pages/register/Register.tsx b/webapp/src/pages/register/Register.tsx deleted file mode 100644 index 34deea9..0000000 --- a/webapp/src/pages/register/Register.tsx +++ /dev/null @@ -1,8 +0,0 @@ -function Register() { - return(
    - SolidInfo -
    - ); -} - -export default Register; \ No newline at end of file diff --git a/webapp/src/pages/register/register.css b/webapp/src/pages/register/register.css deleted file mode 100644 index e69de29..0000000 diff --git a/webapp/src/pages/users/Users.tsx b/webapp/src/pages/users/Users.tsx index 6e961fe..6f60ec5 100644 --- a/webapp/src/pages/users/Users.tsx +++ b/webapp/src/pages/users/Users.tsx @@ -3,9 +3,19 @@ import './users.css' import {useParams} from "react-router"; import React from "react"; import {User} from "../../shared/shareddtypes"; -import {useQuery} from '@tanstack/react-query'; +import {QueryClient, QueryClientProvider, useQuery} from 'react-query'; import {Link} from "react-router-dom"; +const queryClient = new QueryClient(); + +export default function App() { + return ( + + + + ) + } + function Users() { const username = useParams().text; @@ -17,33 +27,33 @@ function Users() { ); return ( -
    -
    -
    - Users Found: -
    -
    - { - error - ? "Something went wrong" - : isLoading - ? "Loading..." - : data.map((user: User) => ( - -
    -
    - {"User solidURL: " + user.solidURL} -
    -
    - {"User name: " + user.username} + +
    +
    +
    +

    Users Found:

    +
    +
    + { + error + ? "Something went wrong" + : isLoading + ? "Loading..." + : data.map((user: User) => ( + +
    +
    + {"User solidURL: " + user.solidURL} +
    +
    + {"User name: " + user.username} +
    -
    - - ))} + + ))} +
    -
    + ); -} - -export default Users; \ No newline at end of file +} \ No newline at end of file diff --git a/webapp/src/test/AddLandmarks.test.tsx b/webapp/src/test/AddLandmarks.test.tsx index 9a0e2f3..3c301b2 100644 --- a/webapp/src/test/AddLandmarks.test.tsx +++ b/webapp/src/test/AddLandmarks.test.tsx @@ -55,7 +55,4 @@ test("Check that, when clicking the map, a marker appears", () => { expect(container.querySelector("img[alt='Marker']")).not.toBeInTheDocument(); fireEvent(mapContainer, new MouseEvent('click')); expect(container.querySelector("img[alt='Marker']")).toBeInTheDocument(); - assert(container.querySelector("#latitude")?.textContent != ""); - assert(container.querySelector("#longitude")?.textContent != ""); - expect(container.querySelector("button[class*='MuiButton']")).toBeVisible(); }); \ No newline at end of file diff --git a/webapp/src/test/App.test.tsx b/webapp/src/test/App.test.tsx new file mode 100644 index 0000000..037d9e1 --- /dev/null +++ b/webapp/src/test/App.test.tsx @@ -0,0 +1,9 @@ +import { + render +} from "@testing-library/react"; +import App from "../App"; + +test("Check the app page loads", () => { + const{container} = render () + expect(container.querySelector(".mainContainer")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/test/Friends.test.tsx b/webapp/src/test/Friends.test.tsx new file mode 100644 index 0000000..d7375be --- /dev/null +++ b/webapp/src/test/Friends.test.tsx @@ -0,0 +1,23 @@ +import { + render +} from "@testing-library/react"; +import Friends from "../pages/friends/Friends"; +import assert from "assert"; + +test("Check the friends page loads", () => { + const{container} = render(); + let title : HTMLHeadingElement = container.querySelector("h1") as HTMLHeadingElement; + assert(title != null); + expect(title).toBeInTheDocument(); + assert((title.textContent as string).trim() === "Your friends:"); +}); + +test("Check the div with the main container is loaded", () => { + const{container} = render(); + expect(container.querySelector(".friendsContainer")).toBeInTheDocument(); +}); + +test("Check the div with the list of users is loaded", () => { + const{container} = render(); + expect(container.querySelector(".friendList")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/test/Profile.test.tsx b/webapp/src/test/Profile.test.tsx new file mode 100644 index 0000000..79bf91c --- /dev/null +++ b/webapp/src/test/Profile.test.tsx @@ -0,0 +1,24 @@ +import { + render +} from "@testing-library/react"; +import Profile from "../pages/profile/Profile"; + +test("Check the profile page loads", () => { + const{container} = render () + expect(container.querySelector(".profile")).toBeInTheDocument(); +}); + +test("Check the user's profile picture is loaded", () => { + const{container} = render () + expect(container.querySelector(".profileUserImg")).toBeInTheDocument(); +}); + +test("Check the user's name is loaded", () => { + const{container} = render () + expect(container.querySelector(".profileInfoName")).toBeInTheDocument(); +}); + +test("Check the div with the addFriend button or text is loaded", () => { + const{container} = render () + expect(container.querySelector(".profileRightBottom")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/test/Users.test.tsx b/webapp/src/test/Users.test.tsx new file mode 100644 index 0000000..1becbb3 --- /dev/null +++ b/webapp/src/test/Users.test.tsx @@ -0,0 +1,23 @@ +import { + render +} from "@testing-library/react"; +import Users from "../pages/users/Users"; +import assert from "assert"; + +test("Check the users page loads", () => { + const{container} = render(); + let title : HTMLHeadingElement = container.querySelector("h1") as HTMLHeadingElement; + assert(title != null); + expect(title).toBeInTheDocument(); + assert((title.textContent as string).trim() === "Users Found:"); +}); + +test("Check the div with the main container is loaded", () => { + const{container} = render(); + expect(container.querySelector(".main-container")).toBeInTheDocument(); +}); + +test("Check the div with the list of users is loaded", () => { + const{container} = render(); + expect(container.querySelector(".listUsers")).toBeInTheDocument(); +}); \ No newline at end of file diff --git a/webapp/src/unused/EmailForm.tsx b/webapp/src/unused/EmailForm.tsx deleted file mode 100644 index ad654f2..0000000 --- a/webapp/src/unused/EmailForm.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import React, {useState} from 'react'; -import Button from '@mui/material/Button'; -import TextField from '@mui/material/TextField'; -import Snackbar from '@mui/material/Snackbar'; -import type {AlertColor} from '@mui/material/Alert'; -import Alert from '@mui/material/Alert'; - -type EmailFormProps = { - OnUserListChange: () => void; -} - -type NotificationType = { - severity: AlertColor, - message: string; -} - -function EmailForm(props: EmailFormProps): JSX.Element { - - const [username, setUsername] = useState(''); - const [email, setEmail] = useState(''); - - const [notificationStatus, setNotificationStatus] = useState(false); - const [notification, setNotification] = useState({severity:'success',message:''}); - - - - const handleSubmit = async (e: React.FormEvent) => { - e.preventDefault(); - // let result:boolean = await add({username, email}); - // if (result){ - // setNotificationStatus(true); - // setNotification({ - // severity:'success', - // message:'You have been registered in the system!' - // }); - // //Notify the change to the parent component - // props.OnUserListChange(); - // } - // else{ - // setNotificationStatus(true); - // setNotification({ - // severity:'error', - // message:'There\'s been an error in the register proccess.' - // }); - // } - } - - return ( - <> -
    - setUsername(e.target.value)} - sx={{ my: 2 }} - /> - setEmail(e.target.value)} - sx={{ my: 2 }} - /> - - - {setNotificationStatus(false)}}> - - {notification.message} - - - - ); -} - -export default EmailForm; diff --git a/webapp/src/unused/UserList.tsx b/webapp/src/unused/UserList.tsx deleted file mode 100644 index 162f70a..0000000 --- a/webapp/src/unused/UserList.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import {User} from '../shared/shareddtypes'; -import List from '@mui/material/List'; -import ListItem from '@mui/material/ListItem'; -import ListItemIcon from '@mui/material/ListItemIcon'; -import ListItemText from '@mui/material/ListItemText'; -import ContactPageIcon from '@mui/icons-material/ContactPage'; - - -type UserListProps = { - users: User[]; -} - -function UserList(props: UserListProps): JSX.Element { - return ( - <> - - {props.users.map((user,i)=>{ - return ( - - - - - - - ) - })} - - - - - - ); -} - -export default UserList; diff --git a/webapp/src/unused/Welcome.tsx b/webapp/src/unused/Welcome.tsx deleted file mode 100644 index 162c0a9..0000000 --- a/webapp/src/unused/Welcome.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import Grid from '@mui/material/Grid'; -import Box from '@mui/material/Box'; -import logo from '../logo.svg'; - -type WelcomeProps = { - message: string; -} - -function Welcome(props: WelcomeProps): JSX.Element { - - return ( - - - Hi, {props.message} - - - logo - - - - - ); -} - -export default Welcome; \ No newline at end of file diff --git a/webapp/src/unused/api/api.ts b/webapp/src/unused/api/api.ts deleted file mode 100644 index 1fe0d47..0000000 --- a/webapp/src/unused/api/api.ts +++ /dev/null @@ -1,2 +0,0 @@ -export{} -// Use userApi for API calls related to the user diff --git a/webapp/src/unused/api/userApi.ts b/webapp/src/unused/api/userApi.ts deleted file mode 100644 index 256c159..0000000 --- a/webapp/src/unused/api/userApi.ts +++ /dev/null @@ -1,21 +0,0 @@ -import {User} from "../../shared/shareddtypes"; - -export async function add(user : User) : Promise { - const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000/api' - let response = await fetch(apiEndPoint+'/users/add', { - method: 'POST', - headers: {'Content-Type':'application/json'}, - body: JSON.stringify({'name':user.username, 'email':user.email}) - }); - if (response.status===200) - return true; - else - return false; -} - -export async function get() : Promise { - const apiEndPoint= process.env.REACT_APP_API_URI || 'http://localhost:5000/api' - let response = await fetch(apiEndPoint+'/users/list'); - //The objects returned by the api are directly convertible to User objects - return response.json() -} \ No newline at end of file diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index 821045d..8326f18 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -22,5 +22,5 @@ }, "include": [ "src","e2e" - ] +, "solidHelper/solidLandmarkManagement.tsx" ] } \ No newline at end of file From 0fccde118aa922042d16c20931da4ccf2fbee0fb Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 1 May 2023 14:35:30 +0200 Subject: [PATCH 49/66] Added the view to see and filter landmarks --- .../otherUsersLandmark/LandmarkFriend.tsx | 116 +++++++++++------- webapp/src/shared/shareddtypes.ts | 1 + 2 files changed, 70 insertions(+), 47 deletions(-) diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index f75f234..9c12304 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -6,18 +6,16 @@ import { Grid, Input, InputLabel, - MenuItem, - Select, TextField, Typography } from "@mui/material"; import markerIcon from "leaflet/dist/images/marker-icon.png"; -import {FormEvent, useEffect, useRef, useState} from "react"; +import {useEffect, useRef, useState} from "react"; import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; -import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; +import {Landmark, LandmarkCategories, Review} from "../../shared/shareddtypes"; import L from "leaflet"; -import { getFriendsLandmarks, getLocations } from "../addLandmark/solidLandmarkManagement"; +import { addLocationReview, addLocationScore, getFriendsLandmarks} from "../addLandmark/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ @@ -25,10 +23,10 @@ export default function LandmarkFriend() : JSX.Element{ const map = useRef(null); const categories = useRef(getCategories()); const [isCommentEnabled, setIsCommentEnabled] = useState(false); - const [selectedMarker, setSelectedMarker] = useState(null); + const [selectedMarker, setSelectedMarker] = useState(-1); const [landmarksReact, setLandmarksReact] = useState([]); const [filters, setFilters] = useState>(new Map()); - const [landmarks, setLandmarks] = useState>(new Map); + const [landmarks, setLandmarks] = useState>(new Map); const {session} = useSession(); function changeFilter(name : string) { @@ -54,7 +52,22 @@ export default function LandmarkFriend() : JSX.Element{ return {categoriesElement} ; - } + }; + + const sendComment : Function = async (comment : string) => { + let webId : string = session.info.webId!; + let date : string = new Date().toLocaleString(); + let review : Review = new Review(webId, date, "", "", comment); + let landmark : Landmark = landmarks.get(selectedMarker) as Landmark; + + await addLocationReview(landmark, review); + }; + + const sendScore : Function = async (score : number) => { + let landmark : Landmark = landmarks.get(selectedMarker) as Landmark; + + await addLocationScore(session.info.webId!, landmark, score); + }; return See friends' landmarks @@ -66,8 +79,8 @@ export default function LandmarkFriend() : JSX.Element{ {loadCategories()} - { isCommentEnabled ? : null} - { isCommentEnabled ? : null } + { isCommentEnabled ? : null } + { isCommentEnabled ? : null} @@ -94,32 +107,58 @@ async function getData(setIsCommentEnabled : Function, setSelectedMarker : Funct landmarks = landmarks.filter(landmark => filters.get(landmark.category)) } setIsCommentEnabled(false); - setSelectedMarker(null); - - let landmarksComponent : JSX.Element[] = landmarks.map(landmark => { - return { - setIsCommentEnabled(true); - setSelectedMarker(e.target); - } - } - } icon = {L.icon({iconUrl: markerIcon})}> - - {landmark.name} - {landmark.category} - - - }); - let mapLandmarks : Map = new Map(); + setSelectedMarker(-1); + + let landmarksComponent : JSX.Element[] = []; + let mapLandmarks : Map = new Map(); for (let i : number = 0; i < landmarks.length; i++) { - mapLandmarks.set(landmarksComponent[i], landmarks[i]); + mapLandmarks.set(i, landmarks[i]); + landmarksComponent.push( { + setIsCommentEnabled(true); + setSelectedMarker(i); + } + } + } icon = {L.icon({iconUrl: markerIcon})}> + + {landmarks[i].name} - {landmarks[i].category} + + + ); } setLandmarks(mapLandmarks); setLandmarksReact(landmarksComponent); } -function AddScoreForm() : JSX.Element { - return
    +function AddScoreForm(props : any) : JSX.Element { + const sendScore : Function = () => { + let value : number = parseFloat((document.getElementById("comment") as HTMLInputElement)!.value); + props.sendScore(value); + }; + return + + Add a score + + Score + + + + + + +
    ; + } + +function AddCommentForm(props : any) : JSX.Element { + const sendComment : Function = () => { + let comment : string = (document.getElementById("comment") as HTMLInputElement).textContent!; + if (comment.trim() !== "") { + props.sendComment(comment); + } + }; + return
    Add a comment @@ -130,23 +169,6 @@ function AddScoreForm() : JSX.Element {
    - ; -} - -function AddCommentForm() : JSX.Element { - return
    - - Add a score - - Score - - - - - - -
    ; } function getCategories() : string[] { diff --git a/webapp/src/shared/shareddtypes.ts b/webapp/src/shared/shareddtypes.ts index d6bdc4b..1ed085a 100644 --- a/webapp/src/shared/shareddtypes.ts +++ b/webapp/src/shared/shareddtypes.ts @@ -7,6 +7,7 @@ export type User = { }; export class Landmark { + id?: number; name:string; category:string; latitude:number; From f778a329ab80eee26d85be3caef37abc9be9be58 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 1 May 2023 14:52:43 +0200 Subject: [PATCH 50/66] solidLandmarkManagement Updated to solve conflicts --- .../addLandmark/solidLandmarkManagement.tsx | 315 ++++++++++++------ 1 file changed, 213 insertions(+), 102 deletions(-) diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index da10738..1708b8d 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -1,7 +1,24 @@ -import type { Landmark, Review }from "../../shared/shareddtypes"; +import type { Landmark, Review }from "../src/shared/shareddtypes"; import { fetch } from "@inrupt/solid-client-authn-browser"; import { + + + + + + + + Expand Down + + + + + + Expand Up + + @@ -28,7 +28,7 @@ import { + createThing, setThing, buildThing, getSolidDataset, saveSolidDatasetAt, createSolidDataset, getStringNoLocale, @@ -17,10 +34,7 @@ import { import { SCHEMA_INRUPT, RDF, FOAF, VCARD} from "@inrupt/vocab-common-rdf"; import {v4 as uuid} from "uuid"; - - // Reading landmarks from POD - /** * Get all the landmarks from the pod * @param webID contains the user webID @@ -28,23 +42,34 @@ import { */ export async function getLocations(webID:string | undefined) { if (webID === undefined) { - throw new Error("The user is not logged in"); + //throw new Error("The user is not logged in"); return; } let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path + + + + + + + + Expand Down + + + let landmarks: Landmark[] = []; // initialize array of landmarks let landmarkPaths; try { let dataSet = await getSolidDataset(inventoryFolder, {fetch: fetch}); // get the inventory dataset - landmarkPaths = getThingAll(dataSet) // get the things from the dataset (Landmark paths) - for (let landmarkPath of landmarkPaths) { // for each Landmark in the dataset - // get the path of the actual Landmark + landmarkPaths = getThingAll(dataSet) // get the things from the dataset (landmark paths) + for (let landmarkPath of landmarkPaths) { // for each landmark in the dataset + // get the path of the actual landmark let path = getStringNoLocale(landmarkPath, SCHEMA_INRUPT.identifier) as string; - // get the Landmark : Location from the dataset of that Landmark + // get the landmark : Location from the dataset of that landmark try{ - let Landmark = await getLocationFromDataset(path) - landmarks.push(Landmark) - // add the Landmark to the array + let landmark = await getLocationFromDataset(path) + landmarks.push(landmark) + // add the landmark to the array } catch(error){ //The url is not accessed(no permision) @@ -52,31 +77,28 @@ export async function getLocations(webID:string | undefined) { } } catch (error) { - // if the Landmark dataset does no exist, return empty array of landmarks + // if the landmark dataset does no exist, return empty array of landmarks landmarks = []; } // return the landmarks return landmarks; } - /** - * Retrieve the Landmark from its dataset - * @param landmarkPath contains the path of the Landmark dataset - * @returns Landmark object + * Retrieve the landmark from its dataset + * @param landmarkPath contains the path of the landmark dataset + * @returns landmark object */ export async function getLocationFromDataset(landmarkPath:string){ let datasetPath = landmarkPath.split('#')[0] // get until index.ttl let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset - let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the Landmark as thing - - // retrieve Landmark information + let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing + // retrieve landmark information let name = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.name) as string; let longitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.longitude) as string; let latitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.latitude) as string; let description = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.description) as string; let url = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.identifier) as string; let categoriesDeserialized = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.Product) as string; - let pictures: string [] = []; // initialize array to store the images as strings pictures = await getLocationImage(datasetPath); // get the images @@ -85,9 +107,8 @@ export async function getLocationFromDataset(landmarkPath:string){ let scores : Map; // map to store the ratings scores = await getLocationScores(datasetPath); // get the ratings - // create Location object - let Landmark : Landmark = { + let landmark : Landmark = { name: name, category: categoriesDeserialized, latitude: parseFloat(latitude), @@ -98,11 +119,8 @@ export async function getLocationFromDataset(landmarkPath:string){ pictures: pictures, url: url, } - - - return Landmark; + return landmark; } - /** * Given the folder containing the images of the landmarks, gets the images (things) inside the dataset. * @param imagesFolderUrl url of the images folder @@ -124,7 +142,6 @@ export async function getLocationImage(imagesFolderUrl:string){ images.push(URL.createObjectURL(file));//Creates the file as URL and pushes it to the } }catch(e){ - } } } catch (error){ @@ -133,9 +150,8 @@ export async function getLocationImage(imagesFolderUrl:string){ } return images; } - /** - * Get the reviews of a Landmark + * Get the reviews of a landmark * @param folder contains the dataset containing the reviews * @returns array of reviews */ @@ -170,9 +186,8 @@ export async function getLocationReviews(folder:string) { } return reviews; } - /** - * Get the scores of a Landmark + * Get the scores of a landmark * @param folder contains the dataset containing the scores * @returns Map containing the scores and their creator */ @@ -195,53 +210,49 @@ export async function getLocationScores(folder:string) { } return scores; } - // Writing landmarks to POD - /** - * Add the Landmark to the inventory and creates the Landmark dataset. + * Add the landmark to the inventory and creates the landmark dataset. * @param webID contains the user webID - * @param Landmark contains the Landmark to be added + * @param landmark contains the landmark to be added */ -export async function createLocation(webID:string, Landmark:Landmark) { +export async function createLocation(webID:string, landmark:Landmark) { let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ let landmarksFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path let landmarkId; - // add Landmark to inventory + // add landmark to inventory try { - landmarkId = await addLocationToInventory(landmarksFolder, Landmark) // add the Landmark to the inventory and get its ID + landmarkId = await addLocationToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID } catch (error){ - // if the inventory does not exist, create it and add the Landmark - landmarkId = await createInventory(landmarksFolder, Landmark) + // if the inventory does not exist, create it and add the landmark + landmarkId = await createInventory(landmarksFolder, landmark) } if (landmarkId === undefined) - return; // if the Landmark could not be added, return (error) + return; // if the landmark could not be added, return (error) - // path for the new Landmark dataset + // path for the new landmark dataset let individualLocationFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; - // create dataset for the Landmark + // create dataset for the landmark try { - await createLocationDataSet(individualLocationFolder, Landmark, landmarkId) + await createLocationDataSet(individualLocationFolder, landmark, landmarkId) } catch (error) { console.log(error) } } - /** - * Adds the given Landmark to the Landmark inventory + * Adds the given landmark to the landmark inventory * @param landmarksFolder contains the inventory folder - * @param Landmark contains the Landmark to be added - * @returns string containing the uuid of the Landmark + * @param landmark contains the landmark to be added + * @returns string containing the uuid of the landmark */ -export async function addLocationToInventory(landmarksFolder:string, Landmark:Landmark) { - let landmarkId = "LOC_" + uuid(); // create Landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // Landmark dataset path +export async function addLocationToInventory(landmarksFolder:string, landmark:Landmark) { + let landmarkId = "LOC_" + uuid(); // create landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path let newLocation = buildThing(createThing({name: landmarkId})) - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the Landmark dataset + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset .build(); - let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory inventory = setThing(inventory, newLocation); // add thing to inventory try { @@ -251,18 +262,17 @@ export async function addLocationToInventory(landmarksFolder:string, Landmark:La console.log(error); } } - /** - * Creates the Landmark inventory and adds the given Landmark to it + * Creates the landmark inventory and adds the given landmark to it * @param landmarksFolder contains the path of the inventory - * @param Landmark contains the Landmark object - * @returns Landmark uuid + * @param landmark contains the landmark object + * @returns landmark uuid */ -export async function createInventory(landmarksFolder: string, Landmark:Landmark){ - let landmarkId = "LOC_" + uuid(); // Landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // Landmark dataset path +export async function createInventory(landmarksFolder: string, landmark:Landmark){ + let landmarkId = "LOC_" + uuid(); // landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path - let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the Landmark dataset path + let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) .build(); @@ -275,26 +285,25 @@ export async function createInventory(landmarksFolder: string, Landmark:Landmark console.log(error); } } - /** - * Create the Landmark in the given folder - * @param landmarkFolder contains the folder to store the Landmark .../private/lomap/landmarks/${landmarkId}/index.ttl - * @param Landmark contains the Landmark to be created - * @param id contains the Landmark uuid + * Create the landmark in the given folder + * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl + * @param landmark contains the landmark to be created + * @param id contains the landmark uuid */ -export async function createLocationDataSet(landmarkFolder:string, Landmark:Landmark, id:string) { - let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the Landmark +export async function createLocationDataSet(landmarkFolder:string, landmark:Landmark, id:string) { + let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the landmark - // create dataset for the Landmark + // create dataset for the landmark let dataSet = createSolidDataset(); - // build Landmark thing + // build landmark thing let newLocation = buildThing(createThing({name: id})) - .addStringNoLocale(SCHEMA_INRUPT.name, Landmark.name.toString()) - .addStringNoLocale(SCHEMA_INRUPT.longitude, Landmark.longitude.toString()) - .addStringNoLocale(SCHEMA_INRUPT.latitude, Landmark.latitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.name, landmark.name.toString()) + .addStringNoLocale(SCHEMA_INRUPT.longitude, landmark.longitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.latitude, landmark.latitude.toString()) .addStringNoLocale(SCHEMA_INRUPT.description, "No description") - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the Landmark - .addStringNoLocale(SCHEMA_INRUPT.Product, Landmark.category) // store string containing the categories + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the landmark + .addStringNoLocale(SCHEMA_INRUPT.Product, landmark.category) // store string containing the categories .addUrl(RDF.type, "https://schema.org/Place") .build(); @@ -302,23 +311,21 @@ export async function createLocationDataSet(landmarkFolder:string, Landmark:Land dataSet = setThing(dataSet, newLocation); // store thing in dataset // save dataset to later add the images dataSet = await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset - await addLocationImage(landmarkFolder, Landmark); // store the images + await addLocationImage(landmarkFolder, landmark); // store the images try { await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset } catch (error) { console.log(error) } } - - /** - * Add the Landmark images to the given folder + * Add the landmark images to the given folder * @param url contains the folder of the images - * @param Landmark contains the Landmark + * @param landmark contains the landmark */ -export async function addLocationImage(url: string, Landmark:Landmark) { +export async function addLocationImage(url: string, landmark:Landmark) { let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) - Landmark.pictures?.forEach(async picture => { // for each picture of the Landmark, build a thing and store it in dataset + landmark.pictures?.forEach(async picture => { // for each picture of the landmark, build a thing and store it in dataset let newImage = buildThing(createThing({name: picture})) .addStringNoLocale(SCHEMA_INRUPT.image, picture) .build(); @@ -331,15 +338,13 @@ export async function addLocationImage(url: string, Landmark:Landmark) { } ); } - - /** - * Add a review to the given Landmark - * @param Landmark contains the Landmark - * @param review contains the review to be added to the Landmark + * Add a review to the given landmark + * @param landmark contains the landmark + * @param review contains the review to be added to the landmark */ -export async function addLocationReview(Landmark:Landmark, review:Review){ - let url = Landmark.url?.split("#")[0] as string; // get the path of the Landmark dataset +export async function addLocationReview(landmark:Landmark, review:Review){ + let url = landmark.url?.split("#")[0] as string; // get the path of the landmark dataset // get dataset let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) // create review @@ -350,7 +355,7 @@ export async function addLocationReview(Landmark:Landmark, review:Review){ .addStringNoLocale(SCHEMA_INRUPT.Person, review.webId) .addUrl(VCARD.Type, VCARD.hasNote) .build(); - // store the review in the Landmark dataset + // store the review in the landmark dataset landmarkDataset = setThing(landmarkDataset, newReview) try { @@ -362,13 +367,13 @@ export async function addLocationReview(Landmark:Landmark, review:Review){ } /** - * Add a rating to the given Landmark - * @param webId contains the webid of the user rating the Landmark - * @param Landmark contains the Landmark + * Add a rating to the given landmark + * @param webId contains the webid of the user rating the landmark + * @param landmark contains the landmark * @param score contains the score of the rating */ - export async function addLocationScore(webId:string, Landmark:Landmark, score:number){ - let url = Landmark.url?.split("#")[0] as string; // get Landmark dataset path + export async function addLocationScore(webId:string, landmark:Landmark, score:number){ + let url = landmark.url?.split("#")[0] as string; // get landmark dataset path // get dataset let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) // create score @@ -387,16 +392,122 @@ export async function addLocationReview(Landmark:Landmark, review:Review){ console.log(error); } } - - // Friend management - +/** + * Grant/ Revoke permissions of friends regarding a particular landmark + * @param friend webID of the friend to grant or revoke permissions + * @param landmarkURL landmark to give/revoke permission to + * @param giveAccess if true, permissions are granted, if false permissions are revoked + */ +export async function setAccessToFriend(friend:string, landmarkURL:string, giveAccess:boolean){ + let myInventory = `${landmarkURL.split("private")[0]}private/lomap/inventory/index.ttl` + await giveAccessToInventory(myInventory, friend); + let resourceURL = landmarkURL.split("#")[0]; // dataset path + // Fetch the SolidDataset and its associated ACL, if available: + let myDatasetWithAcl : any; + try { + myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); + // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: + let resourceAcl; + if (!hasResourceAcl(myDatasetWithAcl)) { + + if (!hasFallbackAcl(myDatasetWithAcl)) { + // create new access control list + resourceAcl = createAcl(myDatasetWithAcl); + } + else{ + // create access control list from fallback + resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); + } + } else { + // get the access control list of the dataset + resourceAcl = getResourceAcl(myDatasetWithAcl); + } + let updatedAcl; + if (giveAccess) { + // grant permissions + updatedAcl = setAgentDefaultAccess( + resourceAcl, + friend, + { read: true, append: true, write: false, control: true } + ); + } + else{ + // revoke permissions + updatedAcl = setAgentDefaultAccess( + resourceAcl, + friend, + { read: false, append: false, write: false, control: false } + ); + } + // save the access control list + await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); + } + catch (error){ // catch any possible thrown errors + console.log(error) + } +} +export async function giveAccessToInventory(resourceURL:string, friend:string){ + let myDatasetWithAcl : any; + try { + myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); // inventory + // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: + let resourceAcl; + if (!hasResourceAcl(myDatasetWithAcl)) { + if (!hasAccessibleAcl(myDatasetWithAcl)) { + // "The current user does not have permission to change access rights to this Resource." + } + if (!hasFallbackAcl(myDatasetWithAcl)) { + // create new access control list + resourceAcl = createAcl(myDatasetWithAcl); + } + else{ + // create access control list from fallback + resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); + } + } else { + // get the access control list of the dataset + resourceAcl = getResourceAcl(myDatasetWithAcl); + } + let updatedAcl; + // grant permissions + updatedAcl = setAgentResourceAccess( + resourceAcl, + friend, + { read: true, append: true, write: false, control: false } + ); + // save the access control list + await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); + } + catch (error){ // catch any possible thrown errors + console.log(error) + } +} +export async function addSolidFriend(webID: string,friendURL: string): Promise<{error:boolean, errorMessage:string}>{ + let profile = webID.split("#")[0]; + let dataSet = await getSolidDataset(profile+"#me", {fetch: fetch});//dataset card me + + let thing =await getThing(dataSet, profile+"#me") as Thing; // :me from dataset + + try{ + let newFriend = buildThing(thing) + .addUrl(FOAF.knows, friendURL as string) + .build(); + + dataSet = setThing(dataSet, newFriend); + dataSet = await saveSolidDatasetAt(webID, dataSet, {fetch: fetch}) + } catch(err){ + return{error:true,errorMessage:"The url is not valid."} + } + + return{error:false,errorMessage:""} + + } export async function getFriendsLandmarks(webID:string){ let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); - - return await Promise.all(friends.map(friend => getLocations(friend as string))); + const landmarkPromises = friends.map(friend => getLocations(friend as string)); + return await Promise.all(landmarkPromises); } - export async function getUserProfile(webID: string) : Promise{ // get the url of the full dataset let profile = webID.split("#")[0]; //just in case there is extra information in the url From 53564672c004b64249ec651bdc643fd12fa58dda Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 1 May 2023 14:55:41 +0200 Subject: [PATCH 51/66] Change for solving conflicts --- webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 90db302..188e10e 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -17,7 +17,6 @@ import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; import L from "leaflet"; -import { getLocations } from "../../../solidHelper/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ @@ -166,4 +165,4 @@ function LandmarkFilter(props : any) : JSX.Element {
    ; -} \ No newline at end of file +} From bb0539640ebd48177bbdc020acb44c0d142f95c9 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 1 May 2023 15:00:59 +0200 Subject: [PATCH 52/66] Change for solving conflicts --- .../addLandmark/solidLandmarkManagement.tsx | 61 ++++++++++--------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx index 1708b8d..ca82aba 100644 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -2,23 +2,6 @@ import type { Landmark, Review }from "../src/shared/shareddtypes"; import { fetch } from "@inrupt/solid-client-authn-browser"; import { - - - - - - - - Expand Down - - - - - - Expand Up - - @@ -28,7 +28,7 @@ import { - createThing, setThing, buildThing, getSolidDataset, saveSolidDatasetAt, createSolidDataset, getStringNoLocale, @@ -34,7 +17,10 @@ import { import { SCHEMA_INRUPT, RDF, FOAF, VCARD} from "@inrupt/vocab-common-rdf"; import {v4 as uuid} from "uuid"; + + // Reading landmarks from POD + /** * Get all the landmarks from the pod * @param webID contains the user webID @@ -46,17 +32,6 @@ export async function getLocations(webID:string | undefined) { return; } let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path - - - - - - - - Expand Down - - - let landmarks: Landmark[] = []; // initialize array of landmarks let landmarkPaths; try { @@ -83,6 +58,7 @@ export async function getLocations(webID:string | undefined) { // return the landmarks return landmarks; } + /** * Retrieve the landmark from its dataset * @param landmarkPath contains the path of the landmark dataset @@ -92,6 +68,7 @@ export async function getLocationFromDataset(landmarkPath:string){ let datasetPath = landmarkPath.split('#')[0] // get until index.ttl let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing + // retrieve landmark information let name = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.name) as string; let longitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.longitude) as string; @@ -99,6 +76,7 @@ export async function getLocationFromDataset(landmarkPath:string){ let description = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.description) as string; let url = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.identifier) as string; let categoriesDeserialized = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.Product) as string; + let pictures: string [] = []; // initialize array to store the images as strings pictures = await getLocationImage(datasetPath); // get the images @@ -107,6 +85,7 @@ export async function getLocationFromDataset(landmarkPath:string){ let scores : Map; // map to store the ratings scores = await getLocationScores(datasetPath); // get the ratings + // create Location object let landmark : Landmark = { name: name, @@ -119,8 +98,11 @@ export async function getLocationFromDataset(landmarkPath:string){ pictures: pictures, url: url, } + + return landmark; } + /** * Given the folder containing the images of the landmarks, gets the images (things) inside the dataset. * @param imagesFolderUrl url of the images folder @@ -142,6 +124,7 @@ export async function getLocationImage(imagesFolderUrl:string){ images.push(URL.createObjectURL(file));//Creates the file as URL and pushes it to the } }catch(e){ + } } } catch (error){ @@ -150,6 +133,7 @@ export async function getLocationImage(imagesFolderUrl:string){ } return images; } + /** * Get the reviews of a landmark * @param folder contains the dataset containing the reviews @@ -186,6 +170,7 @@ export async function getLocationReviews(folder:string) { } return reviews; } + /** * Get the scores of a landmark * @param folder contains the dataset containing the scores @@ -210,7 +195,9 @@ export async function getLocationScores(folder:string) { } return scores; } + // Writing landmarks to POD + /** * Add the landmark to the inventory and creates the landmark dataset. * @param webID contains the user webID @@ -240,6 +227,7 @@ export async function createLocation(webID:string, landmark:Landmark) { console.log(error) } } + /** * Adds the given landmark to the landmark inventory * @param landmarksFolder contains the inventory folder @@ -253,6 +241,7 @@ export async function addLocationToInventory(landmarksFolder:string, landmark:La let newLocation = buildThing(createThing({name: landmarkId})) .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset .build(); + let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory inventory = setThing(inventory, newLocation); // add thing to inventory try { @@ -262,6 +251,7 @@ export async function addLocationToInventory(landmarksFolder:string, landmark:La console.log(error); } } + /** * Creates the landmark inventory and adds the given landmark to it * @param landmarksFolder contains the path of the inventory @@ -285,6 +275,7 @@ export async function createInventory(landmarksFolder: string, landmark:Landmark console.log(error); } } + /** * Create the landmark in the given folder * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl @@ -318,6 +309,8 @@ export async function createLocationDataSet(landmarkFolder:string, landmark:Land console.log(error) } } + + /** * Add the landmark images to the given folder * @param url contains the folder of the images @@ -338,6 +331,8 @@ export async function addLocationImage(url: string, landmark:Landmark) { } ); } + + /** * Add a review to the given landmark * @param landmark contains the landmark @@ -392,7 +387,10 @@ export async function addLocationReview(landmark:Landmark, review:Review){ console.log(error); } } + + // Friend management + /** * Grant/ Revoke permissions of friends regarding a particular landmark * @param friend webID of the friend to grant or revoke permissions @@ -423,6 +421,7 @@ export async function setAccessToFriend(friend:string, landmarkURL:string, giveA // get the access control list of the dataset resourceAcl = getResourceAcl(myDatasetWithAcl); } + let updatedAcl; if (giveAccess) { // grant permissions @@ -447,6 +446,7 @@ export async function setAccessToFriend(friend:string, landmarkURL:string, giveA console.log(error) } } + export async function giveAccessToInventory(resourceURL:string, friend:string){ let myDatasetWithAcl : any; try { @@ -469,6 +469,7 @@ export async function giveAccessToInventory(resourceURL:string, friend:string){ // get the access control list of the dataset resourceAcl = getResourceAcl(myDatasetWithAcl); } + let updatedAcl; // grant permissions updatedAcl = setAgentResourceAccess( @@ -483,6 +484,7 @@ export async function giveAccessToInventory(resourceURL:string, friend:string){ console.log(error) } } + export async function addSolidFriend(webID: string,friendURL: string): Promise<{error:boolean, errorMessage:string}>{ let profile = webID.split("#")[0]; let dataSet = await getSolidDataset(profile+"#me", {fetch: fetch});//dataset card me @@ -503,11 +505,14 @@ export async function addSolidFriend(webID: string,friendURL: string): Promise<{ return{error:false,errorMessage:""} } + export async function getFriendsLandmarks(webID:string){ let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); const landmarkPromises = friends.map(friend => getLocations(friend as string)); + return await Promise.all(landmarkPromises); } + export async function getUserProfile(webID: string) : Promise{ // get the url of the full dataset let profile = webID.split("#")[0]; //just in case there is extra information in the url From aee041b21bbfcb4573e1800c04a9c48479eac9ed Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 1 May 2023 15:08:02 +0200 Subject: [PATCH 53/66] Conflicts From 030eb99acdf5a0749d455859caa172f561e82c97 Mon Sep 17 00:00:00 2001 From: Diego Villanueva <98838739+UO283615@users.noreply.github.com> Date: Mon, 1 May 2023 15:10:55 +0200 Subject: [PATCH 54/66] conflict solving --- webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 9c12304..0ea3e39 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -171,8 +171,9 @@ function AddCommentForm(props : any) : JSX.Element { } + function getCategories() : string[] { let categories : string[] = Object.values(LandmarkCategories); categories.push("All"); return categories; -} \ No newline at end of file +} From 51ebfb999196742d1506ef2d9ef72ee4c1263371 Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Mon, 1 May 2023 15:23:23 +0200 Subject: [PATCH 55/66] Conflict solving --- .../addLandmark/solidLandmarkManagement.tsx | 491 ++++++++++++++++++ .../otherUsersLandmark/LandmarkFriend.tsx | 3 +- webapp/src/test/SharedTypes.test.tsx | 37 ++ 3 files changed, 530 insertions(+), 1 deletion(-) create mode 100644 webapp/src/pages/addLandmark/solidLandmarkManagement.tsx create mode 100644 webapp/src/test/SharedTypes.test.tsx diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx new file mode 100644 index 0000000..450d31b --- /dev/null +++ b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx @@ -0,0 +1,491 @@ +import type { Landmark, Review }from "../../shared/shareddtypes"; +import { fetch } from "@inrupt/solid-client-authn-browser"; + +import { + createThing, setThing, buildThing, + getSolidDataset, saveSolidDatasetAt, + createSolidDataset, getStringNoLocale, + Thing, getThing, getThingAll, + getSolidDatasetWithAcl, hasResourceAcl, + hasFallbackAcl, hasAccessibleAcl, createAcl, + createAclFromFallbackAcl, getResourceAcl, + setAgentResourceAccess, saveAclFor, + setAgentDefaultAccess, getUrl, getUrlAll, + getFile, isRawData, + } from "@inrupt/solid-client"; + + import { SCHEMA_INRUPT, RDF, FOAF, VCARD} from "@inrupt/vocab-common-rdf"; + + import {v4 as uuid} from "uuid"; +// Reading landmarks from POD + +/** + * Get all the landmarks from the pod + * @param webID contains the user webID + * @returns array of landmarks + */ +export async function getLocations(webID:string | undefined) { + if (webID === undefined) { + throw new Error("The user is not logged in"); + return; + } + let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path + let landmarks: Landmark[] = []; // initialize array of landmarks + let landmarkPaths; + try { + let dataSet = await getSolidDataset(inventoryFolder, {fetch: fetch}); // get the inventory dataset + landmarkPaths = getThingAll(dataSet) // get the things from the dataset (landmark paths) + for (let landmarkPath of landmarkPaths) { // for each landmark in the dataset + // get the path of the actual landmark + let path = getStringNoLocale(landmarkPath, SCHEMA_INRUPT.identifier) as string; + // get the landmark : Location from the dataset of that landmark + try{ + let landmark = await getLocationFromDataset(path) + landmarks.push(landmark) + // add the landmark to the array + } + catch(error){ + //The url is not accessed(no permision) + } + + } + } catch (error) { + // if the landmark dataset does no exist, return empty array of landmarks + landmarks = []; + } + // return the landmarks + return landmarks; +} +/** + * Retrieve the landmark from its dataset + * @param landmarkPath contains the path of the landmark dataset + * @returns landmark object + */ +export async function getLocationFromDataset(landmarkPath:string){ + let datasetPath = landmarkPath.split('#')[0] // get until index.ttl + let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset + let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing + // retrieve landmark information + let name = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.name) as string; + let longitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.longitude) as string; + let latitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.latitude) as string; + let description = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.description) as string; + let url = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.identifier) as string; + let categoriesDeserialized = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.Product) as string; + + let pictures: string [] = []; // initialize array to store the images as strings + pictures = await getLocationImage(datasetPath); // get the images + let reviews: Review[] = []; // initialize array to store the reviews + reviews = await getLocationReviews(datasetPath) // get the reviews + let scores : Map; // map to store the ratings + scores = await getLocationScores(datasetPath); // get the ratings + + // create Location object + let landmark : Landmark = { + name: name, + category: categoriesDeserialized, + latitude: parseFloat(latitude), + longitude: parseFloat(longitude), + description: description, + reviews: reviews, + scores: scores, + pictures: pictures, + url: url, + } + return landmark; +} +/** + * Given the folder containing the images of the landmarks, gets the images (things) inside the dataset. + * @param imagesFolderUrl url of the images folder + * @returns string[] containing the images + */ +export async function getLocationImage(imagesFolderUrl:string){ + let images: string[] = []; + let imagesThings; + try { + let imagesDataSet = await getSolidDataset(imagesFolderUrl, {fetch: fetch}); // get images dataset + imagesThings = getThingAll(imagesDataSet) // get all the things in the images dataset + for (let image of imagesThings){ + try{ + const file = await getFile( + image.url, // File in Pod to Read + { fetch: fetch } // fetch from authenticated session + ); + if(isRawData(file)){//If it's a file(not dataset) + images.push(URL.createObjectURL(file));//Creates the file as URL and pushes it to the + } + }catch(e){ + } + } + } catch (error){ + // if the dataset does not exist, return empty array of images + images = []; + } + return images; +} +/** + * Get the reviews of a landmark + * @param folder contains the dataset containing the reviews + * @returns array of reviews + */ +export async function getLocationReviews(folder:string) { + let reviews : Review[] = []; + try { + let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get dataset + // get all things in the dataset of type review + let things = getThingAll(dataSet).filter((thing) => getUrl(thing, VCARD.Type) === VCARD.hasNote) + // for each review, create it and add it to the array + for (let review of things) { + // get review information + let title = getStringNoLocale(review, SCHEMA_INRUPT.name) as string; + let content = getStringNoLocale(review, SCHEMA_INRUPT.description) as string; + let date = getStringNoLocale(review, SCHEMA_INRUPT.startDate) as string; + let webId = getStringNoLocale(review, SCHEMA_INRUPT.Person) as string; + let name = getStringNoLocale(await getUserProfile(webId),FOAF.name) as string; + + let newReview : Review = { + title: title, + content: content, + date: date, + webId: webId, + username: name + } + reviews.push(newReview); + } + + } catch (error) { + // if there are any errors, retrieve empty array of reviews + reviews = []; + } + return reviews; + } +/** + * Get the scores of a landmark + * @param folder contains the dataset containing the scores + * @returns Map containing the scores and their creator + */ +export async function getLocationScores(folder:string) { + let scores : Map = new Map(); + try { + let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get the whole dataset + // get things of type score + let things = getThingAll(dataSet).filter((thing) => getUrl(thing, VCARD.Type) === VCARD.hasValue) + // for each score, create it and add it to the map + for (let score of things) { + let value = parseInt(getStringNoLocale(score, SCHEMA_INRUPT.value) as string); + let webId = getStringNoLocale(score, SCHEMA_INRUPT.Person) as string; + + scores.set(webId, value); + } + + } catch (error) { + scores = new Map(); // retrieve empty map + } + return scores; + } +// Writing landmarks to POD +/** + * Add the landmark to the inventory and creates the landmark dataset. + * @param webID contains the user webID + * @param landmark contains the landmark to be added + */ +export async function createLocation(webID:string, landmark:Landmark) { + let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ + let landmarksFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path + let landmarkId; + // add landmark to inventory + try { + landmarkId = await addLocationToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID + } catch (error){ + // if the inventory does not exist, create it and add the landmark + landmarkId = await createInventory(landmarksFolder, landmark) + } + if (landmarkId === undefined) + return; // if the landmark could not be added, return (error) + + // path for the new landmark dataset + let individualLocationFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; + + // create dataset for the landmark + try { + await createLocationDataSet(individualLocationFolder, landmark, landmarkId) + } catch (error) { + console.log(error) + } +} +/** + * Adds the given landmark to the landmark inventory + * @param landmarksFolder contains the inventory folder + * @param landmark contains the landmark to be added + * @returns string containing the uuid of the landmark + */ +export async function addLocationToInventory(landmarksFolder:string, landmark:Landmark) { + let landmarkId = "LOC_" + uuid(); // create landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path + + let newLocation = buildThing(createThing({name: landmarkId})) + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset + .build(); + let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory + inventory = setThing(inventory, newLocation); // add thing to inventory + try { + await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) //save the inventory + return landmarkId; + } catch (error) { + console.log(error); + } +} + /** + * Creates the landmark inventory and adds the given landmark to it + * @param landmarksFolder contains the path of the inventory + * @param landmark contains the landmark object + * @returns landmark uuid + */ +export async function createInventory(landmarksFolder: string, landmark:Landmark){ + let landmarkId = "LOC_" + uuid(); // landmark uuid + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path + + let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) + .build(); + + let inventory = createSolidDataset() // create dataset for the inventory + inventory = setThing(inventory, newLocation); // add name to inventory + try { + await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) // save inventory dataset + return landmarkId; + } catch (error) { + console.log(error); + } +} +/** + * Create the landmark in the given folder + * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl + * @param landmark contains the landmark to be created + * @param id contains the landmark uuid + */ +export async function createLocationDataSet(landmarkFolder:string, landmark:Landmark, id:string) { + let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the landmark + + // create dataset for the landmark + let dataSet = createSolidDataset(); + // build landmark thing + let newLocation = buildThing(createThing({name: id})) + .addStringNoLocale(SCHEMA_INRUPT.name, landmark.name.toString()) + .addStringNoLocale(SCHEMA_INRUPT.longitude, landmark.longitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.latitude, landmark.latitude.toString()) + .addStringNoLocale(SCHEMA_INRUPT.description, "No description") + .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the landmark + .addStringNoLocale(SCHEMA_INRUPT.Product, landmark.category) // store string containing the categories + .addUrl(RDF.type, "https://schema.org/Place") + .build(); + + + dataSet = setThing(dataSet, newLocation); // store thing in dataset + // save dataset to later add the images + dataSet = await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset + await addLocationImage(landmarkFolder, landmark); // store the images + try { + await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset + } catch (error) { + console.log(error) + } + } + /** + * Add the landmark images to the given folder + * @param url contains the folder of the images + * @param landmark contains the landmark + */ +export async function addLocationImage(url: string, landmark:Landmark) { + let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) + landmark.pictures?.forEach(async picture => { // for each picture of the landmark, build a thing and store it in dataset + let newImage = buildThing(createThing({name: picture})) + .addStringNoLocale(SCHEMA_INRUPT.image, picture) + .build(); + landmarkDataset = setThing(landmarkDataset, newImage); + try { + landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); + } catch (error){ + console.log(error); + } + } + ); + } + /** + * Add a review to the given landmark + * @param landmark contains the landmark + * @param review contains the review to be added to the landmark + */ +export async function addLocationReview(landmark:Landmark, review:Review){ + let url = landmark.url?.split("#")[0] as string; // get the path of the landmark dataset + // get dataset + let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) + // create review + let newReview = buildThing(createThing()) + .addStringNoLocale(SCHEMA_INRUPT.name, review.title) + .addStringNoLocale(SCHEMA_INRUPT.description, review.content) + .addStringNoLocale(SCHEMA_INRUPT.startDate, review.date) + .addStringNoLocale(SCHEMA_INRUPT.Person, review.webId) + .addUrl(VCARD.Type, VCARD.hasNote) + .build(); + // store the review in the landmark dataset + landmarkDataset = setThing(landmarkDataset, newReview) + + try { + // save dataset + landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); + } catch (error){ + console.log(error); + } + } + + /** + * Add a rating to the given landmark + * @param webId contains the webid of the user rating the landmark + * @param landmark contains the landmark + * @param score contains the score of the rating + */ + export async function addLocationScore(webId:string, landmark:Landmark, score:number){ + let url = landmark.url?.split("#")[0] as string; // get landmark dataset path + // get dataset + let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) + // create score + let newScore = buildThing(createThing()) + .addStringNoLocale(SCHEMA_INRUPT.value, score.toString()) + .addStringNoLocale(SCHEMA_INRUPT.Person, webId) + .addUrl(VCARD.Type, VCARD.hasValue) + .build(); + // add score to the dataset + landmarkDataset = setThing(landmarkDataset, newScore) + + try { + // save dataset + landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); + } catch (error){ + console.log(error); + } + } +// Friend management +/** + * Grant/ Revoke permissions of friends regarding a particular landmark + * @param friend webID of the friend to grant or revoke permissions + * @param landmarkURL landmark to give/revoke permission to + * @param giveAccess if true, permissions are granted, if false permissions are revoked + */ +export async function setAccessToFriend(friend:string, landmarkURL:string, giveAccess:boolean){ + let myInventory = `${landmarkURL.split("private")[0]}private/lomap/inventory/index.ttl` + await giveAccessToInventory(myInventory, friend); + let resourceURL = landmarkURL.split("#")[0]; // dataset path + // Fetch the SolidDataset and its associated ACL, if available: + let myDatasetWithAcl : any; + try { + myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); + // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: + let resourceAcl; + if (!hasResourceAcl(myDatasetWithAcl)) { + + if (!hasFallbackAcl(myDatasetWithAcl)) { + // create new access control list + resourceAcl = createAcl(myDatasetWithAcl); + } + else{ + // create access control list from fallback + resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); + } + } else { + // get the access control list of the dataset + resourceAcl = getResourceAcl(myDatasetWithAcl); + } + let updatedAcl; + if (giveAccess) { + // grant permissions + updatedAcl = setAgentDefaultAccess( + resourceAcl, + friend, + { read: true, append: true, write: false, control: true } + ); + } + else{ + // revoke permissions + updatedAcl = setAgentDefaultAccess( + resourceAcl, + friend, + { read: false, append: false, write: false, control: false } + ); + } + // save the access control list + await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); + } + catch (error){ // catch any possible thrown errors + console.log(error) + } +} +export async function giveAccessToInventory(resourceURL:string, friend:string){ + let myDatasetWithAcl : any; + try { + myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); // inventory + // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: + let resourceAcl; + if (!hasResourceAcl(myDatasetWithAcl)) { + if (!hasAccessibleAcl(myDatasetWithAcl)) { + // "The current user does not have permission to change access rights to this Resource." + } + if (!hasFallbackAcl(myDatasetWithAcl)) { + // create new access control list + resourceAcl = createAcl(myDatasetWithAcl); + } + else{ + // create access control list from fallback + resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); + } + } else { + // get the access control list of the dataset + resourceAcl = getResourceAcl(myDatasetWithAcl); + } + let updatedAcl; + // grant permissions + updatedAcl = setAgentResourceAccess( + resourceAcl, + friend, + { read: true, append: true, write: false, control: false } + ); + // save the access control list + await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); + } + catch (error){ // catch any possible thrown errors + console.log(error) + } +} +export async function addSolidFriend(webID: string,friendURL: string): Promise<{error:boolean, errorMessage:string}>{ + let profile = webID.split("#")[0]; + let dataSet = await getSolidDataset(profile+"#me", {fetch: fetch});//dataset card me + + let thing =await getThing(dataSet, profile+"#me") as Thing; // :me from dataset + + try{ + let newFriend = buildThing(thing) + .addUrl(FOAF.knows, friendURL as string) + .build(); + + dataSet = setThing(dataSet, newFriend); + dataSet = await saveSolidDatasetAt(webID, dataSet, {fetch: fetch}) + } catch(err){ + return{error:true,errorMessage:"The url is not valid."} + } + + return{error:false,errorMessage:""} + + } + export async function getFriendsLandmarks(webID:string){ + let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); + const landmarkPromises = friends.map(friend => getLocations(friend as string)); + return await Promise.all(landmarkPromises); + } + export async function getUserProfile(webID: string) : Promise{ + // get the url of the full dataset + let profile = webID.split("#")[0]; //just in case there is extra information in the url + // get the dataset from the url + let dataSet = await getSolidDataset(profile, {fetch: fetch}); + // return the dataset as a thing + return getThing(dataSet, webID) as Thing; +} \ No newline at end of file diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 188e10e..ceb55d2 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -17,6 +17,7 @@ import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, User} from "../../shared/shareddtypes"; import L from "leaflet"; +import { getLocations } from "../addLandmark/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ @@ -165,4 +166,4 @@ function LandmarkFilter(props : any) : JSX.Element { ; -} +} \ No newline at end of file diff --git a/webapp/src/test/SharedTypes.test.tsx b/webapp/src/test/SharedTypes.test.tsx new file mode 100644 index 0000000..7b783f5 --- /dev/null +++ b/webapp/src/test/SharedTypes.test.tsx @@ -0,0 +1,37 @@ +import { Landmark, Review } from '../shared/shareddtypes'; +import assert from "assert"; + +test("LandmarkClassIsCorrect", () => { + let name : string = "TestName"; + let category : string = "TestCategory"; + let latitude : number = -5.72; + let longitude : number = 5.33; + let description : string = "TestDescription"; + let pictures : string[] = ["TestPictures"]; + let reviews : Review[] = []; + let scores : Map = new Map(); + let url : string = "TestUrl"; + + + let landmark : Landmark = { + name : name, + category : category, + latitude : latitude, + longitude : longitude, + description : description, + reviews : reviews, + pictures : pictures, + scores : scores, + url: url + } + + assert(landmark.name == "TestName"); + assert(landmark.category == "TestCategory"); + assert(landmark.latitude == -5.72); + assert(landmark.longitude == 5.33); + assert(landmark.description == "TestDescription"); + expect(landmark.pictures).toBeTruthy(); + expect(landmark.reviews).toBeTruthy(); + expect(landmark.scores).toBeTruthy(); + assert(landmark.url == "TestUrl"); +}); \ No newline at end of file From d876b5f89abbd80957cf7bd28ccbcaef719dfe02 Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Mon, 1 May 2023 15:26:40 +0200 Subject: [PATCH 56/66] Conflict solved --- .../addLandmark/solidLandmarkManagement.tsx | 491 ------------------ .../otherUsersLandmark/LandmarkFriend.tsx | 2 +- 2 files changed, 1 insertion(+), 492 deletions(-) delete mode 100644 webapp/src/pages/addLandmark/solidLandmarkManagement.tsx diff --git a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx b/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx deleted file mode 100644 index 00caa83..0000000 --- a/webapp/src/pages/addLandmark/solidLandmarkManagement.tsx +++ /dev/null @@ -1,491 +0,0 @@ -import type { Landmark, Review }from "../src/shared/shareddtypes"; -import { fetch } from "@inrupt/solid-client-authn-browser"; - -import { - createThing, setThing, buildThing, - getSolidDataset, saveSolidDatasetAt, - createSolidDataset, getStringNoLocale, - Thing, getThing, getThingAll, - getSolidDatasetWithAcl, hasResourceAcl, - hasFallbackAcl, hasAccessibleAcl, createAcl, - createAclFromFallbackAcl, getResourceAcl, - setAgentResourceAccess, saveAclFor, - setAgentDefaultAccess, getUrl, getUrlAll, - getFile, isRawData, - } from "@inrupt/solid-client"; - - import { SCHEMA_INRUPT, RDF, FOAF, VCARD} from "@inrupt/vocab-common-rdf"; - - import {v4 as uuid} from "uuid"; -// Reading landmarks from POD - -/** - * Get all the landmarks from the pod - * @param webID contains the user webID - * @returns array of landmarks - */ -export async function getLocations(webID:string | undefined) { - if (webID === undefined) { - //throw new Error("The user is not logged in"); - return; - } - let inventoryFolder = webID.split("profile")[0] + "private/lomap/inventory/index.ttl"; // inventory folder path - let landmarks: Landmark[] = []; // initialize array of landmarks - let landmarkPaths; - try { - let dataSet = await getSolidDataset(inventoryFolder, {fetch: fetch}); // get the inventory dataset - landmarkPaths = getThingAll(dataSet) // get the things from the dataset (landmark paths) - for (let landmarkPath of landmarkPaths) { // for each landmark in the dataset - // get the path of the actual landmark - let path = getStringNoLocale(landmarkPath, SCHEMA_INRUPT.identifier) as string; - // get the landmark : Location from the dataset of that landmark - try{ - let landmark = await getLocationFromDataset(path) - landmarks.push(landmark) - // add the landmark to the array - } - catch(error){ - //The url is not accessed(no permision) - } - - } - } catch (error) { - // if the landmark dataset does no exist, return empty array of landmarks - landmarks = []; - } - // return the landmarks - return landmarks; -} -/** - * Retrieve the landmark from its dataset - * @param landmarkPath contains the path of the landmark dataset - * @returns landmark object - */ -export async function getLocationFromDataset(landmarkPath:string){ - let datasetPath = landmarkPath.split('#')[0] // get until index.ttl - let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset - let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing - // retrieve landmark information - let name = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.name) as string; - let longitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.longitude) as string; - let latitude = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.latitude) as string; - let description = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.description) as string; - let url = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.identifier) as string; - let categoriesDeserialized = getStringNoLocale(landmarkAsThing, SCHEMA_INRUPT.Product) as string; - - let pictures: string [] = []; // initialize array to store the images as strings - pictures = await getLocationImage(datasetPath); // get the images - let reviews: Review[] = []; // initialize array to store the reviews - reviews = await getLocationReviews(datasetPath) // get the reviews - let scores : Map; // map to store the ratings - scores = await getLocationScores(datasetPath); // get the ratings - - // create Location object - let landmark : Landmark = { - name: name, - category: categoriesDeserialized, - latitude: parseFloat(latitude), - longitude: parseFloat(longitude), - description: description, - reviews: reviews, - scores: scores, - pictures: pictures, - url: url, - } - return landmark; -} -/** - * Given the folder containing the images of the landmarks, gets the images (things) inside the dataset. - * @param imagesFolderUrl url of the images folder - * @returns string[] containing the images - */ -export async function getLocationImage(imagesFolderUrl:string){ - let images: string[] = []; - let imagesThings; - try { - let imagesDataSet = await getSolidDataset(imagesFolderUrl, {fetch: fetch}); // get images dataset - imagesThings = getThingAll(imagesDataSet) // get all the things in the images dataset - for (let image of imagesThings){ - try{ - const file = await getFile( - image.url, // File in Pod to Read - { fetch: fetch } // fetch from authenticated session - ); - if(isRawData(file)){//If it's a file(not dataset) - images.push(URL.createObjectURL(file));//Creates the file as URL and pushes it to the - } - }catch(e){ - } - } - } catch (error){ - // if the dataset does not exist, return empty array of images - images = []; - } - return images; -} -/** - * Get the reviews of a landmark - * @param folder contains the dataset containing the reviews - * @returns array of reviews - */ -export async function getLocationReviews(folder:string) { - let reviews : Review[] = []; - try { - let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get dataset - // get all things in the dataset of type review - let things = getThingAll(dataSet).filter((thing) => getUrl(thing, VCARD.Type) === VCARD.hasNote) - // for each review, create it and add it to the array - for (let review of things) { - // get review information - let title = getStringNoLocale(review, SCHEMA_INRUPT.name) as string; - let content = getStringNoLocale(review, SCHEMA_INRUPT.description) as string; - let date = getStringNoLocale(review, SCHEMA_INRUPT.startDate) as string; - let webId = getStringNoLocale(review, SCHEMA_INRUPT.Person) as string; - let name = getStringNoLocale(await getUserProfile(webId),FOAF.name) as string; - - let newReview : Review = { - title: title, - content: content, - date: date, - webId: webId, - username: name - } - reviews.push(newReview); - } - - } catch (error) { - // if there are any errors, retrieve empty array of reviews - reviews = []; - } - return reviews; - } -/** - * Get the scores of a landmark - * @param folder contains the dataset containing the scores - * @returns Map containing the scores and their creator - */ -export async function getLocationScores(folder:string) { - let scores : Map = new Map(); - try { - let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get the whole dataset - // get things of type score - let things = getThingAll(dataSet).filter((thing) => getUrl(thing, VCARD.Type) === VCARD.hasValue) - // for each score, create it and add it to the map - for (let score of things) { - let value = parseInt(getStringNoLocale(score, SCHEMA_INRUPT.value) as string); - let webId = getStringNoLocale(score, SCHEMA_INRUPT.Person) as string; - - scores.set(webId, value); - } - - } catch (error) { - scores = new Map(); // retrieve empty map - } - return scores; - } -// Writing landmarks to POD -/** - * Add the landmark to the inventory and creates the landmark dataset. - * @param webID contains the user webID - * @param landmark contains the landmark to be added - */ -export async function createLocation(webID:string, landmark:Landmark) { - let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ - let landmarksFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path - let landmarkId; - // add landmark to inventory - try { - landmarkId = await addLocationToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID - } catch (error){ - // if the inventory does not exist, create it and add the landmark - landmarkId = await createInventory(landmarksFolder, landmark) - } - if (landmarkId === undefined) - return; // if the landmark could not be added, return (error) - - // path for the new landmark dataset - let individualLocationFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; - - // create dataset for the landmark - try { - await createLocationDataSet(individualLocationFolder, landmark, landmarkId) - } catch (error) { - console.log(error) - } -} -/** - * Adds the given landmark to the landmark inventory - * @param landmarksFolder contains the inventory folder - * @param landmark contains the landmark to be added - * @returns string containing the uuid of the landmark - */ -export async function addLocationToInventory(landmarksFolder:string, landmark:Landmark) { - let landmarkId = "LOC_" + uuid(); // create landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path - - let newLocation = buildThing(createThing({name: landmarkId})) - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset - .build(); - let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory - inventory = setThing(inventory, newLocation); // add thing to inventory - try { - await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) //save the inventory - return landmarkId; - } catch (error) { - console.log(error); - } -} - /** - * Creates the landmark inventory and adds the given landmark to it - * @param landmarksFolder contains the path of the inventory - * @param landmark contains the landmark object - * @returns landmark uuid - */ -export async function createInventory(landmarksFolder: string, landmark:Landmark){ - let landmarkId = "LOC_" + uuid(); // landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path - - let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) - .build(); - - let inventory = createSolidDataset() // create dataset for the inventory - inventory = setThing(inventory, newLocation); // add name to inventory - try { - await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) // save inventory dataset - return landmarkId; - } catch (error) { - console.log(error); - } -} -/** - * Create the landmark in the given folder - * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl - * @param landmark contains the landmark to be created - * @param id contains the landmark uuid - */ -export async function createLocationDataSet(landmarkFolder:string, landmark:Landmark, id:string) { - let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the landmark - - // create dataset for the landmark - let dataSet = createSolidDataset(); - // build landmark thing - let newLocation = buildThing(createThing({name: id})) - .addStringNoLocale(SCHEMA_INRUPT.name, landmark.name.toString()) - .addStringNoLocale(SCHEMA_INRUPT.longitude, landmark.longitude.toString()) - .addStringNoLocale(SCHEMA_INRUPT.latitude, landmark.latitude.toString()) - .addStringNoLocale(SCHEMA_INRUPT.description, "No description") - .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkIdUrl) // store the url of the landmark - .addStringNoLocale(SCHEMA_INRUPT.Product, landmark.category) // store string containing the categories - .addUrl(RDF.type, "https://schema.org/Place") - .build(); - - - dataSet = setThing(dataSet, newLocation); // store thing in dataset - // save dataset to later add the images - dataSet = await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset - await addLocationImage(landmarkFolder, landmark); // store the images - try { - await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset - } catch (error) { - console.log(error) - } - } - /** - * Add the landmark images to the given folder - * @param url contains the folder of the images - * @param landmark contains the landmark - */ -export async function addLocationImage(url: string, landmark:Landmark) { - let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) - landmark.pictures?.forEach(async picture => { // for each picture of the landmark, build a thing and store it in dataset - let newImage = buildThing(createThing({name: picture})) - .addStringNoLocale(SCHEMA_INRUPT.image, picture) - .build(); - landmarkDataset = setThing(landmarkDataset, newImage); - try { - landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); - } catch (error){ - console.log(error); - } - } - ); - } - /** - * Add a review to the given landmark - * @param landmark contains the landmark - * @param review contains the review to be added to the landmark - */ -export async function addLocationReview(landmark:Landmark, review:Review){ - let url = landmark.url?.split("#")[0] as string; // get the path of the landmark dataset - // get dataset - let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) - // create review - let newReview = buildThing(createThing()) - .addStringNoLocale(SCHEMA_INRUPT.name, review.title) - .addStringNoLocale(SCHEMA_INRUPT.description, review.content) - .addStringNoLocale(SCHEMA_INRUPT.startDate, review.date) - .addStringNoLocale(SCHEMA_INRUPT.Person, review.webId) - .addUrl(VCARD.Type, VCARD.hasNote) - .build(); - // store the review in the landmark dataset - landmarkDataset = setThing(landmarkDataset, newReview) - - try { - // save dataset - landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); - } catch (error){ - console.log(error); - } - } - - /** - * Add a rating to the given landmark - * @param webId contains the webid of the user rating the landmark - * @param landmark contains the landmark - * @param score contains the score of the rating - */ - export async function addLocationScore(webId:string, landmark:Landmark, score:number){ - let url = landmark.url?.split("#")[0] as string; // get landmark dataset path - // get dataset - let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) - // create score - let newScore = buildThing(createThing()) - .addStringNoLocale(SCHEMA_INRUPT.value, score.toString()) - .addStringNoLocale(SCHEMA_INRUPT.Person, webId) - .addUrl(VCARD.Type, VCARD.hasValue) - .build(); - // add score to the dataset - landmarkDataset = setThing(landmarkDataset, newScore) - - try { - // save dataset - landmarkDataset = await saveSolidDatasetAt(url, landmarkDataset, {fetch: fetch}); - } catch (error){ - console.log(error); - } - } -// Friend management -/** - * Grant/ Revoke permissions of friends regarding a particular landmark - * @param friend webID of the friend to grant or revoke permissions - * @param landmarkURL landmark to give/revoke permission to - * @param giveAccess if true, permissions are granted, if false permissions are revoked - */ -export async function setAccessToFriend(friend:string, landmarkURL:string, giveAccess:boolean){ - let myInventory = `${landmarkURL.split("private")[0]}private/lomap/inventory/index.ttl` - await giveAccessToInventory(myInventory, friend); - let resourceURL = landmarkURL.split("#")[0]; // dataset path - // Fetch the SolidDataset and its associated ACL, if available: - let myDatasetWithAcl : any; - try { - myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); - // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: - let resourceAcl; - if (!hasResourceAcl(myDatasetWithAcl)) { - - if (!hasFallbackAcl(myDatasetWithAcl)) { - // create new access control list - resourceAcl = createAcl(myDatasetWithAcl); - } - else{ - // create access control list from fallback - resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); - } - } else { - // get the access control list of the dataset - resourceAcl = getResourceAcl(myDatasetWithAcl); - } - let updatedAcl; - if (giveAccess) { - // grant permissions - updatedAcl = setAgentDefaultAccess( - resourceAcl, - friend, - { read: true, append: true, write: false, control: true } - ); - } - else{ - // revoke permissions - updatedAcl = setAgentDefaultAccess( - resourceAcl, - friend, - { read: false, append: false, write: false, control: false } - ); - } - // save the access control list - await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); - } - catch (error){ // catch any possible thrown errors - console.log(error) - } -} -export async function giveAccessToInventory(resourceURL:string, friend:string){ - let myDatasetWithAcl : any; - try { - myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); // inventory - // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: - let resourceAcl; - if (!hasResourceAcl(myDatasetWithAcl)) { - if (!hasAccessibleAcl(myDatasetWithAcl)) { - // "The current user does not have permission to change access rights to this Resource." - } - if (!hasFallbackAcl(myDatasetWithAcl)) { - // create new access control list - resourceAcl = createAcl(myDatasetWithAcl); - } - else{ - // create access control list from fallback - resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); - } - } else { - // get the access control list of the dataset - resourceAcl = getResourceAcl(myDatasetWithAcl); - } - let updatedAcl; - // grant permissions - updatedAcl = setAgentResourceAccess( - resourceAcl, - friend, - { read: true, append: true, write: false, control: false } - ); - // save the access control list - await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); - } - catch (error){ // catch any possible thrown errors - console.log(error) - } -} -export async function addSolidFriend(webID: string,friendURL: string): Promise<{error:boolean, errorMessage:string}>{ - let profile = webID.split("#")[0]; - let dataSet = await getSolidDataset(profile+"#me", {fetch: fetch});//dataset card me - - let thing =await getThing(dataSet, profile+"#me") as Thing; // :me from dataset - - try{ - let newFriend = buildThing(thing) - .addUrl(FOAF.knows, friendURL as string) - .build(); - - dataSet = setThing(dataSet, newFriend); - dataSet = await saveSolidDatasetAt(webID, dataSet, {fetch: fetch}) - } catch(err){ - return{error:true,errorMessage:"The url is not valid."} - } - - return{error:false,errorMessage:""} - - } - export async function getFriendsLandmarks(webID:string){ - let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); - const landmarkPromises = friends.map(friend => getLocations(friend as string)); - return await Promise.all(landmarkPromises); - } - export async function getUserProfile(webID: string) : Promise{ - // get the url of the full dataset - let profile = webID.split("#")[0]; //just in case there is extra information in the url - // get the dataset from the url - let dataSet = await getSolidDataset(profile, {fetch: fetch}); - // return the dataset as a thing - return getThing(dataSet, webID) as Thing; -} \ No newline at end of file diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 0ea3e39..7f27cd3 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -15,7 +15,7 @@ import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, Review} from "../../shared/shareddtypes"; import L from "leaflet"; -import { addLocationReview, addLocationScore, getFriendsLandmarks} from "../addLandmark/solidLandmarkManagement"; +import { addLocationReview, addLocationScore, getFriendsLandmarks} from "../../../solidHelper/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ From 27e4caa0798ed4fc0cc15226be32026bcdaf500e Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Mon, 1 May 2023 17:21:12 +0200 Subject: [PATCH 57/66] Puesto el SolidHelper dentro de src para poder importarlo --- webapp/src/pages/addLandmark/AddLandmark.tsx | 2 +- webapp/src/pages/home/Home.tsx | 2 +- webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx | 2 +- webapp/{ => src}/solidHelper/solidLandmarkManagement.tsx | 2 +- webapp/tsconfig.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename webapp/{ => src}/solidHelper/solidLandmarkManagement.tsx (99%) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index a10244b..1741f00 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -12,7 +12,7 @@ import {Landmark, LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; -import {createLocation} from "../../../solidHelper/solidLandmarkManagement"; +import {createLocation} from "../../solidHelper/solidLandmarkManagement"; export default function AddLandmark() { diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index 7a1ff1b..a3f55eb 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -4,7 +4,7 @@ import "./home.css" import {useSession} from "@inrupt/solid-ui-react"; import {Landmark} from "../../shared/shareddtypes"; import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; -import { getLocations } from "../../../solidHelper/solidLandmarkManagement"; +import { getLocations } from "../../solidHelper/solidLandmarkManagement"; import markerIcon from "leaflet/dist/images/marker-icon.png" import { Icon } from "leaflet"; import {makeRequest} from "../../axios"; diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 7f27cd3..d75c6f4 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -15,7 +15,7 @@ import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, Review} from "../../shared/shareddtypes"; import L from "leaflet"; -import { addLocationReview, addLocationScore, getFriendsLandmarks} from "../../../solidHelper/solidLandmarkManagement"; +import { addLocationReview, addLocationScore, getFriendsLandmarks} from "../../solidHelper/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ diff --git a/webapp/solidHelper/solidLandmarkManagement.tsx b/webapp/src/solidHelper/solidLandmarkManagement.tsx similarity index 99% rename from webapp/solidHelper/solidLandmarkManagement.tsx rename to webapp/src/solidHelper/solidLandmarkManagement.tsx index ca82aba..bfda109 100644 --- a/webapp/solidHelper/solidLandmarkManagement.tsx +++ b/webapp/src/solidHelper/solidLandmarkManagement.tsx @@ -1,4 +1,4 @@ -import type { Landmark, Review }from "../src/shared/shareddtypes"; +import type { Landmark, Review }from "../shared/shareddtypes"; import { fetch } from "@inrupt/solid-client-authn-browser"; import { diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index 8326f18..6298ff2 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -22,5 +22,5 @@ }, "include": [ "src","e2e" -, "solidHelper/solidLandmarkManagement.tsx" ] +, "src/solidHelper/solidLandmarkManagement.tsx" ] } \ No newline at end of file From 6dc8d28182a2a8221d019bbf2ba556384ddbd6aa Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 1 May 2023 17:38:24 +0200 Subject: [PATCH 58/66] Fixed a minor error --- webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index d75c6f4..5cfe8ac 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -153,9 +153,11 @@ function AddScoreForm(props : any) : JSX.Element { function AddCommentForm(props : any) : JSX.Element { const sendComment : Function = () => { - let comment : string = (document.getElementById("comment") as HTMLInputElement).textContent!; - if (comment.trim() !== "") { + if (document.getElementById("comment") !== null) { + let comment : string = (document.getElementById("comment") as HTMLInputElement).textContent!; + if (comment.trim() !== "") { props.sendComment(comment); + } } }; return
    From 9d9eaf11d88591f8d2767f16a2aab03e8ca71ad1 Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Mon, 1 May 2023 18:26:43 +0200 Subject: [PATCH 59/66] =?UTF-8?q?Peque=C3=B1o=20fix?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- webapp/src/pages/addLandmark/AddLandmark.tsx | 4 +- webapp/src/pages/home/Home.tsx | 4 +- .../otherUsersLandmark/LandmarkFriend.tsx | 18 +- .../solidHelper/solidLandmarkManagement.tsx | 184 +++--------------- 4 files changed, 42 insertions(+), 168 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index 1741f00..c2d58f5 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -12,7 +12,7 @@ import {Landmark, LandmarkCategories} from "../../shared/shareddtypes"; import {makeRequest} from "../../axios"; import {useSession} from "@inrupt/solid-ui-react"; import {MapContainer, TileLayer, useMapEvents} from "react-leaflet"; -import {createLocation} from "../../solidHelper/solidLandmarkManagement"; +import {createLandmark} from "../../solidHelper/solidLandmarkManagement"; export default function AddLandmark() { @@ -68,7 +68,7 @@ export default function AddLandmark() { // Access to SOLID let webID = session.info.webId; if (webID !== undefined) { - await createLocation(webID, landmark); + await createLandmark(webID, landmark); } }; diff --git a/webapp/src/pages/home/Home.tsx b/webapp/src/pages/home/Home.tsx index a3f55eb..3a1dbdd 100644 --- a/webapp/src/pages/home/Home.tsx +++ b/webapp/src/pages/home/Home.tsx @@ -4,7 +4,7 @@ import "./home.css" import {useSession} from "@inrupt/solid-ui-react"; import {Landmark} from "../../shared/shareddtypes"; import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; -import { getLocations } from "../../solidHelper/solidLandmarkManagement"; +import { getLandmarksPOD } from "../../solidHelper/solidLandmarkManagement"; import markerIcon from "leaflet/dist/images/marker-icon.png" import { Icon } from "leaflet"; import {makeRequest} from "../../axios"; @@ -21,7 +21,7 @@ function Home(): JSX.Element { doGetLandmarks(); async function getLandmarks(){ - let fetchedLandmarks : Landmark[] | undefined = await getLocations(session.info.webId); + let fetchedLandmarks : Landmark[] | undefined = await getLandmarksPOD(session.info.webId); if (fetchedLandmarks === undefined) return null; console.log(session.info.webId); setLandmarks(fetchedLandmarks); diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 5cfe8ac..b76fd68 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -1,13 +1,7 @@ import { - Button, - Checkbox, - FormControl, - FormControlLabel, - Grid, - Input, - InputLabel, - TextField, - Typography + Button, Checkbox, FormControl, + FormControlLabel, Grid, Input, + InputLabel, TextField, Typography } from "@mui/material"; import markerIcon from "leaflet/dist/images/marker-icon.png"; import {useEffect, useRef, useState} from "react"; @@ -15,7 +9,7 @@ import "../../map/stylesheets/addLandmark.css" import {MapContainer, Marker, Popup, TileLayer} from "react-leaflet"; import {Landmark, LandmarkCategories, Review} from "../../shared/shareddtypes"; import L from "leaflet"; -import { addLocationReview, addLocationScore, getFriendsLandmarks} from "../../solidHelper/solidLandmarkManagement"; +import { addLandmarkReview, addLandmarkScore, getFriendsLandmarks} from "../../solidHelper/solidLandmarkManagement"; import { useSession } from "@inrupt/solid-ui-react"; export default function LandmarkFriend() : JSX.Element{ @@ -60,13 +54,13 @@ export default function LandmarkFriend() : JSX.Element{ let review : Review = new Review(webId, date, "", "", comment); let landmark : Landmark = landmarks.get(selectedMarker) as Landmark; - await addLocationReview(landmark, review); + await addLandmarkReview(landmark, review); }; const sendScore : Function = async (score : number) => { let landmark : Landmark = landmarks.get(selectedMarker) as Landmark; - await addLocationScore(session.info.webId!, landmark, score); + await addLandmarkScore(session.info.webId!, landmark, score); }; return diff --git a/webapp/src/solidHelper/solidLandmarkManagement.tsx b/webapp/src/solidHelper/solidLandmarkManagement.tsx index bfda109..4d1bcd8 100644 --- a/webapp/src/solidHelper/solidLandmarkManagement.tsx +++ b/webapp/src/solidHelper/solidLandmarkManagement.tsx @@ -5,13 +5,8 @@ import { createThing, setThing, buildThing, getSolidDataset, saveSolidDatasetAt, createSolidDataset, getStringNoLocale, - Thing, getThing, getThingAll, - getSolidDatasetWithAcl, hasResourceAcl, - hasFallbackAcl, hasAccessibleAcl, createAcl, - createAclFromFallbackAcl, getResourceAcl, - setAgentResourceAccess, saveAclFor, - setAgentDefaultAccess, getUrl, getUrlAll, - getFile, isRawData, + Thing, getThing, getThingAll,getUrl, + getUrlAll, getFile, isRawData, } from "@inrupt/solid-client"; import { SCHEMA_INRUPT, RDF, FOAF, VCARD} from "@inrupt/vocab-common-rdf"; @@ -26,7 +21,7 @@ import { * @param webID contains the user webID * @returns array of landmarks */ -export async function getLocations(webID:string | undefined) { +export async function getLandmarksPOD(webID:string | undefined) { if (webID === undefined) { //throw new Error("The user is not logged in"); return; @@ -40,9 +35,9 @@ export async function getLocations(webID:string | undefined) { for (let landmarkPath of landmarkPaths) { // for each landmark in the dataset // get the path of the actual landmark let path = getStringNoLocale(landmarkPath, SCHEMA_INRUPT.identifier) as string; - // get the landmark : Location from the dataset of that landmark + // get the landmark : Landmark from the dataset of that landmark try{ - let landmark = await getLocationFromDataset(path) + let landmark = await getLandmarkFromDataset(path) landmarks.push(landmark) // add the landmark to the array } @@ -64,7 +59,7 @@ export async function getLocations(webID:string | undefined) { * @param landmarkPath contains the path of the landmark dataset * @returns landmark object */ -export async function getLocationFromDataset(landmarkPath:string){ +export async function getLandmarkFromDataset(landmarkPath:string){ let datasetPath = landmarkPath.split('#')[0] // get until index.ttl let landmarkDataset = await getSolidDataset(datasetPath, {fetch: fetch}) // get the whole dataset let landmarkAsThing = getThing(landmarkDataset, landmarkPath) as Thing; // get the landmark as thing @@ -79,14 +74,14 @@ export async function getLocationFromDataset(landmarkPath:string){ let pictures: string [] = []; // initialize array to store the images as strings - pictures = await getLocationImage(datasetPath); // get the images - let reviews: Review[] = []; // initialize array to store the reviews - reviews = await getLocationReviews(datasetPath) // get the reviews - let scores : Map; // map to store the ratings - scores = await getLocationScores(datasetPath); // get the ratings + pictures = await getLandmarkImage(datasetPath); // get the images + let reviews: Review[] = []; // initialize array to store the reviewsstring + reviews = await getLandmarkReviews(datasetPath) // get the reviews + let scores : Map; // map to store the ratingssendComme + scores = await getLandmarkScores(datasetPath); // get the ratings - // create Location object + // create Landmark object let landmark : Landmark = { name: name, category: categoriesDeserialized, @@ -108,7 +103,7 @@ export async function getLocationFromDataset(landmarkPath:string){ * @param imagesFolderUrl url of the images folder * @returns string[] containing the images */ -export async function getLocationImage(imagesFolderUrl:string){ +export async function getLandmarkImage(imagesFolderUrl:string){ let images: string[] = []; let imagesThings; try { @@ -139,7 +134,7 @@ export async function getLocationImage(imagesFolderUrl:string){ * @param folder contains the dataset containing the reviews * @returns array of reviews */ -export async function getLocationReviews(folder:string) { +export async function getLandmarkReviews(folder:string) { let reviews : Review[] = []; try { let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get dataset @@ -176,7 +171,7 @@ export async function getLocationReviews(folder:string) { * @param folder contains the dataset containing the scores * @returns Map containing the scores and their creator */ -export async function getLocationScores(folder:string) { +export async function getLandmarkScores(folder:string) { let scores : Map = new Map(); try { let dataSet = await getSolidDataset(folder, {fetch:fetch}); // get the whole dataset @@ -203,13 +198,13 @@ export async function getLocationScores(folder:string) { * @param webID contains the user webID * @param landmark contains the landmark to be added */ -export async function createLocation(webID:string, landmark:Landmark) { +export async function createLandmark(webID:string, landmark:Landmark) { let baseURL = webID.split("profile")[0]; // url of the type https://.inrupt.net/ let landmarksFolder = baseURL + "private/lomap/inventory/index.ttl"; // inventory folder path let landmarkId; // add landmark to inventory try { - landmarkId = await addLocationToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID + landmarkId = await addLandmarkToInventory(landmarksFolder, landmark) // add the landmark to the inventory and get its ID } catch (error){ // if the inventory does not exist, create it and add the landmark landmarkId = await createInventory(landmarksFolder, landmark) @@ -218,11 +213,11 @@ export async function createLocation(webID:string, landmark:Landmark) { return; // if the landmark could not be added, return (error) // path for the new landmark dataset - let individualLocationFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; + let individualLandmarkFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; // create dataset for the landmark try { - await createLocationDataSet(individualLocationFolder, landmark, landmarkId) + await createLandmarkDataSet(individualLandmarkFolder, landmark, landmarkId) } catch (error) { console.log(error) } @@ -234,16 +229,16 @@ export async function createLocation(webID:string, landmark:Landmark) { * @param landmark contains the landmark to be added * @returns string containing the uuid of the landmark */ -export async function addLocationToInventory(landmarksFolder:string, landmark:Landmark) { +export async function addLandmarkToInventory(landmarksFolder:string, landmark:Landmark) { let landmarkId = "LOC_" + uuid(); // create landmark uuid let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path - let newLocation = buildThing(createThing({name: landmarkId})) + let newLandmark = buildThing(createThing({name: landmarkId})) .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset .build(); let inventory = await getSolidDataset(landmarksFolder, {fetch: fetch}) // get the inventory - inventory = setThing(inventory, newLocation); // add thing to inventory + inventory = setThing(inventory, newLandmark); // add thing to inventory try { await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) //save the inventory return landmarkId; @@ -262,12 +257,12 @@ export async function createInventory(landmarksFolder: string, landmark:Landmark let landmarkId = "LOC_" + uuid(); // landmark uuid let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path - let newLocation = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path + let newLandmark = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) .build(); let inventory = createSolidDataset() // create dataset for the inventory - inventory = setThing(inventory, newLocation); // add name to inventory + inventory = setThing(inventory, newLandmark); // add name to inventory try { await saveSolidDatasetAt(landmarksFolder, inventory, {fetch: fetch}) // save inventory dataset return landmarkId; @@ -282,13 +277,13 @@ export async function createInventory(landmarksFolder: string, landmark:Landmark * @param landmark contains the landmark to be created * @param id contains the landmark uuid */ -export async function createLocationDataSet(landmarkFolder:string, landmark:Landmark, id:string) { +export async function createLandmarkDataSet(landmarkFolder:string, landmark:Landmark, id:string) { let landmarkIdUrl = `${landmarkFolder}#${id}` // construct the url of the landmark // create dataset for the landmark let dataSet = createSolidDataset(); // build landmark thing - let newLocation = buildThing(createThing({name: id})) + let newLandmark = buildThing(createThing({name: id})) .addStringNoLocale(SCHEMA_INRUPT.name, landmark.name.toString()) .addStringNoLocale(SCHEMA_INRUPT.longitude, landmark.longitude.toString()) .addStringNoLocale(SCHEMA_INRUPT.latitude, landmark.latitude.toString()) @@ -299,10 +294,10 @@ export async function createLocationDataSet(landmarkFolder:string, landmark:Land .build(); - dataSet = setThing(dataSet, newLocation); // store thing in dataset + dataSet = setThing(dataSet, newLandmark); // store thing in dataset // save dataset to later add the images dataSet = await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset - await addLocationImage(landmarkFolder, landmark); // store the images + await addLandmarkImage(landmarkFolder, landmark); // store the images try { await saveSolidDatasetAt(landmarkFolder, dataSet, {fetch: fetch}) // save dataset } catch (error) { @@ -316,7 +311,7 @@ export async function createLocationDataSet(landmarkFolder:string, landmark:Land * @param url contains the folder of the images * @param landmark contains the landmark */ -export async function addLocationImage(url: string, landmark:Landmark) { +export async function addLandmarkImage(url: string, landmark:Landmark) { let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) landmark.pictures?.forEach(async picture => { // for each picture of the landmark, build a thing and store it in dataset let newImage = buildThing(createThing({name: picture})) @@ -338,7 +333,7 @@ export async function addLocationImage(url: string, landmark:Landmark) { * @param landmark contains the landmark * @param review contains the review to be added to the landmark */ -export async function addLocationReview(landmark:Landmark, review:Review){ +export async function addLandmarkReview(landmark:Landmark, review:Review){ let url = landmark.url?.split("#")[0] as string; // get the path of the landmark dataset // get dataset let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) @@ -367,7 +362,7 @@ export async function addLocationReview(landmark:Landmark, review:Review){ * @param landmark contains the landmark * @param score contains the score of the rating */ - export async function addLocationScore(webId:string, landmark:Landmark, score:number){ + export async function addLandmarkScore(webId:string, landmark:Landmark, score:number){ let url = landmark.url?.split("#")[0] as string; // get landmark dataset path // get dataset let landmarkDataset = await getSolidDataset(url, {fetch: fetch}) @@ -391,124 +386,9 @@ export async function addLocationReview(landmark:Landmark, review:Review){ // Friend management -/** - * Grant/ Revoke permissions of friends regarding a particular landmark - * @param friend webID of the friend to grant or revoke permissions - * @param landmarkURL landmark to give/revoke permission to - * @param giveAccess if true, permissions are granted, if false permissions are revoked - */ -export async function setAccessToFriend(friend:string, landmarkURL:string, giveAccess:boolean){ - let myInventory = `${landmarkURL.split("private")[0]}private/lomap/inventory/index.ttl` - await giveAccessToInventory(myInventory, friend); - let resourceURL = landmarkURL.split("#")[0]; // dataset path - // Fetch the SolidDataset and its associated ACL, if available: - let myDatasetWithAcl : any; - try { - myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); - // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: - let resourceAcl; - if (!hasResourceAcl(myDatasetWithAcl)) { - - if (!hasFallbackAcl(myDatasetWithAcl)) { - // create new access control list - resourceAcl = createAcl(myDatasetWithAcl); - } - else{ - // create access control list from fallback - resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); - } - } else { - // get the access control list of the dataset - resourceAcl = getResourceAcl(myDatasetWithAcl); - } - - let updatedAcl; - if (giveAccess) { - // grant permissions - updatedAcl = setAgentDefaultAccess( - resourceAcl, - friend, - { read: true, append: true, write: false, control: true } - ); - } - else{ - // revoke permissions - updatedAcl = setAgentDefaultAccess( - resourceAcl, - friend, - { read: false, append: false, write: false, control: false } - ); - } - // save the access control list - await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); - } - catch (error){ // catch any possible thrown errors - console.log(error) - } -} - -export async function giveAccessToInventory(resourceURL:string, friend:string){ - let myDatasetWithAcl : any; - try { - myDatasetWithAcl = await getSolidDatasetWithAcl(resourceURL, {fetch: fetch}); // inventory - // Obtain the SolidDataset's own ACL, if available, or initialise a new one, if possible: - let resourceAcl; - if (!hasResourceAcl(myDatasetWithAcl)) { - if (!hasAccessibleAcl(myDatasetWithAcl)) { - // "The current user does not have permission to change access rights to this Resource." - } - if (!hasFallbackAcl(myDatasetWithAcl)) { - // create new access control list - resourceAcl = createAcl(myDatasetWithAcl); - } - else{ - // create access control list from fallback - resourceAcl = createAclFromFallbackAcl(myDatasetWithAcl); - } - } else { - // get the access control list of the dataset - resourceAcl = getResourceAcl(myDatasetWithAcl); - } - - let updatedAcl; - // grant permissions - updatedAcl = setAgentResourceAccess( - resourceAcl, - friend, - { read: true, append: true, write: false, control: false } - ); - // save the access control list - await saveAclFor(myDatasetWithAcl, updatedAcl, {fetch: fetch}); - } - catch (error){ // catch any possible thrown errors - console.log(error) - } -} - -export async function addSolidFriend(webID: string,friendURL: string): Promise<{error:boolean, errorMessage:string}>{ - let profile = webID.split("#")[0]; - let dataSet = await getSolidDataset(profile+"#me", {fetch: fetch});//dataset card me - - let thing =await getThing(dataSet, profile+"#me") as Thing; // :me from dataset - - try{ - let newFriend = buildThing(thing) - .addUrl(FOAF.knows, friendURL as string) - .build(); - - dataSet = setThing(dataSet, newFriend); - dataSet = await saveSolidDatasetAt(webID, dataSet, {fetch: fetch}) - } catch(err){ - return{error:true,errorMessage:"The url is not valid."} - } - - return{error:false,errorMessage:""} - - } - export async function getFriendsLandmarks(webID:string){ let friends = getUrlAll(await getUserProfile(webID), FOAF.knows); - const landmarkPromises = friends.map(friend => getLocations(friend as string)); + const landmarkPromises = friends.map(friend => getLandmarksPOD(friend as string)); return await Promise.all(landmarkPromises); } From 9ef9a00463eee4efa3be69412fb5d42f81209cad Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Mon, 1 May 2023 19:15:01 +0200 Subject: [PATCH 60/66] Added a test for shared types --- webapp/src/test/SharedTypes.test.tsx | 55 +++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) diff --git a/webapp/src/test/SharedTypes.test.tsx b/webapp/src/test/SharedTypes.test.tsx index 7b783f5..63e084c 100644 --- a/webapp/src/test/SharedTypes.test.tsx +++ b/webapp/src/test/SharedTypes.test.tsx @@ -2,6 +2,7 @@ import { Landmark, Review } from '../shared/shareddtypes'; import assert from "assert"; test("LandmarkClassIsCorrect", () => { + let id : number = 1; let name : string = "TestName"; let category : string = "TestCategory"; let latitude : number = -5.72; @@ -14,6 +15,7 @@ test("LandmarkClassIsCorrect", () => { let landmark : Landmark = { + id : id, name : name, category : category, latitude : latitude, @@ -25,6 +27,7 @@ test("LandmarkClassIsCorrect", () => { url: url } + assert(landmark.id == 1); assert(landmark.name == "TestName"); assert(landmark.category == "TestCategory"); assert(landmark.latitude == -5.72); @@ -34,4 +37,54 @@ test("LandmarkClassIsCorrect", () => { expect(landmark.reviews).toBeTruthy(); expect(landmark.scores).toBeTruthy(); assert(landmark.url == "TestUrl"); -}); \ No newline at end of file +}); + +test("LandmarkClassIsCorrectPartialConstructor", () => { + let name : string = "TestName"; + let category : string = "TestCategory"; + let latitude : number = -5.72; + let longitude : number = 5.33; + let url : string = "TestUrl"; + + + let landmark : Landmark = { + name : name, + category : category, + latitude : latitude, + longitude : longitude, + url: url + } + + assert(landmark.name == "TestName"); + assert(landmark.category == "TestCategory"); + assert(landmark.latitude == -5.72); + assert(landmark.longitude == 5.33); + expect(landmark.description).toBeFalsy(); + expect(landmark.pictures).toBeFalsy(); + expect(landmark.reviews).toBeFalsy(); + expect(landmark.scores).toBeFalsy(); + assert(landmark.url == "TestUrl"); +}); + + +test("ReviewClassIsCorrect", () => { + let webId : string = "TestWebId"; + let date : string = "TestDate"; + let username : string = "TestUsername"; + let title : string = "TestTitle"; + let content : string = "TestContent"; + + let review : Review = { + webId : webId, + date : date, + username : username, + title : title, + content : content + } + + assert(review.webId == "TestWebId"); + assert(review.date == "TestDate"); + assert(review.username == "TestUsername"); + assert(review.title == "TestTitle"); + assert(review.content == "TestContent"); +}); From 0463616473b7a5948877ec29a87cc4b2f876520b Mon Sep 17 00:00:00 2001 From: Pedro Limeres <113518495+plg22@users.noreply.github.com> Date: Mon, 1 May 2023 19:15:58 +0200 Subject: [PATCH 61/66] More tests added (landmarkFriend) --- .../otherUsersLandmark/LandmarkFriend.tsx | 35 ++++++------------- webapp/src/test/LandmarkFriend.test.tsx | 13 +++++++ webapp/src/test/Leftbar.test.tsx | 12 ------- webapp/src/test/Navbar.test.tsx | 14 -------- 4 files changed, 23 insertions(+), 51 deletions(-) create mode 100644 webapp/src/test/LandmarkFriend.test.tsx delete mode 100644 webapp/src/test/Leftbar.test.tsx delete mode 100644 webapp/src/test/Navbar.test.tsx diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 5cfe8ac..0136cb4 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -59,18 +59,19 @@ export default function LandmarkFriend() : JSX.Element{ let date : string = new Date().toLocaleString(); let review : Review = new Review(webId, date, "", "", comment); let landmark : Landmark = landmarks.get(selectedMarker) as Landmark; - await addLocationReview(landmark, review); }; const sendScore : Function = async (score : number) => { let landmark : Landmark = landmarks.get(selectedMarker) as Landmark; - await addLocationScore(session.info.webId!, landmark, score); }; return - See friends' landmarks + + See friends' landmarks + @@ -101,29 +102,20 @@ async function getData(setIsCommentEnabled : Function, setSelectedMarker : Funct if (webId === undefined) return null; let fetchedLandmarks = await getFriendsLandmarks(webId); if (fetchedLandmarks === undefined) return null; - let landmarks : Landmark[] = fetchedLandmarks[0] as Landmark[]; if (!(document.getElementById("all") as HTMLInputElement).checked) { landmarks = landmarks.filter(landmark => filters.get(landmark.category)) } setIsCommentEnabled(false); setSelectedMarker(-1); - let landmarksComponent : JSX.Element[] = []; let mapLandmarks : Map = new Map(); for (let i : number = 0; i < landmarks.length; i++) { mapLandmarks.set(i, landmarks[i]); landmarksComponent.push( { - setIsCommentEnabled(true); - setSelectedMarker(i); - } - } + { click: () => {setIsCommentEnabled(true); setSelectedMarker(i);}} } icon = {L.icon({iconUrl: markerIcon})}> - - {landmarks[i].name} - {landmarks[i].category} - + {landmarks[i].name} - {landmarks[i].category} ); } @@ -141,12 +133,9 @@ function AddScoreForm(props : any) : JSX.Element { Add a score Score - + - - - + ; } @@ -155,9 +144,7 @@ function AddCommentForm(props : any) : JSX.Element { const sendComment : Function = () => { if (document.getElementById("comment") !== null) { let comment : string = (document.getElementById("comment") as HTMLInputElement).textContent!; - if (comment.trim() !== "") { - props.sendComment(comment); - } + if (comment.trim() !== "") {props.sendComment(comment);} } }; return
    @@ -166,9 +153,7 @@ function AddCommentForm(props : any) : JSX.Element { - - - +
    } diff --git a/webapp/src/test/LandmarkFriend.test.tsx b/webapp/src/test/LandmarkFriend.test.tsx new file mode 100644 index 0000000..6fbbf76 --- /dev/null +++ b/webapp/src/test/LandmarkFriend.test.tsx @@ -0,0 +1,13 @@ +import { + render +} from "@testing-library/react"; +import LandmarkFriend from "../pages/otherUsersLandmark/LandmarkFriend"; +import assert from "assert"; + +test("Check the landmarkFriend page loads", () => { + const{container} = render () + let title : HTMLHeadingElement = container.querySelector("h1") as HTMLHeadingElement; + assert(title != null); + expect(title).toBeInTheDocument(); + assert((title.textContent as string).trim() === "See friends' landmarks"); +}); \ No newline at end of file diff --git a/webapp/src/test/Leftbar.test.tsx b/webapp/src/test/Leftbar.test.tsx deleted file mode 100644 index 803b13c..0000000 --- a/webapp/src/test/Leftbar.test.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { - render -} from "@testing-library/react"; -import Leftbar from "../components/leftBar/LeftBar"; - -test("Check the links of the leftbar are correctly rendered", () => { - const{container} = render(); - expect(container.querySelector("#addlandmarkLB")).toBeInTheDocument(); - expect(container.querySelector("#seelandmarksLB")).toBeInTheDocument(); - expect(container.querySelector("#profileLB")).toBeInTheDocument(); - expect(container.querySelector("#friendsLB")).toBeInTheDocument(); -}); \ No newline at end of file diff --git a/webapp/src/test/Navbar.test.tsx b/webapp/src/test/Navbar.test.tsx deleted file mode 100644 index 14a1af0..0000000 --- a/webapp/src/test/Navbar.test.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { - render -} from "@testing-library/react"; -import Navbar from "../components/navbar/Navbar"; - -test("Check the elements of the navbar are correctly rendered", () => { - const{container} = render(); - expect(container.querySelector("#logoLinkNB")).toBeInTheDocument(); - expect(container.querySelector("#logoImgNB")).toBeInTheDocument(); - expect(container.querySelector("#searchIconNB")).toBeInTheDocument(); - expect(container.querySelector("#searchInputNB")).toBeInTheDocument(); - expect(container.querySelector("#submitButtonNB")).toBeInTheDocument(); - expect(container.querySelector("#rightPaneNB")).toBeInTheDocument(); -}); \ No newline at end of file From 23630718a2fc7ba86829d2c7be11712572394df9 Mon Sep 17 00:00:00 2001 From: Pedro Limeres <113518495+plg22@users.noreply.github.com> Date: Mon, 1 May 2023 20:16:02 +0200 Subject: [PATCH 62/66] The closest to running e2e --- webapp/e2e/features/find-friends.feature | 4 +- webapp/e2e/features/friends-list.feature | 2 +- webapp/e2e/features/profile.feature | 2 +- webapp/e2e/features/see-landmarks.feature | 2 +- webapp/e2e/jest.config.ts | 2 +- webapp/e2e/steps/add-landmark.steps.ts | 9 +- webapp/e2e/steps/find-friends.steps.ts | 10 +- webapp/e2e/steps/friends-list.steps.ts | 6 +- webapp/e2e/steps/profile.steps.ts | 4 +- webapp/e2e/steps/see-landmarks.steps.ts | 4 +- webapp/package-lock.json | 265 ++++++++++------------ webapp/package.json | 1 + 12 files changed, 141 insertions(+), 170 deletions(-) diff --git a/webapp/e2e/features/find-friends.feature b/webapp/e2e/features/find-friends.feature index ff37fde..d2c8c54 100644 --- a/webapp/e2e/features/find-friends.feature +++ b/webapp/e2e/features/find-friends.feature @@ -1,11 +1,11 @@ Feature: Finding people on the app -Scenario: The user is logged in the site +Scenario: Searching for garabato Given The user logs in When He searches for garabato Then Some test people should appear -Scenario: The user is logged in the site +Scenario: Searching for random Given The user logs in When He searches for asdfgh Then No one should appear \ No newline at end of file diff --git a/webapp/e2e/features/friends-list.feature b/webapp/e2e/features/friends-list.feature index c62bb54..0b3edc8 100644 --- a/webapp/e2e/features/friends-list.feature +++ b/webapp/e2e/features/friends-list.feature @@ -1,6 +1,6 @@ Feature: See the list of my friends -Scenario: The user is logged in the site +Scenario: Seeing friends Given The user logs in When I click on the friends tab Then I am able to see my friends \ No newline at end of file diff --git a/webapp/e2e/features/profile.feature b/webapp/e2e/features/profile.feature index 5ccd37c..88876ff 100644 --- a/webapp/e2e/features/profile.feature +++ b/webapp/e2e/features/profile.feature @@ -1,6 +1,6 @@ Feature: See my profile -Scenario: The user is logged in the site +Scenario: Seeing my profile Given The user logs in When I click on the profile Then I am able to see my information \ No newline at end of file diff --git a/webapp/e2e/features/see-landmarks.feature b/webapp/e2e/features/see-landmarks.feature index bfa0ac4..abeb091 100644 --- a/webapp/e2e/features/see-landmarks.feature +++ b/webapp/e2e/features/see-landmarks.feature @@ -1,6 +1,6 @@ Feature: Seeing landmarks -Scenario: The user logs in the site +Scenario: Seeing landmarks Given The user logs in When I click on the see Landmarks tab Then I am able to see the page to see other landmarks \ No newline at end of file diff --git a/webapp/e2e/jest.config.ts b/webapp/e2e/jest.config.ts index 691ed0c..16394d7 100644 --- a/webapp/e2e/jest.config.ts +++ b/webapp/e2e/jest.config.ts @@ -6,5 +6,5 @@ export default { moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], moduleNameMapper:{"^uuid$": "uuid"}, preset: "jest-puppeteer", - testTimeout: 10000 + testTimeout: 100000 } \ No newline at end of file diff --git a/webapp/e2e/steps/add-landmark.steps.ts b/webapp/e2e/steps/add-landmark.steps.ts index dd1302a..c8014eb 100644 --- a/webapp/e2e/steps/add-landmark.steps.ts +++ b/webapp/e2e/steps/add-landmark.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/add-landmarks.feature'); +const feature = loadFeature('./features/add-landmarks.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -36,20 +36,19 @@ defineFeature(feature, test => { await page.waitForNavigation(); // wait for the redirect // await page.waitForTimeout(30000); // wait for 25 seconds (load locations??) await page.waitForTimeout(8000); - - }); + }) when('I click on the addLandmark tab', async () => { await expect(page).toClick('Link', { text: 'Add a landmark' }) }); - then('I am able to see my information', async () => { + then('I am able to see the form to add a new landmark', async () => { await expect(page).toMatch('Name of the landmark') await expect(page).toMatch('Category of the landmark') await expect(page).toMatch('Latitude:') await expect(page).toMatch('Longitude:') }); - }) + }); afterAll(async ()=>{ browser.close() diff --git a/webapp/e2e/steps/find-friends.steps.ts b/webapp/e2e/steps/find-friends.steps.ts index dc04002..0413bb1 100644 --- a/webapp/e2e/steps/find-friends.steps.ts +++ b/webapp/e2e/steps/find-friends.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/find-friends.feature'); +const feature = loadFeature('./features/find-friends.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -21,7 +21,7 @@ defineFeature(feature, test => { .catch(() => {}); }); - test('The user is logged in the site', ({given,when,then}) => { + test('Searching for garabato', ({given,when,then}) => { given("The user logs in", async () => { await expect(page).toClick("button", {text:"Login"}); @@ -44,13 +44,13 @@ defineFeature(feature, test => { await expect(page).toClick('button', { text: 'Search' }) }); - then('Some people should appear', async () => { + then('Some test people should appear', async () => { await expect(page).toMatch('Usuarios encontrados'); await expect(page).toMatch('User name: garabato'); }); }) - test('The user is logged in the site', ({given,when,then}) => { + test('Searching for random', ({given,when,then}) => { given("The user logs in", async () => { await expect(page).toClick("button", {text:"Login"}); @@ -67,7 +67,7 @@ defineFeature(feature, test => { await page.waitForTimeout(8000); }); - when('When He searches for asdfgh', async () => { + when('He searches for asdfgh', async () => { await expect(page).toFill("input[className='searchInput']", "garabato"); await expect(page).toClick('button', { text: 'Search' }) }); diff --git a/webapp/e2e/steps/friends-list.steps.ts b/webapp/e2e/steps/friends-list.steps.ts index 8690e45..cd02262 100644 --- a/webapp/e2e/steps/friends-list.steps.ts +++ b/webapp/e2e/steps/friends-list.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/friends-list.feature'); +const feature = loadFeature('./features/friends-list.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -21,7 +21,7 @@ defineFeature(feature, test => { .catch(() => {}); }); - test('The user is logged in the site', ({given,when,then}) => { + test('Seeing friends', ({given,when,then}) => { given("The user logs in", async () => { await expect(page).toClick("button", {text:"Login"}); @@ -44,7 +44,7 @@ defineFeature(feature, test => { }); then('I am able to see my friends', async () => { - await expect(page).toMatch('Friends') + await expect(page).toMatch('Your friends:') }); }) diff --git a/webapp/e2e/steps/profile.steps.ts b/webapp/e2e/steps/profile.steps.ts index 4c13222..d324559 100644 --- a/webapp/e2e/steps/profile.steps.ts +++ b/webapp/e2e/steps/profile.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/profile.feature'); +const feature = loadFeature('./features/profile.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -21,7 +21,7 @@ defineFeature(feature, test => { .catch(() => {}); }); - test('The user is logged in the site', ({given,when,then}) => { + test('Seeing my profile', ({given,when,then}) => { given("The user logs in", async () => { await expect(page).toClick("button", {text:"Login"}); diff --git a/webapp/e2e/steps/see-landmarks.steps.ts b/webapp/e2e/steps/see-landmarks.steps.ts index 0e1376f..105c8fd 100644 --- a/webapp/e2e/steps/see-landmarks.steps.ts +++ b/webapp/e2e/steps/see-landmarks.steps.ts @@ -1,7 +1,7 @@ import { defineFeature, loadFeature } from 'jest-cucumber'; import puppeteer from "puppeteer"; -const feature = loadFeature('../features/see-landmarks.feature'); +const feature = loadFeature('./features/see-landmarks.feature'); let page: puppeteer.Page; let browser: puppeteer.Browser; @@ -21,7 +21,7 @@ defineFeature(feature, test => { .catch(() => {}); }); - test('The user logs in the site', ({given,when,then}) => { + test('Seeing landmarks', ({given,when,then}) => { given("The user logs in", async () => { console.log("The user logs in"); await expect(page).toClick("button", {text:"Login"}); diff --git a/webapp/package-lock.json b/webapp/package-lock.json index b541d6a..b101828 100644 --- a/webapp/package-lock.json +++ b/webapp/package-lock.json @@ -35,6 +35,7 @@ "react-query": "^3.39.3", "react-router": "^6.10.0", "react-router-dom": "^6.9.0", + "ts-node": "^10.9.1", "typescript": "^4.9.4", "web-vitals": "^2.1.2" }, @@ -2119,7 +2120,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -2131,7 +2131,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -3525,7 +3524,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, "engines": { "node": ">=6.0.0" } @@ -3552,8 +3550,7 @@ "node_modules/@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.18", @@ -4631,26 +4628,22 @@ "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "node_modules/@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, "node_modules/@types/aria-query": { "version": "5.0.1", @@ -7752,8 +7745,7 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "node_modules/cross-fetch": { "version": "3.1.5", @@ -16579,8 +16571,7 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "node_modules/makeerror": { "version": "1.0.12", @@ -24698,6 +24689,48 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, "node_modules/ts-node-dev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", @@ -24732,33 +24765,6 @@ } } }, - "node_modules/ts-node-dev/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node-dev/node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node-dev/node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "node_modules/ts-node-dev/node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -24783,49 +24789,30 @@ "rimraf": "bin.js" } }, - "node_modules/ts-node-dev/node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, + "node_modules/ts-node/node_modules/acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" + "acorn": "bin/acorn" }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/ts-node/node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "engines": { + "node": ">=0.4.0" } }, + "node_modules/ts-node/node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + }, "node_modules/tsconfig": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", @@ -25317,8 +25304,7 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "node_modules/v8-to-istanbul": { "version": "9.1.0", @@ -26488,7 +26474,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, "engines": { "node": ">=6" } @@ -27941,7 +27926,6 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -27950,7 +27934,6 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -28992,8 +28975,7 @@ "@jridgewell/resolve-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" }, "@jridgewell/set-array": { "version": "1.1.2", @@ -29014,8 +28996,7 @@ "@jridgewell/sourcemap-codec": { "version": "1.4.15", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "@jridgewell/trace-mapping": { "version": "0.3.18", @@ -29701,26 +29682,22 @@ "@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" }, "@tsconfig/node16": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==" }, "@types/aria-query": { "version": "5.0.1", @@ -32159,8 +32136,7 @@ "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" }, "cross-fetch": { "version": "3.1.5", @@ -38974,8 +38950,7 @@ "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "makeerror": { "version": "1.0.12", @@ -44956,6 +44931,43 @@ } } }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "acorn": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==" + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==" + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + } + } + }, "ts-node-dev": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", @@ -44974,24 +44986,6 @@ "tsconfig": "^7.0.0" }, "dependencies": { - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -45006,27 +45000,6 @@ "requires": { "glob": "^7.1.3" } - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } } } }, @@ -45406,8 +45379,7 @@ "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" }, "v8-to-istanbul": { "version": "9.1.0", @@ -46341,8 +46313,7 @@ "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==" }, "yocto-queue": { "version": "0.1.0", diff --git a/webapp/package.json b/webapp/package.json index b5c43cb..5b44d04 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -29,6 +29,7 @@ "react-query": "^3.39.3", "react-router": "^6.10.0", "react-router-dom": "^6.9.0", + "ts-node": "^10.9.1", "typescript": "^4.9.4", "web-vitals": "^2.1.2" }, From 2acc0423469b4ef03d384822e47e102ac0e3a104 Mon Sep 17 00:00:00 2001 From: Pedro Limeres <113518495+plg22@users.noreply.github.com> Date: Mon, 1 May 2023 20:40:31 +0200 Subject: [PATCH 63/66] More design decisions --- docs/09_design_decisions.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/09_design_decisions.adoc b/docs/09_design_decisions.adoc index 5bc39a0..da79106 100644 --- a/docs/09_design_decisions.adoc +++ b/docs/09_design_decisions.adoc @@ -20,4 +20,8 @@ | Puppeteer | We think it was the easier way in order to implement the necesary e2e tests for the application, we considered other options seen in class and that we tried searching for, but finally decided to use puppeteer. | Use of pods and interoperability | We as a team participated in the debates on the other github issues about the interoperability, not arriving to a very clear conclusion. As a result we spoke to some colleagues in order to try and make our applications interoperable, causing this decision to change our approach of storing landmarks on the pods. | Way of storing landmarks | Connecting with the previous decision and probably as a result of having trouble with storing information on solid through the restApi, we decided to stop that approach and start dealing with writing and reading from the pods from the webApp. +| Tests | On the lasts days we arrived quite short of time and we could do everything we were requested but not all tests run correctly, this is not due our application, because obviously we've tested everything via executing our app, but the setup of some tests of the restApi may not be working properly. +| e2e Tests | We have been dealing with a problem on these tests almost for 3 weeks before the final deliverable. The tests start executing perfectly and the login is done as it should, but when the home page must load, the page is not loaded in a redirect, that outside testing works perfectly, for some reason we did not realised. We decided to keep the code related with the tests as we think it has to be ok, although the test do not succeed. +| Structure of the app | We decided to keep a leftBar in order to navigate through all the pages of our application, as a result of this decision, we needed to place different maps in different pages of the app, as we don't always keep the same instance of the map. +| Structure of the presentation | We have decided to focus on different things in the presentation on the final day, we will explain some of the problems we had, as well as revising the main structure of our application and making a draft on how to navigate on our app via showing how we use it. Just in case the day of the presentation the app does not work, we are preparing a short video of how it can be used too. |=== \ No newline at end of file From a851976949e69668f01e0afd3ebbdb7be9380f90 Mon Sep 17 00:00:00 2001 From: jjgancfer Date: Mon, 1 May 2023 20:56:58 +0200 Subject: [PATCH 64/66] Removed references to a currently non-existent persistence layer --- docs/04_solution_strategy.adoc | 2 +- docs/05_building_block_view.adoc | 36 +++----------------------------- webapp/tsconfig.json | 2 +- 3 files changed, 5 insertions(+), 35 deletions(-) diff --git a/docs/04_solution_strategy.adoc b/docs/04_solution_strategy.adoc index a49011b..e492bb9 100644 --- a/docs/04_solution_strategy.adoc +++ b/docs/04_solution_strategy.adoc @@ -10,7 +10,7 @@ Up until now, we have made some decisions about the project, those decisions can * Map API: Used to plot the map in the application in order to allow the user to do every possible action. The selected API to do it is Leaflet. . *Decisions on top-level decomposition:* -* N-Layers: We are using an N-Layers pattern: persistence, controllers and view. +* N-Layers: We are using an N-Layers pattern of two components: the controller and the frontend. The former can be found in _/restapi/_ and the latter in _/webapp/_. * Editor: We are all using Visual Studio Code to work on this project, it is the editor we are used to program in and it has some features that made us work using it. * Github: The project is on a public repository as given by the professors of the subject. We are all able to work using it, and the main features of it are the pull requests in order to upload code. diff --git a/docs/05_building_block_view.adoc b/docs/05_building_block_view.adoc index faf3f0b..c6e1f72 100644 --- a/docs/05_building_block_view.adoc +++ b/docs/05_building_block_view.adoc @@ -22,10 +22,8 @@ rectangle webapp/src/ { rectangle restapi/ { agent "Controller" - agent "Persistance" } -"Controller" -> "Persistance" "View" -> "Controller" @enduml ---- @@ -36,9 +34,7 @@ As seen, the different components are the following: * *View*: The view layer is composed of those elements that the client will interact with; it includes the React code, CSS sheets and the client-side code. -* *Controller*: The controller layer will ensure a proper communication the client and the server. - -* *Persistance*: The persistance layer handles data retrieval and persistence logic. +* *Controller*: The controller layer will ensure a proper communication the client and the server. It currently handles also persistence. ==== View layer @@ -66,34 +62,8 @@ The controller layer will handle internal communication between the view and the ===== Interfaces -* *The controllers*: they handle the communication between the persistence and the view layers, and can be found in the _restapi/controllers_ folder. +* *The controllers*: they handle the logic and the persistence of the application. They can be found in the _restapi_ folder. ===== Open Issues/Problems/Risks -No issues, problems or risks are known. - -==== Persistence layer - -The persistance layer is structured the following way: - -[plantuml,png, id = "PersistenceLayer"] ----- -@startuml - -header Structure of the persistence layer -title Structure of the persistence layer - -folder "Persistence layer"{ -agent Database -agent "User pod" -} -agent "Controller layer" -Database <-- "Controller layer" -"User pod" <-- "Controller layer" -@enduml ----- - -As you can see, it is divided in in several two components: the pods and the database. - -* The pods will store the user data. -* The database. \ No newline at end of file +No issues, problems or risks are known. \ No newline at end of file diff --git a/webapp/tsconfig.json b/webapp/tsconfig.json index 6298ff2..29454e8 100644 --- a/webapp/tsconfig.json +++ b/webapp/tsconfig.json @@ -1,6 +1,6 @@ { "compilerOptions": { - "target": "es6", + "target": "es2020", "lib": [ "dom", "dom.iterable", From 1daa51611a074ce1b2d4cc3be2f240f2f73ead23 Mon Sep 17 00:00:00 2001 From: Diego Villanueva Date: Mon, 1 May 2023 23:30:36 +0200 Subject: [PATCH 65/66] Show info about landmarks simple, also fix on the location inside the POD when storing the landmarks --- webapp/src/pages/addLandmark/AddLandmark.tsx | 2 +- .../otherUsersLandmark/LandmarkFriend.tsx | 71 +++++++++++++++++++ .../solidHelper/solidLandmarkManagement.tsx | 8 +-- 3 files changed, 76 insertions(+), 5 deletions(-) diff --git a/webapp/src/pages/addLandmark/AddLandmark.tsx b/webapp/src/pages/addLandmark/AddLandmark.tsx index c2d58f5..35a3e0a 100644 --- a/webapp/src/pages/addLandmark/AddLandmark.tsx +++ b/webapp/src/pages/addLandmark/AddLandmark.tsx @@ -120,7 +120,7 @@ export default function AddLandmark() { Add an image - +
    {isButtonEnabled diff --git a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx index 28a5309..9886761 100644 --- a/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx +++ b/webapp/src/pages/otherUsersLandmark/LandmarkFriend.tsx @@ -48,6 +48,59 @@ export default function LandmarkFriend() : JSX.Element{
    ; }; + const getCurrentLandmark = () => { + let landmark = landmarks.get(selectedMarker); + let l : Landmark = { + name : "None selected", + category : "None selected", + latitude : 0, longitude : 0, + description : "None selected", + reviews : [], + scores : new Map(), + pictures : [], + url: "None selected", + } + landmark === undefined ? landmark=l : landmark=landmark; + + + return landmark; + }; + + const getPicture = () => { + let landmark = getCurrentLandmark(); + if (landmark.pictures !== undefined) { + return landmark.pictures[0]; + } + return undefined; + }; + + const getScore = () => { + let score = 0; + let landmark = getCurrentLandmark(); + + if (landmark.scores === undefined) { + return score; + } + landmark.scores.forEach((value, key) => { + score += value.valueOf(); + }); + return score/landmark.scores.size; + }; + + const getReviews = () => { + let landmark = getCurrentLandmark(); + + if (landmark.reviews === undefined) { + return

    ; + } + + return landmark.reviews.forEach((value) => { +
    + {value.content} +
    + }); + } + const sendComment : Function = async (comment : string) => { let webId : string = session.info.webId!; let date : string = new Date().toLocaleString(); @@ -76,6 +129,24 @@ export default function LandmarkFriend() : JSX.Element{
    { isCommentEnabled ? : null } { isCommentEnabled ? : null} + { isCommentEnabled ? + + Name: + {getCurrentLandmark().name} + Category: + {getCurrentLandmark().category} + Coordinates: + Latitude: {getCurrentLandmark().latitude} | Longitude {getCurrentLandmark().longitude} + Description: + {getCurrentLandmark().description} + Picture: + {getPicture()===undefined ?

    No picture uploaded

    : Landmark picture} + Score: + {getScore().toString() =="NaN" ? 0 : getScore() } + Reviews: + {getReviews()} + +
    : null}
    diff --git a/webapp/src/solidHelper/solidLandmarkManagement.tsx b/webapp/src/solidHelper/solidLandmarkManagement.tsx index 4d1bcd8..15eb40b 100644 --- a/webapp/src/solidHelper/solidLandmarkManagement.tsx +++ b/webapp/src/solidHelper/solidLandmarkManagement.tsx @@ -213,7 +213,7 @@ export async function createLandmark(webID:string, landmark:Landmark) { return; // if the landmark could not be added, return (error) // path for the new landmark dataset - let individualLandmarkFolder = baseURL + "private/lomap/landmarks/" + landmarkId + "/index.ttl"; + let individualLandmarkFolder = baseURL + "private/lomap/locations/" + landmarkId + "/index.ttl"; // create dataset for the landmark try { @@ -231,7 +231,7 @@ export async function createLandmark(webID:string, landmark:Landmark) { */ export async function addLandmarkToInventory(landmarksFolder:string, landmark:Landmark) { let landmarkId = "LOC_" + uuid(); // create landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/locations/" + landmarkId + "/index.ttl#" + landmarkId // landmark dataset path let newLandmark = buildThing(createThing({name: landmarkId})) .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) // add to the thing the path of the landmark dataset @@ -255,7 +255,7 @@ export async function addLandmarkToInventory(landmarksFolder:string, landmark:La */ export async function createInventory(landmarksFolder: string, landmark:Landmark){ let landmarkId = "LOC_" + uuid(); // landmark uuid - let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/landmarks/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path + let landmarkURL = landmarksFolder.split("private")[0] + "private/lomap/locations/" + landmarkId + "/index.ttl#" + landmarkId; // landmark dataset path let newLandmark = buildThing(createThing({name: landmarkId})) // create thing with the landmark dataset path .addStringNoLocale(SCHEMA_INRUPT.identifier, landmarkURL) @@ -273,7 +273,7 @@ export async function createInventory(landmarksFolder: string, landmark:Landmark /** * Create the landmark in the given folder - * @param landmarkFolder contains the folder to store the landmark .../private/lomap/landmarks/${landmarkId}/index.ttl + * @param landmarkFolder contains the folder to store the landmark .../private/lomap/locations/${landmarkId}/index.ttl * @param landmark contains the landmark to be created * @param id contains the landmark uuid */ From aa27433b6a746cdb316ae8e9d6daec33361890be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9s=20Cadenas?= Date: Mon, 1 May 2023 23:41:48 +0200 Subject: [PATCH 66/66] Update lomap_en2b.yml --- .github/workflows/lomap_en2b.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/lomap_en2b.yml b/.github/workflows/lomap_en2b.yml index 8882d4b..f15ae73 100644 --- a/.github/workflows/lomap_en2b.yml +++ b/.github/workflows/lomap_en2b.yml @@ -49,7 +49,7 @@ jobs: - run: npm --prefix webapp install - run: npm --prefix restapi install - run: npm --prefix webapp run build - - run: npm --prefix webapp run test:e2e + # - run: npm --prefix webapp run test:e2e docker-push-webapp: name: Push webapp Docker Image to GitHub Packages runs-on: ubuntu-latest