diff --git a/webapp/chat-app/chat-app/.gitignore b/webapp/chat-app/chat-app/.gitignore
deleted file mode 100644
index 6ec10967..00000000
--- a/webapp/chat-app/chat-app/.gitignore
+++ /dev/null
@@ -1,25 +0,0 @@
-+ # Node
-+ node_modules/
-+ build/
-+ dist/
-+ coverage/
-+
-+ # Gradle
-+ .gradle/
-+ build/
-+
-+ # IDE
-+ .idea/
-+ .vscode/
-+ *.iml
-+
-+ # Misc
-+ .DS_Store
-+ .env.local
-+ .env.development.local
-+ .env.test.local
-+ .env.production.local
-+
-+ npm-debug.log*
-+ yarn-debug.log*
-+ yarn-error.log*
\ No newline at end of file
diff --git a/webapp/chat-app/package.json b/webapp/chat-app/package.json
index c9e84c2e..49e49ff3 100644
--- a/webapp/chat-app/package.json
+++ b/webapp/chat-app/package.json
@@ -3,8 +3,6 @@
"version": "0.1.0",
"private": true,
"dependencies": {
- "mermaid": "^10.0.0",
- "qrcode-generator": "^1.4.4",
"@fortawesome/free-solid-svg-icons": "^6.7.1",
"@fortawesome/react-fontawesome": "^0.2.2",
"@reduxjs/toolkit": "^1.9.7",
@@ -12,8 +10,10 @@
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^13.5.0",
"dompurify": "^3.2.1",
+ "mermaid": "^10.0.0",
"prismjs": "^1.29.0",
"prismjs-components-loader": "^3.0.1",
+ "qrcode-generator": "^1.4.4",
"react": "^18.3.1",
"react-dom": "^18.3.1",
"react-redux": "^8.1.3",
@@ -25,10 +25,10 @@
"devDependencies": {
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"@types/dompurify": "^3.2.0",
- "@types/node": "^18.0.0",
+ "@types/node": "^22.10.1",
"@types/prismjs": "^1.26.3",
- "@types/react": "^18.2.37",
- "@types/react-dom": "^18.2.15",
+ "@types/react": "^18.3.12",
+ "@types/react-dom": "^18.3.1",
"@types/react-redux": "^7.1.34",
"@types/react-router-dom": "^5.3.3",
"@types/styled-components": "^5.1.34",
diff --git a/webapp/chat-app/src/components/Menu/WebSocketMenu.tsx b/webapp/chat-app/src/components/Menu/WebSocketMenu.tsx
index 2f1561de..9f328d73 100644
--- a/webapp/chat-app/src/components/Menu/WebSocketMenu.tsx
+++ b/webapp/chat-app/src/components/Menu/WebSocketMenu.tsx
@@ -52,8 +52,8 @@ export const WebSocketMenu: React.FC = () => {
const [config, setConfig] = useState({
- url: wsConfig.url,
- port: wsConfig.port,
+ url: process.env.NODE_ENV === 'development' ? wsConfig.url : window.location.hostname,
+ port: process.env.NODE_ENV === 'development' ? wsConfig.port : window.location.port,
protocol: wsConfig.protocol
});
diff --git a/webapp/chat-app/src/hooks/useModal.ts b/webapp/chat-app/src/hooks/useModal.ts
index 56cdefba..61a3bd0a 100644
--- a/webapp/chat-app/src/hooks/useModal.ts
+++ b/webapp/chat-app/src/hooks/useModal.ts
@@ -25,8 +25,8 @@ export const useModal = () => {
const getModalUrl = (endpoint: string) => {
console.log('[Modal] Constructing modal URL for endpoint:', endpoint);
const protocol = window.location.protocol;
- const host = config.url || window.location.hostname;
- const port = config.port || window.location.port;
+ const host = (process.env.NODE_ENV === 'development' ? config.url : null) || window.location.hostname;
+ const port = (process.env.NODE_ENV === 'development' ? config.port : null) || window.location.port;
// Handle endpoints that already have query parameters
const separator = endpoint.includes('?') ? '&' : '?';
const url = `${protocol}//${host}:${port}/${endpoint}${separator}sessionId=${WebSocketService.getSessionId()}`;
diff --git a/webapp/chat-app/src/services/appConfig.ts b/webapp/chat-app/src/services/appConfig.ts
index 75dadd0c..321e248a 100644
--- a/webapp/chat-app/src/services/appConfig.ts
+++ b/webapp/chat-app/src/services/appConfig.ts
@@ -8,14 +8,14 @@ const BASE_API_URL = process.env.REACT_APP_API_URL || window.location.origin;
export const fetchAppConfig = async (sessionId: string) => {
try {
logger.info('Fetching app config for session:', sessionId);
- const url = new URL('/api/appInfo', BASE_API_URL);
+ const url = new URL('/appInfo', BASE_API_URL);
url.searchParams.append('session', sessionId);
let response: Response;
// Add error handling for failed requests
try {
response = await fetch(url.toString(), {
headers: {
- 'Accept': 'application/json'
+ 'Accept': 'application/json, text/json'
}
});
} catch (networkError) {
@@ -28,7 +28,7 @@ export const fetchAppConfig = async (sessionId: string) => {
return null;
}
const contentType = response.headers.get('content-type');
- if (!contentType || !contentType.includes('application/json')) {
+ if (!contentType || (!contentType.includes('application/json') && !contentType.includes('text/json'))) {
throw new Error(`Invalid content type: ${contentType}`);
}
@@ -47,7 +47,7 @@ export const fetchAppConfig = async (sessionId: string) => {
logger.error('Failed to fetch app config:', {
error,
sessionId,
- url: BASE_API_URL ? `${BASE_API_URL}/api/appInfo` : '/api/appInfo'
+ url: BASE_API_URL ? `${BASE_API_URL}/appInfo` : '/api/appInfo'
});
throw error;
}
diff --git a/webui/src/main/resources/application/about.js b/webui/src/main/resources/application/about.js
deleted file mode 100644
index af218555..00000000
--- a/webui/src/main/resources/application/about.js
+++ /dev/null
@@ -1,12 +0,0 @@
-document.addEventListener('DOMContentLoaded', () => {
- const privacyLink = document.getElementById('privacy');
- const tosLink = document.getElementById('tos');
- if (privacyLink) {
- // Update the privacy link with the user's name and make it visible
- privacyLink.addEventListener('click', () => showModal('/privacy.html', false));
- }
- if (tosLink) {
- // Update the terms link with the user's name and make it visible
- tosLink.addEventListener('click', () => showModal('/tos.html', false));
- }
-});
\ No newline at end of file
diff --git a/webui/src/main/resources/application/alien.scss b/webui/src/main/resources/application/alien.scss
deleted file mode 100644
index 88fa6928..00000000
--- a/webui/src/main/resources/application/alien.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import '../shared/schemes/alien_spaceship';
-@import '../shared/main';
diff --git a/webui/src/main/resources/application/appConfig.js b/webui/src/main/resources/application/appConfig.js
deleted file mode 100644
index 16d9c3e7..00000000
--- a/webui/src/main/resources/application/appConfig.js
+++ /dev/null
@@ -1,71 +0,0 @@
-export let singleInput = false;
-export let stickyInput = false;
-export let loadImages = "true";
-export let showMenubar = true;
-export let websocket = {
- url: window.location.hostname,
- port: window.location.port
-};
-
-export function fetchAppConfig(sessionId) {
- return fetch('appInfo?session=' + sessionId)
- .then(response => {
- console.log('AppInfo fetch response:', response);
- if (!response.ok) {
- throw new Error('Network response was not ok');
- }
- return response.json();
- })
- .then(data => {
- console.log('AppInfo data:', data);
- if (data) {
- if (data.applicationName) {
- document.title = data.applicationName;
- }
- if (data.singleInput) {
- singleInput = data.singleInput;
- }
- if (data.stickyInput) {
- stickyInput = data.stickyInput;
- }
- if (data.loadImages) {
- loadImages = data.loadImages;
- }
- if (data.websocket) {
- websocket = data.websocket;
- }
- if (data.showMenubar != null) {
- showMenubar = data.showMenubar;
- applyMenubarConfig(showMenubar);
- }
- // Make config available globally
- window.appConfig = {
- singleInput,
- stickyInput,
- loadImages,
- showMenubar,
- websocket
- };
- }
- return {singleInput, stickyInput, loadImages, showMenubar, websocket};
- });
-}
-
-function applyMenubarConfig(showMenubar) {
- if (showMenubar === false) {
- const menubar = document.getElementById('toolbar');
- if (menubar) menubar.style.display = 'none';
- const namebar = document.getElementById('namebar');
- if (namebar) namebar.style.display = 'none';
- const mainInput = document.getElementById('main-input');
- if (mainInput) {
- mainInput.style.top = '0px';
- }
- const session = document.getElementById('session');
- if (session) {
- session.style.top = '0px';
- session.style.width = '100%';
- session.style.position = 'absolute';
- }
- }
-}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/asset-manifest.json b/webui/src/main/resources/application/asset-manifest.json
new file mode 100644
index 00000000..91ce8884
--- /dev/null
+++ b/webui/src/main/resources/application/asset-manifest.json
@@ -0,0 +1,137 @@
+{
+ "files": {
+ "main.css": "/static/css/main.351373b1.css",
+ "main.js": "/static/js/main.a499650c.js",
+ "static/css/684.baca662c.chunk.css": "/static/css/684.baca662c.chunk.css",
+ "static/js/684.4c3de71b.chunk.js": "/static/js/684.4c3de71b.chunk.js",
+ "static/css/662.745fbc88.chunk.css": "/static/css/662.745fbc88.chunk.css",
+ "static/js/662.12f6391a.chunk.js": "/static/js/662.12f6391a.chunk.js",
+ "static/css/955.2f6989f5.chunk.css": "/static/css/955.2f6989f5.chunk.css",
+ "static/js/955.2cbea828.chunk.js": "/static/js/955.2cbea828.chunk.js",
+ "static/css/890.383e424b.chunk.css": "/static/css/890.383e424b.chunk.css",
+ "static/js/890.260019b4.chunk.js": "/static/js/890.260019b4.chunk.js",
+ "static/css/584.450f2786.chunk.css": "/static/css/584.450f2786.chunk.css",
+ "static/js/584.d9243508.chunk.js": "/static/js/584.d9243508.chunk.js",
+ "static/css/589.f1e01cde.chunk.css": "/static/css/589.f1e01cde.chunk.css",
+ "static/js/589.d519c971.chunk.js": "/static/js/589.d519c971.chunk.js",
+ "static/css/941.0beb07ed.chunk.css": "/static/css/941.0beb07ed.chunk.css",
+ "static/js/941.5c1201e7.chunk.js": "/static/js/941.5c1201e7.chunk.js",
+ "static/css/479.7217da39.chunk.css": "/static/css/479.7217da39.chunk.css",
+ "static/js/479.f52db03b.chunk.js": "/static/js/479.f52db03b.chunk.js",
+ "static/css/436.0394fb49.chunk.css": "/static/css/436.0394fb49.chunk.css",
+ "static/js/436.aec394b1.chunk.js": "/static/js/436.aec394b1.chunk.js",
+ "static/css/550.c616970f.chunk.css": "/static/css/550.c616970f.chunk.css",
+ "static/js/550.9118c689.chunk.js": "/static/js/550.9118c689.chunk.js",
+ "static/css/198.76fff1e7.chunk.css": "/static/css/198.76fff1e7.chunk.css",
+ "static/js/198.639e32f7.chunk.js": "/static/js/198.639e32f7.chunk.js",
+ "static/css/80.d2e93c45.chunk.css": "/static/css/80.d2e93c45.chunk.css",
+ "static/js/80.559e0b3a.chunk.js": "/static/js/80.559e0b3a.chunk.js",
+ "static/css/707.bbfe9480.chunk.css": "/static/css/707.bbfe9480.chunk.css",
+ "static/js/707.ef3e771d.chunk.js": "/static/js/707.ef3e771d.chunk.js",
+ "static/css/101.c207c750.chunk.css": "/static/css/101.c207c750.chunk.css",
+ "static/js/101.a67d1b82.chunk.js": "/static/js/101.a67d1b82.chunk.js",
+ "static/css/970.b84c1be1.chunk.css": "/static/css/970.b84c1be1.chunk.css",
+ "static/js/970.5003b895.chunk.js": "/static/js/970.5003b895.chunk.js",
+ "static/js/349.3fce7626.chunk.js": "/static/js/349.3fce7626.chunk.js",
+ "static/js/967.d81fcc30.chunk.js": "/static/js/967.d81fcc30.chunk.js",
+ "static/js/964.21ed2858.chunk.js": "/static/js/964.21ed2858.chunk.js",
+ "static/js/20.72aac927.chunk.js": "/static/js/20.72aac927.chunk.js",
+ "static/js/401.70312292.chunk.js": "/static/js/401.70312292.chunk.js",
+ "static/js/590.e57a5edb.chunk.js": "/static/js/590.e57a5edb.chunk.js",
+ "static/js/324.55974c0a.chunk.js": "/static/js/324.55974c0a.chunk.js",
+ "static/js/134.bddaeef6.chunk.js": "/static/js/134.bddaeef6.chunk.js",
+ "static/js/759.1fe9965a.chunk.js": "/static/js/759.1fe9965a.chunk.js",
+ "static/js/899.c0867d99.chunk.js": "/static/js/899.c0867d99.chunk.js",
+ "static/js/140.38ddc782.chunk.js": "/static/js/140.38ddc782.chunk.js",
+ "static/js/644.c6f78ba1.chunk.js": "/static/js/644.c6f78ba1.chunk.js",
+ "static/js/720.2f0fd0b6.chunk.js": "/static/js/720.2f0fd0b6.chunk.js",
+ "static/js/135.5d13f1ca.chunk.js": "/static/js/135.5d13f1ca.chunk.js",
+ "static/js/787.ae15bb64.chunk.js": "/static/js/787.ae15bb64.chunk.js",
+ "static/js/58.5155fbd7.chunk.js": "/static/js/58.5155fbd7.chunk.js",
+ "static/js/169.5dd6f801.chunk.js": "/static/js/169.5dd6f801.chunk.js",
+ "static/js/657.6c031494.chunk.js": "/static/js/657.6c031494.chunk.js",
+ "static/js/713.847947f8.chunk.js": "/static/js/713.847947f8.chunk.js",
+ "static/js/88.f973dc1f.chunk.js": "/static/js/88.f973dc1f.chunk.js",
+ "static/js/383.d007dedd.chunk.js": "/static/js/383.d007dedd.chunk.js",
+ "static/js/141.e3083122.chunk.js": "/static/js/141.e3083122.chunk.js",
+ "static/js/56.8d2cf628.chunk.js": "/static/js/56.8d2cf628.chunk.js",
+ "static/js/453.8675bcab.chunk.js": "/static/js/453.8675bcab.chunk.js",
+ "static/js/532.b7154a0d.chunk.js": "/static/js/532.b7154a0d.chunk.js",
+ "static/js/587.458082b5.chunk.js": "/static/js/587.458082b5.chunk.js",
+ "static/js/509.965f3c53.chunk.js": "/static/js/509.965f3c53.chunk.js",
+ "static/js/865.93d56689.chunk.js": "/static/js/865.93d56689.chunk.js",
+ "static/js/556.bfdf8229.chunk.js": "/static/js/556.bfdf8229.chunk.js",
+ "static/js/745.c57f2e11.chunk.js": "/static/js/745.c57f2e11.chunk.js",
+ "static/js/813.801479d9.chunk.js": "/static/js/813.801479d9.chunk.js",
+ "static/js/194.4acfb22a.chunk.js": "/static/js/194.4acfb22a.chunk.js",
+ "index.html": "/index.html",
+ "main.351373b1.css.map": "/static/css/main.351373b1.css.map",
+ "main.a499650c.js.map": "/static/js/main.a499650c.js.map",
+ "684.baca662c.chunk.css.map": "/static/css/684.baca662c.chunk.css.map",
+ "684.4c3de71b.chunk.js.map": "/static/js/684.4c3de71b.chunk.js.map",
+ "662.745fbc88.chunk.css.map": "/static/css/662.745fbc88.chunk.css.map",
+ "662.12f6391a.chunk.js.map": "/static/js/662.12f6391a.chunk.js.map",
+ "955.2f6989f5.chunk.css.map": "/static/css/955.2f6989f5.chunk.css.map",
+ "955.2cbea828.chunk.js.map": "/static/js/955.2cbea828.chunk.js.map",
+ "890.383e424b.chunk.css.map": "/static/css/890.383e424b.chunk.css.map",
+ "890.260019b4.chunk.js.map": "/static/js/890.260019b4.chunk.js.map",
+ "584.450f2786.chunk.css.map": "/static/css/584.450f2786.chunk.css.map",
+ "584.d9243508.chunk.js.map": "/static/js/584.d9243508.chunk.js.map",
+ "589.f1e01cde.chunk.css.map": "/static/css/589.f1e01cde.chunk.css.map",
+ "589.d519c971.chunk.js.map": "/static/js/589.d519c971.chunk.js.map",
+ "941.0beb07ed.chunk.css.map": "/static/css/941.0beb07ed.chunk.css.map",
+ "941.5c1201e7.chunk.js.map": "/static/js/941.5c1201e7.chunk.js.map",
+ "479.7217da39.chunk.css.map": "/static/css/479.7217da39.chunk.css.map",
+ "479.f52db03b.chunk.js.map": "/static/js/479.f52db03b.chunk.js.map",
+ "436.0394fb49.chunk.css.map": "/static/css/436.0394fb49.chunk.css.map",
+ "436.aec394b1.chunk.js.map": "/static/js/436.aec394b1.chunk.js.map",
+ "550.c616970f.chunk.css.map": "/static/css/550.c616970f.chunk.css.map",
+ "550.9118c689.chunk.js.map": "/static/js/550.9118c689.chunk.js.map",
+ "198.76fff1e7.chunk.css.map": "/static/css/198.76fff1e7.chunk.css.map",
+ "198.639e32f7.chunk.js.map": "/static/js/198.639e32f7.chunk.js.map",
+ "80.d2e93c45.chunk.css.map": "/static/css/80.d2e93c45.chunk.css.map",
+ "80.559e0b3a.chunk.js.map": "/static/js/80.559e0b3a.chunk.js.map",
+ "707.bbfe9480.chunk.css.map": "/static/css/707.bbfe9480.chunk.css.map",
+ "707.ef3e771d.chunk.js.map": "/static/js/707.ef3e771d.chunk.js.map",
+ "101.c207c750.chunk.css.map": "/static/css/101.c207c750.chunk.css.map",
+ "101.a67d1b82.chunk.js.map": "/static/js/101.a67d1b82.chunk.js.map",
+ "970.b84c1be1.chunk.css.map": "/static/css/970.b84c1be1.chunk.css.map",
+ "970.5003b895.chunk.js.map": "/static/js/970.5003b895.chunk.js.map",
+ "349.3fce7626.chunk.js.map": "/static/js/349.3fce7626.chunk.js.map",
+ "967.d81fcc30.chunk.js.map": "/static/js/967.d81fcc30.chunk.js.map",
+ "964.21ed2858.chunk.js.map": "/static/js/964.21ed2858.chunk.js.map",
+ "20.72aac927.chunk.js.map": "/static/js/20.72aac927.chunk.js.map",
+ "401.70312292.chunk.js.map": "/static/js/401.70312292.chunk.js.map",
+ "590.e57a5edb.chunk.js.map": "/static/js/590.e57a5edb.chunk.js.map",
+ "324.55974c0a.chunk.js.map": "/static/js/324.55974c0a.chunk.js.map",
+ "134.bddaeef6.chunk.js.map": "/static/js/134.bddaeef6.chunk.js.map",
+ "759.1fe9965a.chunk.js.map": "/static/js/759.1fe9965a.chunk.js.map",
+ "899.c0867d99.chunk.js.map": "/static/js/899.c0867d99.chunk.js.map",
+ "140.38ddc782.chunk.js.map": "/static/js/140.38ddc782.chunk.js.map",
+ "644.c6f78ba1.chunk.js.map": "/static/js/644.c6f78ba1.chunk.js.map",
+ "720.2f0fd0b6.chunk.js.map": "/static/js/720.2f0fd0b6.chunk.js.map",
+ "135.5d13f1ca.chunk.js.map": "/static/js/135.5d13f1ca.chunk.js.map",
+ "787.ae15bb64.chunk.js.map": "/static/js/787.ae15bb64.chunk.js.map",
+ "58.5155fbd7.chunk.js.map": "/static/js/58.5155fbd7.chunk.js.map",
+ "169.5dd6f801.chunk.js.map": "/static/js/169.5dd6f801.chunk.js.map",
+ "657.6c031494.chunk.js.map": "/static/js/657.6c031494.chunk.js.map",
+ "713.847947f8.chunk.js.map": "/static/js/713.847947f8.chunk.js.map",
+ "88.f973dc1f.chunk.js.map": "/static/js/88.f973dc1f.chunk.js.map",
+ "383.d007dedd.chunk.js.map": "/static/js/383.d007dedd.chunk.js.map",
+ "141.e3083122.chunk.js.map": "/static/js/141.e3083122.chunk.js.map",
+ "56.8d2cf628.chunk.js.map": "/static/js/56.8d2cf628.chunk.js.map",
+ "453.8675bcab.chunk.js.map": "/static/js/453.8675bcab.chunk.js.map",
+ "532.b7154a0d.chunk.js.map": "/static/js/532.b7154a0d.chunk.js.map",
+ "587.458082b5.chunk.js.map": "/static/js/587.458082b5.chunk.js.map",
+ "509.965f3c53.chunk.js.map": "/static/js/509.965f3c53.chunk.js.map",
+ "865.93d56689.chunk.js.map": "/static/js/865.93d56689.chunk.js.map",
+ "556.bfdf8229.chunk.js.map": "/static/js/556.bfdf8229.chunk.js.map",
+ "745.c57f2e11.chunk.js.map": "/static/js/745.c57f2e11.chunk.js.map",
+ "813.801479d9.chunk.js.map": "/static/js/813.801479d9.chunk.js.map",
+ "194.4acfb22a.chunk.js.map": "/static/js/194.4acfb22a.chunk.js.map"
+ },
+ "entrypoints": [
+ "static/css/main.351373b1.css",
+ "static/js/main.a499650c.js"
+ ]
+}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/chat.js b/webui/src/main/resources/application/chat.js
deleted file mode 100644
index 37d54fd0..00000000
--- a/webui/src/main/resources/application/chat.js
+++ /dev/null
@@ -1,88 +0,0 @@
-let socket;
-let reconnectAttempts = 0;
-const MAX_RECONNECT_DELAY = 30000; // Maximum delay of 30 seconds
-
-export function send(message) {
- console.log('Sending message:', message);
- if (socket.readyState !== 1) {
- console.error('WebSocket is not open. Message not sent:', message);
- return false;
- }
- socket.send(message);
- return true;
-}
-
-export function connect(sessionId, customReceiveFunction) {
-
- const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:';
- const host = window.location.hostname;
- const port = window.location.port;
- const path = getWebSocketPath();
-
- socket = new WebSocket(`${protocol}//${host}:${port}${path}ws?sessionId=${sessionId}`);
-
- socket.addEventListener('open', (event) => {
- console.log('WebSocket connected:', event);
- showDisconnectedOverlay(false);
- reconnectAttempts = 0;
- });
- socket.addEventListener('message', (event) => {
- if (customReceiveFunction) {
- customReceiveFunction(event);
- } else {
- onWebSocketText(event);
- }
- });
-
-
- socket.addEventListener('close', (event) => {
- console.log('WebSocket closed:', event);
- showDisconnectedOverlay(true);
- reconnect(sessionId, customReceiveFunction);
- });
-
- socket.addEventListener('error', (event) => {
- console.error('WebSocket error:', event);
- });
-}
-
-function getWebSocketPath() {
- const path = window.location.pathname;
- const strings = path.split('/');
- return (strings.length >= 2 && strings[1] !== '' && strings[1] !== 'index.html')
- ? '/' + strings[1] + '/'
- : '/';
-}
-
-function reconnect(sessionId, customReceiveFunction) {
- const delay = Math.min(1000 * Math.pow(2, reconnectAttempts), MAX_RECONNECT_DELAY);
- console.log(`Attempting to reconnect in ${delay}ms...`);
- setTimeout(() => {
- connect(sessionId, customReceiveFunction);
- reconnectAttempts++;
- }, delay);
-}
-
-function showDisconnectedOverlay(show) {
- document.querySelectorAll('.ws-control').forEach(element => {
- element.disabled = show;
- });
-}
-
-// Implement a message queue to handle potential disconnections
-let messageQueue = [];
-
-export function queueMessage(message) {
-
- messageQueue.push(message);
- processMessageQueue();
-}
-
-function processMessageQueue() {
- if (socket.readyState === WebSocket.OPEN) {
- while (messageQueue.length > 0) {
- const message = messageQueue.shift();
- send(message);
- }
- }
-}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/favicon.ico b/webui/src/main/resources/application/favicon.ico
new file mode 100644
index 00000000..a11777cc
Binary files /dev/null and b/webui/src/main/resources/application/favicon.ico differ
diff --git a/webui/src/main/resources/application/favicon.svg b/webui/src/main/resources/application/favicon.svg
deleted file mode 100644
index 32b29bf6..00000000
--- a/webui/src/main/resources/application/favicon.svg
+++ /dev/null
@@ -1,745 +0,0 @@
-
-
diff --git a/webui/src/main/resources/application/forest.scss b/webui/src/main/resources/application/forest.scss
deleted file mode 100644
index f259fab5..00000000
--- a/webui/src/main/resources/application/forest.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import '../shared/schemes/forest';
-@import '../shared/main';
diff --git a/webui/src/main/resources/application/functions.js b/webui/src/main/resources/application/functions.js
deleted file mode 100644
index 7937edd9..00000000
--- a/webui/src/main/resources/application/functions.js
+++ /dev/null
@@ -1,242 +0,0 @@
-export async function fetchData(endpoint, useSession = true) {
- try {
- const modalContent = getCachedElement('modal-content');
- if (modalContent) modalContent.innerHTML = "
Loading...
";
- // Use the configured host/port from the app config
- const config = window.appConfig || {};
- const protocol = window.location.protocol;
- const host = config.websocket?.url || window.location.hostname;
- const port = config.websocket?.port || window.location.port;
- // Handle endpoints that already have query parameters
- const separator = endpoint.includes('?') ? '&' : '?';
- const url = `${protocol}//${host}:${port}/${endpoint}${useSession ? `${separator}sessionId=${getSessionId()}` : ''}`;
- const response = await fetch(url);
- if (!response.ok) {
- throw new Error(`HTTP error! status: ${response.status}`);
- }
- const text = await response.text();
- if (modalContent) modalContent.innerHTML = "" + text + "
";
- if (typeof Prism !== 'undefined') {
- Prism.highlightAll();
- }
- } catch (error) {
- console.error('Error fetching data:', error);
- const modalContent = document.getElementById('modal-content');
- if (modalContent) modalContent.innerHTML = "Error loading content. Please try again later.
";
- throw error; // Re-throw the error for the caller to handle if needed
- }
-}
-
-export function getSessionId() {
- if (!window.location.hash) {
- return fetch('newSession')
- .then(response => {
- if (response.ok) {
- return response.text();
- } else {
- throw new Error(`Failed to get new session ID. Status: ${response.status}`);
- }
- })
- .then(sessionId => {
- window.location.hash = sessionId;
- return sessionId;
- })
- .catch(error => {
- console.error('Error getting session ID:', error.message);
- throw error; // Re-throw the error for the caller to handle
- });
- } else {
- return window.location.hash.substring(1);
- }
-}
-
-const elementCache = new Map();
-
-export function getCachedElement(id) {
- if (!elementCache.has(id)) {
- const element = document.getElementById(id);
- if (element) {
- elementCache.set(id, element);
- }
- }
- return elementCache.get(id);
-}
-
-export function showModal(endpoint, useSession = true) {
- fetchData(endpoint, useSession).then(r => {
- const modal = getCachedElement('modal');
- if (modal) modal.style.display = 'block';
- });
-}
-
-export function closeModal() {
- const modal = getCachedElement('modal');
- if (modal) modal.style.display = 'none';
-}
-
-(function () {
- class SvgPanZoom {
-
- // Make sure to update the init function to avoid attaching multiple listeners to the same SVG
- init(svgElement) {
- if (svgElement.dataset.svgPanZoomInitialized) return; // Skip if already initialized
- svgElement.dataset.svgPanZoomInitialized = true; // Mark as initialized
- this.svgElement = svgElement;
- this.currentTransform = {x: 0, y: 0, scale: 1};
- this.onMove = this.onMove.bind(this);
- this.onClick = this.onClick.bind(this);
- this.handleZoom = this.handleZoom.bind(this);
- this.ensureTransformGroup();
- this.attachEventListeners();
- }
-
- // Ensure the SVG has a element for transformations
- ensureTransformGroup() {
- if (!this.svgElement.querySelector('g.transform-group')) {
- const group = document.createElementNS('http://www.w3.org/2000/svg', 'g');
- group.classList.add('transform-group');
- while (this.svgElement.firstChild) {
- group.appendChild(this.svgElement.firstChild);
- }
- this.svgElement.appendChild(group);
- }
- this.transformGroup = this.svgElement.querySelector('g.transform-group');
- }
-
- // Attach event listeners for panning and zooming
- attachEventListeners() {
- this.svgElement.addEventListener('click', this.onClick.bind(this));
- this.svgElement.addEventListener('mousemove', this.onMove.bind(this));
- this.svgElement.addEventListener('wheel', this.handleZoom.bind(this));
- }
-
- // Start panning
- onClick(event) {
- if (this.isPanning) {
- this.isPanning = false;
- console.log("Ending pan");
- } else {
- this.isPanning = true;
- console.log("Starting pan");
- this.startX = event.clientX;
- this.startY = event.clientY;
- this.priorPan = {x: this.currentTransform.x, y: this.currentTransform.y};
- }
- }
-
- // Perform panning
- onMove(event) {
- const moveScale = this.svgElement.viewBox.baseVal.width / this.svgElement.width.baseVal.value;
- if (this.isPanning === false) return;
- const dx = event.clientX - this.startX;
- const dy = event.clientY - this.startY;
- if (this.priorPan) {
- if (this.currentTransform.x) {
- this.currentTransform.x = dx * moveScale + this.priorPan.x;
- } else {
- this.currentTransform.x = dx * moveScale + this.priorPan.x;
- }
- if (this.currentTransform.y) {
- this.currentTransform.y = dy * moveScale + this.priorPan.y;
- } else {
- this.currentTransform.y = dy * moveScale + this.priorPan.y;
- }
- }
- this.updateTransform();
- }
-
- // Handle zooming
- handleZoom(event) {
- event.preventDefault();
- const direction = event.deltaY > 0 ? -1 : 1;
- const zoomFactor = 0.1;
- this.currentTransform.scale += direction * zoomFactor;
- this.currentTransform.scale = Math.max(0.1, this.currentTransform.scale); // Prevent inverting
- console.log("Handling zoom %s (%s)", direction, this.currentTransform.scale);
- this.updateTransform();
- }
-
- // Update SVG transform
- updateTransform() {
- console.log("Updating SVG transform");
- const transformAttr = `translate(${this.currentTransform.x} ${this.currentTransform.y}) scale(${this.currentTransform.scale})`;
- this.transformGroup.setAttribute('transform', transformAttr);
- }
- }
-
- // Expose the library to the global scope
- window.SvgPanZoom = SvgPanZoom;
-})();
-
-
-export function toggleVerbose() {
- let verboseToggle = getCachedElement('verbose');
- if (verboseToggle.innerText === 'Hide Verbose') {
- const elements = Array.from(document.getElementsByClassName('verbose'));
- for (let i = 0; i < elements.length; i++) {
- elements[i].classList.add('verbose-hidden'); // Add the 'verbose-hidden' class to hide
- }
- verboseToggle.innerText = 'Show Verbose';
- } else if (verboseToggle.innerText === 'Show Verbose') {
- const elements = Array.from(document.getElementsByClassName('verbose'));
- for (let i = 0; i < elements.length; i++) {
- elements[i].classList.remove('verbose-hidden'); // Remove the 'verbose-hidden' class to show
- }
- verboseToggle.innerText = 'Hide Verbose';
- } else {
- console.log("Error: Unknown state for verbose button");
- }
-}
-
-export function refreshReplyForms() {
- Array.from(document.getElementsByClassName('reply-input')).forEach(messageInput => {
- messageInput.addEventListener('keydown', (event) => {
- if (event.key === 'Enter' && !event.shiftKey) {
- event.preventDefault();
- let form = messageInput.closest('form');
- if (form) {
- let textSubmitButton = form.getElementsByClassName('text-submit-button')[0];
- if (textSubmitButton) {
- textSubmitButton.click();
- } else {
- form.dispatchEvent(new Event('submit', {cancelable: true}));
- }
- }
- }
- });
- });
-}
-
-
-export function refreshVerbose() {
- let verboseToggle = getCachedElement('verbose');
- if (verboseToggle.innerText === 'Hide Verbose') {
- const elements = Array.from(document.getElementsByClassName('verbose'));
- for (let i = 0; i < elements.length; i++) {
- elements[i].classList.remove('verbose-hidden'); // Remove the 'verbose-hidden' class to show
- }
- } else if (verboseToggle.innerText === 'Show Verbose') {
- const elements = Array.from(document.getElementsByClassName('verbose'));
- for (let i = 0; i < elements.length; i++) {
- elements[i].classList.add('verbose-hidden'); // Add the 'verbose-hidden' class to hide
- }
- } else {
- console.log("Error: Unknown state for verbose button");
- }
-}
-
-export function findAncestor(element, selector) {
- while (element && !element.matches(selector)) {
- element = element.parentElement;
- }
- return element;
-}
-
-
-export function applyToAllSvg() {
- Array.from(document.getElementsByTagName('svg')).forEach(svg => {
- if (!svg.dataset.svgPanZoomInitialized) {
- new SvgPanZoom().init(svg);
- }
- });
-}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/index.html b/webui/src/main/resources/application/index.html
index c162accd..12e8e6c1 100644
--- a/webui/src/main/resources/application/index.html
+++ b/webui/src/main/resources/application/index.html
@@ -1,120 +1,19 @@
-
+
- WebSocket Client
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+ React App
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
\ No newline at end of file
diff --git a/webui/src/main/resources/application/logo192.png b/webui/src/main/resources/application/logo192.png
new file mode 100644
index 00000000..fc44b0a3
Binary files /dev/null and b/webui/src/main/resources/application/logo192.png differ
diff --git a/webui/src/main/resources/application/logo512.png b/webui/src/main/resources/application/logo512.png
new file mode 100644
index 00000000..a4e47a65
Binary files /dev/null and b/webui/src/main/resources/application/logo512.png differ
diff --git a/webui/src/main/resources/application/main.js b/webui/src/main/resources/application/main.js
deleted file mode 100644
index 7526f6ad..00000000
--- a/webui/src/main/resources/application/main.js
+++ /dev/null
@@ -1,97 +0,0 @@
-import {connect} from './chat.js';
-import {getCachedElement, getSessionId, refreshReplyForms, refreshVerbose} from './functions.js';
-import {updateTabs} from './tabs.js';
-import {setupUIHandlers} from './uiHandlers.js';
-import {onWebSocketText} from './messageHandling.js';
-import {setupFormSubmit, setupMessageInput, setupUserInfo} from './uiSetup.js';
-import {fetchAppConfig} from './appConfig.js';
-
-console.log('Main script started');
-
-function debounce(func, wait) {
- let timeout;
- return function executedFunction(...args) {
- const later = () => {
- clearTimeout(timeout);
- func(...args);
- };
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- };
-}
-
-const updateDocumentComponents = debounce(function () {
- try {
- updateTabs();
- } catch (e) {
- console.error("Error updating tabs:", e);
- }
- try {
- if (typeof Prism !== 'undefined') Prism.highlightAll();
- } catch (e) {
- console.error("Error highlighting code:", e);
- }
- try {
- refreshVerbose();
- } catch (e) {
- console.error("Error refreshing verbose:", e);
- }
- try {
- refreshReplyForms()
- } catch (e) {
- console.error("Error refreshing reply forms:", e);
- }
- try {
- if (typeof mermaid !== 'undefined') {
- const mermaidDiagrams = Array.from(document.getElementsByClassName('mermaid')).filter(el => !el.classList.contains('mermaid-processed'));
- if (mermaidDiagrams.length > 0) {
- mermaid.run();
- mermaidDiagrams.forEach(diagram => diagram.classList.add('mermaid-processed'));
- }
- }
- } catch (e) {
- console.error("Error running mermaid:", e);
- }
- // try {
- // applyToAllSvg();
- // } catch (e) {
- // console.error("Error applying SVG pan zoom:", e);
- // }
-}, 250);
-
-document.addEventListener('DOMContentLoaded', () => {
- console.log('DOM content loaded');
- if (typeof mermaid !== 'undefined') mermaid.run();
-
- updateTabs();
- setupUIHandlers();
-
- const loginLink = getCachedElement('login');
- const usernameLink = getCachedElement('username');
- const userSettingsLink = getCachedElement('user-settings');
- const userUsageLink = getCachedElement('user-usage');
- const logoutLink = getCachedElement('logout');
- const form = getCachedElement('main-input');
- const messageInput = getCachedElement('chat-input');
- const sessionId = getSessionId();
- const messages = getCachedElement('messages');
-
- if (sessionId) {
- console.log(`Connecting with session ID: ${sessionId}`);
- connect(sessionId, (event) => onWebSocketText(event, messages, updateDocumentComponents));
- } else {
- console.log('Connecting without session ID');
- connect(undefined, (event) => onWebSocketText(event, messages, updateDocumentComponents));
- }
-
- setupMessageInput(form, messageInput);
- setupFormSubmit(form, messageInput);
- setupUserInfo(loginLink, usernameLink, userSettingsLink, userUsageLink, logoutLink);
-
- fetchAppConfig(sessionId)
- .catch(error => {
- console.error('There was a problem with the fetch operation:', error);
- });
-
-
-});
\ No newline at end of file
diff --git a/webui/src/main/resources/application/main.scss b/webui/src/main/resources/application/main.scss
deleted file mode 100644
index 0d476ca5..00000000
--- a/webui/src/main/resources/application/main.scss
+++ /dev/null
@@ -1,27 +0,0 @@
-@import '../shared/schemes/normal';
-@import '../shared/main';
-
-.cmd-button {
- display: inline-block;
- padding: 8px 15px;
- font-size: 14px;
- cursor: pointer;
- text-align: center;
- text-decoration: none;
- outline: none;
- color: #fff;
- background-color: #4CAF50;
- border: none;
- border-radius: 5px;
- box-shadow: 0 9px #999;
-}
-
-.cmd-button:hover {
- background-color: #3e8e41
-}
-
-.cmd-button:active {
- background-color: #3e8e41;
- box-shadow: 0 5px #666;
- transform: translateY(4px);
-}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/manifest.json b/webui/src/main/resources/application/manifest.json
new file mode 100644
index 00000000..080d6c77
--- /dev/null
+++ b/webui/src/main/resources/application/manifest.json
@@ -0,0 +1,25 @@
+{
+ "short_name": "React App",
+ "name": "Create React App Sample",
+ "icons": [
+ {
+ "src": "favicon.ico",
+ "sizes": "64x64 32x32 24x24 16x16",
+ "type": "image/x-icon"
+ },
+ {
+ "src": "logo192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "logo512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ],
+ "start_url": ".",
+ "display": "standalone",
+ "theme_color": "#000000",
+ "background_color": "#ffffff"
+}
diff --git a/webui/src/main/resources/application/messageHandling.js b/webui/src/main/resources/application/messageHandling.js
deleted file mode 100644
index 9428e01f..00000000
--- a/webui/src/main/resources/application/messageHandling.js
+++ /dev/null
@@ -1,68 +0,0 @@
-import {showMenubar, singleInput, stickyInput} from './appConfig.js';
-
-const messageVersions = new Map();
-const messageMap = new Map(); // Use Map instead of object for better performance
-const MAX_SUBSTITUTION_DEPTH = 10;
-const OPERATION_TIMEOUT = 5000; // 5 seconds
-
-export function onWebSocketText(event, messagesDiv, updateDocumentComponents) {
- if (!messagesDiv) return;
- const [messageId, messageVersion, ...contentParts] = event.data.split(',');
- const messageContent = contentParts.join(',');
- messageVersions.set(messageId, messageVersion);
- messageMap.set(messageId, messageContent);
-
- const messageDivs = messagesDiv.querySelectorAll(`[id="${messageId}"]`);
- messageDivs.forEach((messageDiv) => {
- messageDiv.innerHTML = messageContent;
- substituteMessages(messageDiv, 0, [messageId]);
- });
- if (messageDivs.length === 0 && !messageId.startsWith("z")) {
- const messageDiv = document.createElement('div');
- messageDiv.className = `message message-container ${messageId.startsWith('u') ? 'user-message' : 'response-message'}`;
- messageDiv.id = messageId;
- messageDiv.innerHTML = messageContent;
- messagesDiv.appendChild(messageDiv);
- substituteMessages(messageDiv, 0, [messageId]);
- }
- const mainInput = document.getElementById('main-input');
- if (mainInput) {
- if (singleInput) mainInput.style.display = 'none';
- if (stickyInput) {
- mainInput.style.position = 'sticky';
- mainInput.style.zIndex = '1';
- mainInput.style.top = showMenubar ? '30px' : '0px';
- }
- } else {
- console.log("Error: Could not find #main-input");
- }
-
- requestAnimationFrame(() => {
- updateDocumentComponents();
- });
-}
-
-
-function substituteMessages(messageDiv, depth, outerMessageIds) {
- if (depth > MAX_SUBSTITUTION_DEPTH) {
- console.warn('Max substitution depth reached');
- return;
- }
- const timeoutId = setTimeout(() => console.warn('substituteMessages operation timed out'), OPERATION_TIMEOUT);
- for (const [innerMessageId, content] of messageMap) {
- if (!innerMessageId.startsWith("z") || outerMessageIds.includes(innerMessageId)) continue;
- const elements = messageDiv.querySelectorAll(`[id="${innerMessageId}"]`);
- for (let i = 0; i < elements.length; i++) {
- const element = elements[i];
- if (element.innerHTML !== content) {
- try {
- element.innerHTML = content;
- substituteMessages(element, depth + 1, [...outerMessageIds, innerMessageId]);
- } catch (e) {
- console.warn('Error during message substitution:', e);
- }
- }
- }
- }
- clearTimeout(timeoutId);
-}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/night.scss b/webui/src/main/resources/application/night.scss
deleted file mode 100644
index 06743da9..00000000
--- a/webui/src/main/resources/application/night.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import '../shared/schemes/night';
-@import '../shared/main';
diff --git a/webui/src/main/resources/application/pony.scss b/webui/src/main/resources/application/pony.scss
deleted file mode 100644
index c902326b..00000000
--- a/webui/src/main/resources/application/pony.scss
+++ /dev/null
@@ -1,2 +0,0 @@
-@import '../shared/schemes/pony';
-@import '../shared/main';
diff --git a/webui/src/main/resources/application/robots.txt b/webui/src/main/resources/application/robots.txt
new file mode 100644
index 00000000..e9e57dc4
--- /dev/null
+++ b/webui/src/main/resources/application/robots.txt
@@ -0,0 +1,3 @@
+# https://www.robotstxt.org/robotstxt.html
+User-agent: *
+Disallow:
diff --git a/webui/src/main/resources/application/static/css/101.c207c750.chunk.css b/webui/src/main/resources/application/static/css/101.c207c750.chunk.css
new file mode 100644
index 00000000..de4f2dbc
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/101.c207c750.chunk.css
@@ -0,0 +1,2 @@
+code[class*=language-],pre[class*=language-]{word-wrap:normal;background:0 0;color:#fff;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;text-shadow:0 -.1em .2em #000;white-space:pre;word-break:normal;word-spacing:normal}:not(pre)>code[class*=language-],pre[class*=language-]{background:#141414}pre[class*=language-]{border:.3em solid #545454;border-radius:.5em;box-shadow:inset 1px 1px .5em #000;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::selection{background:#27292a}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#ededed26;text-shadow:none}:not(pre)>code[class*=language-]{border:.13em solid #545454;border-radius:.3em;box-shadow:inset 1px 1px .3em -.1em #000;padding:.15em .2em .05em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#777}.token.namespace,.token.punctuation{opacity:.7}.token.boolean,.token.deleted,.token.number,.token.tag{color:#ce6849}.token.builtin,.token.constant,.token.keyword,.token.property,.token.selector,.token.symbol{color:#f9ed99}.language-css .token.string,.style .token.string,.token.attr-name,.token.attr-value,.token.char,.token.entity,.token.inserted,.token.operator,.token.string,.token.url,.token.variable{color:#909e6a}.token.atrule{color:#7385a5}.token.important,.token.regex{color:#e8c062}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.attr-name,.language-markup .token.punctuation,.language-markup .token.tag{color:#ac885c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:#54545440;background:linear-gradient(90deg,#5454541a 70%,#54545400);border-bottom:1px dashed #545454;border-top:1px dashed #545454;margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8693a6;color:#f4f1ef}
+/*# sourceMappingURL=101.c207c750.chunk.css.map*/
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/101.c207c750.chunk.css.map b/webui/src/main/resources/application/static/css/101.c207c750.chunk.css.map
new file mode 100644
index 00000000..3a06ac44
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/101.c207c750.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/101.c207c750.chunk.css","mappings":"AAAA,6CAA2P,gBAAgB,CAAnN,cAAc,CAAzB,UAAU,CAAgB,6DAAiE,CAAC,aAAa,CAA+K,oBAAoB,CAAoC,YAAW,CAA5H,eAAe,CAA+B,UAAU,CAA7K,eAAe,CAAC,6BAA6B,CAAC,eAAe,CAAqB,iBAAiB,CAArC,mBAAoL,CAAC,uDAAuD,kBAAkB,CAAC,sBAAyC,yBAAyB,CAA5C,kBAAkB,CAA2B,kCAAkC,CAAC,aAAa,CAAC,aAAa,CAAC,WAAW,CAA0D,iCAAiC,kBAAkB,CAA4M,wIAAyJ,oBAA4B,CAA7C,gBAA8C,CAAC,iCAAoD,0BAA0B,CAA7C,kBAAkB,CAA4B,wCAAwC,CAAC,wBAAwB,CAAC,kBAAkB,CAAC,yDAAyD,UAAU,CAA+B,oCAAiB,UAAU,CAAC,uDAAuD,aAAa,CAAC,4FAA4F,aAAa,CAAC,uLAAuL,aAAa,CAAC,cAAc,aAAa,CAAC,8BAA8B,aAAa,CAAC,6BAA6B,eAAe,CAAC,cAAc,iBAAiB,CAAC,cAAc,WAAW,CAAC,kGAAkG,aAAa,CAAC,OAAO,iBAAiB,CAAC,SAAS,CAAC,+BAA+B,oBAA6B,CAAC,yDAA2E,CAAC,gCAAgC,CAAC,6BAA6B,CAAC,gBAAgB,CAAC,SAAS,CAAC,qFAAqF,wBAAwB,CAAC,aAAa","sources":["../node_modules/prismjs/themes/prism-twilight.min.css"],"sourcesContent":["code[class*=language-],pre[class*=language-]{color:#fff;background:0 0;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;text-shadow:0 -.1em .2em #000;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}:not(pre)>code[class*=language-],pre[class*=language-]{background:#141414}pre[class*=language-]{border-radius:.5em;border:.3em solid #545454;box-shadow:1px 1px .5em #000 inset;margin:.5em 0;overflow:auto;padding:1em}pre[class*=language-]::-moz-selection{background:#27292a}pre[class*=language-]::selection{background:#27292a}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{text-shadow:none;background:hsla(0,0%,93%,.15)}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{text-shadow:none;background:hsla(0,0%,93%,.15)}:not(pre)>code[class*=language-]{border-radius:.3em;border:.13em solid #545454;box-shadow:1px 1px .3em -.1em #000 inset;padding:.15em .2em .05em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#777}.token.punctuation{opacity:.7}.token.namespace{opacity:.7}.token.boolean,.token.deleted,.token.number,.token.tag{color:#ce6849}.token.builtin,.token.constant,.token.keyword,.token.property,.token.selector,.token.symbol{color:#f9ed99}.language-css .token.string,.style .token.string,.token.attr-name,.token.attr-value,.token.char,.token.entity,.token.inserted,.token.operator,.token.string,.token.url,.token.variable{color:#909e6a}.token.atrule{color:#7385a5}.token.important,.token.regex{color:#e8c062}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.language-markup .token.attr-name,.language-markup .token.punctuation,.language-markup .token.tag{color:#ac885c}.token{position:relative;z-index:1}.line-highlight.line-highlight{background:hsla(0,0%,33%,.25);background:linear-gradient(to right,hsla(0,0%,33%,.1) 70%,hsla(0,0%,33%,0));border-bottom:1px dashed #545454;border-top:1px dashed #545454;margin-top:.75em;z-index:0}.line-highlight.line-highlight:before,.line-highlight.line-highlight[data-end]:after{background-color:#8693a6;color:#f4f1ef}"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/198.76fff1e7.chunk.css b/webui/src/main/resources/application/static/css/198.76fff1e7.chunk.css
new file mode 100644
index 00000000..3cbda514
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/198.76fff1e7.chunk.css
@@ -0,0 +1,2 @@
+code[class*=language-],pre[class*=language-]{word-wrap:normal;background:none;color:#ccc;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#2d2d2d}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#999}.token.punctuation{color:#ccc}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#f08d49}.token.class-name,.token.constant,.token.property,.token.symbol{color:#f8c555}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#cc99cd}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#7ec699}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}
+/*# sourceMappingURL=198.76fff1e7.chunk.css.map*/
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/198.76fff1e7.chunk.css.map b/webui/src/main/resources/application/static/css/198.76fff1e7.chunk.css.map
new file mode 100644
index 00000000..60b68ff9
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/198.76fff1e7.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/198.76fff1e7.chunk.css","mappings":"AAMA,6CAUC,gBAAiB,CAPjB,eAAgB,CADhB,UAAW,CAEX,6DAAsE,CACtE,aAAc,CAYd,oBAAqB,CAGrB,YAAa,CATb,eAAgB,CAIhB,UAAW,CATX,eAAgB,CAChB,eAAgB,CAEhB,iBAAkB,CADlB,mBAcD,CAGA,sBAEC,aAAc,CACd,aAAc,CAFd,WAGD,CAEA,uDAEC,kBACD,CAGA,iCAEC,kBAAmB,CADnB,YAAa,CAEb,kBACD,CAEA,8EAKC,UACD,CAEA,mBACC,UACD,CAEA,4DAIC,aACD,CAEA,qBACC,aACD,CAEA,6CAGC,aACD,CAEA,gEAIC,aACD,CAEA,6EAKC,aACD,CAEA,yEAKC,aACD,CAEA,yCAGC,aACD,CAEA,6BAEC,eACD,CACA,cACC,iBACD,CAEA,cACC,WACD,CAEA,gBACC,WACD","sources":["../node_modules/prismjs/themes/prism-tomorrow.css"],"sourcesContent":["/**\n * prism.js tomorrow night eighties for JavaScript, CoffeeScript, CSS and HTML\n * Based on https://github.com/chriskempson/tomorrow-theme\n * @author Rose Pritchard\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #ccc;\n\tbackground: none;\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground: #2d2d2d;\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n\twhite-space: normal;\n}\n\n.token.comment,\n.token.block-comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #999;\n}\n\n.token.punctuation {\n\tcolor: #ccc;\n}\n\n.token.tag,\n.token.attr-name,\n.token.namespace,\n.token.deleted {\n\tcolor: #e2777a;\n}\n\n.token.function-name {\n\tcolor: #6196cc;\n}\n\n.token.boolean,\n.token.number,\n.token.function {\n\tcolor: #f08d49;\n}\n\n.token.property,\n.token.class-name,\n.token.constant,\n.token.symbol {\n\tcolor: #f8c555;\n}\n\n.token.selector,\n.token.important,\n.token.atrule,\n.token.keyword,\n.token.builtin {\n\tcolor: #cc99cd;\n}\n\n.token.string,\n.token.char,\n.token.attr-value,\n.token.regex,\n.token.variable {\n\tcolor: #7ec699;\n}\n\n.token.operator,\n.token.entity,\n.token.url {\n\tcolor: #67cdcc;\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n\n.token.inserted {\n\tcolor: green;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/436.0394fb49.chunk.css b/webui/src/main/resources/application/static/css/436.0394fb49.chunk.css
new file mode 100644
index 00000000..df6a2f3e
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/436.0394fb49.chunk.css
@@ -0,0 +1,2 @@
+code[class*=language-],pre[class*=language-]{word-wrap:normal;color:#657b83;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#073642}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdf6e3}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#93a1a1}.token.punctuation{color:#586e75}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#268bd2}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#2aa198}.token.entity{background:#eee8d5;color:#657b83}.token.atrule,.token.attr-value,.token.keyword{color:#859900}.token.class-name,.token.function{color:#b58900}.token.important,.token.regex,.token.variable{color:#cb4b16}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+/*# sourceMappingURL=436.0394fb49.chunk.css.map*/
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/436.0394fb49.chunk.css.map b/webui/src/main/resources/application/static/css/436.0394fb49.chunk.css.map
new file mode 100644
index 00000000..d7a3e019
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/436.0394fb49.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/436.0394fb49.chunk.css","mappings":"AA8BA,6CASC,gBAAiB,CAPjB,aAAc,CACd,6DAAsE,CACtE,aAAc,CAad,oBAAqB,CAGrB,YAAa,CATb,eAAgB,CAIhB,UAAW,CAVX,eAAgB,CAChB,eAAgB,CAEhB,iBAAkB,CADlB,mBAcD,CAOA,wIAEC,kBACD,CAGA,sBAIC,kBAAoB,CAFpB,aAAc,CACd,aAAc,CAFd,WAID,CAEA,uDAEC,wBACD,CAGA,iCAEC,kBAAmB,CADnB,YAED,CAEA,yDAIC,aACD,CAEA,mBACC,aACD,CAEA,iBACC,UACD,CAEA,qGAOC,aACD,CAEA,qGAOC,aACD,CAEA,cAEC,kBAAmB,CADnB,aAED,CAEA,+CAGC,aACD,CAEA,kCAEC,aACD,CAEA,8CAGC,aACD,CAEA,6BAEC,eACD,CACA,cACC,iBACD,CAEA,cACC,WACD","sources":["../node_modules/prismjs/themes/prism-solarizedlight.css"],"sourcesContent":["/*\n Solarized Color Schemes originally by Ethan Schoonover\n http://ethanschoonover.com/solarized\n\n Ported for PrismJS by Hector Matos\n Website: https://krakendev.io\n Twitter Handle: https://twitter.com/allonsykraken)\n*/\n\n/*\nSOLARIZED HEX\n--------- -------\nbase03 #002b36\nbase02 #073642\nbase01 #586e75\nbase00 #657b83\nbase0 #839496\nbase1 #93a1a1\nbase2 #eee8d5\nbase3 #fdf6e3\nyellow #b58900\norange #cb4b16\nred #dc322f\nmagenta #d33682\nviolet #6c71c4\nblue #268bd2\ncyan #2aa198\ngreen #859900\n*/\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tcolor: #657b83; /* base00 */\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\npre[class*=\"language-\"]::-moz-selection, pre[class*=\"language-\"] ::-moz-selection,\ncode[class*=\"language-\"]::-moz-selection, code[class*=\"language-\"] ::-moz-selection {\n\tbackground: #073642; /* base02 */\n}\n\npre[class*=\"language-\"]::selection, pre[class*=\"language-\"] ::selection,\ncode[class*=\"language-\"]::selection, code[class*=\"language-\"] ::selection {\n\tbackground: #073642; /* base02 */\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: 1em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tborder-radius: 0.3em;\n}\n\n:not(pre) > code[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tbackground-color: #fdf6e3; /* base3 */\n}\n\n/* Inline code */\n:not(pre) > code[class*=\"language-\"] {\n\tpadding: .1em;\n\tborder-radius: .3em;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n\tcolor: #93a1a1; /* base1 */\n}\n\n.token.punctuation {\n\tcolor: #586e75; /* base01 */\n}\n\n.token.namespace {\n\topacity: .7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol,\n.token.deleted {\n\tcolor: #268bd2; /* blue */\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin,\n.token.url,\n.token.inserted {\n\tcolor: #2aa198; /* cyan */\n}\n\n.token.entity {\n\tcolor: #657b83; /* base00 */\n\tbackground: #eee8d5; /* base2 */\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n\tcolor: #859900; /* green */\n}\n\n.token.function,\n.token.class-name {\n\tcolor: #b58900; /* yellow */\n}\n\n.token.regex,\n.token.important,\n.token.variable {\n\tcolor: #cb4b16; /* orange */\n}\n\n.token.important,\n.token.bold {\n\tfont-weight: bold;\n}\n.token.italic {\n\tfont-style: italic;\n}\n\n.token.entity {\n\tcursor: help;\n}\n"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/479.7217da39.chunk.css b/webui/src/main/resources/application/static/css/479.7217da39.chunk.css
new file mode 100644
index 00000000..438db503
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/479.7217da39.chunk.css
@@ -0,0 +1,2 @@
+code[class*=language-],pre[class*=language-]{word-wrap:normal;background:0 0;color:#f8f8f2;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;text-shadow:0 1px #0000004d;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8292a2}.token.punctuation{color:#f8f8f2}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+/*# sourceMappingURL=479.7217da39.chunk.css.map*/
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/479.7217da39.chunk.css.map b/webui/src/main/resources/application/static/css/479.7217da39.chunk.css.map
new file mode 100644
index 00000000..4e0622b2
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/479.7217da39.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/479.7217da39.chunk.css","mappings":"AAAA,6CAAiQ,gBAAgB,CAAtN,cAAc,CAA5B,aAAa,CAAiD,6DAAiE,CAAC,aAAa,CAAiJ,oBAAoB,CAAoC,YAAW,CAA5H,eAAe,CAA+B,UAAU,CAA/I,eAAe,CAAhI,2BAAgC,CAAiG,eAAe,CAAqB,iBAAiB,CAArC,mBAAoL,CAAC,sBAA8D,kBAAiB,CAA7C,aAAa,CAAC,aAAa,CAAvC,WAA0D,CAAC,uDAAuD,kBAAkB,CAAC,iCAA8C,kBAAkB,CAA/B,YAAY,CAAoB,kBAAkB,CAAC,yDAAyD,aAAa,CAAC,mBAAmB,aAAa,CAAC,iBAAiB,UAAU,CAAC,wEAAwE,aAAa,CAAC,6BAA6B,aAAa,CAAC,0FAA0F,aAAa,CAAC,0GAA0G,aAAa,CAAC,kEAAkE,aAAa,CAAC,eAAe,aAAa,CAAC,8BAA8B,aAAa,CAAC,6BAA6B,eAAe,CAAC,cAAc,iBAAiB,CAAC,cAAc,WAAW","sources":["../node_modules/prismjs/themes/prism-okaidia.min.css"],"sourcesContent":["code[class*=language-],pre[class*=language-]{color:#f8f8f2;background:0 0;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#272822}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#8292a2}.token.punctuation{color:#f8f8f2}.token.namespace{opacity:.7}.token.constant,.token.deleted,.token.property,.token.symbol,.token.tag{color:#f92672}.token.boolean,.token.number{color:#ae81ff}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#a6e22e}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f8f8f2}.token.atrule,.token.attr-value,.token.class-name,.token.function{color:#e6db74}.token.keyword{color:#66d9ef}.token.important,.token.regex{color:#fd971f}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/550.c616970f.chunk.css b/webui/src/main/resources/application/static/css/550.c616970f.chunk.css
new file mode 100644
index 00000000..c2a0716c
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/550.c616970f.chunk.css
@@ -0,0 +1,2 @@
+code[class*=language-],pre[class*=language-]{word-wrap:normal;color:#657b83;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#073642}pre[class*=language-]{border-radius:.3em;margin:.5em 0;overflow:auto;padding:1em}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdf6e3}:not(pre)>code[class*=language-]{border-radius:.3em;padding:.1em}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#93a1a1}.token.punctuation{color:#586e75}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#268bd2}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#2aa198}.token.entity{background:#eee8d5;color:#657b83}.token.atrule,.token.attr-value,.token.keyword{color:#859900}.token.class-name,.token.function{color:#b58900}.token.important,.token.regex,.token.variable{color:#cb4b16}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}
+/*# sourceMappingURL=550.c616970f.chunk.css.map*/
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/550.c616970f.chunk.css.map b/webui/src/main/resources/application/static/css/550.c616970f.chunk.css.map
new file mode 100644
index 00000000..5cfda311
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/550.c616970f.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/550.c616970f.chunk.css","mappings":"AAAA,6CAAiN,gBAAgB,CAApL,aAAa,CAAC,6DAAiE,CAAC,aAAa,CAAiJ,oBAAoB,CAAoC,YAAW,CAA5H,eAAe,CAA+B,UAAU,CAA/I,eAAe,CAAC,eAAe,CAAqB,iBAAiB,CAArC,mBAAoL,CAAgL,wIAAwI,kBAAkB,CAAC,sBAA8D,kBAAiB,CAA7C,aAAa,CAAC,aAAa,CAAvC,WAA0D,CAAC,uDAAuD,wBAAwB,CAAC,iCAA8C,kBAAiB,CAA9B,YAA+B,CAAC,yDAAyD,aAAa,CAAC,mBAAmB,aAAa,CAAC,iBAAiB,UAAU,CAAC,qGAAqG,aAAa,CAAC,qGAAqG,aAAa,CAAC,cAA4B,kBAAiB,CAA/B,aAAgC,CAAC,+CAA+C,aAAa,CAAC,kCAAkC,aAAa,CAAC,8CAA8C,aAAa,CAAC,6BAA6B,eAAe,CAAC,cAAc,iBAAiB,CAAC,cAAc,WAAW","sources":["../node_modules/prismjs/themes/prism-solarizedlight.min.css"],"sourcesContent":["code[class*=language-],pre[class*=language-]{color:#657b83;font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;font-size:1em;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none}code[class*=language-] ::-moz-selection,code[class*=language-]::-moz-selection,pre[class*=language-] ::-moz-selection,pre[class*=language-]::-moz-selection{background:#073642}code[class*=language-] ::selection,code[class*=language-]::selection,pre[class*=language-] ::selection,pre[class*=language-]::selection{background:#073642}pre[class*=language-]{padding:1em;margin:.5em 0;overflow:auto;border-radius:.3em}:not(pre)>code[class*=language-],pre[class*=language-]{background-color:#fdf6e3}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#93a1a1}.token.punctuation{color:#586e75}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.deleted,.token.number,.token.property,.token.symbol,.token.tag{color:#268bd2}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string,.token.url{color:#2aa198}.token.entity{color:#657b83;background:#eee8d5}.token.atrule,.token.attr-value,.token.keyword{color:#859900}.token.class-name,.token.function{color:#b58900}.token.important,.token.regex,.token.variable{color:#cb4b16}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}"],"names":[],"sourceRoot":""}
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/584.450f2786.chunk.css b/webui/src/main/resources/application/static/css/584.450f2786.chunk.css
new file mode 100644
index 00000000..a17a5523
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/584.450f2786.chunk.css
@@ -0,0 +1,2 @@
+code[class*=language-],pre[class*=language-]{word-wrap:normal;font-family:Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;font-size:1em;-webkit-hyphens:none;hyphens:none;line-height:1.5;tab-size:4;text-align:left;white-space:pre;word-break:normal;word-spacing:normal}pre[class*=language-]{background:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' fill='rgba(0,0,0,.2)'%3E%3Cpath d='M0 50 50 0H0zM0 100h50l50-50V0z'/%3E%3C/svg%3E");background-size:1em 1em;margin:.5em 0;overflow:auto;padding:.4em .8em}code[class*=language-]{background:#000;box-shadow:-.3em 0 0 .3em #000,.3em 0 0 .3em #000;color:#fff}:not(pre)>code[class*=language-]{border-radius:.3em;box-shadow:none;padding:.2em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#aaa}.token.punctuation{color:#999}.token.namespace{opacity:.7}.token.boolean,.token.constant,.token.number,.token.property,.token.symbol,.token.tag{color:#0cf}.token.attr-name,.token.builtin,.token.char,.token.selector,.token.string{color:#ff0}.language-css .token.string,.token.entity,.token.inserted,.token.operator,.token.url,.token.variable{color:#9acd32}.token.atrule,.token.attr-value,.token.keyword{color:#ff1493}.token.important,.token.regex{color:orange}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.deleted{color:red}pre.diff-highlight.diff-highlight>code .token.deleted:not(.prefix),pre>code.diff-highlight.diff-highlight .token.deleted:not(.prefix){background-color:#ff00004d;display:inline}pre.diff-highlight.diff-highlight>code .token.inserted:not(.prefix),pre>code.diff-highlight.diff-highlight .token.inserted:not(.prefix){background-color:#00ff804d;display:inline}
+/*# sourceMappingURL=584.450f2786.chunk.css.map*/
\ No newline at end of file
diff --git a/webui/src/main/resources/application/static/css/584.450f2786.chunk.css.map b/webui/src/main/resources/application/static/css/584.450f2786.chunk.css.map
new file mode 100644
index 00000000..fed99f02
--- /dev/null
+++ b/webui/src/main/resources/application/static/css/584.450f2786.chunk.css.map
@@ -0,0 +1 @@
+{"version":3,"file":"static/css/584.450f2786.chunk.css","mappings":"AAMA,6CAQC,gBAAiB,CANjB,6DAAsE,CACtE,aAAc,CAYd,oBAAqB,CAGrB,YAAa,CATb,eAAgB,CAIhB,UAAW,CATX,eAAgB,CAChB,eAAgB,CAEhB,iBAAkB,CADlB,mBAaD,CAGA,sBAIC,uMAA+U,CAC/U,uBAAwB,CAHxB,aAAc,CACd,aAAc,CAFd,iBAKD,CAEA,uBACC,eAAiB,CAEjB,iDAAqD,CADrD,UAED,CAGA,iCAEC,kBAAmB,CACnB,eAAgB,CAFhB,YAAa,CAGb,kBACD,CAEA,yDAIC,UACD,CAEA,mBACC,UACD,CAEA,iBACC,UACD,CAEA,sFAMC,UACD,CAEA,0EAKC,UACD,CAEA,qGAMC,aACD,CAEA,+CAGC,aACD,CAEA,8BAEC,YACD,CAEA,6BAEC,eACD,CACA,cACC,iBACD,CAEA,cACC,WACD,CAEA,eACC,SACD,CAGA,sIAEC,0BAAqC,CACrC,cACD,CAEA,wIAEC,0BAAuC,CACvC,cACD","sources":["../node_modules/prismjs/themes/prism-funky.css"],"sourcesContent":["/**\n * prism.js Funky theme\n * Based on “Polyfilling the gaps” talk slides http://lea.verou.me/polyfilling-the-gaps/\n * @author Lea Verou\n */\n\ncode[class*=\"language-\"],\npre[class*=\"language-\"] {\n\tfont-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;\n\tfont-size: 1em;\n\ttext-align: left;\n\twhite-space: pre;\n\tword-spacing: normal;\n\tword-break: normal;\n\tword-wrap: normal;\n\tline-height: 1.5;\n\n\t-moz-tab-size: 4;\n\t-o-tab-size: 4;\n\ttab-size: 4;\n\n\t-webkit-hyphens: none;\n\t-moz-hyphens: none;\n\t-ms-hyphens: none;\n\thyphens: none;\n}\n\n/* Code blocks */\npre[class*=\"language-\"] {\n\tpadding: .4em .8em;\n\tmargin: .5em 0;\n\toverflow: auto;\n\tbackground: url('data:image/svg+xml;charset=utf-8,