signalk-edge-link 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/public/main.js ADDED
@@ -0,0 +1,467 @@
1
+ /*
2
+ * ATTENTION: An "eval-source-map" devtool has been used.
3
+ * This devtool is neither made for production nor for readable output files.
4
+ * It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
5
+ * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
6
+ * or disable the default devtool with "devtool: false".
7
+ * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
8
+ */
9
+ /******/ (() => { // webpackBootstrap
10
+ /******/ "use strict";
11
+ /******/ var __webpack_modules__ = ({
12
+
13
+ /***/ "./node_modules/css-loader/dist/cjs.js!./src/webapp/styles.css"
14
+ /*!*********************************************************************!*\
15
+ !*** ./node_modules/css-loader/dist/cjs.js!./src/webapp/styles.css ***!
16
+ \*********************************************************************/
17
+ (module, __webpack_exports__, __webpack_require__) {
18
+
19
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/sourceMaps.js */ \"./node_modules/css-loader/dist/runtime/sourceMaps.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../node_modules/css-loader/dist/runtime/api.js */ \"./node_modules/css-loader/dist/runtime/api.js\");\n/* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__);\n// Imports\n\n\nvar ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_sourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `/* Modern SignalK-themed styles */\r\n:root {\r\n --primary-color: #2c5aa0;\r\n --secondary-color: #4a90e2;\r\n --success-color: #28a745;\r\n --warning-color: #ffc107;\r\n --danger-color: #dc3545;\r\n --dark-color: #343a40;\r\n --light-color: #f8f9fa;\r\n --border-color: #dee2e6;\r\n --text-color: #212529;\r\n --background-color: #ffffff;\r\n --card-shadow: 0 2px 4px rgba(0,0,0,0.1);\r\n --metric-bg: #f0f4f8;\r\n}\r\n\r\n\r\n* {\r\n box-sizing: border-box;\r\n}\r\n\r\nbody {\r\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\r\n line-height: 1.6;\r\n color: var(--text-color);\r\n background-color: var(--light-color);\r\n margin: 0;\r\n padding: 0;\r\n}\r\n\r\n.header {\r\n background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\r\n color: white;\r\n text-align: center;\r\n padding: 2rem 1rem;\r\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\r\n}\r\n\r\n.header h1 {\r\n margin: 0 0 0.5rem 0;\r\n font-size: 2.5rem;\r\n font-weight: 300;\r\n}\r\n\r\n.subtitle {\r\n margin: 0;\r\n opacity: 0.9;\r\n font-size: 1.1rem;\r\n}\r\n\r\n/* Connection Tabs */\r\n.connection-tabs {\r\n background: var(--dark-color);\r\n box-shadow: 0 2px 4px rgba(0,0,0,0.15);\r\n position: sticky;\r\n top: 0;\r\n z-index: 100;\r\n}\r\n\r\n.tabs-container {\r\n max-width: 1200px;\r\n margin: 0 auto;\r\n display: flex;\r\n overflow-x: auto;\r\n -webkit-overflow-scrolling: touch;\r\n scrollbar-width: thin;\r\n}\r\n\r\n.connection-tab {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n padding: 0.85rem 1.25rem;\r\n border: none;\r\n background: transparent;\r\n color: rgba(255, 255, 255, 0.7);\r\n font-size: 0.95rem;\r\n font-family: inherit;\r\n cursor: pointer;\r\n white-space: nowrap;\r\n transition: background 0.2s, color 0.2s;\r\n border-bottom: 3px solid transparent;\r\n}\r\n\r\n.connection-tab:hover {\r\n background: rgba(255, 255, 255, 0.08);\r\n color: white;\r\n}\r\n\r\n.connection-tab.active {\r\n color: white;\r\n background: rgba(255, 255, 255, 0.1);\r\n border-bottom-color: var(--secondary-color);\r\n}\r\n\r\n.tab-status-dot {\r\n width: 8px;\r\n height: 8px;\r\n border-radius: 50%;\r\n flex-shrink: 0;\r\n}\r\n\r\n.tab-status-dot.ok {\r\n background: var(--success-color);\r\n box-shadow: 0 0 4px rgba(40, 167, 69, 0.5);\r\n}\r\n\r\n.tab-status-dot.warning {\r\n background: var(--warning-color);\r\n}\r\n\r\n.tab-status-dot.error {\r\n background: var(--danger-color);\r\n}\r\n\r\n.tab-icon {\r\n font-size: 1.1rem;\r\n}\r\n\r\n.tab-name {\r\n font-weight: 500;\r\n}\r\n\r\n.tab-type {\r\n font-size: 0.75rem;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n opacity: 0.6;\r\n padding: 0.1rem 0.4rem;\r\n border: 1px solid rgba(255, 255, 255, 0.2);\r\n border-radius: 3px;\r\n}\r\n\r\n@media (max-width: 768px) {\r\n .connection-tab {\r\n padding: 0.7rem 1rem;\r\n font-size: 0.85rem;\r\n }\r\n\r\n .tab-type {\r\n display: none;\r\n }\r\n}\r\n\r\n.container {\r\n max-width: 1200px;\r\n margin: 0 auto;\r\n padding: 2rem 1rem;\r\n}\r\n\r\n.config-section {\r\n margin-bottom: 2rem;\r\n}\r\n\r\n.page-group {\r\n margin-bottom: 2.5rem;\r\n}\r\n\r\n.page-group-header {\r\n margin: 0 0 1rem;\r\n padding: 0 0.25rem;\r\n}\r\n\r\n.page-group-header h2 {\r\n margin: 0;\r\n color: var(--primary-color);\r\n font-size: 1.4rem;\r\n}\r\n\r\n.page-group-header p {\r\n margin: 0.35rem 0 0;\r\n color: #516173;\r\n}\r\n\r\n.page-group-content .config-section:last-child {\r\n margin-bottom: 0;\r\n}\r\n\r\n\r\n.mode-banner-card {\r\n border: 2px solid var(--primary-color);\r\n}\r\n\r\n.mode-banner-card .card-content {\r\n padding: 1.25rem 1.5rem;\r\n}\r\n\r\n.mode-banner-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\r\n gap: 0.75rem;\r\n}\r\n\r\n.mode-banner-item {\r\n background: var(--metric-bg);\r\n border-left: 3px solid var(--secondary-color);\r\n border-radius: 6px;\r\n padding: 0.75rem 0.9rem;\r\n color: #334155;\r\n font-size: 0.92rem;\r\n}\r\n\r\n.mode-server {\r\n background: linear-gradient(135deg, #f7fbff, #edf4ff);\r\n}\r\n\r\n.mode-client {\r\n background: linear-gradient(135deg, #f8fbff, #eef7f2);\r\n}\r\n\r\n.card {\r\n background: var(--background-color);\r\n border-radius: 8px;\r\n box-shadow: var(--card-shadow);\r\n overflow: hidden;\r\n}\r\n\r\n.card-header {\r\n background: linear-gradient(45deg, var(--primary-color), var(--secondary-color));\r\n color: white;\r\n padding: 1.5rem;\r\n}\r\n\r\n.card-header h2 {\r\n margin: 0 0 0.5rem 0;\r\n font-size: 1.5rem;\r\n font-weight: 400;\r\n}\r\n\r\n.card-header p {\r\n margin: 0;\r\n opacity: 0.9;\r\n}\r\n\r\n.card-content {\r\n padding: 2rem;\r\n}\r\n\r\n.form-group {\r\n margin-bottom: 1.5rem;\r\n}\r\n\r\n.form-group label {\r\n display: block;\r\n margin-bottom: 0.5rem;\r\n font-weight: 600;\r\n color: var(--dark-color);\r\n}\r\n\r\n.form-group input,\r\n.form-group textarea {\r\n width: 100%;\r\n padding: 0.75rem;\r\n border: 2px solid var(--border-color);\r\n border-radius: 4px;\r\n font-size: 1rem;\r\n transition: border-color 0.3s ease;\r\n}\r\n\r\n.form-group input:focus,\r\n.form-group textarea:focus {\r\n outline: none;\r\n border-color: var(--secondary-color);\r\n box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1);\r\n}\r\n\r\n.help-text {\r\n display: block;\r\n margin-top: 0.5rem;\r\n color: #666;\r\n font-size: 0.875rem;\r\n line-height: 1.4;\r\n}\r\n\r\n.btn {\r\n display: inline-block;\r\n padding: 0.75rem 1.5rem;\r\n border: none;\r\n border-radius: 4px;\r\n font-size: 1rem;\r\n font-weight: 500;\r\n text-decoration: none;\r\n cursor: pointer;\r\n transition: all 0.3s ease;\r\n margin-right: 0.5rem;\r\n margin-bottom: 0.5rem;\r\n}\r\n\r\n.btn-primary {\r\n background: linear-gradient(45deg, var(--primary-color), var(--secondary-color));\r\n color: white;\r\n}\r\n\r\n.btn-primary:hover {\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 8px rgba(44, 90, 160, 0.3);\r\n}\r\n\r\n.btn-secondary {\r\n background-color: #6c757d;\r\n color: white;\r\n}\r\n\r\n.btn-secondary:hover {\r\n background-color: #545b62;\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 8px rgba(108, 117, 125, 0.3);\r\n}\r\n\r\n.btn-danger {\r\n background-color: var(--danger-color);\r\n color: white;\r\n}\r\n\r\n.btn-danger:hover {\r\n background-color: #c82333;\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 8px rgba(220, 53, 69, 0.3);\r\n}\r\n\r\n.subscription-paths {\r\n margin-bottom: 2rem;\r\n}\r\n\r\n.subscription-paths h3 {\r\n margin-bottom: 1rem;\r\n color: var(--dark-color);\r\n}\r\n\r\n.paths-list {\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.path-item {\r\n display: flex;\r\n align-items: center;\r\n margin-bottom: 0.5rem;\r\n padding: 0.75rem;\r\n background-color: var(--light-color);\r\n border-radius: 4px;\r\n border: 1px solid var(--border-color);\r\n}\r\n\r\n.path-item input {\r\n flex: 1;\r\n margin: 0 0.5rem 0 0;\r\n border: 1px solid var(--border-color);\r\n}\r\n\r\n.json-editor {\r\n margin-bottom: 2rem;\r\n}\r\n\r\n.json-editor h3 {\r\n margin-bottom: 1rem;\r\n color: var(--dark-color);\r\n}\r\n\r\n.json-editor textarea {\r\n font-family: 'Courier New', monospace;\r\n background-color: #f8f9fa;\r\n border: 2px solid var(--border-color);\r\n}\r\n\r\n.plugin-config-summary {\r\n margin-bottom: 1rem;\r\n padding: 1rem;\r\n background: var(--metric-bg);\r\n border-radius: 6px;\r\n border-left: 4px solid var(--secondary-color);\r\n}\r\n\r\n.plugin-summary-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\r\n gap: 0.75rem;\r\n}\r\n\r\n.plugin-config-editor textarea {\r\n min-height: 320px;\r\n}\r\n\r\n.plugin-config-actions {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 0.5rem;\r\n}\r\n\r\n.status-info {\r\n padding: 1rem;\r\n background-color: var(--light-color);\r\n border-radius: 4px;\r\n border-left: 4px solid var(--secondary-color);\r\n}\r\n\r\n.notification {\r\n position: fixed;\r\n top: 20px;\r\n right: 20px;\r\n padding: 1rem 1.5rem;\r\n border-radius: 4px;\r\n color: white;\r\n font-weight: 500;\r\n transform: translateX(400px);\r\n transition: transform 0.3s ease;\r\n z-index: 1000;\r\n min-width: 300px;\r\n box-shadow: 0 4px 8px rgba(0,0,0,0.2);\r\n}\r\n\r\n.notification.show {\r\n transform: translateX(0);\r\n}\r\n\r\n.notification.success {\r\n background-color: var(--success-color);\r\n}\r\n\r\n.notification.error {\r\n background-color: var(--danger-color);\r\n}\r\n\r\n.notification.warning {\r\n background-color: var(--warning-color);\r\n color: var(--dark-color);\r\n}\r\n\r\n/* Responsive design */\r\n@media (max-width: 768px) {\r\n .header h1 {\r\n font-size: 2rem;\r\n }\r\n \r\n .container {\r\n padding: 1rem;\r\n }\r\n\r\n .page-group {\r\n margin-bottom: 2rem;\r\n }\r\n\r\n .page-group-header h2 {\r\n font-size: 1.25rem;\r\n }\r\n\r\n .mode-banner-grid {\r\n grid-template-columns: 1fr;\r\n }\r\n \r\n .card-content {\r\n padding: 1rem;\r\n }\r\n \r\n .btn {\r\n width: 100%;\r\n margin-right: 0;\r\n }\r\n \r\n .path-item {\r\n flex-direction: column;\r\n align-items: stretch;\r\n }\r\n \r\n .path-item input {\r\n margin: 0 0 0.5rem 0;\r\n }\r\n}\r\n\r\n/* Status indicators */\r\n.status-item {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 0.5rem 0;\r\n border-bottom: 1px solid var(--border-color);\r\n}\r\n\r\n.status-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.status-indicator {\r\n font-size: 0.875rem;\r\n font-weight: 600;\r\n padding: 0.25rem 0.5rem;\r\n border-radius: 12px;\r\n}\r\n\r\n.status-indicator.success {\r\n background-color: var(--success-color);\r\n color: white;\r\n}\r\n\r\n.status-indicator.warning {\r\n background-color: var(--warning-color);\r\n color: var(--dark-color);\r\n}\r\n\r\n.status-indicator.info {\r\n background-color: var(--secondary-color);\r\n color: white;\r\n}\r\n\r\n.status-details {\r\n margin-top: 0.5rem;\r\n padding: 0.5rem;\r\n background-color: var(--light-color);\r\n border-radius: 4px;\r\n font-size: 0.875rem;\r\n line-height: 1.4;\r\n}\r\n\r\n/* Animation for smooth transitions */\r\n.fade-in {\r\n animation: fadeIn 0.5s ease-in;\r\n}\r\n\r\n@keyframes fadeIn {\r\n from { opacity: 0; transform: translateY(20px); }\r\n to { opacity: 1; transform: translateY(0); }\r\n}\r\n\r\n/* Server Mode Styles */\r\n.server-mode-card {\r\n background: linear-gradient(135deg, #f8f9fa, #e9ecef);\r\n border: 2px solid var(--primary-color);\r\n}\r\n\r\n.server-mode-card .card-header {\r\n background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\r\n color: white;\r\n}\r\n\r\n.server-mode-card .card-header h2 {\r\n margin: 0;\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n}\r\n\r\n.server-mode-info h3 {\r\n color: var(--primary-color);\r\n border-bottom: 2px solid var(--primary-color);\r\n padding-bottom: 8px;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.info-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\r\n gap: 1.5rem;\r\n margin: 2rem 0;\r\n}\r\n\r\n.info-grid.compact {\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: 1rem;\r\n margin: 0.5rem 0;\r\n}\r\n\r\n.info-grid.compact .info-item {\r\n padding: 1rem;\r\n}\r\n\r\n.info-grid.compact .info-item h4 {\r\n font-size: 0.9rem;\r\n margin-bottom: 0.25rem;\r\n}\r\n\r\n.info-grid.compact .info-item p {\r\n font-size: 0.85rem;\r\n}\r\n\r\n.info-item {\r\n background: white;\r\n padding: 1.5rem;\r\n border-radius: 8px;\r\n box-shadow: var(--card-shadow);\r\n border-left: 4px solid var(--secondary-color);\r\n}\r\n\r\n.info-item h4 {\r\n color: var(--primary-color);\r\n margin: 0 0 0.5rem 0;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.info-item p {\r\n margin: 0;\r\n line-height: 1.5;\r\n}\r\n\r\n.server-status {\r\n background: white;\r\n padding: 1.5rem;\r\n border-radius: 8px;\r\n box-shadow: var(--card-shadow);\r\n margin: 2rem 0;\r\n border: 2px solid var(--success-color);\r\n}\r\n\r\n.server-status h4 {\r\n color: var(--success-color);\r\n margin: 0 0 1rem 0;\r\n}\r\n\r\n.configuration-note {\r\n background: #fff3cd;\r\n border: 1px solid #ffeaa7;\r\n padding: 1.5rem;\r\n border-radius: 8px;\r\n margin: 2rem 0;\r\n}\r\n\r\n.configuration-note h4 {\r\n color: #856404;\r\n margin: 0 0 1rem 0;\r\n display: flex;\r\n align-items: center;\r\n gap: 8px;\r\n}\r\n\r\n.configuration-note p {\r\n margin: 0 0 1rem 0;\r\n}\r\n\r\n.configuration-note ol {\r\n margin: 0;\r\n padding-left: 1.5rem;\r\n}\r\n\r\n.configuration-note li {\r\n margin-bottom: 0.5rem;\r\n}\r\n\r\n/* Metrics Display Styles */\r\n.metrics-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\r\n gap: 1rem;\r\n margin-bottom: 1.5rem;\r\n}\r\n\r\n.metric-item {\r\n background: var(--metric-bg);\r\n padding: 1rem;\r\n border-radius: 8px;\r\n text-align: center;\r\n border: 2px solid var(--border-color);\r\n}\r\n\r\n.metric-item.success {\r\n border-color: var(--success-color);\r\n background: rgba(40, 167, 69, 0.1);\r\n}\r\n\r\n.metric-item.error {\r\n border-color: var(--danger-color);\r\n background: rgba(220, 53, 69, 0.1);\r\n}\r\n\r\n.metric-label {\r\n font-size: 0.9rem;\r\n color: #666;\r\n margin-bottom: 0.5rem;\r\n}\r\n\r\n.metric-value {\r\n font-size: 1.5rem;\r\n font-weight: bold;\r\n color: var(--text-color);\r\n}\r\n\r\n.metrics-stats {\r\n margin-top: 1.5rem;\r\n padding-top: 1.5rem;\r\n border-top: 2px solid var(--border-color);\r\n}\r\n\r\n.metrics-stats h5 {\r\n margin-top: 0;\r\n margin-bottom: 1rem;\r\n color: var(--primary-color);\r\n}\r\n\r\n.stats-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\r\n gap: 0.75rem;\r\n}\r\n\r\n.stat-item {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 0.75rem;\r\n background: var(--metric-bg);\r\n border-radius: 4px;\r\n border-left: 3px solid var(--primary-color);\r\n}\r\n\r\n.stat-item.error {\r\n border-left-color: var(--danger-color);\r\n background: rgba(220, 53, 69, 0.05);\r\n}\r\n\r\n.stat-label {\r\n color: #666;\r\n font-size: 0.9rem;\r\n}\r\n\r\n.stat-value {\r\n font-weight: bold;\r\n color: var(--text-color);\r\n}\r\n\r\n.stat-item.error .stat-value {\r\n color: var(--danger-color);\r\n}\r\n\r\n.metrics-error {\r\n margin-top: 1.5rem;\r\n padding: 1rem;\r\n background: rgba(220, 53, 69, 0.1);\r\n border-left: 4px solid var(--danger-color);\r\n border-radius: 4px;\r\n}\r\n\r\n.metrics-error h5 {\r\n margin-top: 0;\r\n margin-bottom: 0.5rem;\r\n color: var(--danger-color);\r\n}\r\n\r\n.error-message {\r\n font-family: 'Courier New', monospace;\r\n font-size: 0.9rem;\r\n margin-bottom: 0.5rem;\r\n word-break: break-word;\r\n}\r\n\r\n.error-time {\r\n font-size: 0.85rem;\r\n color: #666;\r\n font-style: italic;\r\n}\r\n\r\n.metrics-success {\r\n margin-top: 1.5rem;\r\n padding: 1rem;\r\n background: rgba(40, 167, 69, 0.1);\r\n border-left: 4px solid var(--success-color);\r\n border-radius: 4px;\r\n text-align: center;\r\n}\r\n\r\n.success-message {\r\n color: var(--success-color);\r\n font-weight: bold;\r\n font-size: 1.1rem;\r\n}\r\n\r\n.metrics-section {\r\n margin-top: 2rem;\r\n padding-top: 1.5rem;\r\n border-top: 2px solid var(--border-color);\r\n}\r\n\r\n/* Bandwidth Dashboard Styles */\r\n.bandwidth-dashboard {\r\n padding: 1rem 0;\r\n}\r\n\r\n.bandwidth-hero {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\r\n gap: 1.5rem;\r\n margin-bottom: 2rem;\r\n}\r\n\r\n.hero-stat {\r\n background: linear-gradient(135deg, var(--metric-bg), #fff);\r\n padding: 1.5rem;\r\n border-radius: 12px;\r\n text-align: center;\r\n border: 2px solid var(--border-color);\r\n transition: transform 0.2s ease, box-shadow 0.2s ease;\r\n}\r\n\r\n.hero-stat:hover {\r\n transform: translateY(-2px);\r\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\r\n}\r\n\r\n.hero-stat.primary {\r\n border-color: var(--primary-color);\r\n background: linear-gradient(135deg, rgba(44, 90, 160, 0.1), #fff);\r\n}\r\n\r\n.hero-stat.secondary {\r\n border-color: var(--secondary-color);\r\n background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), #fff);\r\n}\r\n\r\n.hero-stat.success {\r\n border-color: var(--success-color);\r\n background: linear-gradient(135deg, rgba(40, 167, 69, 0.1), #fff);\r\n}\r\n\r\n.hero-value {\r\n font-size: 2rem;\r\n font-weight: bold;\r\n color: var(--primary-color);\r\n margin-bottom: 0.5rem;\r\n}\r\n\r\n.hero-stat.success .hero-value {\r\n color: var(--success-color);\r\n}\r\n\r\n.hero-label {\r\n font-size: 0.9rem;\r\n color: #666;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.bandwidth-details {\r\n background: var(--metric-bg);\r\n padding: 1.5rem;\r\n border-radius: 8px;\r\n margin-bottom: 1.5rem;\r\n}\r\n\r\n.bandwidth-details h5 {\r\n margin: 0 0 1rem 0;\r\n color: var(--primary-color);\r\n}\r\n\r\n.bandwidth-grid {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\r\n gap: 0.75rem;\r\n}\r\n\r\n.bw-stat {\r\n display: flex;\r\n justify-content: space-between;\r\n padding: 0.75rem;\r\n background: white;\r\n border-radius: 4px;\r\n border-left: 3px solid var(--primary-color);\r\n}\r\n\r\n.bw-stat.highlight {\r\n border-left-color: var(--success-color);\r\n background: rgba(40, 167, 69, 0.05);\r\n}\r\n\r\n.bw-label {\r\n color: #666;\r\n font-size: 0.9rem;\r\n}\r\n\r\n.bw-value {\r\n font-weight: bold;\r\n color: var(--text-color);\r\n}\r\n\r\n.bw-value.success-text {\r\n color: var(--success-color);\r\n}\r\n\r\n.bandwidth-chart {\r\n background: var(--metric-bg);\r\n padding: 1.5rem;\r\n border-radius: 8px;\r\n}\r\n\r\n.bandwidth-chart h5 {\r\n margin: 0 0 1rem 0;\r\n color: var(--primary-color);\r\n}\r\n\r\n.chart-container {\r\n position: relative;\r\n height: 100px;\r\n background: white;\r\n border-radius: 4px;\r\n padding: 1rem;\r\n}\r\n\r\n.sparkline {\r\n width: 100%;\r\n height: 100%;\r\n}\r\n\r\n.chart-labels {\r\n position: absolute;\r\n right: 0.5rem;\r\n top: 0.5rem;\r\n bottom: 0.5rem;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: space-between;\r\n font-size: 0.75rem;\r\n color: #999;\r\n}\r\n\r\n.bandwidth-chart-placeholder {\r\n text-align: center;\r\n padding: 2rem;\r\n color: #666;\r\n background: var(--metric-bg);\r\n border-radius: 8px;\r\n}\r\n\r\n/* Path Analytics Styles */\r\n.path-analytics-dashboard {\r\n padding: 1rem 0;\r\n}\r\n\r\n.path-summary {\r\n display: flex;\r\n gap: 2rem;\r\n margin-bottom: 1.5rem;\r\n}\r\n\r\n.summary-stat {\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n padding: 1rem 2rem;\r\n background: var(--metric-bg);\r\n border-radius: 8px;\r\n border: 2px solid var(--border-color);\r\n}\r\n\r\n.summary-value {\r\n font-size: 2rem;\r\n font-weight: bold;\r\n color: var(--primary-color);\r\n}\r\n\r\n.summary-label {\r\n font-size: 0.85rem;\r\n color: #666;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.path-table-container {\r\n overflow-x: auto;\r\n margin-bottom: 1rem;\r\n}\r\n\r\n.path-table {\r\n width: 100%;\r\n border-collapse: collapse;\r\n font-size: 0.9rem;\r\n}\r\n\r\n.path-table th,\r\n.path-table td {\r\n padding: 0.75rem;\r\n text-align: left;\r\n border-bottom: 1px solid var(--border-color);\r\n}\r\n\r\n.path-table th {\r\n background: var(--metric-bg);\r\n font-weight: 600;\r\n color: var(--dark-color);\r\n position: sticky;\r\n top: 0;\r\n}\r\n\r\n.path-table tbody tr:hover {\r\n background: rgba(44, 90, 160, 0.05);\r\n}\r\n\r\n.path-name {\r\n font-family: 'Courier New', monospace;\r\n color: var(--primary-color);\r\n max-width: 300px;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n}\r\n\r\n.path-rate {\r\n text-align: center;\r\n color: #666;\r\n}\r\n\r\n.path-bytes {\r\n text-align: right;\r\n font-weight: 500;\r\n}\r\n\r\n.path-percentage {\r\n width: 150px;\r\n}\r\n\r\n.percentage-bar-container {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n}\r\n\r\n.percentage-bar {\r\n height: 8px;\r\n background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));\r\n border-radius: 4px;\r\n transition: width 0.3s ease;\r\n}\r\n\r\n.percentage-text {\r\n font-size: 0.85rem;\r\n color: #666;\r\n min-width: 35px;\r\n}\r\n\r\n.path-more {\r\n text-align: center;\r\n padding: 1rem;\r\n color: #666;\r\n font-style: italic;\r\n}\r\n\r\n.path-analytics-empty {\r\n text-align: center;\r\n padding: 2rem;\r\n color: #666;\r\n background: var(--metric-bg);\r\n border-radius: 8px;\r\n}\r\n\r\n/* Network Quality Dashboard Styles */\r\n.network-quality-dashboard {\r\n padding: 1rem 0;\r\n}\r\n\r\n.nq-hero {\r\n display: grid;\r\n grid-template-columns: auto 1fr;\r\n gap: 2rem;\r\n align-items: center;\r\n margin-bottom: 1.5rem;\r\n}\r\n\r\n.nq-gauge-container {\r\n text-align: center;\r\n width: 160px;\r\n}\r\n\r\n.quality-gauge {\r\n width: 160px;\r\n height: 90px;\r\n}\r\n\r\n.nq-gauge-label {\r\n font-size: 0.85rem;\r\n color: #666;\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n margin-top: 0.25rem;\r\n}\r\n\r\n.nq-key-metrics {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\r\n gap: 1rem;\r\n}\r\n\r\n.nq-key-metrics .metric-item {\r\n text-align: center;\r\n}\r\n\r\n.nq-key-metrics .metric-item.warning {\r\n border-color: var(--warning-color);\r\n background: rgba(255, 193, 7, 0.1);\r\n}\r\n\r\n.nq-details {\r\n background: var(--metric-bg);\r\n padding: 1.5rem;\r\n border-radius: 8px;\r\n}\r\n\r\n.nq-details h5 {\r\n margin: 0 0 1rem 0;\r\n color: var(--primary-color);\r\n}\r\n\r\n/* Responsive adjustments for bandwidth and path analytics */\r\n@media (max-width: 768px) {\r\n .hero-value {\r\n font-size: 1.5rem;\r\n }\r\n\r\n .bandwidth-grid {\r\n grid-template-columns: 1fr;\r\n }\r\n\r\n .path-summary {\r\n flex-direction: column;\r\n gap: 1rem;\r\n }\r\n\r\n .summary-stat {\r\n padding: 0.75rem 1rem;\r\n }\r\n\r\n .path-name {\r\n max-width: 150px;\r\n }\r\n\r\n .percentage-bar-container {\r\n flex-direction: column;\r\n align-items: flex-start;\r\n gap: 0.25rem;\r\n }\r\n\r\n .percentage-bar {\r\n width: 100% !important;\r\n max-width: 100px;\r\n }\r\n\r\n .nq-hero {\r\n grid-template-columns: 1fr;\r\n justify-items: center;\r\n }\r\n\r\n .nq-key-metrics {\r\n grid-template-columns: 1fr 1fr;\r\n }\r\n}\r\n\r\n/* Protocol Version Badge */\r\n.protocol-badge {\r\n display: inline-block;\r\n padding: 0.2rem 0.6rem;\r\n border-radius: 12px;\r\n font-size: 0.85rem;\r\n font-weight: 700;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.protocol-v1 {\r\n background: var(--metric-bg);\r\n color: #666;\r\n border: 2px solid var(--border-color);\r\n}\r\n\r\n.protocol-v2 {\r\n background: linear-gradient(135deg, rgba(40, 167, 69, 0.15), rgba(40, 167, 69, 0.05));\r\n color: var(--success-color);\r\n border: 2px solid var(--success-color);\r\n}\r\n\r\n.protocol-v3 {\r\n background: linear-gradient(135deg, rgba(13, 110, 253, 0.15), rgba(13, 110, 253, 0.05));\r\n color: #0d6efd;\r\n border: 2px solid #0d6efd;\r\n}\r\n\r\n/* Recent Errors List */\r\n.recent-errors-list {\r\n margin-top: 0.5rem;\r\n font-size: 0.875rem;\r\n}\r\n\r\n.recent-error-item {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 0.5rem;\r\n padding: 0.4rem 0;\r\n border-bottom: 1px solid rgba(220, 53, 69, 0.15);\r\n}\r\n\r\n.recent-error-item:last-child {\r\n border-bottom: none;\r\n}\r\n\r\n.error-category-badge {\r\n flex-shrink: 0;\r\n display: inline-block;\r\n padding: 0.1rem 0.4rem;\r\n border-radius: 8px;\r\n font-size: 0.75rem;\r\n font-weight: 600;\r\n background: rgba(220, 53, 69, 0.15);\r\n color: var(--danger-color);\r\n text-transform: uppercase;\r\n}\r\n\r\n.recent-error-msg {\r\n flex: 1;\r\n font-family: 'Courier New', monospace;\r\n word-break: break-word;\r\n color: var(--text-color);\r\n}\r\n\r\n.recent-error-time {\r\n flex-shrink: 0;\r\n font-size: 0.75rem;\r\n color: #888;\r\n font-style: italic;\r\n white-space: nowrap;\r\n}\r\n\r\n/* v2 Dashboard Styles */\r\n.v2-dashboard {\r\n padding: 0.5rem 0;\r\n}\r\n\r\n.v2-dashboard .metrics-grid {\r\n margin-bottom: 1.5rem;\r\n}\r\n\r\n/* Congestion Control Styles */\r\n.congestion-state {\r\n display: inline-block;\r\n padding: 0.15rem 0.5rem;\r\n border-radius: 4px;\r\n font-size: 0.85rem;\r\n font-weight: 600;\r\n text-transform: capitalize;\r\n background: var(--metric-bg);\r\n color: var(--text-color);\r\n}\r\n\r\n.congestion-state.success {\r\n background: rgba(40, 167, 69, 0.15);\r\n color: var(--success-color);\r\n}\r\n\r\n.congestion-state.warning {\r\n background: rgba(255, 193, 7, 0.15);\r\n color: #856404;\r\n}\r\n\r\n/* Bonding Styles */\r\n.bonding-links {\r\n display: grid;\r\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\r\n gap: 1rem;\r\n margin-top: 1rem;\r\n}\r\n\r\n.bonding-link {\r\n background: var(--metric-bg);\r\n border: 2px solid var(--border-color);\r\n border-radius: 8px;\r\n padding: 1rem;\r\n transition: border-color 0.2s ease;\r\n}\r\n\r\n.bonding-link.active {\r\n border-color: var(--success-color);\r\n background: rgba(40, 167, 69, 0.05);\r\n}\r\n\r\n.link-header {\r\n display: flex;\r\n align-items: center;\r\n gap: 0.5rem;\r\n margin-bottom: 0.75rem;\r\n}\r\n\r\n.link-name {\r\n font-weight: 600;\r\n font-size: 1rem;\r\n color: var(--text-color);\r\n}\r\n\r\n.link-badge {\r\n display: inline-block;\r\n padding: 0.1rem 0.4rem;\r\n border-radius: 4px;\r\n font-size: 0.75rem;\r\n font-weight: 700;\r\n letter-spacing: 0.5px;\r\n}\r\n\r\n.link-badge.active-badge {\r\n background: var(--success-color);\r\n color: white;\r\n}\r\n\r\n.link-badge.success {\r\n background: rgba(40, 167, 69, 0.15);\r\n color: var(--success-color);\r\n}\r\n\r\n.link-badge.error {\r\n background: rgba(220, 53, 69, 0.15);\r\n color: var(--danger-color);\r\n}\r\n\r\n.link-stats {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: 0.5rem;\r\n}\r\n\r\n.link-stats .stat-item {\r\n padding: 0.5rem;\r\n font-size: 0.85rem;\r\n}\r\n\r\n/* Monitoring & Alerts Styles */\r\n.monitoring-subsection {\r\n margin-bottom: 1.5rem;\r\n padding-bottom: 1.5rem;\r\n border-bottom: 2px solid var(--border-color);\r\n}\r\n\r\n.monitoring-subsection:last-child {\r\n border-bottom: none;\r\n margin-bottom: 0;\r\n padding-bottom: 0;\r\n}\r\n\r\n.monitoring-subsection h5 {\r\n margin: 0 0 1rem 0;\r\n color: var(--primary-color);\r\n}\r\n\r\n.alert-level {\r\n display: inline-block;\r\n padding: 0.1rem 0.4rem;\r\n border-radius: 4px;\r\n font-size: 0.8rem;\r\n font-weight: 700;\r\n}\r\n\r\n.alert-ok {\r\n background: rgba(40, 167, 69, 0.15);\r\n color: var(--success-color);\r\n}\r\n\r\n.alert-warning {\r\n background: rgba(255, 193, 7, 0.15);\r\n color: #856404;\r\n}\r\n\r\n.alert-critical {\r\n background: rgba(220, 53, 69, 0.15);\r\n color: var(--danger-color);\r\n}\r\n\r\n/* Responsive adjustments for v2 sections */\r\n@media (max-width: 768px) {\r\n .bonding-links {\r\n grid-template-columns: 1fr;\r\n }\r\n\r\n .link-stats {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/webapp/styles.css\"],\"names\":[],\"mappings\":\"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\",\"sourcesContent\":[\"/* Modern SignalK-themed styles */\\r\\n:root {\\r\\n --primary-color: #2c5aa0;\\r\\n --secondary-color: #4a90e2;\\r\\n --success-color: #28a745;\\r\\n --warning-color: #ffc107;\\r\\n --danger-color: #dc3545;\\r\\n --dark-color: #343a40;\\r\\n --light-color: #f8f9fa;\\r\\n --border-color: #dee2e6;\\r\\n --text-color: #212529;\\r\\n --background-color: #ffffff;\\r\\n --card-shadow: 0 2px 4px rgba(0,0,0,0.1);\\r\\n --metric-bg: #f0f4f8;\\r\\n}\\r\\n\\r\\n\\r\\n* {\\r\\n box-sizing: border-box;\\r\\n}\\r\\n\\r\\nbody {\\r\\n font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\\r\\n line-height: 1.6;\\r\\n color: var(--text-color);\\r\\n background-color: var(--light-color);\\r\\n margin: 0;\\r\\n padding: 0;\\r\\n}\\r\\n\\r\\n.header {\\r\\n background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\\r\\n color: white;\\r\\n text-align: center;\\r\\n padding: 2rem 1rem;\\r\\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\\r\\n}\\r\\n\\r\\n.header h1 {\\r\\n margin: 0 0 0.5rem 0;\\r\\n font-size: 2.5rem;\\r\\n font-weight: 300;\\r\\n}\\r\\n\\r\\n.subtitle {\\r\\n margin: 0;\\r\\n opacity: 0.9;\\r\\n font-size: 1.1rem;\\r\\n}\\r\\n\\r\\n/* Connection Tabs */\\r\\n.connection-tabs {\\r\\n background: var(--dark-color);\\r\\n box-shadow: 0 2px 4px rgba(0,0,0,0.15);\\r\\n position: sticky;\\r\\n top: 0;\\r\\n z-index: 100;\\r\\n}\\r\\n\\r\\n.tabs-container {\\r\\n max-width: 1200px;\\r\\n margin: 0 auto;\\r\\n display: flex;\\r\\n overflow-x: auto;\\r\\n -webkit-overflow-scrolling: touch;\\r\\n scrollbar-width: thin;\\r\\n}\\r\\n\\r\\n.connection-tab {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0.5rem;\\r\\n padding: 0.85rem 1.25rem;\\r\\n border: none;\\r\\n background: transparent;\\r\\n color: rgba(255, 255, 255, 0.7);\\r\\n font-size: 0.95rem;\\r\\n font-family: inherit;\\r\\n cursor: pointer;\\r\\n white-space: nowrap;\\r\\n transition: background 0.2s, color 0.2s;\\r\\n border-bottom: 3px solid transparent;\\r\\n}\\r\\n\\r\\n.connection-tab:hover {\\r\\n background: rgba(255, 255, 255, 0.08);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.connection-tab.active {\\r\\n color: white;\\r\\n background: rgba(255, 255, 255, 0.1);\\r\\n border-bottom-color: var(--secondary-color);\\r\\n}\\r\\n\\r\\n.tab-status-dot {\\r\\n width: 8px;\\r\\n height: 8px;\\r\\n border-radius: 50%;\\r\\n flex-shrink: 0;\\r\\n}\\r\\n\\r\\n.tab-status-dot.ok {\\r\\n background: var(--success-color);\\r\\n box-shadow: 0 0 4px rgba(40, 167, 69, 0.5);\\r\\n}\\r\\n\\r\\n.tab-status-dot.warning {\\r\\n background: var(--warning-color);\\r\\n}\\r\\n\\r\\n.tab-status-dot.error {\\r\\n background: var(--danger-color);\\r\\n}\\r\\n\\r\\n.tab-icon {\\r\\n font-size: 1.1rem;\\r\\n}\\r\\n\\r\\n.tab-name {\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.tab-type {\\r\\n font-size: 0.75rem;\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n opacity: 0.6;\\r\\n padding: 0.1rem 0.4rem;\\r\\n border: 1px solid rgba(255, 255, 255, 0.2);\\r\\n border-radius: 3px;\\r\\n}\\r\\n\\r\\n@media (max-width: 768px) {\\r\\n .connection-tab {\\r\\n padding: 0.7rem 1rem;\\r\\n font-size: 0.85rem;\\r\\n }\\r\\n\\r\\n .tab-type {\\r\\n display: none;\\r\\n }\\r\\n}\\r\\n\\r\\n.container {\\r\\n max-width: 1200px;\\r\\n margin: 0 auto;\\r\\n padding: 2rem 1rem;\\r\\n}\\r\\n\\r\\n.config-section {\\r\\n margin-bottom: 2rem;\\r\\n}\\r\\n\\r\\n.page-group {\\r\\n margin-bottom: 2.5rem;\\r\\n}\\r\\n\\r\\n.page-group-header {\\r\\n margin: 0 0 1rem;\\r\\n padding: 0 0.25rem;\\r\\n}\\r\\n\\r\\n.page-group-header h2 {\\r\\n margin: 0;\\r\\n color: var(--primary-color);\\r\\n font-size: 1.4rem;\\r\\n}\\r\\n\\r\\n.page-group-header p {\\r\\n margin: 0.35rem 0 0;\\r\\n color: #516173;\\r\\n}\\r\\n\\r\\n.page-group-content .config-section:last-child {\\r\\n margin-bottom: 0;\\r\\n}\\r\\n\\r\\n\\r\\n.mode-banner-card {\\r\\n border: 2px solid var(--primary-color);\\r\\n}\\r\\n\\r\\n.mode-banner-card .card-content {\\r\\n padding: 1.25rem 1.5rem;\\r\\n}\\r\\n\\r\\n.mode-banner-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\\r\\n gap: 0.75rem;\\r\\n}\\r\\n\\r\\n.mode-banner-item {\\r\\n background: var(--metric-bg);\\r\\n border-left: 3px solid var(--secondary-color);\\r\\n border-radius: 6px;\\r\\n padding: 0.75rem 0.9rem;\\r\\n color: #334155;\\r\\n font-size: 0.92rem;\\r\\n}\\r\\n\\r\\n.mode-server {\\r\\n background: linear-gradient(135deg, #f7fbff, #edf4ff);\\r\\n}\\r\\n\\r\\n.mode-client {\\r\\n background: linear-gradient(135deg, #f8fbff, #eef7f2);\\r\\n}\\r\\n\\r\\n.card {\\r\\n background: var(--background-color);\\r\\n border-radius: 8px;\\r\\n box-shadow: var(--card-shadow);\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.card-header {\\r\\n background: linear-gradient(45deg, var(--primary-color), var(--secondary-color));\\r\\n color: white;\\r\\n padding: 1.5rem;\\r\\n}\\r\\n\\r\\n.card-header h2 {\\r\\n margin: 0 0 0.5rem 0;\\r\\n font-size: 1.5rem;\\r\\n font-weight: 400;\\r\\n}\\r\\n\\r\\n.card-header p {\\r\\n margin: 0;\\r\\n opacity: 0.9;\\r\\n}\\r\\n\\r\\n.card-content {\\r\\n padding: 2rem;\\r\\n}\\r\\n\\r\\n.form-group {\\r\\n margin-bottom: 1.5rem;\\r\\n}\\r\\n\\r\\n.form-group label {\\r\\n display: block;\\r\\n margin-bottom: 0.5rem;\\r\\n font-weight: 600;\\r\\n color: var(--dark-color);\\r\\n}\\r\\n\\r\\n.form-group input,\\r\\n.form-group textarea {\\r\\n width: 100%;\\r\\n padding: 0.75rem;\\r\\n border: 2px solid var(--border-color);\\r\\n border-radius: 4px;\\r\\n font-size: 1rem;\\r\\n transition: border-color 0.3s ease;\\r\\n}\\r\\n\\r\\n.form-group input:focus,\\r\\n.form-group textarea:focus {\\r\\n outline: none;\\r\\n border-color: var(--secondary-color);\\r\\n box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1);\\r\\n}\\r\\n\\r\\n.help-text {\\r\\n display: block;\\r\\n margin-top: 0.5rem;\\r\\n color: #666;\\r\\n font-size: 0.875rem;\\r\\n line-height: 1.4;\\r\\n}\\r\\n\\r\\n.btn {\\r\\n display: inline-block;\\r\\n padding: 0.75rem 1.5rem;\\r\\n border: none;\\r\\n border-radius: 4px;\\r\\n font-size: 1rem;\\r\\n font-weight: 500;\\r\\n text-decoration: none;\\r\\n cursor: pointer;\\r\\n transition: all 0.3s ease;\\r\\n margin-right: 0.5rem;\\r\\n margin-bottom: 0.5rem;\\r\\n}\\r\\n\\r\\n.btn-primary {\\r\\n background: linear-gradient(45deg, var(--primary-color), var(--secondary-color));\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-primary:hover {\\r\\n transform: translateY(-2px);\\r\\n box-shadow: 0 4px 8px rgba(44, 90, 160, 0.3);\\r\\n}\\r\\n\\r\\n.btn-secondary {\\r\\n background-color: #6c757d;\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-secondary:hover {\\r\\n background-color: #545b62;\\r\\n transform: translateY(-2px);\\r\\n box-shadow: 0 4px 8px rgba(108, 117, 125, 0.3);\\r\\n}\\r\\n\\r\\n.btn-danger {\\r\\n background-color: var(--danger-color);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.btn-danger:hover {\\r\\n background-color: #c82333;\\r\\n transform: translateY(-2px);\\r\\n box-shadow: 0 4px 8px rgba(220, 53, 69, 0.3);\\r\\n}\\r\\n\\r\\n.subscription-paths {\\r\\n margin-bottom: 2rem;\\r\\n}\\r\\n\\r\\n.subscription-paths h3 {\\r\\n margin-bottom: 1rem;\\r\\n color: var(--dark-color);\\r\\n}\\r\\n\\r\\n.paths-list {\\r\\n margin-bottom: 1rem;\\r\\n}\\r\\n\\r\\n.path-item {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n margin-bottom: 0.5rem;\\r\\n padding: 0.75rem;\\r\\n background-color: var(--light-color);\\r\\n border-radius: 4px;\\r\\n border: 1px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.path-item input {\\r\\n flex: 1;\\r\\n margin: 0 0.5rem 0 0;\\r\\n border: 1px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.json-editor {\\r\\n margin-bottom: 2rem;\\r\\n}\\r\\n\\r\\n.json-editor h3 {\\r\\n margin-bottom: 1rem;\\r\\n color: var(--dark-color);\\r\\n}\\r\\n\\r\\n.json-editor textarea {\\r\\n font-family: 'Courier New', monospace;\\r\\n background-color: #f8f9fa;\\r\\n border: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.plugin-config-summary {\\r\\n margin-bottom: 1rem;\\r\\n padding: 1rem;\\r\\n background: var(--metric-bg);\\r\\n border-radius: 6px;\\r\\n border-left: 4px solid var(--secondary-color);\\r\\n}\\r\\n\\r\\n.plugin-summary-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\\r\\n gap: 0.75rem;\\r\\n}\\r\\n\\r\\n.plugin-config-editor textarea {\\r\\n min-height: 320px;\\r\\n}\\r\\n\\r\\n.plugin-config-actions {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 0.5rem;\\r\\n}\\r\\n\\r\\n.status-info {\\r\\n padding: 1rem;\\r\\n background-color: var(--light-color);\\r\\n border-radius: 4px;\\r\\n border-left: 4px solid var(--secondary-color);\\r\\n}\\r\\n\\r\\n.notification {\\r\\n position: fixed;\\r\\n top: 20px;\\r\\n right: 20px;\\r\\n padding: 1rem 1.5rem;\\r\\n border-radius: 4px;\\r\\n color: white;\\r\\n font-weight: 500;\\r\\n transform: translateX(400px);\\r\\n transition: transform 0.3s ease;\\r\\n z-index: 1000;\\r\\n min-width: 300px;\\r\\n box-shadow: 0 4px 8px rgba(0,0,0,0.2);\\r\\n}\\r\\n\\r\\n.notification.show {\\r\\n transform: translateX(0);\\r\\n}\\r\\n\\r\\n.notification.success {\\r\\n background-color: var(--success-color);\\r\\n}\\r\\n\\r\\n.notification.error {\\r\\n background-color: var(--danger-color);\\r\\n}\\r\\n\\r\\n.notification.warning {\\r\\n background-color: var(--warning-color);\\r\\n color: var(--dark-color);\\r\\n}\\r\\n\\r\\n/* Responsive design */\\r\\n@media (max-width: 768px) {\\r\\n .header h1 {\\r\\n font-size: 2rem;\\r\\n }\\r\\n \\r\\n .container {\\r\\n padding: 1rem;\\r\\n }\\r\\n\\r\\n .page-group {\\r\\n margin-bottom: 2rem;\\r\\n }\\r\\n\\r\\n .page-group-header h2 {\\r\\n font-size: 1.25rem;\\r\\n }\\r\\n\\r\\n .mode-banner-grid {\\r\\n grid-template-columns: 1fr;\\r\\n }\\r\\n \\r\\n .card-content {\\r\\n padding: 1rem;\\r\\n }\\r\\n \\r\\n .btn {\\r\\n width: 100%;\\r\\n margin-right: 0;\\r\\n }\\r\\n \\r\\n .path-item {\\r\\n flex-direction: column;\\r\\n align-items: stretch;\\r\\n }\\r\\n \\r\\n .path-item input {\\r\\n margin: 0 0 0.5rem 0;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Status indicators */\\r\\n.status-item {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 0.5rem 0;\\r\\n border-bottom: 1px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.status-item:last-child {\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.status-indicator {\\r\\n font-size: 0.875rem;\\r\\n font-weight: 600;\\r\\n padding: 0.25rem 0.5rem;\\r\\n border-radius: 12px;\\r\\n}\\r\\n\\r\\n.status-indicator.success {\\r\\n background-color: var(--success-color);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.status-indicator.warning {\\r\\n background-color: var(--warning-color);\\r\\n color: var(--dark-color);\\r\\n}\\r\\n\\r\\n.status-indicator.info {\\r\\n background-color: var(--secondary-color);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.status-details {\\r\\n margin-top: 0.5rem;\\r\\n padding: 0.5rem;\\r\\n background-color: var(--light-color);\\r\\n border-radius: 4px;\\r\\n font-size: 0.875rem;\\r\\n line-height: 1.4;\\r\\n}\\r\\n\\r\\n/* Animation for smooth transitions */\\r\\n.fade-in {\\r\\n animation: fadeIn 0.5s ease-in;\\r\\n}\\r\\n\\r\\n@keyframes fadeIn {\\r\\n from { opacity: 0; transform: translateY(20px); }\\r\\n to { opacity: 1; transform: translateY(0); }\\r\\n}\\r\\n\\r\\n/* Server Mode Styles */\\r\\n.server-mode-card {\\r\\n background: linear-gradient(135deg, #f8f9fa, #e9ecef);\\r\\n border: 2px solid var(--primary-color);\\r\\n}\\r\\n\\r\\n.server-mode-card .card-header {\\r\\n background: linear-gradient(135deg, var(--primary-color), var(--secondary-color));\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.server-mode-card .card-header h2 {\\r\\n margin: 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n}\\r\\n\\r\\n.server-mode-info h3 {\\r\\n color: var(--primary-color);\\r\\n border-bottom: 2px solid var(--primary-color);\\r\\n padding-bottom: 8px;\\r\\n margin-bottom: 1rem;\\r\\n}\\r\\n\\r\\n.info-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));\\r\\n gap: 1.5rem;\\r\\n margin: 2rem 0;\\r\\n}\\r\\n\\r\\n.info-grid.compact {\\r\\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\\r\\n gap: 1rem;\\r\\n margin: 0.5rem 0;\\r\\n}\\r\\n\\r\\n.info-grid.compact .info-item {\\r\\n padding: 1rem;\\r\\n}\\r\\n\\r\\n.info-grid.compact .info-item h4 {\\r\\n font-size: 0.9rem;\\r\\n margin-bottom: 0.25rem;\\r\\n}\\r\\n\\r\\n.info-grid.compact .info-item p {\\r\\n font-size: 0.85rem;\\r\\n}\\r\\n\\r\\n.info-item {\\r\\n background: white;\\r\\n padding: 1.5rem;\\r\\n border-radius: 8px;\\r\\n box-shadow: var(--card-shadow);\\r\\n border-left: 4px solid var(--secondary-color);\\r\\n}\\r\\n\\r\\n.info-item h4 {\\r\\n color: var(--primary-color);\\r\\n margin: 0 0 0.5rem 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.info-item p {\\r\\n margin: 0;\\r\\n line-height: 1.5;\\r\\n}\\r\\n\\r\\n.server-status {\\r\\n background: white;\\r\\n padding: 1.5rem;\\r\\n border-radius: 8px;\\r\\n box-shadow: var(--card-shadow);\\r\\n margin: 2rem 0;\\r\\n border: 2px solid var(--success-color);\\r\\n}\\r\\n\\r\\n.server-status h4 {\\r\\n color: var(--success-color);\\r\\n margin: 0 0 1rem 0;\\r\\n}\\r\\n\\r\\n.configuration-note {\\r\\n background: #fff3cd;\\r\\n border: 1px solid #ffeaa7;\\r\\n padding: 1.5rem;\\r\\n border-radius: 8px;\\r\\n margin: 2rem 0;\\r\\n}\\r\\n\\r\\n.configuration-note h4 {\\r\\n color: #856404;\\r\\n margin: 0 0 1rem 0;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 8px;\\r\\n}\\r\\n\\r\\n.configuration-note p {\\r\\n margin: 0 0 1rem 0;\\r\\n}\\r\\n\\r\\n.configuration-note ol {\\r\\n margin: 0;\\r\\n padding-left: 1.5rem;\\r\\n}\\r\\n\\r\\n.configuration-note li {\\r\\n margin-bottom: 0.5rem;\\r\\n}\\r\\n\\r\\n/* Metrics Display Styles */\\r\\n.metrics-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));\\r\\n gap: 1rem;\\r\\n margin-bottom: 1.5rem;\\r\\n}\\r\\n\\r\\n.metric-item {\\r\\n background: var(--metric-bg);\\r\\n padding: 1rem;\\r\\n border-radius: 8px;\\r\\n text-align: center;\\r\\n border: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.metric-item.success {\\r\\n border-color: var(--success-color);\\r\\n background: rgba(40, 167, 69, 0.1);\\r\\n}\\r\\n\\r\\n.metric-item.error {\\r\\n border-color: var(--danger-color);\\r\\n background: rgba(220, 53, 69, 0.1);\\r\\n}\\r\\n\\r\\n.metric-label {\\r\\n font-size: 0.9rem;\\r\\n color: #666;\\r\\n margin-bottom: 0.5rem;\\r\\n}\\r\\n\\r\\n.metric-value {\\r\\n font-size: 1.5rem;\\r\\n font-weight: bold;\\r\\n color: var(--text-color);\\r\\n}\\r\\n\\r\\n.metrics-stats {\\r\\n margin-top: 1.5rem;\\r\\n padding-top: 1.5rem;\\r\\n border-top: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.metrics-stats h5 {\\r\\n margin-top: 0;\\r\\n margin-bottom: 1rem;\\r\\n color: var(--primary-color);\\r\\n}\\r\\n\\r\\n.stats-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));\\r\\n gap: 0.75rem;\\r\\n}\\r\\n\\r\\n.stat-item {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n padding: 0.75rem;\\r\\n background: var(--metric-bg);\\r\\n border-radius: 4px;\\r\\n border-left: 3px solid var(--primary-color);\\r\\n}\\r\\n\\r\\n.stat-item.error {\\r\\n border-left-color: var(--danger-color);\\r\\n background: rgba(220, 53, 69, 0.05);\\r\\n}\\r\\n\\r\\n.stat-label {\\r\\n color: #666;\\r\\n font-size: 0.9rem;\\r\\n}\\r\\n\\r\\n.stat-value {\\r\\n font-weight: bold;\\r\\n color: var(--text-color);\\r\\n}\\r\\n\\r\\n.stat-item.error .stat-value {\\r\\n color: var(--danger-color);\\r\\n}\\r\\n\\r\\n.metrics-error {\\r\\n margin-top: 1.5rem;\\r\\n padding: 1rem;\\r\\n background: rgba(220, 53, 69, 0.1);\\r\\n border-left: 4px solid var(--danger-color);\\r\\n border-radius: 4px;\\r\\n}\\r\\n\\r\\n.metrics-error h5 {\\r\\n margin-top: 0;\\r\\n margin-bottom: 0.5rem;\\r\\n color: var(--danger-color);\\r\\n}\\r\\n\\r\\n.error-message {\\r\\n font-family: 'Courier New', monospace;\\r\\n font-size: 0.9rem;\\r\\n margin-bottom: 0.5rem;\\r\\n word-break: break-word;\\r\\n}\\r\\n\\r\\n.error-time {\\r\\n font-size: 0.85rem;\\r\\n color: #666;\\r\\n font-style: italic;\\r\\n}\\r\\n\\r\\n.metrics-success {\\r\\n margin-top: 1.5rem;\\r\\n padding: 1rem;\\r\\n background: rgba(40, 167, 69, 0.1);\\r\\n border-left: 4px solid var(--success-color);\\r\\n border-radius: 4px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.success-message {\\r\\n color: var(--success-color);\\r\\n font-weight: bold;\\r\\n font-size: 1.1rem;\\r\\n}\\r\\n\\r\\n.metrics-section {\\r\\n margin-top: 2rem;\\r\\n padding-top: 1.5rem;\\r\\n border-top: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n/* Bandwidth Dashboard Styles */\\r\\n.bandwidth-dashboard {\\r\\n padding: 1rem 0;\\r\\n}\\r\\n\\r\\n.bandwidth-hero {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));\\r\\n gap: 1.5rem;\\r\\n margin-bottom: 2rem;\\r\\n}\\r\\n\\r\\n.hero-stat {\\r\\n background: linear-gradient(135deg, var(--metric-bg), #fff);\\r\\n padding: 1.5rem;\\r\\n border-radius: 12px;\\r\\n text-align: center;\\r\\n border: 2px solid var(--border-color);\\r\\n transition: transform 0.2s ease, box-shadow 0.2s ease;\\r\\n}\\r\\n\\r\\n.hero-stat:hover {\\r\\n transform: translateY(-2px);\\r\\n box-shadow: 0 4px 12px rgba(0,0,0,0.1);\\r\\n}\\r\\n\\r\\n.hero-stat.primary {\\r\\n border-color: var(--primary-color);\\r\\n background: linear-gradient(135deg, rgba(44, 90, 160, 0.1), #fff);\\r\\n}\\r\\n\\r\\n.hero-stat.secondary {\\r\\n border-color: var(--secondary-color);\\r\\n background: linear-gradient(135deg, rgba(74, 144, 226, 0.1), #fff);\\r\\n}\\r\\n\\r\\n.hero-stat.success {\\r\\n border-color: var(--success-color);\\r\\n background: linear-gradient(135deg, rgba(40, 167, 69, 0.1), #fff);\\r\\n}\\r\\n\\r\\n.hero-value {\\r\\n font-size: 2rem;\\r\\n font-weight: bold;\\r\\n color: var(--primary-color);\\r\\n margin-bottom: 0.5rem;\\r\\n}\\r\\n\\r\\n.hero-stat.success .hero-value {\\r\\n color: var(--success-color);\\r\\n}\\r\\n\\r\\n.hero-label {\\r\\n font-size: 0.9rem;\\r\\n color: #666;\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.bandwidth-details {\\r\\n background: var(--metric-bg);\\r\\n padding: 1.5rem;\\r\\n border-radius: 8px;\\r\\n margin-bottom: 1.5rem;\\r\\n}\\r\\n\\r\\n.bandwidth-details h5 {\\r\\n margin: 0 0 1rem 0;\\r\\n color: var(--primary-color);\\r\\n}\\r\\n\\r\\n.bandwidth-grid {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));\\r\\n gap: 0.75rem;\\r\\n}\\r\\n\\r\\n.bw-stat {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n padding: 0.75rem;\\r\\n background: white;\\r\\n border-radius: 4px;\\r\\n border-left: 3px solid var(--primary-color);\\r\\n}\\r\\n\\r\\n.bw-stat.highlight {\\r\\n border-left-color: var(--success-color);\\r\\n background: rgba(40, 167, 69, 0.05);\\r\\n}\\r\\n\\r\\n.bw-label {\\r\\n color: #666;\\r\\n font-size: 0.9rem;\\r\\n}\\r\\n\\r\\n.bw-value {\\r\\n font-weight: bold;\\r\\n color: var(--text-color);\\r\\n}\\r\\n\\r\\n.bw-value.success-text {\\r\\n color: var(--success-color);\\r\\n}\\r\\n\\r\\n.bandwidth-chart {\\r\\n background: var(--metric-bg);\\r\\n padding: 1.5rem;\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.bandwidth-chart h5 {\\r\\n margin: 0 0 1rem 0;\\r\\n color: var(--primary-color);\\r\\n}\\r\\n\\r\\n.chart-container {\\r\\n position: relative;\\r\\n height: 100px;\\r\\n background: white;\\r\\n border-radius: 4px;\\r\\n padding: 1rem;\\r\\n}\\r\\n\\r\\n.sparkline {\\r\\n width: 100%;\\r\\n height: 100%;\\r\\n}\\r\\n\\r\\n.chart-labels {\\r\\n position: absolute;\\r\\n right: 0.5rem;\\r\\n top: 0.5rem;\\r\\n bottom: 0.5rem;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n justify-content: space-between;\\r\\n font-size: 0.75rem;\\r\\n color: #999;\\r\\n}\\r\\n\\r\\n.bandwidth-chart-placeholder {\\r\\n text-align: center;\\r\\n padding: 2rem;\\r\\n color: #666;\\r\\n background: var(--metric-bg);\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n/* Path Analytics Styles */\\r\\n.path-analytics-dashboard {\\r\\n padding: 1rem 0;\\r\\n}\\r\\n\\r\\n.path-summary {\\r\\n display: flex;\\r\\n gap: 2rem;\\r\\n margin-bottom: 1.5rem;\\r\\n}\\r\\n\\r\\n.summary-stat {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n align-items: center;\\r\\n padding: 1rem 2rem;\\r\\n background: var(--metric-bg);\\r\\n border-radius: 8px;\\r\\n border: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.summary-value {\\r\\n font-size: 2rem;\\r\\n font-weight: bold;\\r\\n color: var(--primary-color);\\r\\n}\\r\\n\\r\\n.summary-label {\\r\\n font-size: 0.85rem;\\r\\n color: #666;\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.path-table-container {\\r\\n overflow-x: auto;\\r\\n margin-bottom: 1rem;\\r\\n}\\r\\n\\r\\n.path-table {\\r\\n width: 100%;\\r\\n border-collapse: collapse;\\r\\n font-size: 0.9rem;\\r\\n}\\r\\n\\r\\n.path-table th,\\r\\n.path-table td {\\r\\n padding: 0.75rem;\\r\\n text-align: left;\\r\\n border-bottom: 1px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.path-table th {\\r\\n background: var(--metric-bg);\\r\\n font-weight: 600;\\r\\n color: var(--dark-color);\\r\\n position: sticky;\\r\\n top: 0;\\r\\n}\\r\\n\\r\\n.path-table tbody tr:hover {\\r\\n background: rgba(44, 90, 160, 0.05);\\r\\n}\\r\\n\\r\\n.path-name {\\r\\n font-family: 'Courier New', monospace;\\r\\n color: var(--primary-color);\\r\\n max-width: 300px;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n.path-rate {\\r\\n text-align: center;\\r\\n color: #666;\\r\\n}\\r\\n\\r\\n.path-bytes {\\r\\n text-align: right;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.path-percentage {\\r\\n width: 150px;\\r\\n}\\r\\n\\r\\n.percentage-bar-container {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0.5rem;\\r\\n}\\r\\n\\r\\n.percentage-bar {\\r\\n height: 8px;\\r\\n background: linear-gradient(90deg, var(--primary-color), var(--secondary-color));\\r\\n border-radius: 4px;\\r\\n transition: width 0.3s ease;\\r\\n}\\r\\n\\r\\n.percentage-text {\\r\\n font-size: 0.85rem;\\r\\n color: #666;\\r\\n min-width: 35px;\\r\\n}\\r\\n\\r\\n.path-more {\\r\\n text-align: center;\\r\\n padding: 1rem;\\r\\n color: #666;\\r\\n font-style: italic;\\r\\n}\\r\\n\\r\\n.path-analytics-empty {\\r\\n text-align: center;\\r\\n padding: 2rem;\\r\\n color: #666;\\r\\n background: var(--metric-bg);\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n/* Network Quality Dashboard Styles */\\r\\n.network-quality-dashboard {\\r\\n padding: 1rem 0;\\r\\n}\\r\\n\\r\\n.nq-hero {\\r\\n display: grid;\\r\\n grid-template-columns: auto 1fr;\\r\\n gap: 2rem;\\r\\n align-items: center;\\r\\n margin-bottom: 1.5rem;\\r\\n}\\r\\n\\r\\n.nq-gauge-container {\\r\\n text-align: center;\\r\\n width: 160px;\\r\\n}\\r\\n\\r\\n.quality-gauge {\\r\\n width: 160px;\\r\\n height: 90px;\\r\\n}\\r\\n\\r\\n.nq-gauge-label {\\r\\n font-size: 0.85rem;\\r\\n color: #666;\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n margin-top: 0.25rem;\\r\\n}\\r\\n\\r\\n.nq-key-metrics {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));\\r\\n gap: 1rem;\\r\\n}\\r\\n\\r\\n.nq-key-metrics .metric-item {\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.nq-key-metrics .metric-item.warning {\\r\\n border-color: var(--warning-color);\\r\\n background: rgba(255, 193, 7, 0.1);\\r\\n}\\r\\n\\r\\n.nq-details {\\r\\n background: var(--metric-bg);\\r\\n padding: 1.5rem;\\r\\n border-radius: 8px;\\r\\n}\\r\\n\\r\\n.nq-details h5 {\\r\\n margin: 0 0 1rem 0;\\r\\n color: var(--primary-color);\\r\\n}\\r\\n\\r\\n/* Responsive adjustments for bandwidth and path analytics */\\r\\n@media (max-width: 768px) {\\r\\n .hero-value {\\r\\n font-size: 1.5rem;\\r\\n }\\r\\n\\r\\n .bandwidth-grid {\\r\\n grid-template-columns: 1fr;\\r\\n }\\r\\n\\r\\n .path-summary {\\r\\n flex-direction: column;\\r\\n gap: 1rem;\\r\\n }\\r\\n\\r\\n .summary-stat {\\r\\n padding: 0.75rem 1rem;\\r\\n }\\r\\n\\r\\n .path-name {\\r\\n max-width: 150px;\\r\\n }\\r\\n\\r\\n .percentage-bar-container {\\r\\n flex-direction: column;\\r\\n align-items: flex-start;\\r\\n gap: 0.25rem;\\r\\n }\\r\\n\\r\\n .percentage-bar {\\r\\n width: 100% !important;\\r\\n max-width: 100px;\\r\\n }\\r\\n\\r\\n .nq-hero {\\r\\n grid-template-columns: 1fr;\\r\\n justify-items: center;\\r\\n }\\r\\n\\r\\n .nq-key-metrics {\\r\\n grid-template-columns: 1fr 1fr;\\r\\n }\\r\\n}\\r\\n\\r\\n/* Protocol Version Badge */\\r\\n.protocol-badge {\\r\\n display: inline-block;\\r\\n padding: 0.2rem 0.6rem;\\r\\n border-radius: 12px;\\r\\n font-size: 0.85rem;\\r\\n font-weight: 700;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.protocol-v1 {\\r\\n background: var(--metric-bg);\\r\\n color: #666;\\r\\n border: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.protocol-v2 {\\r\\n background: linear-gradient(135deg, rgba(40, 167, 69, 0.15), rgba(40, 167, 69, 0.05));\\r\\n color: var(--success-color);\\r\\n border: 2px solid var(--success-color);\\r\\n}\\r\\n\\r\\n.protocol-v3 {\\r\\n background: linear-gradient(135deg, rgba(13, 110, 253, 0.15), rgba(13, 110, 253, 0.05));\\r\\n color: #0d6efd;\\r\\n border: 2px solid #0d6efd;\\r\\n}\\r\\n\\r\\n/* Recent Errors List */\\r\\n.recent-errors-list {\\r\\n margin-top: 0.5rem;\\r\\n font-size: 0.875rem;\\r\\n}\\r\\n\\r\\n.recent-error-item {\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n gap: 0.5rem;\\r\\n padding: 0.4rem 0;\\r\\n border-bottom: 1px solid rgba(220, 53, 69, 0.15);\\r\\n}\\r\\n\\r\\n.recent-error-item:last-child {\\r\\n border-bottom: none;\\r\\n}\\r\\n\\r\\n.error-category-badge {\\r\\n flex-shrink: 0;\\r\\n display: inline-block;\\r\\n padding: 0.1rem 0.4rem;\\r\\n border-radius: 8px;\\r\\n font-size: 0.75rem;\\r\\n font-weight: 600;\\r\\n background: rgba(220, 53, 69, 0.15);\\r\\n color: var(--danger-color);\\r\\n text-transform: uppercase;\\r\\n}\\r\\n\\r\\n.recent-error-msg {\\r\\n flex: 1;\\r\\n font-family: 'Courier New', monospace;\\r\\n word-break: break-word;\\r\\n color: var(--text-color);\\r\\n}\\r\\n\\r\\n.recent-error-time {\\r\\n flex-shrink: 0;\\r\\n font-size: 0.75rem;\\r\\n color: #888;\\r\\n font-style: italic;\\r\\n white-space: nowrap;\\r\\n}\\r\\n\\r\\n/* v2 Dashboard Styles */\\r\\n.v2-dashboard {\\r\\n padding: 0.5rem 0;\\r\\n}\\r\\n\\r\\n.v2-dashboard .metrics-grid {\\r\\n margin-bottom: 1.5rem;\\r\\n}\\r\\n\\r\\n/* Congestion Control Styles */\\r\\n.congestion-state {\\r\\n display: inline-block;\\r\\n padding: 0.15rem 0.5rem;\\r\\n border-radius: 4px;\\r\\n font-size: 0.85rem;\\r\\n font-weight: 600;\\r\\n text-transform: capitalize;\\r\\n background: var(--metric-bg);\\r\\n color: var(--text-color);\\r\\n}\\r\\n\\r\\n.congestion-state.success {\\r\\n background: rgba(40, 167, 69, 0.15);\\r\\n color: var(--success-color);\\r\\n}\\r\\n\\r\\n.congestion-state.warning {\\r\\n background: rgba(255, 193, 7, 0.15);\\r\\n color: #856404;\\r\\n}\\r\\n\\r\\n/* Bonding Styles */\\r\\n.bonding-links {\\r\\n display: grid;\\r\\n grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));\\r\\n gap: 1rem;\\r\\n margin-top: 1rem;\\r\\n}\\r\\n\\r\\n.bonding-link {\\r\\n background: var(--metric-bg);\\r\\n border: 2px solid var(--border-color);\\r\\n border-radius: 8px;\\r\\n padding: 1rem;\\r\\n transition: border-color 0.2s ease;\\r\\n}\\r\\n\\r\\n.bonding-link.active {\\r\\n border-color: var(--success-color);\\r\\n background: rgba(40, 167, 69, 0.05);\\r\\n}\\r\\n\\r\\n.link-header {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 0.5rem;\\r\\n margin-bottom: 0.75rem;\\r\\n}\\r\\n\\r\\n.link-name {\\r\\n font-weight: 600;\\r\\n font-size: 1rem;\\r\\n color: var(--text-color);\\r\\n}\\r\\n\\r\\n.link-badge {\\r\\n display: inline-block;\\r\\n padding: 0.1rem 0.4rem;\\r\\n border-radius: 4px;\\r\\n font-size: 0.75rem;\\r\\n font-weight: 700;\\r\\n letter-spacing: 0.5px;\\r\\n}\\r\\n\\r\\n.link-badge.active-badge {\\r\\n background: var(--success-color);\\r\\n color: white;\\r\\n}\\r\\n\\r\\n.link-badge.success {\\r\\n background: rgba(40, 167, 69, 0.15);\\r\\n color: var(--success-color);\\r\\n}\\r\\n\\r\\n.link-badge.error {\\r\\n background: rgba(220, 53, 69, 0.15);\\r\\n color: var(--danger-color);\\r\\n}\\r\\n\\r\\n.link-stats {\\r\\n display: grid;\\r\\n grid-template-columns: 1fr 1fr;\\r\\n gap: 0.5rem;\\r\\n}\\r\\n\\r\\n.link-stats .stat-item {\\r\\n padding: 0.5rem;\\r\\n font-size: 0.85rem;\\r\\n}\\r\\n\\r\\n/* Monitoring & Alerts Styles */\\r\\n.monitoring-subsection {\\r\\n margin-bottom: 1.5rem;\\r\\n padding-bottom: 1.5rem;\\r\\n border-bottom: 2px solid var(--border-color);\\r\\n}\\r\\n\\r\\n.monitoring-subsection:last-child {\\r\\n border-bottom: none;\\r\\n margin-bottom: 0;\\r\\n padding-bottom: 0;\\r\\n}\\r\\n\\r\\n.monitoring-subsection h5 {\\r\\n margin: 0 0 1rem 0;\\r\\n color: var(--primary-color);\\r\\n}\\r\\n\\r\\n.alert-level {\\r\\n display: inline-block;\\r\\n padding: 0.1rem 0.4rem;\\r\\n border-radius: 4px;\\r\\n font-size: 0.8rem;\\r\\n font-weight: 700;\\r\\n}\\r\\n\\r\\n.alert-ok {\\r\\n background: rgba(40, 167, 69, 0.15);\\r\\n color: var(--success-color);\\r\\n}\\r\\n\\r\\n.alert-warning {\\r\\n background: rgba(255, 193, 7, 0.15);\\r\\n color: #856404;\\r\\n}\\r\\n\\r\\n.alert-critical {\\r\\n background: rgba(220, 53, 69, 0.15);\\r\\n color: var(--danger-color);\\r\\n}\\r\\n\\r\\n/* Responsive adjustments for v2 sections */\\r\\n@media (max-width: 768px) {\\r\\n .bonding-links {\\r\\n grid-template-columns: 1fr;\\r\\n }\\r\\n\\r\\n .link-stats {\\r\\n grid-template-columns: 1fr;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3NyYy93ZWJhcHAvc3R5bGVzLmNzcyIsIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQzZHO0FBQ2pCO0FBQzVGLDhCQUE4QixtRkFBMkIsQ0FBQyw0RkFBcUM7QUFDL0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sWUFBWTtBQUNuQjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sK0ZBQStGLE1BQU0sWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsUUFBUSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsV0FBVyxVQUFVLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxXQUFXLFVBQVUsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLEtBQUssTUFBTSxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsT0FBTyxLQUFLLFlBQVksUUFBUSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFVBQVUsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFVBQVUsTUFBTSxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxNQUFNLFVBQVUsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE9BQU8sTUFBTSxVQUFVLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxVQUFVLFVBQVUsVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxVQUFVLFVBQVUsWUFBWSxhQUFhLFdBQVcsWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLFlBQVksTUFBTSxLQUFLLFVBQVUsT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFVBQVUsTUFBTSxLQUFLLFVBQVUsVUFBVSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE1BQU0sTUFBTSxZQUFZLE1BQU0sVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLFlBQVksTUFBTSxZQUFZLE9BQU8sS0FBSyxnQ0FBZ0MsaUNBQWlDLE9BQU8sWUFBWSxNQUFNLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxVQUFVLFVBQVUsWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxVQUFVLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxXQUFXLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxZQUFZLFdBQVcsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sWUFBWSxNQUFNLFVBQVUsWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sWUFBWSxNQUFNLFVBQVUsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxhQUFhLFdBQVcsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFVBQVUsVUFBVSxVQUFVLFlBQVksYUFBYSxhQUFhLFdBQVcsTUFBTSxLQUFLLFlBQVksV0FBVyxVQUFVLFlBQVksYUFBYSxPQUFPLFlBQVksTUFBTSxVQUFVLE9BQU8sS0FBSyxVQUFVLFVBQVUsWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsT0FBTyxNQUFNLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLFdBQVcsTUFBTSxLQUFLLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxNQUFNLEtBQUssVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksV0FBVyxVQUFVLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLE9BQU8sS0FBSyxZQUFZLFdBQVcsVUFBVSxZQUFZLGFBQWEsT0FBTyxZQUFZLE1BQU0sVUFBVSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsVUFBVSxNQUFNLEtBQUssWUFBWSxXQUFXLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxVQUFVLFlBQVksV0FBVyxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sWUFBWSxNQUFNLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsV0FBVyxNQUFNLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksTUFBTSxNQUFNLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksYUFBYSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsWUFBWSxPQUFPLFlBQVksTUFBTSxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxPQUFPLEtBQUssVUFBVSxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksYUFBYSxPQUFPLFlBQVksTUFBTSxZQUFZLE9BQU8sS0FBSyxZQUFZLE9BQU8sWUFBWSxNQUFNLFlBQVksYUFBYSxhQUFhLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLE9BQU8sS0FBSyxZQUFZLFdBQVcsT0FBTyxZQUFZLE1BQU0sVUFBVSxZQUFZLFdBQVcsWUFBWSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFVBQVUsWUFBWSxXQUFXLFlBQVksT0FBTyxLQUFLLFlBQVksV0FBVyxZQUFZLE9BQU8sS0FBSyxZQUFZLGFBQWEsYUFBYSxhQUFhLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxXQUFXLE1BQU0sS0FBSyxZQUFZLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssVUFBVSxZQUFZLFdBQVcsTUFBTSxLQUFLLFVBQVUsWUFBWSxPQUFPLFlBQVksTUFBTSxZQUFZLGFBQWEsYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsT0FBTyxLQUFLLFlBQVksYUFBYSxPQUFPLEtBQUssWUFBWSxhQUFhLGFBQWEsYUFBYSxhQUFhLE9BQU8sS0FB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QXlCLEtBQUssb0VBQW9FLDRCQUE0Qiw2QkFBNkIsbURBQW1ELEtBQUssMkNBQTJDLDBCQUEwQix1QkFBdUIsd0JBQXdCLEtBQUssbUNBQW1DLHlCQUF5QixrQ0FBa0MsS0FBSyxzQkFBc0IsNEJBQTRCLDZCQUE2Qix5QkFBeUIsd0JBQXdCLHVCQUF1QixLQUFLLG1CQUFtQiwwQ0FBMEMsa0NBQWtDLEtBQUssd0JBQXdCLDBDQUEwQyxxQkFBcUIsS0FBSyx5QkFBeUIsMENBQTBDLGlDQUFpQyxLQUFLLG1GQUFtRixzQkFBc0IsbUNBQW1DLE9BQU8sdUJBQXVCLG1DQUFtQyxPQUFPLEtBQUssdUJBQXVCO0FBQzU1ckM7QUFDQSxpRUFBZSx1QkFBdUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vc3JjL3dlYmFwcC9zdHlsZXMuY3NzP2RhZTUiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gSW1wb3J0c1xuaW1wb3J0IF9fX0NTU19MT0FERVJfQVBJX1NPVVJDRU1BUF9JTVBPUlRfX18gZnJvbSBcIi4uLy4uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9zb3VyY2VNYXBzLmpzXCI7XG5pbXBvcnQgX19fQ1NTX0xPQURFUl9BUElfSU1QT1JUX19fIGZyb20gXCIuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzXCI7XG52YXIgX19fQ1NTX0xPQURFUl9FWFBPUlRfX18gPSBfX19DU1NfTE9BREVSX0FQSV9JTVBPUlRfX18oX19fQ1NTX0xPQURFUl9BUElfU09VUkNFTUFQX0lNUE9SVF9fXyk7XG4vLyBNb2R1bGVcbl9fX0NTU19MT0FERVJfRVhQT1JUX19fLnB1c2goW21vZHVsZS5pZCwgYC8qIE1vZGVybiBTaWduYWxLLXRoZW1lZCBzdHlsZXMgKi9cclxuOnJvb3Qge1xyXG4gIC0tcHJpbWFyeS1jb2xvcjogIzJjNWFhMDtcclxuICAtLXNlY29uZGFyeS1jb2xvcjogIzRhOTBlMjtcclxuICAtLXN1Y2Nlc3MtY29sb3I6ICMyOGE3NDU7XHJcbiAgLS13YXJuaW5nLWNvbG9yOiAjZmZjMTA3O1xyXG4gIC0tZGFuZ2VyLWNvbG9yOiAjZGMzNTQ1O1xyXG4gIC0tZGFyay1jb2xvcjogIzM0M2E0MDtcclxuICAtLWxpZ2h0LWNvbG9yOiAjZjhmOWZhO1xyXG4gIC0tYm9yZGVyLWNvbG9yOiAjZGVlMmU2O1xyXG4gIC0tdGV4dC1jb2xvcjogIzIxMjUyOTtcclxuICAtLWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XHJcbiAgLS1jYXJkLXNoYWRvdzogMCAycHggNHB4IHJnYmEoMCwwLDAsMC4xKTtcclxuICAtLW1ldHJpYy1iZzogI2YwZjRmODtcclxufVxyXG5cclxuXHJcbioge1xyXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XHJcbn1cclxuXHJcbmJvZHkge1xyXG4gIGZvbnQtZmFtaWx5OiAnU2Vnb2UgVUknLCBUYWhvbWEsIEdlbmV2YSwgVmVyZGFuYSwgc2Fucy1zZXJpZjtcclxuICBsaW5lLWhlaWdodDogMS42O1xyXG4gIGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1saWdodC1jb2xvcik7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIHBhZGRpbmc6IDA7XHJcbn1cclxuXHJcbi5oZWFkZXIge1xyXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLXByaW1hcnktY29sb3IpLCB2YXIoLS1zZWNvbmRhcnktY29sb3IpKTtcclxuICBjb2xvcjogd2hpdGU7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIHBhZGRpbmc6IDJyZW0gMXJlbTtcclxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjEpO1xyXG59XHJcblxyXG4uaGVhZGVyIGgxIHtcclxuICBtYXJnaW46IDAgMCAwLjVyZW0gMDtcclxuICBmb250LXNpemU6IDIuNXJlbTtcclxuICBmb250LXdlaWdodDogMzAwO1xyXG59XHJcblxyXG4uc3VidGl0bGUge1xyXG4gIG1hcmdpbjogMDtcclxuICBvcGFjaXR5OiAwLjk7XHJcbiAgZm9udC1zaXplOiAxLjFyZW07XHJcbn1cclxuXHJcbi8qIENvbm5lY3Rpb24gVGFicyAqL1xyXG4uY29ubmVjdGlvbi10YWJzIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1kYXJrLWNvbG9yKTtcclxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjE1KTtcclxuICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gIHRvcDogMDtcclxuICB6LWluZGV4OiAxMDA7XHJcbn1cclxuXHJcbi50YWJzLWNvbnRhaW5lciB7XHJcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XHJcbiAgbWFyZ2luOiAwIGF1dG87XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBvdmVyZmxvdy14OiBhdXRvO1xyXG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcclxuICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XHJcbn1cclxuXHJcbi5jb25uZWN0aW9uLXRhYiB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMC41cmVtO1xyXG4gIHBhZGRpbmc6IDAuODVyZW0gMS4yNXJlbTtcclxuICBib3JkZXI6IG5vbmU7XHJcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XHJcbiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KTtcclxuICBmb250LXNpemU6IDAuOTVyZW07XHJcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XHJcbiAgY3Vyc29yOiBwb2ludGVyO1xyXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XHJcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzLCBjb2xvciAwLjJzO1xyXG4gIGJvcmRlci1ib3R0b206IDNweCBzb2xpZCB0cmFuc3BhcmVudDtcclxufVxyXG5cclxuLmNvbm5lY3Rpb24tdGFiOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDgpO1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLmNvbm5lY3Rpb24tdGFiLmFjdGl2ZSB7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTtcclxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xyXG59XHJcblxyXG4udGFiLXN0YXR1cy1kb3Qge1xyXG4gIHdpZHRoOiA4cHg7XHJcbiAgaGVpZ2h0OiA4cHg7XHJcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xyXG4gIGZsZXgtc2hyaW5rOiAwO1xyXG59XHJcblxyXG4udGFiLXN0YXR1cy1kb3Qub2sge1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xyXG4gIGJveC1zaGFkb3c6IDAgMCA0cHggcmdiYSg0MCwgMTY3LCA2OSwgMC41KTtcclxufVxyXG5cclxuLnRhYi1zdGF0dXMtZG90Lndhcm5pbmcge1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLXdhcm5pbmctY29sb3IpO1xyXG59XHJcblxyXG4udGFiLXN0YXR1cy1kb3QuZXJyb3Ige1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLWRhbmdlci1jb2xvcik7XHJcbn1cclxuXHJcbi50YWItaWNvbiB7XHJcbiAgZm9udC1zaXplOiAxLjFyZW07XHJcbn1cclxuXHJcbi50YWItbmFtZSB7XHJcbiAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG5cclxuLnRhYi10eXBlIHtcclxuICBmb250LXNpemU6IDAuNzVyZW07XHJcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcclxuICBsZXR0ZXItc3BhY2luZzogMC41cHg7XHJcbiAgb3BhY2l0eTogMC42O1xyXG4gIHBhZGRpbmc6IDAuMXJlbSAwLjRyZW07XHJcbiAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjIpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDNweDtcclxufVxyXG5cclxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgLmNvbm5lY3Rpb24tdGFiIHtcclxuICAgIHBhZGRpbmc6IDAuN3JlbSAxcmVtO1xyXG4gICAgZm9udC1zaXplOiAwLjg1cmVtO1xyXG4gIH1cclxuXHJcbiAgLnRhYi10eXBlIHtcclxuICAgIGRpc3BsYXk6IG5vbmU7XHJcbiAgfVxyXG59XHJcblxyXG4uY29udGFpbmVyIHtcclxuICBtYXgtd2lkdGg6IDEyMDBweDtcclxuICBtYXJnaW46IDAgYXV0bztcclxuICBwYWRkaW5nOiAycmVtIDFyZW07XHJcbn1cclxuXHJcbi5jb25maWctc2VjdGlvbiB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcclxufVxyXG5cclxuLnBhZ2UtZ3JvdXAge1xyXG4gIG1hcmdpbi1ib3R0b206IDIuNXJlbTtcclxufVxyXG5cclxuLnBhZ2UtZ3JvdXAtaGVhZGVyIHtcclxuICBtYXJnaW46IDAgMCAxcmVtO1xyXG4gIHBhZGRpbmc6IDAgMC4yNXJlbTtcclxufVxyXG5cclxuLnBhZ2UtZ3JvdXAtaGVhZGVyIGgyIHtcclxuICBtYXJnaW46IDA7XHJcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xyXG4gIGZvbnQtc2l6ZTogMS40cmVtO1xyXG59XHJcblxyXG4ucGFnZS1ncm91cC1oZWFkZXIgcCB7XHJcbiAgbWFyZ2luOiAwLjM1cmVtIDAgMDtcclxuICBjb2xvcjogIzUxNjE3MztcclxufVxyXG5cclxuLnBhZ2UtZ3JvdXAtY29udGVudCAuY29uZmlnLXNlY3Rpb246bGFzdC1jaGlsZCB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMDtcclxufVxyXG5cclxuXHJcbi5tb2RlLWJhbm5lci1jYXJkIHtcclxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxufVxyXG5cclxuLm1vZGUtYmFubmVyLWNhcmQgLmNhcmQtY29udGVudCB7XHJcbiAgcGFkZGluZzogMS4yNXJlbSAxLjVyZW07XHJcbn1cclxuXHJcbi5tb2RlLWJhbm5lci1ncmlkIHtcclxuICBkaXNwbGF5OiBncmlkO1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjYwcHgsIDFmcikpO1xyXG4gIGdhcDogMC43NXJlbTtcclxufVxyXG5cclxuLm1vZGUtYmFubmVyLWl0ZW0ge1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XHJcbiAgYm9yZGVyLWxlZnQ6IDNweCBzb2xpZCB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDZweDtcclxuICBwYWRkaW5nOiAwLjc1cmVtIDAuOXJlbTtcclxuICBjb2xvcjogIzMzNDE1NTtcclxuICBmb250LXNpemU6IDAuOTJyZW07XHJcbn1cclxuXHJcbi5tb2RlLXNlcnZlciB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y3ZmJmZiwgI2VkZjRmZik7XHJcbn1cclxuXHJcbi5tb2RlLWNsaWVudCB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y4ZmJmZiwgI2VlZjdmMik7XHJcbn1cclxuXHJcbi5jYXJkIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1iYWNrZ3JvdW5kLWNvbG9yKTtcclxuICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgYm94LXNoYWRvdzogdmFyKC0tY2FyZC1zaGFkb3cpO1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbn1cclxuXHJcbi5jYXJkLWhlYWRlciB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSwgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKSk7XHJcbiAgY29sb3I6IHdoaXRlO1xyXG4gIHBhZGRpbmc6IDEuNXJlbTtcclxufVxyXG5cclxuLmNhcmQtaGVhZGVyIGgyIHtcclxuICBtYXJnaW46IDAgMCAwLjVyZW0gMDtcclxuICBmb250LXNpemU6IDEuNXJlbTtcclxuICBmb250LXdlaWdodDogNDAwO1xyXG59XHJcblxyXG4uY2FyZC1oZWFkZXIgcCB7XHJcbiAgbWFyZ2luOiAwO1xyXG4gIG9wYWNpdHk6IDAuOTtcclxufVxyXG5cclxuLmNhcmQtY29udGVudCB7XHJcbiAgcGFkZGluZzogMnJlbTtcclxufVxyXG5cclxuLmZvcm0tZ3JvdXAge1xyXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcclxufVxyXG5cclxuLmZvcm0tZ3JvdXAgbGFiZWwge1xyXG4gIGRpc3BsYXk6IGJsb2NrO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG4gIGNvbG9yOiB2YXIoLS1kYXJrLWNvbG9yKTtcclxufVxyXG5cclxuLmZvcm0tZ3JvdXAgaW5wdXQsXHJcbi5mb3JtLWdyb3VwIHRleHRhcmVhIHtcclxuICB3aWR0aDogMTAwJTtcclxuICBwYWRkaW5nOiAwLjc1cmVtO1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIGZvbnQtc2l6ZTogMXJlbTtcclxuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4zcyBlYXNlO1xyXG59XHJcblxyXG4uZm9ybS1ncm91cCBpbnB1dDpmb2N1cyxcclxuLmZvcm0tZ3JvdXAgdGV4dGFyZWE6Zm9jdXMge1xyXG4gIG91dGxpbmU6IG5vbmU7XHJcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xyXG4gIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDc0LCAxNDQsIDIyNiwgMC4xKTtcclxufVxyXG5cclxuLmhlbHAtdGV4dCB7XHJcbiAgZGlzcGxheTogYmxvY2s7XHJcbiAgbWFyZ2luLXRvcDogMC41cmVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XHJcbiAgbGluZS1oZWlnaHQ6IDEuNDtcclxufVxyXG5cclxuLmJ0biB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHBhZGRpbmc6IDAuNzVyZW0gMS41cmVtO1xyXG4gIGJvcmRlcjogbm9uZTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgZm9udC1zaXplOiAxcmVtO1xyXG4gIGZvbnQtd2VpZ2h0OiA1MDA7XHJcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xyXG4gIGN1cnNvcjogcG9pbnRlcjtcclxuICB0cmFuc2l0aW9uOiBhbGwgMC4zcyBlYXNlO1xyXG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcclxufVxyXG5cclxuLmJ0bi1wcmltYXJ5IHtcclxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoNDVkZWcsIHZhcigtLXByaW1hcnktY29sb3IpLCB2YXIoLS1zZWNvbmRhcnktY29sb3IpKTtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5idG4tcHJpbWFyeTpob3ZlciB7XHJcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0ycHgpO1xyXG4gIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDQ0LCA5MCwgMTYwLCAwLjMpO1xyXG59XHJcblxyXG4uYnRuLXNlY29uZGFyeSB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNzU3ZDtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5idG4tc2Vjb25kYXJ5OmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTQ1YjYyO1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcclxuICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgxMDgsIDExNywgMTI1LCAwLjMpO1xyXG59XHJcblxyXG4uYnRuLWRhbmdlciB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGFuZ2VyLWNvbG9yKTtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5idG4tZGFuZ2VyOmhvdmVyIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzgyMzMzO1xyXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcclxuICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgyMjAsIDUzLCA2OSwgMC4zKTtcclxufVxyXG5cclxuLnN1YnNjcmlwdGlvbi1wYXRocyB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcclxufVxyXG5cclxuLnN1YnNjcmlwdGlvbi1wYXRocyBoMyB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxuICBjb2xvcjogdmFyKC0tZGFyay1jb2xvcik7XHJcbn1cclxuXHJcbi5wYXRocy1saXN0IHtcclxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xyXG59XHJcblxyXG4ucGF0aC1pdGVtIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG4gIHBhZGRpbmc6IDAuNzVyZW07XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtY29sb3IpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xyXG59XHJcblxyXG4ucGF0aC1pdGVtIGlucHV0IHtcclxuICBmbGV4OiAxO1xyXG4gIG1hcmdpbjogMCAwLjVyZW0gMCAwO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XHJcbn1cclxuXHJcbi5qc29uLWVkaXRvciB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcclxufVxyXG5cclxuLmpzb24tZWRpdG9yIGgzIHtcclxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xyXG4gIGNvbG9yOiB2YXIoLS1kYXJrLWNvbG9yKTtcclxufVxyXG5cclxuLmpzb24tZWRpdG9yIHRleHRhcmVhIHtcclxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xyXG4gIGJhY2tncm91bmQtY29sb3I6ICNmOGY5ZmE7XHJcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcclxufVxyXG5cclxuLnBsdWdpbi1jb25maWctc3VtbWFyeSB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxuICBwYWRkaW5nOiAxcmVtO1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XHJcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xyXG4gIGJvcmRlci1sZWZ0OiA0cHggc29saWQgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKTtcclxufVxyXG5cclxuLnBsdWdpbi1zdW1tYXJ5LWdyaWQge1xyXG4gIGRpc3BsYXk6IGdyaWQ7XHJcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxODBweCwgMWZyKSk7XHJcbiAgZ2FwOiAwLjc1cmVtO1xyXG59XHJcblxyXG4ucGx1Z2luLWNvbmZpZy1lZGl0b3IgdGV4dGFyZWEge1xyXG4gIG1pbi1oZWlnaHQ6IDMyMHB4O1xyXG59XHJcblxyXG4ucGx1Z2luLWNvbmZpZy1hY3Rpb25zIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtd3JhcDogd3JhcDtcclxuICBnYXA6IDAuNXJlbTtcclxufVxyXG5cclxuLnN0YXR1cy1pbmZvIHtcclxuICBwYWRkaW5nOiAxcmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LWNvbG9yKTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xyXG59XHJcblxyXG4ubm90aWZpY2F0aW9uIHtcclxuICBwb3NpdGlvbjogZml4ZWQ7XHJcbiAgdG9wOiAyMHB4O1xyXG4gIHJpZ2h0OiAyMHB4O1xyXG4gIHBhZGRpbmc6IDFyZW0gMS41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBjb2xvcjogd2hpdGU7XHJcbiAgZm9udC13ZWlnaHQ6IDUwMDtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNDAwcHgpO1xyXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7XHJcbiAgei1pbmRleDogMTAwMDtcclxuICBtaW4td2lkdGg6IDMwMHB4O1xyXG4gIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsMCwwLDAuMik7XHJcbn1cclxuXHJcbi5ub3RpZmljYXRpb24uc2hvdyB7XHJcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDApO1xyXG59XHJcblxyXG4ubm90aWZpY2F0aW9uLnN1Y2Nlc3Mge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xyXG59XHJcblxyXG4ubm90aWZpY2F0aW9uLmVycm9yIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kYW5nZXItY29sb3IpO1xyXG59XHJcblxyXG4ubm90aWZpY2F0aW9uLndhcm5pbmcge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXdhcm5pbmctY29sb3IpO1xyXG4gIGNvbG9yOiB2YXIoLS1kYXJrLWNvbG9yKTtcclxufVxyXG5cclxuLyogUmVzcG9uc2l2ZSBkZXNpZ24gKi9cclxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgLmhlYWRlciBoMSB7XHJcbiAgICBmb250LXNpemU6IDJyZW07XHJcbiAgfVxyXG4gIFxyXG4gIC5jb250YWluZXIge1xyXG4gICAgcGFkZGluZzogMXJlbTtcclxuICB9XHJcblxyXG4gIC5wYWdlLWdyb3VwIHtcclxuICAgIG1hcmdpbi1ib3R0b206IDJyZW07XHJcbiAgfVxyXG5cclxuICAucGFnZS1ncm91cC1oZWFkZXIgaDIge1xyXG4gICAgZm9udC1zaXplOiAxLjI1cmVtO1xyXG4gIH1cclxuXHJcbiAgLm1vZGUtYmFubmVyLWdyaWQge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XHJcbiAgfVxyXG4gIFxyXG4gIC5jYXJkLWNvbnRlbnQge1xyXG4gICAgcGFkZGluZzogMXJlbTtcclxuICB9XHJcbiAgXHJcbiAgLmJ0biB7XHJcbiAgICB3aWR0aDogMTAwJTtcclxuICAgIG1hcmdpbi1yaWdodDogMDtcclxuICB9XHJcbiAgXHJcbiAgLnBhdGgtaXRlbSB7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XHJcbiAgfVxyXG4gIFxyXG4gIC5wYXRoLWl0ZW0gaW5wdXQge1xyXG4gICAgbWFyZ2luOiAwIDAgMC41cmVtIDA7XHJcbiAgfVxyXG59XHJcblxyXG4vKiBTdGF0dXMgaW5kaWNhdG9ycyAqL1xyXG4uc3RhdHVzLWl0ZW0ge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgcGFkZGluZzogMC41cmVtIDA7XHJcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XHJcbn1cclxuXHJcbi5zdGF0dXMtaXRlbTpsYXN0LWNoaWxkIHtcclxuICBib3JkZXItYm90dG9tOiBub25lO1xyXG59XHJcblxyXG4uc3RhdHVzLWluZGljYXRvciB7XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG4gIHBhZGRpbmc6IDAuMjVyZW0gMC41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XHJcbn1cclxuXHJcbi5zdGF0dXMtaW5kaWNhdG9yLnN1Y2Nlc3Mge1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLnN0YXR1cy1pbmRpY2F0b3Iud2FybmluZyB7XHJcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2FybmluZy1jb2xvcik7XHJcbiAgY29sb3I6IHZhcigtLWRhcmstY29sb3IpO1xyXG59XHJcblxyXG4uc3RhdHVzLWluZGljYXRvci5pbmZvIHtcclxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLnN0YXR1cy1kZXRhaWxzIHtcclxuICBtYXJnaW4tdG9wOiAwLjVyZW07XHJcbiAgcGFkZGluZzogMC41cmVtO1xyXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LWNvbG9yKTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxuICBsaW5lLWhlaWdodDogMS40O1xyXG59XHJcblxyXG4vKiBBbmltYXRpb24gZm9yIHNtb290aCB0cmFuc2l0aW9ucyAqL1xyXG4uZmFkZS1pbiB7XHJcbiAgYW5pbWF0aW9uOiBmYWRlSW4gMC41cyBlYXNlLWluO1xyXG59XHJcblxyXG5Aa2V5ZnJhbWVzIGZhZGVJbiB7XHJcbiAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMHB4KTsgfVxyXG4gIHRvIHsgb3BhY2l0eTogMTsgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOyB9XHJcbn1cclxuXHJcbi8qIFNlcnZlciBNb2RlIFN0eWxlcyAqL1xyXG4uc2VydmVyLW1vZGUtY2FyZCB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y4ZjlmYSwgI2U5ZWNlZik7XHJcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcHJpbWFyeS1jb2xvcik7XHJcbn1cclxuXHJcbi5zZXJ2ZXItbW9kZS1jYXJkIC5jYXJkLWhlYWRlciB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgdmFyKC0tcHJpbWFyeS1jb2xvciksIHZhcigtLXNlY29uZGFyeS1jb2xvcikpO1xyXG4gIGNvbG9yOiB3aGl0ZTtcclxufVxyXG5cclxuLnNlcnZlci1tb2RlLWNhcmQgLmNhcmQtaGVhZGVyIGgyIHtcclxuICBtYXJnaW46IDA7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogMTBweDtcclxufVxyXG5cclxuLnNlcnZlci1tb2RlLWluZm8gaDMge1xyXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxuICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcHJpbWFyeS1jb2xvcik7XHJcbiAgcGFkZGluZy1ib3R0b206IDhweDtcclxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xyXG59XHJcblxyXG4uaW5mby1ncmlkIHtcclxuICBkaXNwbGF5OiBncmlkO1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjgwcHgsIDFmcikpO1xyXG4gIGdhcDogMS41cmVtO1xyXG4gIG1hcmdpbjogMnJlbSAwO1xyXG59XHJcblxyXG4uaW5mby1ncmlkLmNvbXBhY3Qge1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpO1xyXG4gIGdhcDogMXJlbTtcclxuICBtYXJnaW46IDAuNXJlbSAwO1xyXG59XHJcblxyXG4uaW5mby1ncmlkLmNvbXBhY3QgLmluZm8taXRlbSB7XHJcbiAgcGFkZGluZzogMXJlbTtcclxufVxyXG5cclxuLmluZm8tZ3JpZC5jb21wYWN0IC5pbmZvLWl0ZW0gaDQge1xyXG4gIGZvbnQtc2l6ZTogMC45cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XHJcbn1cclxuXHJcbi5pbmZvLWdyaWQuY29tcGFjdCAuaW5mby1pdGVtIHAge1xyXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcclxufVxyXG5cclxuLmluZm8taXRlbSB7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgcGFkZGluZzogMS41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICBib3gtc2hhZG93OiB2YXIoLS1jYXJkLXNoYWRvdyk7XHJcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xyXG59XHJcblxyXG4uaW5mby1pdGVtIGg0IHtcclxuICBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XHJcbiAgbWFyZ2luOiAwIDAgMC41cmVtIDA7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIGdhcDogOHB4O1xyXG59XHJcblxyXG4uaW5mby1pdGVtIHAge1xyXG4gIG1hcmdpbjogMDtcclxuICBsaW5lLWhlaWdodDogMS41O1xyXG59XHJcblxyXG4uc2VydmVyLXN0YXR1cyB7XHJcbiAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgcGFkZGluZzogMS41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICBib3gtc2hhZG93OiB2YXIoLS1jYXJkLXNoYWRvdyk7XHJcbiAgbWFyZ2luOiAycmVtIDA7XHJcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tc3VjY2Vzcy1jb2xvcik7XHJcbn1cclxuXHJcbi5zZXJ2ZXItc3RhdHVzIGg0IHtcclxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XHJcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xyXG59XHJcblxyXG4uY29uZmlndXJhdGlvbi1ub3RlIHtcclxuICBiYWNrZ3JvdW5kOiAjZmZmM2NkO1xyXG4gIGJvcmRlcjogMXB4IHNvbGlkICNmZmVhYTc7XHJcbiAgcGFkZGluZzogMS41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICBtYXJnaW46IDJyZW0gMDtcclxufVxyXG5cclxuLmNvbmZpZ3VyYXRpb24tbm90ZSBoNCB7XHJcbiAgY29sb3I6ICM4NTY0MDQ7XHJcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcclxuICBnYXA6IDhweDtcclxufVxyXG5cclxuLmNvbmZpZ3VyYXRpb24tbm90ZSBwIHtcclxuICBtYXJnaW46IDAgMCAxcmVtIDA7XHJcbn1cclxuXHJcbi5jb25maWd1cmF0aW9uLW5vdGUgb2wge1xyXG4gIG1hcmdpbjogMDtcclxuICBwYWRkaW5nLWxlZnQ6IDEuNXJlbTtcclxufVxyXG5cclxuLmNvbmZpZ3VyYXRpb24tbm90ZSBsaSB7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG59XHJcblxyXG4vKiBNZXRyaWNzIERpc3BsYXkgU3R5bGVzICovXHJcbi5tZXRyaWNzLWdyaWQge1xyXG4gIGRpc3BsYXk6IGdyaWQ7XHJcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7XHJcbiAgZ2FwOiAxcmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcclxufVxyXG5cclxuLm1ldHJpYy1pdGVtIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xyXG4gIHBhZGRpbmc6IDFyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xyXG59XHJcblxyXG4ubWV0cmljLWl0ZW0uc3VjY2VzcyB7XHJcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjEpO1xyXG59XHJcblxyXG4ubWV0cmljLWl0ZW0uZXJyb3Ige1xyXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZGFuZ2VyLWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgNTMsIDY5LCAwLjEpO1xyXG59XHJcblxyXG4ubWV0cmljLWxhYmVsIHtcclxuICBmb250LXNpemU6IDAuOXJlbTtcclxuICBjb2xvcjogIzY2NjtcclxuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XHJcbn1cclxuXHJcbi5tZXRyaWMtdmFsdWUge1xyXG4gIGZvbnQtc2l6ZTogMS41cmVtO1xyXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gIGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTtcclxufVxyXG5cclxuLm1ldHJpY3Mtc3RhdHMge1xyXG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcclxuICBwYWRkaW5nLXRvcDogMS41cmVtO1xyXG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xyXG59XHJcblxyXG4ubWV0cmljcy1zdGF0cyBoNSB7XHJcbiAgbWFyZ2luLXRvcDogMDtcclxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xyXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxufVxyXG5cclxuLnN0YXRzLWdyaWQge1xyXG4gIGRpc3BsYXk6IGdyaWQ7XHJcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjUwcHgsIDFmcikpO1xyXG4gIGdhcDogMC43NXJlbTtcclxufVxyXG5cclxuLnN0YXQtaXRlbSB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XHJcbiAgcGFkZGluZzogMC43NXJlbTtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3IpO1xyXG59XHJcblxyXG4uc3RhdC1pdGVtLmVycm9yIHtcclxuICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0tZGFuZ2VyLWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgNTMsIDY5LCAwLjA1KTtcclxufVxyXG5cclxuLnN0YXQtbGFiZWwge1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIGZvbnQtc2l6ZTogMC45cmVtO1xyXG59XHJcblxyXG4uc3RhdC12YWx1ZSB7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgY29sb3I6IHZhcigtLXRleHQtY29sb3IpO1xyXG59XHJcblxyXG4uc3RhdC1pdGVtLmVycm9yIC5zdGF0LXZhbHVlIHtcclxuICBjb2xvcjogdmFyKC0tZGFuZ2VyLWNvbG9yKTtcclxufVxyXG5cclxuLm1ldHJpY3MtZXJyb3Ige1xyXG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcclxuICBwYWRkaW5nOiAxcmVtO1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMSk7XHJcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1kYW5nZXItY29sb3IpO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxufVxyXG5cclxuLm1ldHJpY3MtZXJyb3IgaDUge1xyXG4gIG1hcmdpbi10b3A6IDA7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG4gIGNvbG9yOiB2YXIoLS1kYW5nZXItY29sb3IpO1xyXG59XHJcblxyXG4uZXJyb3ItbWVzc2FnZSB7XHJcbiAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTtcclxuICBmb250LXNpemU6IDAuOXJlbTtcclxuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XHJcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcclxufVxyXG5cclxuLmVycm9yLXRpbWUge1xyXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcclxuICBjb2xvcjogIzY2NjtcclxuICBmb250LXN0eWxlOiBpdGFsaWM7XHJcbn1cclxuXHJcbi5tZXRyaWNzLXN1Y2Nlc3Mge1xyXG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcclxuICBwYWRkaW5nOiAxcmVtO1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoNDAsIDE2NywgNjksIDAuMSk7XHJcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG59XHJcblxyXG4uc3VjY2Vzcy1tZXNzYWdlIHtcclxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgZm9udC1zaXplOiAxLjFyZW07XHJcbn1cclxuXHJcbi5tZXRyaWNzLXNlY3Rpb24ge1xyXG4gIG1hcmdpbi10b3A6IDJyZW07XHJcbiAgcGFkZGluZy10b3A6IDEuNXJlbTtcclxuICBib3JkZXItdG9wOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcclxufVxyXG5cclxuLyogQmFuZHdpZHRoIERhc2hib2FyZCBTdHlsZXMgKi9cclxuLmJhbmR3aWR0aC1kYXNoYm9hcmQge1xyXG4gIHBhZGRpbmc6IDFyZW0gMDtcclxufVxyXG5cclxuLmJhbmR3aWR0aC1oZXJvIHtcclxuICBkaXNwbGF5OiBncmlkO1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTgwcHgsIDFmcikpO1xyXG4gIGdhcDogMS41cmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDJyZW07XHJcbn1cclxuXHJcbi5oZXJvLXN0YXQge1xyXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLW1ldHJpYy1iZyksICNmZmYpO1xyXG4gIHBhZGRpbmc6IDEuNXJlbTtcclxuICBib3JkZXItcmFkaXVzOiAxMnB4O1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xyXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGVhc2UsIGJveC1zaGFkb3cgMC4ycyBlYXNlO1xyXG59XHJcblxyXG4uaGVyby1zdGF0OmhvdmVyIHtcclxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XHJcbiAgYm94LXNoYWRvdzogMCA0cHggMTJweCByZ2JhKDAsMCwwLDAuMSk7XHJcbn1cclxuXHJcbi5oZXJvLXN0YXQucHJpbWFyeSB7XHJcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQ0LCA5MCwgMTYwLCAwLjEpLCAjZmZmKTtcclxufVxyXG5cclxuLmhlcm8tc3RhdC5zZWNvbmRhcnkge1xyXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDc0LCAxNDQsIDIyNiwgMC4xKSwgI2ZmZik7XHJcbn1cclxuXHJcbi5oZXJvLXN0YXQuc3VjY2VzcyB7XHJcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQwLCAxNjcsIDY5LCAwLjEpLCAjZmZmKTtcclxufVxyXG5cclxuLmhlcm8tdmFsdWUge1xyXG4gIGZvbnQtc2l6ZTogMnJlbTtcclxuICBmb250LXdlaWdodDogYm9sZDtcclxuICBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XHJcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xyXG59XHJcblxyXG4uaGVyby1zdGF0LnN1Y2Nlc3MgLmhlcm8tdmFsdWUge1xyXG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxufVxyXG5cclxuLmhlcm8tbGFiZWwge1xyXG4gIGZvbnQtc2l6ZTogMC45cmVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xyXG59XHJcblxyXG4uYmFuZHdpZHRoLWRldGFpbHMge1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XHJcbiAgcGFkZGluZzogMS41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcclxuICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XHJcbn1cclxuXHJcbi5iYW5kd2lkdGgtZGV0YWlscyBoNSB7XHJcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xyXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxufVxyXG5cclxuLmJhbmR3aWR0aC1ncmlkIHtcclxuICBkaXNwbGF5OiBncmlkO1xyXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDI4MHB4LCAxZnIpKTtcclxuICBnYXA6IDAuNzVyZW07XHJcbn1cclxuXHJcbi5idy1zdGF0IHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcclxuICBwYWRkaW5nOiAwLjc1cmVtO1xyXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3IpO1xyXG59XHJcblxyXG4uYnctc3RhdC5oaWdobGlnaHQge1xyXG4gIGJvcmRlci1sZWZ0LWNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjA1KTtcclxufVxyXG5cclxuLmJ3LWxhYmVsIHtcclxuICBjb2xvcjogIzY2NjtcclxuICBmb250LXNpemU6IDAuOXJlbTtcclxufVxyXG5cclxuLmJ3LXZhbHVlIHtcclxuICBmb250LXdlaWdodDogYm9sZDtcclxuICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XHJcbn1cclxuXHJcbi5idy12YWx1ZS5zdWNjZXNzLXRleHQge1xyXG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxufVxyXG5cclxuLmJhbmR3aWR0aC1jaGFydCB7XHJcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcclxuICBwYWRkaW5nOiAxLjVyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG59XHJcblxyXG4uYmFuZHdpZHRoLWNoYXJ0IGg1IHtcclxuICBtYXJnaW46IDAgMCAxcmVtIDA7XHJcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xyXG59XHJcblxyXG4uY2hhcnQtY29udGFpbmVyIHtcclxuICBwb3NpdGlvbjogcmVsYXRpdmU7XHJcbiAgaGVpZ2h0OiAxMDBweDtcclxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgcGFkZGluZzogMXJlbTtcclxufVxyXG5cclxuLnNwYXJrbGluZSB7XHJcbiAgd2lkdGg6IDEwMCU7XHJcbiAgaGVpZ2h0OiAxMDAlO1xyXG59XHJcblxyXG4uY2hhcnQtbGFiZWxzIHtcclxuICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgcmlnaHQ6IDAuNXJlbTtcclxuICB0b3A6IDAuNXJlbTtcclxuICBib3R0b206IDAuNXJlbTtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xyXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcclxuICBjb2xvcjogIzk5OTtcclxufVxyXG5cclxuLmJhbmR3aWR0aC1jaGFydC1wbGFjZWhvbGRlciB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIHBhZGRpbmc6IDJyZW07XHJcbiAgY29sb3I6ICM2NjY7XHJcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcclxuICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbn1cclxuXHJcbi8qIFBhdGggQW5hbHl0aWNzIFN0eWxlcyAqL1xyXG4ucGF0aC1hbmFseXRpY3MtZGFzaGJvYXJkIHtcclxuICBwYWRkaW5nOiAxcmVtIDA7XHJcbn1cclxuXHJcbi5wYXRoLXN1bW1hcnkge1xyXG4gIGRpc3BsYXk6IGZsZXg7XHJcbiAgZ2FwOiAycmVtO1xyXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcclxufVxyXG5cclxuLnN1bW1hcnktc3RhdCB7XHJcbiAgZGlzcGxheTogZmxleDtcclxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgcGFkZGluZzogMXJlbSAycmVtO1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XHJcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XHJcbn1cclxuXHJcbi5zdW1tYXJ5LXZhbHVlIHtcclxuICBmb250LXNpemU6IDJyZW07XHJcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XHJcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xyXG59XHJcblxyXG4uc3VtbWFyeS1sYWJlbCB7XHJcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xyXG59XHJcblxyXG4ucGF0aC10YWJsZS1jb250YWluZXIge1xyXG4gIG92ZXJmbG93LXg6IGF1dG87XHJcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcclxufVxyXG5cclxuLnBhdGgtdGFibGUge1xyXG4gIHdpZHRoOiAxMDAlO1xyXG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XHJcbiAgZm9udC1zaXplOiAwLjlyZW07XHJcbn1cclxuXHJcbi5wYXRoLXRhYmxlIHRoLFxyXG4ucGF0aC10YWJsZSB0ZCB7XHJcbiAgcGFkZGluZzogMC43NXJlbTtcclxuICB0ZXh0LWFsaWduOiBsZWZ0O1xyXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xyXG59XHJcblxyXG4ucGF0aC10YWJsZSB0aCB7XHJcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG4gIGNvbG9yOiB2YXIoLS1kYXJrLWNvbG9yKTtcclxuICBwb3NpdGlvbjogc3RpY2t5O1xyXG4gIHRvcDogMDtcclxufVxyXG5cclxuLnBhdGgtdGFibGUgdGJvZHkgdHI6aG92ZXIge1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoNDQsIDkwLCAxNjAsIDAuMDUpO1xyXG59XHJcblxyXG4ucGF0aC1uYW1lIHtcclxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xyXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxuICBtYXgtd2lkdGg6IDMwMHB4O1xyXG4gIG92ZXJmbG93OiBoaWRkZW47XHJcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XHJcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcclxufVxyXG5cclxuLnBhdGgtcmF0ZSB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG59XHJcblxyXG4ucGF0aC1ieXRlcyB7XHJcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XHJcbiAgZm9udC13ZWlnaHQ6IDUwMDtcclxufVxyXG5cclxuLnBhdGgtcGVyY2VudGFnZSB7XHJcbiAgd2lkdGg6IDE1MHB4O1xyXG59XHJcblxyXG4ucGVyY2VudGFnZS1iYXItY29udGFpbmVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjVyZW07XHJcbn1cclxuXHJcbi5wZXJjZW50YWdlLWJhciB7XHJcbiAgaGVpZ2h0OiA4cHg7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSwgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKSk7XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIHRyYW5zaXRpb246IHdpZHRoIDAuM3MgZWFzZTtcclxufVxyXG5cclxuLnBlcmNlbnRhZ2UtdGV4dCB7XHJcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIG1pbi13aWR0aDogMzVweDtcclxufVxyXG5cclxuLnBhdGgtbW9yZSB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIHBhZGRpbmc6IDFyZW07XHJcbiAgY29sb3I6ICM2NjY7XHJcbiAgZm9udC1zdHlsZTogaXRhbGljO1xyXG59XHJcblxyXG4ucGF0aC1hbmFseXRpY3MtZW1wdHkge1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICBwYWRkaW5nOiAycmVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XHJcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG59XHJcblxyXG4vKiBOZXR3b3JrIFF1YWxpdHkgRGFzaGJvYXJkIFN0eWxlcyAqL1xyXG4ubmV0d29yay1xdWFsaXR5LWRhc2hib2FyZCB7XHJcbiAgcGFkZGluZzogMXJlbSAwO1xyXG59XHJcblxyXG4ubnEtaGVybyB7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gMWZyO1xyXG4gIGdhcDogMnJlbTtcclxuICBhbGlnbi1pdGVtczogY2VudGVyO1xyXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcclxufVxyXG5cclxuLm5xLWdhdWdlLWNvbnRhaW5lciB7XHJcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xyXG4gIHdpZHRoOiAxNjBweDtcclxufVxyXG5cclxuLnF1YWxpdHktZ2F1Z2Uge1xyXG4gIHdpZHRoOiAxNjBweDtcclxuICBoZWlnaHQ6IDkwcHg7XHJcbn1cclxuXHJcbi5ucS1nYXVnZS1sYWJlbCB7XHJcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xyXG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XHJcbn1cclxuXHJcbi5ucS1rZXktbWV0cmljcyB7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IHJlcGVhdChhdXRvLWZpdCwgbWlubWF4KDE0MHB4LCAxZnIpKTtcclxuICBnYXA6IDFyZW07XHJcbn1cclxuXHJcbi5ucS1rZXktbWV0cmljcyAubWV0cmljLWl0ZW0ge1xyXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcclxufVxyXG5cclxuLm5xLWtleS1tZXRyaWNzIC5tZXRyaWMtaXRlbS53YXJuaW5nIHtcclxuICBib3JkZXItY29sb3I6IHZhcigtLXdhcm5pbmctY29sb3IpO1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTMsIDcsIDAuMSk7XHJcbn1cclxuXHJcbi5ucS1kZXRhaWxzIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xyXG4gIHBhZGRpbmc6IDEuNXJlbTtcclxuICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbn1cclxuXHJcbi5ucS1kZXRhaWxzIGg1IHtcclxuICBtYXJnaW46IDAgMCAxcmVtIDA7XHJcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xyXG59XHJcblxyXG4vKiBSZXNwb25zaXZlIGFkanVzdG1lbnRzIGZvciBiYW5kd2lkdGggYW5kIHBhdGggYW5hbHl0aWNzICovXHJcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xyXG4gIC5oZXJvLXZhbHVlIHtcclxuICAgIGZvbnQtc2l6ZTogMS41cmVtO1xyXG4gIH1cclxuXHJcbiAgLmJhbmR3aWR0aC1ncmlkIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xyXG4gIH1cclxuXHJcbiAgLnBhdGgtc3VtbWFyeSB7XHJcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xyXG4gICAgZ2FwOiAxcmVtO1xyXG4gIH1cclxuXHJcbiAgLnN1bW1hcnktc3RhdCB7XHJcbiAgICBwYWRkaW5nOiAwLjc1cmVtIDFyZW07XHJcbiAgfVxyXG5cclxuICAucGF0aC1uYW1lIHtcclxuICAgIG1heC13aWR0aDogMTUwcHg7XHJcbiAgfVxyXG5cclxuICAucGVyY2VudGFnZS1iYXItY29udGFpbmVyIHtcclxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XHJcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcclxuICAgIGdhcDogMC4yNXJlbTtcclxuICB9XHJcblxyXG4gIC5wZXJjZW50YWdlLWJhciB7XHJcbiAgICB3aWR0aDogMTAwJSAhaW1wb3J0YW50O1xyXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcclxuICB9XHJcblxyXG4gIC5ucS1oZXJvIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xyXG4gICAganVzdGlmeS1pdGVtczogY2VudGVyO1xyXG4gIH1cclxuXHJcbiAgLm5xLWtleS1tZXRyaWNzIHtcclxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcclxuICB9XHJcbn1cclxuXHJcbi8qIFByb3RvY29sIFZlcnNpb24gQmFkZ2UgKi9cclxuLnByb3RvY29sLWJhZGdlIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgcGFkZGluZzogMC4ycmVtIDAuNnJlbTtcclxuICBib3JkZXItcmFkaXVzOiAxMnB4O1xyXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcclxuICBmb250LXdlaWdodDogNzAwO1xyXG4gIGxldHRlci1zcGFjaW5nOiAwLjVweDtcclxufVxyXG5cclxuLnByb3RvY29sLXYxIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xyXG4gIGNvbG9yOiAjNjY2O1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XHJcbn1cclxuXHJcbi5wcm90b2NvbC12MiB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg0MCwgMTY3LCA2OSwgMC4xNSksIHJnYmEoNDAsIDE2NywgNjksIDAuMDUpKTtcclxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XHJcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tc3VjY2Vzcy1jb2xvcik7XHJcbn1cclxuXHJcbi5wcm90b2NvbC12MyB7XHJcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMywgMTEwLCAyNTMsIDAuMTUpLCByZ2JhKDEzLCAxMTAsIDI1MywgMC4wNSkpO1xyXG4gIGNvbG9yOiAjMGQ2ZWZkO1xyXG4gIGJvcmRlcjogMnB4IHNvbGlkICMwZDZlZmQ7XHJcbn1cclxuXHJcbi8qIFJlY2VudCBFcnJvcnMgTGlzdCAqL1xyXG4ucmVjZW50LWVycm9ycy1saXN0IHtcclxuICBtYXJnaW4tdG9wOiAwLjVyZW07XHJcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcclxufVxyXG5cclxuLnJlY2VudC1lcnJvci1pdGVtIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xyXG4gIGdhcDogMC41cmVtO1xyXG4gIHBhZGRpbmc6IDAuNHJlbSAwO1xyXG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDIyMCwgNTMsIDY5LCAwLjE1KTtcclxufVxyXG5cclxuLnJlY2VudC1lcnJvci1pdGVtOmxhc3QtY2hpbGQge1xyXG4gIGJvcmRlci1ib3R0b206IG5vbmU7XHJcbn1cclxuXHJcbi5lcnJvci1jYXRlZ29yeS1iYWRnZSB7XHJcbiAgZmxleC1zaHJpbms6IDA7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHBhZGRpbmc6IDAuMXJlbSAwLjRyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xyXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcclxuICBmb250LXdlaWdodDogNjAwO1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMTUpO1xyXG4gIGNvbG9yOiB2YXIoLS1kYW5nZXItY29sb3IpO1xyXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XHJcbn1cclxuXHJcbi5yZWNlbnQtZXJyb3ItbXNnIHtcclxuICBmbGV4OiAxO1xyXG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7XHJcbiAgd29yZC1icmVhazogYnJlYWstd29yZDtcclxuICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XHJcbn1cclxuXHJcbi5yZWNlbnQtZXJyb3ItdGltZSB7XHJcbiAgZmxleC1zaHJpbms6IDA7XHJcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xyXG4gIGNvbG9yOiAjODg4O1xyXG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcclxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG59XHJcblxyXG4vKiB2MiBEYXNoYm9hcmQgU3R5bGVzICovXHJcbi52Mi1kYXNoYm9hcmQge1xyXG4gIHBhZGRpbmc6IDAuNXJlbSAwO1xyXG59XHJcblxyXG4udjItZGFzaGJvYXJkIC5tZXRyaWNzLWdyaWQge1xyXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcclxufVxyXG5cclxuLyogQ29uZ2VzdGlvbiBDb250cm9sIFN0eWxlcyAqL1xyXG4uY29uZ2VzdGlvbi1zdGF0ZSB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHBhZGRpbmc6IDAuMTVyZW0gMC41cmVtO1xyXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcclxuICBmb250LXNpemU6IDAuODVyZW07XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xyXG4gIGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTtcclxufVxyXG5cclxuLmNvbmdlc3Rpb24tc3RhdGUuc3VjY2VzcyB7XHJcbiAgYmFja2dyb3VuZDogcmdiYSg0MCwgMTY3LCA2OSwgMC4xNSk7XHJcbiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xyXG59XHJcblxyXG4uY29uZ2VzdGlvbi1zdGF0ZS53YXJuaW5nIHtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTkzLCA3LCAwLjE1KTtcclxuICBjb2xvcjogIzg1NjQwNDtcclxufVxyXG5cclxuLyogQm9uZGluZyBTdHlsZXMgKi9cclxuLmJvbmRpbmctbGlua3Mge1xyXG4gIGRpc3BsYXk6IGdyaWQ7XHJcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNTBweCwgMWZyKSk7XHJcbiAgZ2FwOiAxcmVtO1xyXG4gIG1hcmdpbi10b3A6IDFyZW07XHJcbn1cclxuXHJcbi5ib25kaW5nLWxpbmsge1xyXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XHJcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcclxuICBib3JkZXItcmFkaXVzOiA4cHg7XHJcbiAgcGFkZGluZzogMXJlbTtcclxuICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4ycyBlYXNlO1xyXG59XHJcblxyXG4uYm9uZGluZy1saW5rLmFjdGl2ZSB7XHJcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjA1KTtcclxufVxyXG5cclxuLmxpbmstaGVhZGVyIHtcclxuICBkaXNwbGF5OiBmbGV4O1xyXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgZ2FwOiAwLjVyZW07XHJcbiAgbWFyZ2luLWJvdHRvbTogMC43NXJlbTtcclxufVxyXG5cclxuLmxpbmstbmFtZSB7XHJcbiAgZm9udC13ZWlnaHQ6IDYwMDtcclxuICBmb250LXNpemU6IDFyZW07XHJcbiAgY29sb3I6IHZhcigtLXRleHQtY29sb3IpO1xyXG59XHJcblxyXG4ubGluay1iYWRnZSB7XHJcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xyXG4gIHBhZGRpbmc6IDAuMXJlbSAwLjRyZW07XHJcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xyXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcclxuICBmb250LXdlaWdodDogNzAwO1xyXG4gIGxldHRlci1zcGFjaW5nOiAwLjVweDtcclxufVxyXG5cclxuLmxpbmstYmFkZ2UuYWN0aXZlLWJhZGdlIHtcclxuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxuICBjb2xvcjogd2hpdGU7XHJcbn1cclxuXHJcbi5saW5rLWJhZGdlLnN1Y2Nlc3Mge1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoNDAsIDE2NywgNjksIDAuMTUpO1xyXG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcclxufVxyXG5cclxuLmxpbmstYmFkZ2UuZXJyb3Ige1xyXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMTUpO1xyXG4gIGNvbG9yOiB2YXIoLS1kYW5nZXItY29sb3IpO1xyXG59XHJcblxyXG4ubGluay1zdGF0cyB7XHJcbiAgZGlzcGxheTogZ3JpZDtcclxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XHJcbiAgZ2FwOiAwLjVyZW07XHJcbn1cclxuXHJcbi5saW5rLXN0YXRzIC5zdGF0LWl0ZW0ge1xyXG4gIHBhZGRpbmc6IDAuNXJlbTtcclxuICBmb250LXNpemU6IDAuODVyZW07XHJcbn1cclxuXHJcbi8qIE1vbml0b3JpbmcgJiBBbGVydHMgU3R5bGVzICovXHJcbi5tb25pdG9yaW5nLXN1YnNlY3Rpb24ge1xyXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcclxuICBwYWRkaW5nLWJvdHRvbTogMS41cmVtO1xyXG4gIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xyXG59XHJcblxyXG4ubW9uaXRvcmluZy1zdWJzZWN0aW9uOmxhc3QtY2hpbGQge1xyXG4gIGJvcmRlci1ib3R0b206IG5vbmU7XHJcbiAgbWFyZ2luLWJvdHRvbTogMDtcclxuICBwYWRkaW5nLWJvdHRvbTogMDtcclxufVxyXG5cclxuLm1vbml0b3Jpbmctc3Vic2VjdGlvbiBoNSB7XHJcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xyXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcclxufVxyXG5cclxuLmFsZXJ0LWxldmVsIHtcclxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgcGFkZGluZzogMC4xcmVtIDAuNHJlbTtcclxuICBib3JkZXItcmFkaXVzOiA0cHg7XHJcbiAgZm9udC1zaXplOiAwLjhyZW07XHJcbiAgZm9udC13ZWlnaHQ6IDcwMDtcclxufVxyXG5cclxuLmFsZXJ0LW9rIHtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjE1KTtcclxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XHJcbn1cclxuXHJcbi5hbGVydC13YXJuaW5nIHtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTkzLCA3LCAwLjE1KTtcclxuICBjb2xvcjogIzg1NjQwNDtcclxufVxyXG5cclxuLmFsZXJ0LWNyaXRpY2FsIHtcclxuICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgNTMsIDY5LCAwLjE1KTtcclxuICBjb2xvcjogdmFyKC0tZGFuZ2VyLWNvbG9yKTtcclxufVxyXG5cclxuLyogUmVzcG9uc2l2ZSBhZGp1c3RtZW50cyBmb3IgdjIgc2VjdGlvbnMgKi9cclxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XHJcbiAgLmJvbmRpbmctbGlua3Mge1xyXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XHJcbiAgfVxyXG5cclxuICAubGluay1zdGF0cyB7XHJcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcclxuICB9XHJcbn1cclxuYCwgXCJcIix7XCJ2ZXJzaW9uXCI6MyxcInNvdXJjZXNcIjpbXCJ3ZWJwYWNrOi8vLi9zcmMvd2ViYXBwL3N0eWxlcy5jc3NcIl0sXCJuYW1lc1wiOltdLFwibWFwcGluZ3NcIjpcIkFBQUEsaUNBQWlDO0FBQ2pDO0VBQ0Usd0JBQXdCO0VBQ3hCLDBCQUEwQjtFQUMxQix3QkFBd0I7RUFDeEIsd0JBQXdCO0VBQ3hCLHVCQUF1QjtFQUN2QixxQkFBcUI7RUFDckIsc0JBQXNCO0VBQ3RCLHVCQUF1QjtFQUN2QixxQkFBcUI7RUFDckIsMkJB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Z25hbEstdGhlbWVkIHN0eWxlcyAqL1xcclxcbjpyb290IHtcXHJcXG4gIC0tcHJpbWFyeS1jb2xvcjogIzJjNWFhMDtcXHJcXG4gIC0tc2Vjb25kYXJ5LWNvbG9yOiAjNGE5MGUyO1xcclxcbiAgLS1zdWNjZXNzLWNvbG9yOiAjMjhhNzQ1O1xcclxcbiAgLS13YXJuaW5nLWNvbG9yOiAjZmZjMTA3O1xcclxcbiAgLS1kYW5nZXItY29sb3I6ICNkYzM1NDU7XFxyXFxuICAtLWRhcmstY29sb3I6ICMzNDNhNDA7XFxyXFxuICAtLWxpZ2h0LWNvbG9yOiAjZjhmOWZhO1xcclxcbiAgLS1ib3JkZXItY29sb3I6ICNkZWUyZTY7XFxyXFxuICAtLXRleHQtY29sb3I6ICMyMTI1Mjk7XFxyXFxuICAtLWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7XFxyXFxuICAtLWNhcmQtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjEpO1xcclxcbiAgLS1tZXRyaWMtYmc6ICNmMGY0Zjg7XFxyXFxufVxcclxcblxcclxcblxcclxcbioge1xcclxcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXHJcXG59XFxyXFxuXFxyXFxuYm9keSB7XFxyXFxuICBmb250LWZhbWlseTogJ1NlZ29lIFVJJywgVGFob21hLCBHZW5ldmEsIFZlcmRhbmEsIHNhbnMtc2VyaWY7XFxyXFxuICBsaW5lLWhlaWdodDogMS42O1xcclxcbiAgY29sb3I6IHZhcigtLXRleHQtY29sb3IpO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtY29sb3IpO1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgcGFkZGluZzogMDtcXHJcXG59XFxyXFxuXFxyXFxuLmhlYWRlciB7XFxyXFxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSwgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKSk7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBwYWRkaW5nOiAycmVtIDFyZW07XFxyXFxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjEpO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVhZGVyIGgxIHtcXHJcXG4gIG1hcmdpbjogMCAwIDAuNXJlbSAwO1xcclxcbiAgZm9udC1zaXplOiAyLjVyZW07XFxyXFxuICBmb250LXdlaWdodDogMzAwO1xcclxcbn1cXHJcXG5cXHJcXG4uc3VidGl0bGUge1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgb3BhY2l0eTogMC45O1xcclxcbiAgZm9udC1zaXplOiAxLjFyZW07XFxyXFxufVxcclxcblxcclxcbi8qIENvbm5lY3Rpb24gVGFicyAqL1xcclxcbi5jb25uZWN0aW9uLXRhYnMge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tZGFyay1jb2xvcik7XFxyXFxuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjE1KTtcXHJcXG4gIHBvc2l0aW9uOiBzdGlja3k7XFxyXFxuICB0b3A6IDA7XFxyXFxuICB6LWluZGV4OiAxMDA7XFxyXFxufVxcclxcblxcclxcbi50YWJzLWNvbnRhaW5lciB7XFxyXFxuICBtYXgtd2lkdGg6IDEyMDBweDtcXHJcXG4gIG1hcmdpbjogMCBhdXRvO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIG92ZXJmbG93LXg6IGF1dG87XFxyXFxuICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7XFxyXFxuICBzY3JvbGxiYXItd2lkdGg6IHRoaW47XFxyXFxufVxcclxcblxcclxcbi5jb25uZWN0aW9uLXRhYiB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGdhcDogMC41cmVtO1xcclxcbiAgcGFkZGluZzogMC44NXJlbSAxLjI1cmVtO1xcclxcbiAgYm9yZGVyOiBub25lO1xcclxcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XFxyXFxuICBjb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpO1xcclxcbiAgZm9udC1zaXplOiAwLjk1cmVtO1xcclxcbiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XFxyXFxuICBjdXJzb3I6IHBvaW50ZXI7XFxyXFxuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xcclxcbiAgdHJhbnNpdGlvbjogYmFja2dyb3VuZCAwLjJzLCBjb2xvciAwLjJzO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogM3B4IHNvbGlkIHRyYW5zcGFyZW50O1xcclxcbn1cXHJcXG5cXHJcXG4uY29ubmVjdGlvbi10YWI6aG92ZXIge1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjA4KTtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbm5lY3Rpb24tdGFiLmFjdGl2ZSB7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMSk7XFxyXFxuICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4udGFiLXN0YXR1cy1kb3Qge1xcclxcbiAgd2lkdGg6IDhweDtcXHJcXG4gIGhlaWdodDogOHB4O1xcclxcbiAgYm9yZGVyLXJhZGl1czogNTAlO1xcclxcbiAgZmxleC1zaHJpbms6IDA7XFxyXFxufVxcclxcblxcclxcbi50YWItc3RhdHVzLWRvdC5vayB7XFxyXFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG4gIGJveC1zaGFkb3c6IDAgMCA0cHggcmdiYSg0MCwgMTY3LCA2OSwgMC41KTtcXHJcXG59XFxyXFxuXFxyXFxuLnRhYi1zdGF0dXMtZG90Lndhcm5pbmcge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0td2FybmluZy1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi50YWItc3RhdHVzLWRvdC5lcnJvciB7XFxyXFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1kYW5nZXItY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4udGFiLWljb24ge1xcclxcbiAgZm9udC1zaXplOiAxLjFyZW07XFxyXFxufVxcclxcblxcclxcbi50YWItbmFtZSB7XFxyXFxuICBmb250LXdlaWdodDogNTAwO1xcclxcbn1cXHJcXG5cXHJcXG4udGFiLXR5cGUge1xcclxcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcclxcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXHJcXG4gIGxldHRlci1zcGFjaW5nOiAwLjVweDtcXHJcXG4gIG9wYWNpdHk6IDAuNjtcXHJcXG4gIHBhZGRpbmc6IDAuMXJlbSAwLjRyZW07XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMik7XFxyXFxuICBib3JkZXItcmFkaXVzOiAzcHg7XFxyXFxufVxcclxcblxcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcclxcbiAgLmNvbm5lY3Rpb24tdGFiIHtcXHJcXG4gICAgcGFkZGluZzogMC43cmVtIDFyZW07XFxyXFxuICAgIGZvbnQtc2l6ZTogMC44NXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC50YWItdHlwZSB7XFxyXFxuICAgIGRpc3BsYXk6IG5vbmU7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbi5jb250YWluZXIge1xcclxcbiAgbWF4LXdpZHRoOiAxMjAwcHg7XFxyXFxuICBtYXJnaW46IDAgYXV0bztcXHJcXG4gIHBhZGRpbmc6IDJyZW0gMXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmNvbmZpZy1zZWN0aW9uIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDJyZW07XFxyXFxufVxcclxcblxcclxcbi5wYWdlLWdyb3VwIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDIuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnBhZ2UtZ3JvdXAtaGVhZGVyIHtcXHJcXG4gIG1hcmdpbjogMCAwIDFyZW07XFxyXFxuICBwYWRkaW5nOiAwIDAuMjVyZW07XFxyXFxufVxcclxcblxcclxcbi5wYWdlLWdyb3VwLWhlYWRlciBoMiB7XFxyXFxuICBtYXJnaW46IDA7XFxyXFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxuICBmb250LXNpemU6IDEuNHJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnBhZ2UtZ3JvdXAtaGVhZGVyIHAge1xcclxcbiAgbWFyZ2luOiAwLjM1cmVtIDAgMDtcXHJcXG4gIGNvbG9yOiAjNTE2MTczO1xcclxcbn1cXHJcXG5cXHJcXG4ucGFnZS1ncm91cC1jb250ZW50IC5jb25maWctc2VjdGlvbjpsYXN0LWNoaWxkIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDA7XFxyXFxufVxcclxcblxcclxcblxcclxcbi5tb2RlLWJhbm5lci1jYXJkIHtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXByaW1hcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kZS1iYW5uZXItY2FyZCAuY2FyZC1jb250ZW50IHtcXHJcXG4gIHBhZGRpbmc6IDEuMjVyZW0gMS41cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kZS1iYW5uZXItZ3JpZCB7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNjBweCwgMWZyKSk7XFxyXFxuICBnYXA6IDAuNzVyZW07XFxyXFxufVxcclxcblxcclxcbi5tb2RlLWJhbm5lci1pdGVtIHtcXHJcXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XFxyXFxuICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLXNlY29uZGFyeS1jb2xvcik7XFxyXFxuICBib3JkZXItcmFkaXVzOiA2cHg7XFxyXFxuICBwYWRkaW5nOiAwLjc1cmVtIDAuOXJlbTtcXHJcXG4gIGNvbG9yOiAjMzM0MTU1O1xcclxcbiAgZm9udC1zaXplOiAwLjkycmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9kZS1zZXJ2ZXIge1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y3ZmJmZiwgI2VkZjRmZik7XFxyXFxufVxcclxcblxcclxcbi5tb2RlLWNsaWVudCB7XFxyXFxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCAjZjhmYmZmLCAjZWVmN2YyKTtcXHJcXG59XFxyXFxuXFxyXFxuLmNhcmQge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tYmFja2dyb3VuZC1jb2xvcik7XFxyXFxuICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICBib3gtc2hhZG93OiB2YXIoLS1jYXJkLXNoYWRvdyk7XFxyXFxuICBvdmVyZmxvdzogaGlkZGVuO1xcclxcbn1cXHJcXG5cXHJcXG4uY2FyZC1oZWFkZXIge1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSwgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKSk7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICBwYWRkaW5nOiAxLjVyZW07XFxyXFxufVxcclxcblxcclxcbi5jYXJkLWhlYWRlciBoMiB7XFxyXFxuICBtYXJnaW46IDAgMCAwLjVyZW0gMDtcXHJcXG4gIGZvbnQtc2l6ZTogMS41cmVtO1xcclxcbiAgZm9udC13ZWlnaHQ6IDQwMDtcXHJcXG59XFxyXFxuXFxyXFxuLmNhcmQtaGVhZGVyIHAge1xcclxcbiAgbWFyZ2luOiAwO1xcclxcbiAgb3BhY2l0eTogMC45O1xcclxcbn1cXHJcXG5cXHJcXG4uY2FyZC1jb250ZW50IHtcXHJcXG4gIHBhZGRpbmc6IDJyZW07XFxyXFxufVxcclxcblxcclxcbi5mb3JtLWdyb3VwIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmZvcm0tZ3JvdXAgbGFiZWwge1xcclxcbiAgZGlzcGxheTogYmxvY2s7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XFxyXFxuICBmb250LXdlaWdodDogNjAwO1xcclxcbiAgY29sb3I6IHZhcigtLWRhcmstY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4uZm9ybS1ncm91cCBpbnB1dCxcXHJcXG4uZm9ybS1ncm91cCB0ZXh0YXJlYSB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIHBhZGRpbmc6IDAuNzVyZW07XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgZm9udC1zaXplOiAxcmVtO1xcclxcbiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuM3MgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLmZvcm0tZ3JvdXAgaW5wdXQ6Zm9jdXMsXFxyXFxuLmZvcm0tZ3JvdXAgdGV4dGFyZWE6Zm9jdXMge1xcclxcbiAgb3V0bGluZTogbm9uZTtcXHJcXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKTtcXHJcXG4gIGJveC1zaGFkb3c6IDAgMCAwIDNweCByZ2JhKDc0LCAxNDQsIDIyNiwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlbHAtdGV4dCB7XFxyXFxuICBkaXNwbGF5OiBibG9jaztcXHJcXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxLjQ7XFxyXFxufVxcclxcblxcclxcbi5idG4ge1xcclxcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xcclxcbiAgcGFkZGluZzogMC43NXJlbSAxLjVyZW07XFxyXFxuICBib3JkZXI6IG5vbmU7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBmb250LXNpemU6IDFyZW07XFxyXFxuICBmb250LXdlaWdodDogNTAwO1xcclxcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xcclxcbiAgY3Vyc29yOiBwb2ludGVyO1xcclxcbiAgdHJhbnNpdGlvbjogYWxsIDAuM3MgZWFzZTtcXHJcXG4gIG1hcmdpbi1yaWdodDogMC41cmVtO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYnRuLXByaW1hcnkge1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDQ1ZGVnLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSwgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKSk7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5idG4tcHJpbWFyeTpob3ZlciB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XFxyXFxuICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSg0NCwgOTAsIDE2MCwgMC4zKTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1zZWNvbmRhcnkge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzZjNzU3ZDtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ0bi1zZWNvbmRhcnk6aG92ZXIge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogIzU0NWI2MjtcXHJcXG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMnB4KTtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDEwOCwgMTE3LCAxMjUsIDAuMyk7XFxyXFxufVxcclxcblxcclxcbi5idG4tZGFuZ2VyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5idG4tZGFuZ2VyOmhvdmVyIHtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6ICNjODIzMzM7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XFxyXFxuICBib3gtc2hhZG93OiAwIDRweCA4cHggcmdiYSgyMjAsIDUzLCA2OSwgMC4zKTtcXHJcXG59XFxyXFxuXFxyXFxuLnN1YnNjcmlwdGlvbi1wYXRocyB7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAycmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uc3Vic2NyaXB0aW9uLXBhdGhzIGgzIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFyZW07XFxyXFxuICBjb2xvcjogdmFyKC0tZGFyay1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5wYXRocy1saXN0IHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFyZW07XFxyXFxufVxcclxcblxcclxcbi5wYXRoLWl0ZW0ge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwLjVyZW07XFxyXFxuICBwYWRkaW5nOiAwLjc1cmVtO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtY29sb3IpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLnBhdGgtaXRlbSBpbnB1dCB7XFxyXFxuICBmbGV4OiAxO1xcclxcbiAgbWFyZ2luOiAwIDAuNXJlbSAwIDA7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4uanNvbi1lZGl0b3Ige1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMnJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmpzb24tZWRpdG9yIGgzIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDFyZW07XFxyXFxuICBjb2xvcjogdmFyKC0tZGFyay1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5qc29uLWVkaXRvciB0ZXh0YXJlYSB7XFxyXFxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogI2Y4ZjlmYTtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5wbHVnaW4tY29uZmlnLXN1bW1hcnkge1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNnB4O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ucGx1Z2luLXN1bW1hcnktZ3JpZCB7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxODBweCwgMWZyKSk7XFxyXFxuICBnYXA6IDAuNzVyZW07XFxyXFxufVxcclxcblxcclxcbi5wbHVnaW4tY29uZmlnLWVkaXRvciB0ZXh0YXJlYSB7XFxyXFxuICBtaW4taGVpZ2h0OiAzMjBweDtcXHJcXG59XFxyXFxuXFxyXFxuLnBsdWdpbi1jb25maWctYWN0aW9ucyB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC13cmFwOiB3cmFwO1xcclxcbiAgZ2FwOiAwLjVyZW07XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtaW5mbyB7XFxyXFxuICBwYWRkaW5nOiAxcmVtO1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtY29sb3IpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ubm90aWZpY2F0aW9uIHtcXHJcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXHJcXG4gIHRvcDogMjBweDtcXHJcXG4gIHJpZ2h0OiAyMHB4O1xcclxcbiAgcGFkZGluZzogMXJlbSAxLjVyZW07XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxuICBmb250LXdlaWdodDogNTAwO1xcclxcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDQwMHB4KTtcXHJcXG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjNzIGVhc2U7XFxyXFxuICB6LWluZGV4OiAxMDAwO1xcclxcbiAgbWluLXdpZHRoOiAzMDBweDtcXHJcXG4gIGJveC1zaGFkb3c6IDAgNHB4IDhweCByZ2JhKDAsMCwwLDAuMik7XFxyXFxufVxcclxcblxcclxcbi5ub3RpZmljYXRpb24uc2hvdyB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMCk7XFxyXFxufVxcclxcblxcclxcbi5ub3RpZmljYXRpb24uc3VjY2VzcyB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLm5vdGlmaWNhdGlvbi5lcnJvciB7XFxyXFxuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kYW5nZXItY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ubm90aWZpY2F0aW9uLndhcm5pbmcge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2FybmluZy1jb2xvcik7XFxyXFxuICBjb2xvcjogdmFyKC0tZGFyay1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi8qIFJlc3BvbnNpdmUgZGVzaWduICovXFxyXFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxyXFxuICAuaGVhZGVyIGgxIHtcXHJcXG4gICAgZm9udC1zaXplOiAycmVtO1xcclxcbiAgfVxcclxcbiAgXFxyXFxuICAuY29udGFpbmVyIHtcXHJcXG4gICAgcGFkZGluZzogMXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wYWdlLWdyb3VwIHtcXHJcXG4gICAgbWFyZ2luLWJvdHRvbTogMnJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wYWdlLWdyb3VwLWhlYWRlciBoMiB7XFxyXFxuICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5tb2RlLWJhbm5lci1ncmlkIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XFxyXFxuICB9XFxyXFxuICBcXHJcXG4gIC5jYXJkLWNvbnRlbnQge1xcclxcbiAgICBwYWRkaW5nOiAxcmVtO1xcclxcbiAgfVxcclxcbiAgXFxyXFxuICAuYnRuIHtcXHJcXG4gICAgd2lkdGg6IDEwMCU7XFxyXFxuICAgIG1hcmdpbi1yaWdodDogMDtcXHJcXG4gIH1cXHJcXG4gIFxcclxcbiAgLnBhdGgtaXRlbSB7XFxyXFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xcclxcbiAgfVxcclxcbiAgXFxyXFxuICAucGF0aC1pdGVtIGlucHV0IHtcXHJcXG4gICAgbWFyZ2luOiAwIDAgMC41cmVtIDA7XFxyXFxuICB9XFxyXFxufVxcclxcblxcclxcbi8qIFN0YXR1cyBpbmRpY2F0b3JzICovXFxyXFxuLnN0YXR1cy1pdGVtIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgcGFkZGluZzogMC41cmVtIDA7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXR1cy1pdGVtOmxhc3QtY2hpbGQge1xcclxcbiAgYm9yZGVyLWJvdHRvbTogbm9uZTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXR1cy1pbmRpY2F0b3Ige1xcclxcbiAgZm9udC1zaXplOiAwLjg3NXJlbTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxuICBwYWRkaW5nOiAwLjI1cmVtIDAuNXJlbTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDEycHg7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtaW5kaWNhdG9yLnN1Y2Nlc3Mge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtaW5kaWNhdG9yLndhcm5pbmcge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0td2FybmluZy1jb2xvcik7XFxyXFxuICBjb2xvcjogdmFyKC0tZGFyay1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5zdGF0dXMtaW5kaWNhdG9yLmluZm8ge1xcclxcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKTtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXR1cy1kZXRhaWxzIHtcXHJcXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDAuNXJlbTtcXHJcXG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LWNvbG9yKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XFxyXFxuICBsaW5lLWhlaWdodDogMS40O1xcclxcbn1cXHJcXG5cXHJcXG4vKiBBbmltYXRpb24gZm9yIHNtb290aCB0cmFuc2l0aW9ucyAqL1xcclxcbi5mYWRlLWluIHtcXHJcXG4gIGFuaW1hdGlvbjogZmFkZUluIDAuNXMgZWFzZS1pbjtcXHJcXG59XFxyXFxuXFxyXFxuQGtleWZyYW1lcyBmYWRlSW4ge1xcclxcbiAgZnJvbSB7IG9wYWNpdHk6IDA7IHRyYW5zZm9ybTogdHJhbnNsYXRlWSgyMHB4KTsgfVxcclxcbiAgdG8geyBvcGFjaXR5OiAxOyB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7IH1cXHJcXG59XFxyXFxuXFxyXFxuLyogU2VydmVyIE1vZGUgU3R5bGVzICovXFxyXFxuLnNlcnZlci1tb2RlLWNhcmQge1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgI2Y4ZjlmYSwgI2U5ZWNlZik7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlcnZlci1tb2RlLWNhcmQgLmNhcmQtaGVhZGVyIHtcXHJcXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLXByaW1hcnktY29sb3IpLCB2YXIoLS1zZWNvbmRhcnktY29sb3IpKTtcXHJcXG4gIGNvbG9yOiB3aGl0ZTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlcnZlci1tb2RlLWNhcmQgLmNhcmQtaGVhZGVyIGgyIHtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgZ2FwOiAxMHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uc2VydmVyLW1vZGUtaW5mbyBoMyB7XFxyXFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxuICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogOHB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmluZm8tZ3JpZCB7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyODBweCwgMWZyKSk7XFxyXFxuICBnYXA6IDEuNXJlbTtcXHJcXG4gIG1hcmdpbjogMnJlbSAwO1xcclxcbn1cXHJcXG5cXHJcXG4uaW5mby1ncmlkLmNvbXBhY3Qge1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyMDBweCwgMWZyKSk7XFxyXFxuICBnYXA6IDFyZW07XFxyXFxuICBtYXJnaW46IDAuNXJlbSAwO1xcclxcbn1cXHJcXG5cXHJcXG4uaW5mby1ncmlkLmNvbXBhY3QgLmluZm8taXRlbSB7XFxyXFxuICBwYWRkaW5nOiAxcmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uaW5mby1ncmlkLmNvbXBhY3QgLmluZm8taXRlbSBoNCB7XFxyXFxuICBmb250LXNpemU6IDAuOXJlbTtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDAuMjVyZW07XFxyXFxufVxcclxcblxcclxcbi5pbmZvLWdyaWQuY29tcGFjdCAuaW5mby1pdGVtIHAge1xcclxcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uaW5mby1pdGVtIHtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbiAgcGFkZGluZzogMS41cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgYm94LXNoYWRvdzogdmFyKC0tY2FyZC1zaGFkb3cpO1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4uaW5mby1pdGVtIGg0IHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcXHJcXG4gIG1hcmdpbjogMCAwIDAuNXJlbSAwO1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBnYXA6IDhweDtcXHJcXG59XFxyXFxuXFxyXFxuLmluZm8taXRlbSBwIHtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIGxpbmUtaGVpZ2h0OiAxLjU7XFxyXFxufVxcclxcblxcclxcbi5zZXJ2ZXItc3RhdHVzIHtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbiAgcGFkZGluZzogMS41cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgYm94LXNoYWRvdzogdmFyKC0tY2FyZC1zaGFkb3cpO1xcclxcbiAgbWFyZ2luOiAycmVtIDA7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLnNlcnZlci1zdGF0dXMgaDQge1xcclxcbiAgY29sb3I6IHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xcclxcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlndXJhdGlvbi1ub3RlIHtcXHJcXG4gIGJhY2tncm91bmQ6ICNmZmYzY2Q7XFxyXFxuICBib3JkZXI6IDFweCBzb2xpZCAjZmZlYWE3O1xcclxcbiAgcGFkZGluZzogMS41cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgbWFyZ2luOiAycmVtIDA7XFxyXFxufVxcclxcblxcclxcbi5jb25maWd1cmF0aW9uLW5vdGUgaDQge1xcclxcbiAgY29sb3I6ICM4NTY0MDQ7XFxyXFxuICBtYXJnaW46IDAgMCAxcmVtIDA7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIGdhcDogOHB4O1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlndXJhdGlvbi1ub3RlIHAge1xcclxcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlndXJhdGlvbi1ub3RlIG9sIHtcXHJcXG4gIG1hcmdpbjogMDtcXHJcXG4gIHBhZGRpbmctbGVmdDogMS41cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uY29uZmlndXJhdGlvbi1ub3RlIGxpIHtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLyogTWV0cmljcyBEaXNwbGF5IFN0eWxlcyAqL1xcclxcbi5tZXRyaWNzLWdyaWQge1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMjAwcHgsIDFmcikpO1xcclxcbiAgZ2FwOiAxcmVtO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMS41cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubWV0cmljLWl0ZW0ge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ubWV0cmljLWl0ZW0uc3VjY2VzcyB7XFxyXFxuICBib3JkZXItY29sb3I6IHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSg0MCwgMTY3LCA2OSwgMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLm1ldHJpYy1pdGVtLmVycm9yIHtcXHJcXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tZGFuZ2VyLWNvbG9yKTtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5tZXRyaWMtbGFiZWwge1xcclxcbiAgZm9udC1zaXplOiAwLjlyZW07XFxyXFxuICBjb2xvcjogIzY2NjtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLm1ldHJpYy12YWx1ZSB7XFxyXFxuICBmb250LXNpemU6IDEuNXJlbTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xcclxcbiAgY29sb3I6IHZhcigtLXRleHQtY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ubWV0cmljcy1zdGF0cyB7XFxyXFxuICBtYXJnaW4tdG9wOiAxLjVyZW07XFxyXFxuICBwYWRkaW5nLXRvcDogMS41cmVtO1xcclxcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5tZXRyaWNzLXN0YXRzIGg1IHtcXHJcXG4gIG1hcmdpbi10b3A6IDA7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcclxcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdHMtZ3JpZCB7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maWxsLCBtaW5tYXgoMjUwcHgsIDFmcikpO1xcclxcbiAgZ2FwOiAwLjc1cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uc3RhdC1pdGVtIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XFxyXFxuICBwYWRkaW5nOiAwLjc1cmVtO1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5zdGF0LWl0ZW0uZXJyb3Ige1xcclxcbiAgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgNTMsIDY5LCAwLjA1KTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQtbGFiZWwge1xcclxcbiAgY29sb3I6ICM2NjY7XFxyXFxuICBmb250LXNpemU6IDAuOXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnN0YXQtdmFsdWUge1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5zdGF0LWl0ZW0uZXJyb3IgLnN0YXQtdmFsdWUge1xcclxcbiAgY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5tZXRyaWNzLWVycm9yIHtcXHJcXG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDIyMCwgNTMsIDY5LCAwLjEpO1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1kYW5nZXItY29sb3IpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbn1cXHJcXG5cXHJcXG4ubWV0cmljcy1lcnJvciBoNSB7XFxyXFxuICBtYXJnaW4tdG9wOiAwO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMC41cmVtO1xcclxcbiAgY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5lcnJvci1tZXNzYWdlIHtcXHJcXG4gIGZvbnQtZmFtaWx5OiAnQ291cmllciBOZXcnLCBtb25vc3BhY2U7XFxyXFxuICBmb250LXNpemU6IDAuOXJlbTtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcXHJcXG4gIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XFxyXFxufVxcclxcblxcclxcbi5lcnJvci10aW1lIHtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbn1cXHJcXG5cXHJcXG4ubWV0cmljcy1zdWNjZXNzIHtcXHJcXG4gIG1hcmdpbi10b3A6IDEuNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDFyZW07XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjEpO1xcclxcbiAgYm9yZGVyLWxlZnQ6IDRweCBzb2xpZCB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG59XFxyXFxuXFxyXFxuLnN1Y2Nlc3MtbWVzc2FnZSB7XFxyXFxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gIGZvbnQtc2l6ZTogMS4xcmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubWV0cmljcy1zZWN0aW9uIHtcXHJcXG4gIG1hcmdpbi10b3A6IDJyZW07XFxyXFxuICBwYWRkaW5nLXRvcDogMS41cmVtO1xcclxcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi8qIEJhbmR3aWR0aCBEYXNoYm9hcmQgU3R5bGVzICovXFxyXFxuLmJhbmR3aWR0aC1kYXNoYm9hcmQge1xcclxcbiAgcGFkZGluZzogMXJlbSAwO1xcclxcbn1cXHJcXG5cXHJcXG4uYmFuZHdpZHRoLWhlcm8ge1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZml0LCBtaW5tYXgoMTgwcHgsIDFmcikpO1xcclxcbiAgZ2FwOiAxLjVyZW07XFxyXFxuICBtYXJnaW4tYm90dG9tOiAycmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVyby1zdGF0IHtcXHJcXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHZhcigtLW1ldHJpYy1iZyksICNmZmYpO1xcclxcbiAgcGFkZGluZzogMS41cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcXHJcXG4gIHRleHQtYWxpZ246IGNlbnRlcjtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XFxyXFxuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4ycyBlYXNlLCBib3gtc2hhZG93IDAuMnMgZWFzZTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlcm8tc3RhdDpob3ZlciB7XFxyXFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTJweCk7XFxyXFxuICBib3gtc2hhZG93OiAwIDRweCAxMnB4IHJnYmEoMCwwLDAsMC4xKTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlcm8tc3RhdC5wcmltYXJ5IHtcXHJcXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxuICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQoMTM1ZGVnLCByZ2JhKDQ0LCA5MCwgMTYwLCAwLjEpLCAjZmZmKTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlcm8tc3RhdC5zZWNvbmRhcnkge1xcclxcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zZWNvbmRhcnktY29sb3IpO1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg3NCwgMTQ0LCAyMjYsIDAuMSksICNmZmYpO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVyby1zdGF0LnN1Y2Nlc3Mge1xcclxcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG4gIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCgxMzVkZWcsIHJnYmEoNDAsIDE2NywgNjksIDAuMSksICNmZmYpO1xcclxcbn1cXHJcXG5cXHJcXG4uaGVyby12YWx1ZSB7XFxyXFxuICBmb250LXNpemU6IDJyZW07XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDAuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlcm8tc3RhdC5zdWNjZXNzIC5oZXJvLXZhbHVlIHtcXHJcXG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLmhlcm8tbGFiZWwge1xcclxcbiAgZm9udC1zaXplOiAwLjlyZW07XFxyXFxuICBjb2xvcjogIzY2NjtcXHJcXG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XFxyXFxuICBsZXR0ZXItc3BhY2luZzogMC41cHg7XFxyXFxufVxcclxcblxcclxcbi5iYW5kd2lkdGgtZGV0YWlscyB7XFxyXFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xcclxcbiAgcGFkZGluZzogMS41cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMS41cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYmFuZHdpZHRoLWRldGFpbHMgaDUge1xcclxcbiAgbWFyZ2luOiAwIDAgMXJlbSAwO1xcclxcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4uYmFuZHdpZHRoLWdyaWQge1xcclxcbiAgZGlzcGxheTogZ3JpZDtcXHJcXG4gIGdyaWQtdGVtcGxhdGUtY29sdW1uczogcmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDI4MHB4LCAxZnIpKTtcXHJcXG4gIGdhcDogMC43NXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ3LXN0YXQge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcXHJcXG4gIHBhZGRpbmc6IDAuNzVyZW07XFxyXFxuICBiYWNrZ3JvdW5kOiB3aGl0ZTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIGJvcmRlci1sZWZ0OiAzcHggc29saWQgdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5idy1zdGF0LmhpZ2hsaWdodCB7XFxyXFxuICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjA1KTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ3LWxhYmVsIHtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgZm9udC1zaXplOiAwLjlyZW07XFxyXFxufVxcclxcblxcclxcbi5idy12YWx1ZSB7XFxyXFxuICBmb250LXdlaWdodDogYm9sZDtcXHJcXG4gIGNvbG9yOiB2YXIoLS10ZXh0LWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLmJ3LXZhbHVlLnN1Y2Nlc3MtdGV4dCB7XFxyXFxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5iYW5kd2lkdGgtY2hhcnQge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcXHJcXG4gIHBhZGRpbmc6IDEuNXJlbTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG59XFxyXFxuXFxyXFxuLmJhbmR3aWR0aC1jaGFydCBoNSB7XFxyXFxuICBtYXJnaW46IDAgMCAxcmVtIDA7XFxyXFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5jaGFydC1jb250YWluZXIge1xcclxcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xcclxcbiAgaGVpZ2h0OiAxMDBweDtcXHJcXG4gIGJhY2tncm91bmQ6IHdoaXRlO1xcclxcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xcclxcbiAgcGFkZGluZzogMXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnNwYXJrbGluZSB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGhlaWdodDogMTAwJTtcXHJcXG59XFxyXFxuXFxyXFxuLmNoYXJ0LWxhYmVscyB7XFxyXFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxyXFxuICByaWdodDogMC41cmVtO1xcclxcbiAgdG9wOiAwLjVyZW07XFxyXFxuICBib3R0b206IDAuNXJlbTtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xcclxcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcclxcbiAgY29sb3I6ICM5OTk7XFxyXFxufVxcclxcblxcclxcbi5iYW5kd2lkdGgtY2hhcnQtcGxhY2Vob2xkZXIge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgcGFkZGluZzogMnJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogUGF0aCBBbmFseXRpY3MgU3R5bGVzICovXFxyXFxuLnBhdGgtYW5hbHl0aWNzLWRhc2hib2FyZCB7XFxyXFxuICBwYWRkaW5nOiAxcmVtIDA7XFxyXFxufVxcclxcblxcclxcbi5wYXRoLXN1bW1hcnkge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGdhcDogMnJlbTtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnN1bW1hcnktc3RhdCB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBwYWRkaW5nOiAxcmVtIDJyZW07XFxyXFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLnN1bW1hcnktdmFsdWUge1xcclxcbiAgZm9udC1zaXplOiAycmVtO1xcclxcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XFxyXFxuICBjb2xvcjogdmFyKC0tcHJpbWFyeS1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5zdW1tYXJ5LWxhYmVsIHtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXHJcXG4gIGxldHRlci1zcGFjaW5nOiAwLjVweDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhdGgtdGFibGUtY29udGFpbmVyIHtcXHJcXG4gIG92ZXJmbG93LXg6IGF1dG87XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxcmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ucGF0aC10YWJsZSB7XFxyXFxuICB3aWR0aDogMTAwJTtcXHJcXG4gIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7XFxyXFxuICBmb250LXNpemU6IDAuOXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnBhdGgtdGFibGUgdGgsXFxyXFxuLnBhdGgtdGFibGUgdGQge1xcclxcbiAgcGFkZGluZzogMC43NXJlbTtcXHJcXG4gIHRleHQtYWxpZ246IGxlZnQ7XFxyXFxuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tYm9yZGVyLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLnBhdGgtdGFibGUgdGgge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxuICBjb2xvcjogdmFyKC0tZGFyay1jb2xvcik7XFxyXFxuICBwb3NpdGlvbjogc3RpY2t5O1xcclxcbiAgdG9wOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ucGF0aC10YWJsZSB0Ym9keSB0cjpob3ZlciB7XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDQ0LCA5MCwgMTYwLCAwLjA1KTtcXHJcXG59XFxyXFxuXFxyXFxuLnBhdGgtbmFtZSB7XFxyXFxuICBmb250LWZhbWlseTogJ0NvdXJpZXIgTmV3JywgbW9ub3NwYWNlO1xcclxcbiAgY29sb3I6IHZhcigtLXByaW1hcnktY29sb3IpO1xcclxcbiAgbWF4LXdpZHRoOiAzMDBweDtcXHJcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxyXFxuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcXHJcXG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XFxyXFxufVxcclxcblxcclxcbi5wYXRoLXJhdGUge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgY29sb3I6ICM2NjY7XFxyXFxufVxcclxcblxcclxcbi5wYXRoLWJ5dGVzIHtcXHJcXG4gIHRleHQtYWxpZ246IHJpZ2h0O1xcclxcbiAgZm9udC13ZWlnaHQ6IDUwMDtcXHJcXG59XFxyXFxuXFxyXFxuLnBhdGgtcGVyY2VudGFnZSB7XFxyXFxuICB3aWR0aDogMTUwcHg7XFxyXFxufVxcclxcblxcclxcbi5wZXJjZW50YWdlLWJhci1jb250YWluZXIge1xcclxcbiAgZGlzcGxheTogZmxleDtcXHJcXG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XFxyXFxuICBnYXA6IDAuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLnBlcmNlbnRhZ2UtYmFyIHtcXHJcXG4gIGhlaWdodDogOHB4O1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDkwZGVnLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSwgdmFyKC0tc2Vjb25kYXJ5LWNvbG9yKSk7XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICB0cmFuc2l0aW9uOiB3aWR0aCAwLjNzIGVhc2U7XFxyXFxufVxcclxcblxcclxcbi5wZXJjZW50YWdlLXRleHQge1xcclxcbiAgZm9udC1zaXplOiAwLjg1cmVtO1xcclxcbiAgY29sb3I6ICM2NjY7XFxyXFxuICBtaW4td2lkdGg6IDM1cHg7XFxyXFxufVxcclxcblxcclxcbi5wYXRoLW1vcmUge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgcGFkZGluZzogMXJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbn1cXHJcXG5cXHJcXG4ucGF0aC1hbmFseXRpY3MtZW1wdHkge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbiAgcGFkZGluZzogMnJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tbWV0cmljLWJnKTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDhweDtcXHJcXG59XFxyXFxuXFxyXFxuLyogTmV0d29yayBRdWFsaXR5IERhc2hib2FyZCBTdHlsZXMgKi9cXHJcXG4ubmV0d29yay1xdWFsaXR5LWRhc2hib2FyZCB7XFxyXFxuICBwYWRkaW5nOiAxcmVtIDA7XFxyXFxufVxcclxcblxcclxcbi5ucS1oZXJvIHtcXHJcXG4gIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IGF1dG8gMWZyO1xcclxcbiAgZ2FwOiAycmVtO1xcclxcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcXHJcXG4gIG1hcmdpbi1ib3R0b206IDEuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLm5xLWdhdWdlLWNvbnRhaW5lciB7XFxyXFxuICB0ZXh0LWFsaWduOiBjZW50ZXI7XFxyXFxuICB3aWR0aDogMTYwcHg7XFxyXFxufVxcclxcblxcclxcbi5xdWFsaXR5LWdhdWdlIHtcXHJcXG4gIHdpZHRoOiAxNjBweDtcXHJcXG4gIGhlaWdodDogOTBweDtcXHJcXG59XFxyXFxuXFxyXFxuLm5xLWdhdWdlLWxhYmVsIHtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcXHJcXG4gIGNvbG9yOiAjNjY2O1xcclxcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcXHJcXG4gIGxldHRlci1zcGFjaW5nOiAwLjVweDtcXHJcXG4gIG1hcmdpbi10b3A6IDAuMjVyZW07XFxyXFxufVxcclxcblxcclxcbi5ucS1rZXktbWV0cmljcyB7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgxNDBweCwgMWZyKSk7XFxyXFxuICBnYXA6IDFyZW07XFxyXFxufVxcclxcblxcclxcbi5ucS1rZXktbWV0cmljcyAubWV0cmljLWl0ZW0ge1xcclxcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xcclxcbn1cXHJcXG5cXHJcXG4ubnEta2V5LW1ldHJpY3MgLm1ldHJpYy1pdGVtLndhcm5pbmcge1xcclxcbiAgYm9yZGVyLWNvbG9yOiB2YXIoLS13YXJuaW5nLWNvbG9yKTtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxOTMsIDcsIDAuMSk7XFxyXFxufVxcclxcblxcclxcbi5ucS1kZXRhaWxzIHtcXHJcXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XFxyXFxuICBwYWRkaW5nOiAxLjVyZW07XFxyXFxuICBib3JkZXItcmFkaXVzOiA4cHg7XFxyXFxufVxcclxcblxcclxcbi5ucS1kZXRhaWxzIGg1IHtcXHJcXG4gIG1hcmdpbjogMCAwIDFyZW0gMDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLyogUmVzcG9uc2l2ZSBhZGp1c3RtZW50cyBmb3IgYmFuZHdpZHRoIGFuZCBwYXRoIGFuYWx5dGljcyAqL1xcclxcbkBtZWRpYSAobWF4LXdpZHRoOiA3NjhweCkge1xcclxcbiAgLmhlcm8tdmFsdWUge1xcclxcbiAgICBmb250LXNpemU6IDEuNXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5iYW5kd2lkdGgtZ3JpZCB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBhdGgtc3VtbWFyeSB7XFxyXFxuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XFxyXFxuICAgIGdhcDogMXJlbTtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5zdW1tYXJ5LXN0YXQge1xcclxcbiAgICBwYWRkaW5nOiAwLjc1cmVtIDFyZW07XFxyXFxuICB9XFxyXFxuXFxyXFxuICAucGF0aC1uYW1lIHtcXHJcXG4gICAgbWF4LXdpZHRoOiAxNTBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5wZXJjZW50YWdlLWJhci1jb250YWluZXIge1xcclxcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xcclxcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcXHJcXG4gICAgZ2FwOiAwLjI1cmVtO1xcclxcbiAgfVxcclxcblxcclxcbiAgLnBlcmNlbnRhZ2UtYmFyIHtcXHJcXG4gICAgd2lkdGg6IDEwMCUgIWltcG9ydGFudDtcXHJcXG4gICAgbWF4LXdpZHRoOiAxMDBweDtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5ucS1oZXJvIHtcXHJcXG4gICAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiAxZnI7XFxyXFxuICAgIGp1c3RpZnktaXRlbXM6IGNlbnRlcjtcXHJcXG4gIH1cXHJcXG5cXHJcXG4gIC5ucS1rZXktbWV0cmljcyB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXFxyXFxuLyogUHJvdG9jb2wgVmVyc2lvbiBCYWRnZSAqL1xcclxcbi5wcm90b2NvbC1iYWRnZSB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBwYWRkaW5nOiAwLjJyZW0gMC42cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxyXFxuICBsZXR0ZXItc3BhY2luZzogMC41cHg7XFxyXFxufVxcclxcblxcclxcbi5wcm90b2NvbC12MSB7XFxyXFxuICBiYWNrZ3JvdW5kOiB2YXIoLS1tZXRyaWMtYmcpO1xcclxcbiAgY29sb3I6ICM2NjY7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJvdG9jb2wtdjIge1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSg0MCwgMTY3LCA2OSwgMC4xNSksIHJnYmEoNDAsIDE2NywgNjksIDAuMDUpKTtcXHJcXG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG4gIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXN1Y2Nlc3MtY29sb3IpO1xcclxcbn1cXHJcXG5cXHJcXG4ucHJvdG9jb2wtdjMge1xcclxcbiAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KDEzNWRlZywgcmdiYSgxMywgMTEwLCAyNTMsIDAuMTUpLCByZ2JhKDEzLCAxMTAsIDI1MywgMC4wNSkpO1xcclxcbiAgY29sb3I6ICMwZDZlZmQ7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCAjMGQ2ZWZkO1xcclxcbn1cXHJcXG5cXHJcXG4vKiBSZWNlbnQgRXJyb3JzIExpc3QgKi9cXHJcXG4ucmVjZW50LWVycm9ycy1saXN0IHtcXHJcXG4gIG1hcmdpbi10b3A6IDAuNXJlbTtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NzVyZW07XFxyXFxufVxcclxcblxcclxcbi5yZWNlbnQtZXJyb3ItaXRlbSB7XFxyXFxuICBkaXNwbGF5OiBmbGV4O1xcclxcbiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XFxyXFxuICBnYXA6IDAuNXJlbTtcXHJcXG4gIHBhZGRpbmc6IDAuNHJlbSAwO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYmEoMjIwLCA1MywgNjksIDAuMTUpO1xcclxcbn1cXHJcXG5cXHJcXG4ucmVjZW50LWVycm9yLWl0ZW06bGFzdC1jaGlsZCB7XFxyXFxuICBib3JkZXItYm90dG9tOiBub25lO1xcclxcbn1cXHJcXG5cXHJcXG4uZXJyb3ItY2F0ZWdvcnktYmFkZ2Uge1xcclxcbiAgZmxleC1zaHJpbms6IDA7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBwYWRkaW5nOiAwLjFyZW0gMC40cmVtO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgZm9udC1zaXplOiAwLjc1cmVtO1xcclxcbiAgZm9udC13ZWlnaHQ6IDYwMDtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMTUpO1xcclxcbiAgY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xcclxcbn1cXHJcXG5cXHJcXG4ucmVjZW50LWVycm9yLW1zZyB7XFxyXFxuICBmbGV4OiAxO1xcclxcbiAgZm9udC1mYW1pbHk6ICdDb3VyaWVyIE5ldycsIG1vbm9zcGFjZTtcXHJcXG4gIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmQ7XFxyXFxuICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5yZWNlbnQtZXJyb3ItdGltZSB7XFxyXFxuICBmbGV4LXNocmluazogMDtcXHJcXG4gIGZvbnQtc2l6ZTogMC43NXJlbTtcXHJcXG4gIGNvbG9yOiAjODg4O1xcclxcbiAgZm9udC1zdHlsZTogaXRhbGljO1xcclxcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcXHJcXG59XFxyXFxuXFxyXFxuLyogdjIgRGFzaGJvYXJkIFN0eWxlcyAqL1xcclxcbi52Mi1kYXNoYm9hcmQge1xcclxcbiAgcGFkZGluZzogMC41cmVtIDA7XFxyXFxufVxcclxcblxcclxcbi52Mi1kYXNoYm9hcmQgLm1ldHJpY3MtZ3JpZCB7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XFxyXFxufVxcclxcblxcclxcbi8qIENvbmdlc3Rpb24gQ29udHJvbCBTdHlsZXMgKi9cXHJcXG4uY29uZ2VzdGlvbi1zdGF0ZSB7XFxyXFxuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XFxyXFxuICBwYWRkaW5nOiAwLjE1cmVtIDAuNXJlbTtcXHJcXG4gIGJvcmRlci1yYWRpdXM6IDRweDtcXHJcXG4gIGZvbnQtc2l6ZTogMC44NXJlbTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxuICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcXHJcXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XFxyXFxuICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5jb25nZXN0aW9uLXN0YXRlLnN1Y2Nlc3Mge1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSg0MCwgMTY3LCA2OSwgMC4xNSk7XFxyXFxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5jb25nZXN0aW9uLXN0YXRlLndhcm5pbmcge1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDE5MywgNywgMC4xNSk7XFxyXFxuICBjb2xvcjogIzg1NjQwNDtcXHJcXG59XFxyXFxuXFxyXFxuLyogQm9uZGluZyBTdHlsZXMgKi9cXHJcXG4uYm9uZGluZy1saW5rcyB7XFxyXFxuICBkaXNwbGF5OiBncmlkO1xcclxcbiAgZ3JpZC10ZW1wbGF0ZS1jb2x1bW5zOiByZXBlYXQoYXV0by1maXQsIG1pbm1heCgyNTBweCwgMWZyKSk7XFxyXFxuICBnYXA6IDFyZW07XFxyXFxuICBtYXJnaW4tdG9wOiAxcmVtO1xcclxcbn1cXHJcXG5cXHJcXG4uYm9uZGluZy1saW5rIHtcXHJcXG4gIGJhY2tncm91bmQ6IHZhcigtLW1ldHJpYy1iZyk7XFxyXFxuICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1ib3JkZXItY29sb3IpO1xcclxcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xcclxcbiAgcGFkZGluZzogMXJlbTtcXHJcXG4gIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjJzIGVhc2U7XFxyXFxufVxcclxcblxcclxcbi5ib25kaW5nLWxpbmsuYWN0aXZlIHtcXHJcXG4gIGJvcmRlci1jb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjA1KTtcXHJcXG59XFxyXFxuXFxyXFxuLmxpbmstaGVhZGVyIHtcXHJcXG4gIGRpc3BsYXk6IGZsZXg7XFxyXFxuICBhbGlnbi1pdGVtczogY2VudGVyO1xcclxcbiAgZ2FwOiAwLjVyZW07XFxyXFxuICBtYXJnaW4tYm90dG9tOiAwLjc1cmVtO1xcclxcbn1cXHJcXG5cXHJcXG4ubGluay1uYW1lIHtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA2MDA7XFxyXFxuICBmb250LXNpemU6IDFyZW07XFxyXFxuICBjb2xvcjogdmFyKC0tdGV4dC1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5saW5rLWJhZGdlIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHBhZGRpbmc6IDAuMXJlbSAwLjRyZW07XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBmb250LXNpemU6IDAuNzVyZW07XFxyXFxuICBmb250LXdlaWdodDogNzAwO1xcclxcbiAgbGV0dGVyLXNwYWNpbmc6IDAuNXB4O1xcclxcbn1cXHJcXG5cXHJcXG4ubGluay1iYWRnZS5hY3RpdmUtYmFkZ2Uge1xcclxcbiAgYmFja2dyb3VuZDogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxuICBjb2xvcjogd2hpdGU7XFxyXFxufVxcclxcblxcclxcbi5saW5rLWJhZGdlLnN1Y2Nlc3Mge1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSg0MCwgMTY3LCA2OSwgMC4xNSk7XFxyXFxuICBjb2xvcjogdmFyKC0tc3VjY2Vzcy1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5saW5rLWJhZGdlLmVycm9yIHtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMTUpO1xcclxcbiAgY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5saW5rLXN0YXRzIHtcXHJcXG4gIGRpc3BsYXk6IGdyaWQ7XFxyXFxuICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmciAxZnI7XFxyXFxuICBnYXA6IDAuNXJlbTtcXHJcXG59XFxyXFxuXFxyXFxuLmxpbmstc3RhdHMgLnN0YXQtaXRlbSB7XFxyXFxuICBwYWRkaW5nOiAwLjVyZW07XFxyXFxuICBmb250LXNpemU6IDAuODVyZW07XFxyXFxufVxcclxcblxcclxcbi8qIE1vbml0b3JpbmcgJiBBbGVydHMgU3R5bGVzICovXFxyXFxuLm1vbml0b3Jpbmctc3Vic2VjdGlvbiB7XFxyXFxuICBtYXJnaW4tYm90dG9tOiAxLjVyZW07XFxyXFxuICBwYWRkaW5nLWJvdHRvbTogMS41cmVtO1xcclxcbiAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLWJvcmRlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi5tb25pdG9yaW5nLXN1YnNlY3Rpb246bGFzdC1jaGlsZCB7XFxyXFxuICBib3JkZXItYm90dG9tOiBub25lO1xcclxcbiAgbWFyZ2luLWJvdHRvbTogMDtcXHJcXG4gIHBhZGRpbmctYm90dG9tOiAwO1xcclxcbn1cXHJcXG5cXHJcXG4ubW9uaXRvcmluZy1zdWJzZWN0aW9uIGg1IHtcXHJcXG4gIG1hcmdpbjogMCAwIDFyZW0gMDtcXHJcXG4gIGNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFsZXJ0LWxldmVsIHtcXHJcXG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcXHJcXG4gIHBhZGRpbmc6IDAuMXJlbSAwLjRyZW07XFxyXFxuICBib3JkZXItcmFkaXVzOiA0cHg7XFxyXFxuICBmb250LXNpemU6IDAuOHJlbTtcXHJcXG4gIGZvbnQtd2VpZ2h0OiA3MDA7XFxyXFxufVxcclxcblxcclxcbi5hbGVydC1vayB7XFxyXFxuICBiYWNrZ3JvdW5kOiByZ2JhKDQwLCAxNjcsIDY5LCAwLjE1KTtcXHJcXG4gIGNvbG9yOiB2YXIoLS1zdWNjZXNzLWNvbG9yKTtcXHJcXG59XFxyXFxuXFxyXFxuLmFsZXJ0LXdhcm5pbmcge1xcclxcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDE5MywgNywgMC4xNSk7XFxyXFxuICBjb2xvcjogIzg1NjQwNDtcXHJcXG59XFxyXFxuXFxyXFxuLmFsZXJ0LWNyaXRpY2FsIHtcXHJcXG4gIGJhY2tncm91bmQ6IHJnYmEoMjIwLCA1MywgNjksIDAuMTUpO1xcclxcbiAgY29sb3I6IHZhcigtLWRhbmdlci1jb2xvcik7XFxyXFxufVxcclxcblxcclxcbi8qIFJlc3BvbnNpdmUgYWRqdXN0bWVudHMgZm9yIHYyIHNlY3Rpb25zICovXFxyXFxuQG1lZGlhIChtYXgtd2lkdGg6IDc2OHB4KSB7XFxyXFxuICAuYm9uZGluZy1saW5rcyB7XFxyXFxuICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyO1xcclxcbiAgfVxcclxcblxcclxcbiAgLmxpbmstc3RhdHMge1xcclxcbiAgICBncmlkLXRlbXBsYXRlLWNvbHVtbnM6IDFmcjtcXHJcXG4gIH1cXHJcXG59XFxyXFxuXCJdLFwic291cmNlUm9vdFwiOlwiXCJ9XSk7XG4vLyBFeHBvcnRzXG5leHBvcnQgZGVmYXVsdCBfX19DU1NfTE9BREVSX0VYUE9SVF9fXztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/cjs.js!./src/webapp/styles.css\n\n}");
20
+
21
+ /***/ },
22
+
23
+ /***/ "./node_modules/css-loader/dist/runtime/api.js"
24
+ /*!*****************************************************!*\
25
+ !*** ./node_modules/css-loader/dist/runtime/api.js ***!
26
+ \*****************************************************/
27
+ (module) {
28
+
29
+ eval("{\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvYXBpLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxREFBcUQ7QUFDckQ7QUFDQTtBQUNBLGdEQUFnRDtBQUNoRDtBQUNBO0FBQ0EscUZBQXFGO0FBQ3JGO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQjtBQUNBO0FBQ0EscUJBQXFCO0FBQ3JCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckI7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHNCQUFzQixpQkFBaUI7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscUJBQXFCLHFCQUFxQjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzRkFBc0YscUJBQXFCO0FBQzNHO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixpREFBaUQscUJBQXFCO0FBQ3RFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFVBQVU7QUFDVixzREFBc0QscUJBQXFCO0FBQzNFO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zaWduYWxrLWVkZ2UtbGluay8uL25vZGVfbW9kdWxlcy9jc3MtbG9hZGVyL2Rpc3QvcnVudGltZS9hcGkuanM/MjRmYiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLypcbiAgTUlUIExpY2Vuc2UgaHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBcbiAgQXV0aG9yIFRvYmlhcyBLb3BwZXJzIEBzb2tyYVxuKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGNzc1dpdGhNYXBwaW5nVG9TdHJpbmcpIHtcbiAgdmFyIGxpc3QgPSBbXTtcblxuICAvLyByZXR1cm4gdGhlIGxpc3Qgb2YgbW9kdWxlcyBhcyBjc3Mgc3RyaW5nXG4gIGxpc3QudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgIHZhciBjb250ZW50ID0gXCJcIjtcbiAgICAgIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2YgaXRlbVs1XSAhPT0gXCJ1bmRlZmluZWRcIjtcbiAgICAgIGlmIChpdGVtWzRdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKTtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbWVkaWEgXCIuY29uY2F0KGl0ZW1bMl0sIFwiIHtcIik7XG4gICAgICB9XG4gICAgICBpZiAobmVlZExheWVyKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJAbGF5ZXJcIi5jb25jYXQoaXRlbVs1XS5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KGl0ZW1bNV0pIDogXCJcIiwgXCIge1wiKTtcbiAgICAgIH1cbiAgICAgIGNvbnRlbnQgKz0gY3NzV2l0aE1hcHBpbmdUb1N0cmluZyhpdGVtKTtcbiAgICAgIGlmIChuZWVkTGF5ZXIpIHtcbiAgICAgICAgY29udGVudCArPSBcIn1cIjtcbiAgICAgIH1cbiAgICAgIGlmIChpdGVtWzJdKSB7XG4gICAgICAgIGNvbnRlbnQgKz0gXCJ9XCI7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbVs0XSkge1xuICAgICAgICBjb250ZW50ICs9IFwifVwiO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfSkuam9pbihcIlwiKTtcbiAgfTtcblxuICAvLyBpbXBvcnQgYSBsaXN0IG9mIG1vZHVsZXMgaW50byB0aGUgbGlzdFxuICBsaXN0LmkgPSBmdW5jdGlvbiBpKG1vZHVsZXMsIG1lZGlhLCBkZWR1cGUsIHN1cHBvcnRzLCBsYXllcikge1xuICAgIGlmICh0eXBlb2YgbW9kdWxlcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgbW9kdWxlcyA9IFtbbnVsbCwgbW9kdWxlcywgdW5kZWZpbmVkXV07XG4gICAgfVxuICAgIHZhciBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzID0ge307XG4gICAgaWYgKGRlZHVwZSkge1xuICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCB0aGlzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgIHZhciBpZCA9IHRoaXNba11bMF07XG4gICAgICAgIGlmIChpZCAhPSBudWxsKSB7XG4gICAgICAgICAgYWxyZWFkeUltcG9ydGVkTW9kdWxlc1tpZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAodmFyIF9rID0gMDsgX2sgPCBtb2R1bGVzLmxlbmd0aDsgX2srKykge1xuICAgICAgdmFyIGl0ZW0gPSBbXS5jb25jYXQobW9kdWxlc1tfa10pO1xuICAgICAgaWYgKGRlZHVwZSAmJiBhbHJlYWR5SW1wb3J0ZWRNb2R1bGVzW2l0ZW1bMF1dKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBsYXllciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBpZiAodHlwZW9mIGl0ZW1bNV0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQGxheWVyXCIuY29uY2F0KGl0ZW1bNV0ubGVuZ3RoID4gMCA/IFwiIFwiLmNvbmNhdChpdGVtWzVdKSA6IFwiXCIsIFwiIHtcIikuY29uY2F0KGl0ZW1bMV0sIFwifVwiKTtcbiAgICAgICAgICBpdGVtWzVdID0gbGF5ZXI7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChtZWRpYSkge1xuICAgICAgICBpZiAoIWl0ZW1bMl0pIHtcbiAgICAgICAgICBpdGVtWzJdID0gbWVkaWE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaXRlbVsxXSA9IFwiQG1lZGlhIFwiLmNvbmNhdChpdGVtWzJdLCBcIiB7XCIpLmNvbmNhdChpdGVtWzFdLCBcIn1cIik7XG4gICAgICAgICAgaXRlbVsyXSA9IG1lZGlhO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoc3VwcG9ydHMpIHtcbiAgICAgICAgaWYgKCFpdGVtWzRdKSB7XG4gICAgICAgICAgaXRlbVs0XSA9IFwiXCIuY29uY2F0KHN1cHBvcnRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpdGVtWzFdID0gXCJAc3VwcG9ydHMgKFwiLmNvbmNhdChpdGVtWzRdLCBcIikge1wiKS5jb25jYXQoaXRlbVsxXSwgXCJ9XCIpO1xuICAgICAgICAgIGl0ZW1bNF0gPSBzdXBwb3J0cztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbGlzdC5wdXNoKGl0ZW0pO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGxpc3Q7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/api.js\n\n}");
30
+
31
+ /***/ },
32
+
33
+ /***/ "./node_modules/css-loader/dist/runtime/sourceMaps.js"
34
+ /*!************************************************************!*\
35
+ !*** ./node_modules/css-loader/dist/runtime/sourceMaps.js ***!
36
+ \************************************************************/
37
+ (module) {
38
+
39
+ eval("{\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L3J1bnRpbWUvc291cmNlTWFwcy5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsdURBQXVELGNBQWM7QUFDckU7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vbm9kZV9tb2R1bGVzL2Nzcy1sb2FkZXIvZGlzdC9ydW50aW1lL3NvdXJjZU1hcHMuanM/YWYxMiJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlbSkge1xuICB2YXIgY29udGVudCA9IGl0ZW1bMV07XG4gIHZhciBjc3NNYXBwaW5nID0gaXRlbVszXTtcbiAgaWYgKCFjc3NNYXBwaW5nKSB7XG4gICAgcmV0dXJuIGNvbnRlbnQ7XG4gIH1cbiAgaWYgKHR5cGVvZiBidG9hID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICB2YXIgYmFzZTY0ID0gYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoY3NzTWFwcGluZykpKSk7XG4gICAgdmFyIGRhdGEgPSBcInNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LFwiLmNvbmNhdChiYXNlNjQpO1xuICAgIHZhciBzb3VyY2VNYXBwaW5nID0gXCIvKiMgXCIuY29uY2F0KGRhdGEsIFwiICovXCIpO1xuICAgIHJldHVybiBbY29udGVudF0uY29uY2F0KFtzb3VyY2VNYXBwaW5nXSkuam9pbihcIlxcblwiKTtcbiAgfVxuICByZXR1cm4gW2NvbnRlbnRdLmpvaW4oXCJcXG5cIik7XG59OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/css-loader/dist/runtime/sourceMaps.js\n\n}");
40
+
41
+ /***/ },
42
+
43
+ /***/ "./src/webapp/styles.css"
44
+ /*!*******************************!*\
45
+ !*** ./src/webapp/styles.css ***!
46
+ \*******************************/
47
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
48
+
49
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js */ \"./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleDomAPI.js */ \"./node_modules/style-loader/dist/runtime/styleDomAPI.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertBySelector.js */ \"./node_modules/style-loader/dist/runtime/insertBySelector.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js */ \"./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/insertStyleElement.js */ \"./node_modules/style-loader/dist/runtime/insertStyleElement.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__);\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! !../../node_modules/style-loader/dist/runtime/styleTagTransform.js */ \"./node_modules/style-loader/dist/runtime/styleTagTransform.js\");\n/* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__);\n/* harmony import */ var _node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! !!../../node_modules/css-loader/dist/cjs.js!./styles.css */ \"./node_modules/css-loader/dist/cjs.js!./src/webapp/styles.css\");\n\n \n \n \n \n \n \n \n \n \n\nvar options = {};\n\noptions.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default());\noptions.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default());\n\n options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, \"head\");\n \noptions.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default());\noptions.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default());\n\nvar update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"], options);\n\n\n\n\n /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"] && _node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals ? _node_modules_css_loader_dist_cjs_js_styles_css__WEBPACK_IMPORTED_MODULE_6__[\"default\"].locals : undefined);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvd2ViYXBwL3N0eWxlcy5jc3MiLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsTUFBa0c7QUFDbEcsTUFBd0Y7QUFDeEYsTUFBK0Y7QUFDL0YsTUFBa0g7QUFDbEgsTUFBMkc7QUFDM0csTUFBMkc7QUFDM0csTUFBdUc7QUFDdkc7QUFDQTs7QUFFQTs7QUFFQSw0QkFBNEIscUdBQW1CO0FBQy9DLHdCQUF3QixrSEFBYTs7QUFFckMsdUJBQXVCLHVHQUFhO0FBQ3BDO0FBQ0EsaUJBQWlCLCtGQUFNO0FBQ3ZCLDZCQUE2QixzR0FBa0I7O0FBRS9DLGFBQWEsMEdBQUcsQ0FBQyx1RkFBTzs7OztBQUlpRDtBQUN6RSxPQUFPLGlFQUFlLHVGQUFPLElBQUksdUZBQU8sVUFBVSx1RkFBTyxtQkFBbUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vc3JjL3dlYmFwcC9zdHlsZXMuY3NzPzRkNzQiXSwic291cmNlc0NvbnRlbnQiOlsiXG4gICAgICBpbXBvcnQgQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5qZWN0U3R5bGVzSW50b1N0eWxlVGFnLmpzXCI7XG4gICAgICBpbXBvcnQgZG9tQVBJIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanNcIjtcbiAgICAgIGltcG9ydCBpbnNlcnRGbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luc2VydEJ5U2VsZWN0b3IuanNcIjtcbiAgICAgIGltcG9ydCBzZXRBdHRyaWJ1dGVzIGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc2V0QXR0cmlidXRlc1dpdGhvdXRBdHRyaWJ1dGVzLmpzXCI7XG4gICAgICBpbXBvcnQgaW5zZXJ0U3R5bGVFbGVtZW50IGZyb20gXCIhLi4vLi4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzXCI7XG4gICAgICBpbXBvcnQgc3R5bGVUYWdUcmFuc2Zvcm1GbiBmcm9tIFwiIS4uLy4uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3N0eWxlVGFnVHJhbnNmb3JtLmpzXCI7XG4gICAgICBpbXBvcnQgY29udGVudCwgKiBhcyBuYW1lZEV4cG9ydCBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlcy5jc3NcIjtcbiAgICAgIFxuICAgICAgXG5cbnZhciBvcHRpb25zID0ge307XG5cbm9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0gPSBzdHlsZVRhZ1RyYW5zZm9ybUZuO1xub3B0aW9ucy5zZXRBdHRyaWJ1dGVzID0gc2V0QXR0cmlidXRlcztcblxuICAgICAgb3B0aW9ucy5pbnNlcnQgPSBpbnNlcnRGbi5iaW5kKG51bGwsIFwiaGVhZFwiKTtcbiAgICBcbm9wdGlvbnMuZG9tQVBJID0gZG9tQVBJO1xub3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQgPSBpbnNlcnRTdHlsZUVsZW1lbnQ7XG5cbnZhciB1cGRhdGUgPSBBUEkoY29udGVudCwgb3B0aW9ucyk7XG5cblxuXG5leHBvcnQgKiBmcm9tIFwiISEuLi8uLi9ub2RlX21vZHVsZXMvY3NzLWxvYWRlci9kaXN0L2Nqcy5qcyEuL3N0eWxlcy5jc3NcIjtcbiAgICAgICBleHBvcnQgZGVmYXVsdCBjb250ZW50ICYmIGNvbnRlbnQubG9jYWxzID8gY29udGVudC5sb2NhbHMgOiB1bmRlZmluZWQ7XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./src/webapp/styles.css\n\n}");
50
+
51
+ /***/ },
52
+
53
+ /***/ "./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js"
54
+ /*!****************************************************************************!*\
55
+ !*** ./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js ***!
56
+ \****************************************************************************/
57
+ (module) {
58
+
59
+ eval("{\n\nvar stylesInDOM = [];\nfunction getIndexByIdentifier(identifier) {\n var result = -1;\n for (var i = 0; i < stylesInDOM.length; i++) {\n if (stylesInDOM[i].identifier === identifier) {\n result = i;\n break;\n }\n }\n return result;\n}\nfunction modulesToDom(list, options) {\n var idCountMap = {};\n var identifiers = [];\n for (var i = 0; i < list.length; i++) {\n var item = list[i];\n var id = options.base ? item[0] + options.base : item[0];\n var count = idCountMap[id] || 0;\n var identifier = \"\".concat(id, \" \").concat(count);\n idCountMap[id] = count + 1;\n var indexByIdentifier = getIndexByIdentifier(identifier);\n var obj = {\n css: item[1],\n media: item[2],\n sourceMap: item[3],\n supports: item[4],\n layer: item[5]\n };\n if (indexByIdentifier !== -1) {\n stylesInDOM[indexByIdentifier].references++;\n stylesInDOM[indexByIdentifier].updater(obj);\n } else {\n var updater = addElementStyle(obj, options);\n options.byIndex = i;\n stylesInDOM.splice(i, 0, {\n identifier: identifier,\n updater: updater,\n references: 1\n });\n }\n identifiers.push(identifier);\n }\n return identifiers;\n}\nfunction addElementStyle(obj, options) {\n var api = options.domAPI(options);\n api.update(obj);\n var updater = function updater(newObj) {\n if (newObj) {\n if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) {\n return;\n }\n api.update(obj = newObj);\n } else {\n api.remove();\n }\n };\n return updater;\n}\nmodule.exports = function (list, options) {\n options = options || {};\n list = list || [];\n var lastIdentifiers = modulesToDom(list, options);\n return function update(newList) {\n newList = newList || [];\n for (var i = 0; i < lastIdentifiers.length; i++) {\n var identifier = lastIdentifiers[i];\n var index = getIndexByIdentifier(identifier);\n stylesInDOM[index].references--;\n }\n var newLastIdentifiers = modulesToDom(newList, options);\n for (var _i = 0; _i < lastIdentifiers.length; _i++) {\n var _identifier = lastIdentifiers[_i];\n var _index = getIndexByIdentifier(_identifier);\n if (stylesInDOM[_index].references === 0) {\n stylesInDOM[_index].updater();\n stylesInDOM.splice(_index, 1);\n }\n }\n lastIdentifiers = newLastIdentifiers;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbmplY3RTdHlsZXNJbnRvU3R5bGVUYWcuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0Esa0JBQWtCLHdCQUF3QjtBQUMxQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixpQkFBaUI7QUFDbkM7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsT0FBTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNO0FBQ047QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQiw0QkFBNEI7QUFDaEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQiw2QkFBNkI7QUFDbEQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zaWduYWxrLWVkZ2UtbGluay8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL2luamVjdFN0eWxlc0ludG9TdHlsZVRhZy5qcz8yZGJhIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgc3R5bGVzSW5ET00gPSBbXTtcbmZ1bmN0aW9uIGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpIHtcbiAgdmFyIHJlc3VsdCA9IC0xO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlc0luRE9NLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKHN0eWxlc0luRE9NW2ldLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHtcbiAgICAgIHJlc3VsdCA9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbmZ1bmN0aW9uIG1vZHVsZXNUb0RvbShsaXN0LCBvcHRpb25zKSB7XG4gIHZhciBpZENvdW50TWFwID0ge307XG4gIHZhciBpZGVudGlmaWVycyA9IFtdO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgaXRlbSA9IGxpc3RbaV07XG4gICAgdmFyIGlkID0gb3B0aW9ucy5iYXNlID8gaXRlbVswXSArIG9wdGlvbnMuYmFzZSA6IGl0ZW1bMF07XG4gICAgdmFyIGNvdW50ID0gaWRDb3VudE1hcFtpZF0gfHwgMDtcbiAgICB2YXIgaWRlbnRpZmllciA9IFwiXCIuY29uY2F0KGlkLCBcIiBcIikuY29uY2F0KGNvdW50KTtcbiAgICBpZENvdW50TWFwW2lkXSA9IGNvdW50ICsgMTtcbiAgICB2YXIgaW5kZXhCeUlkZW50aWZpZXIgPSBnZXRJbmRleEJ5SWRlbnRpZmllcihpZGVudGlmaWVyKTtcbiAgICB2YXIgb2JqID0ge1xuICAgICAgY3NzOiBpdGVtWzFdLFxuICAgICAgbWVkaWE6IGl0ZW1bMl0sXG4gICAgICBzb3VyY2VNYXA6IGl0ZW1bM10sXG4gICAgICBzdXBwb3J0czogaXRlbVs0XSxcbiAgICAgIGxheWVyOiBpdGVtWzVdXG4gICAgfTtcbiAgICBpZiAoaW5kZXhCeUlkZW50aWZpZXIgIT09IC0xKSB7XG4gICAgICBzdHlsZXNJbkRPTVtpbmRleEJ5SWRlbnRpZmllcl0ucmVmZXJlbmNlcysrO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhCeUlkZW50aWZpZXJdLnVwZGF0ZXIob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHVwZGF0ZXIgPSBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKTtcbiAgICAgIG9wdGlvbnMuYnlJbmRleCA9IGk7XG4gICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoaSwgMCwge1xuICAgICAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVyLFxuICAgICAgICB1cGRhdGVyOiB1cGRhdGVyLFxuICAgICAgICByZWZlcmVuY2VzOiAxXG4gICAgICB9KTtcbiAgICB9XG4gICAgaWRlbnRpZmllcnMucHVzaChpZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gaWRlbnRpZmllcnM7XG59XG5mdW5jdGlvbiBhZGRFbGVtZW50U3R5bGUob2JqLCBvcHRpb25zKSB7XG4gIHZhciBhcGkgPSBvcHRpb25zLmRvbUFQSShvcHRpb25zKTtcbiAgYXBpLnVwZGF0ZShvYmopO1xuICB2YXIgdXBkYXRlciA9IGZ1bmN0aW9uIHVwZGF0ZXIobmV3T2JqKSB7XG4gICAgaWYgKG5ld09iaikge1xuICAgICAgaWYgKG5ld09iai5jc3MgPT09IG9iai5jc3MgJiYgbmV3T2JqLm1lZGlhID09PSBvYmoubWVkaWEgJiYgbmV3T2JqLnNvdXJjZU1hcCA9PT0gb2JqLnNvdXJjZU1hcCAmJiBuZXdPYmouc3VwcG9ydHMgPT09IG9iai5zdXBwb3J0cyAmJiBuZXdPYmoubGF5ZXIgPT09IG9iai5sYXllcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBhcGkudXBkYXRlKG9iaiA9IG5ld09iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaS5yZW1vdmUoKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiB1cGRhdGVyO1xufVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobGlzdCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgbGlzdCA9IGxpc3QgfHwgW107XG4gIHZhciBsYXN0SWRlbnRpZmllcnMgPSBtb2R1bGVzVG9Eb20obGlzdCwgb3B0aW9ucyk7XG4gIHJldHVybiBmdW5jdGlvbiB1cGRhdGUobmV3TGlzdCkge1xuICAgIG5ld0xpc3QgPSBuZXdMaXN0IHx8IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgaWRlbnRpZmllciA9IGxhc3RJZGVudGlmaWVyc1tpXTtcbiAgICAgIHZhciBpbmRleCA9IGdldEluZGV4QnlJZGVudGlmaWVyKGlkZW50aWZpZXIpO1xuICAgICAgc3R5bGVzSW5ET01baW5kZXhdLnJlZmVyZW5jZXMtLTtcbiAgICB9XG4gICAgdmFyIG5ld0xhc3RJZGVudGlmaWVycyA9IG1vZHVsZXNUb0RvbShuZXdMaXN0LCBvcHRpb25zKTtcbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGFzdElkZW50aWZpZXJzLmxlbmd0aDsgX2krKykge1xuICAgICAgdmFyIF9pZGVudGlmaWVyID0gbGFzdElkZW50aWZpZXJzW19pXTtcbiAgICAgIHZhciBfaW5kZXggPSBnZXRJbmRleEJ5SWRlbnRpZmllcihfaWRlbnRpZmllcik7XG4gICAgICBpZiAoc3R5bGVzSW5ET01bX2luZGV4XS5yZWZlcmVuY2VzID09PSAwKSB7XG4gICAgICAgIHN0eWxlc0luRE9NW19pbmRleF0udXBkYXRlcigpO1xuICAgICAgICBzdHlsZXNJbkRPTS5zcGxpY2UoX2luZGV4LCAxKTtcbiAgICAgIH1cbiAgICB9XG4gICAgbGFzdElkZW50aWZpZXJzID0gbmV3TGFzdElkZW50aWZpZXJzO1xuICB9O1xufTsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\n\n}");
60
+
61
+ /***/ },
62
+
63
+ /***/ "./node_modules/style-loader/dist/runtime/insertBySelector.js"
64
+ /*!********************************************************************!*\
65
+ !*** ./node_modules/style-loader/dist/runtime/insertBySelector.js ***!
66
+ \********************************************************************/
67
+ (module) {
68
+
69
+ eval("{\n\nvar memo = {};\n\n/* istanbul ignore next */\nfunction getTarget(target) {\n if (typeof memo[target] === \"undefined\") {\n var styleTarget = document.querySelector(target);\n\n // Special case to return head of iframe instead of iframe itself\n if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) {\n try {\n // This will throw an exception if access to iframe is blocked\n // due to cross-origin restrictions\n styleTarget = styleTarget.contentDocument.head;\n } catch (e) {\n // istanbul ignore next\n styleTarget = null;\n }\n }\n memo[target] = styleTarget;\n }\n return memo[target];\n}\n\n/* istanbul ignore next */\nfunction insertBySelector(insert, style) {\n var target = getTarget(insert);\n if (!target) {\n throw new Error(\"Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.\");\n }\n target.appendChild(style);\n}\nmodule.exports = insertBySelector;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRCeVNlbGVjdG9yLmpzIiwibWFwcGluZ3MiOiJBQUFhOztBQUViOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFFBQVE7QUFDUjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0QnlTZWxlY3Rvci5qcz9iMjE0Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG52YXIgbWVtbyA9IHt9O1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIGdldFRhcmdldCh0YXJnZXQpIHtcbiAgaWYgKHR5cGVvZiBtZW1vW3RhcmdldF0gPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB2YXIgc3R5bGVUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHRhcmdldCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgdG8gcmV0dXJuIGhlYWQgb2YgaWZyYW1lIGluc3RlYWQgb2YgaWZyYW1lIGl0c2VsZlxuICAgIGlmICh3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQgJiYgc3R5bGVUYXJnZXQgaW5zdGFuY2VvZiB3aW5kb3cuSFRNTElGcmFtZUVsZW1lbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgYWNjZXNzIHRvIGlmcmFtZSBpcyBibG9ja2VkXG4gICAgICAgIC8vIGR1ZSB0byBjcm9zcy1vcmlnaW4gcmVzdHJpY3Rpb25zXG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gc3R5bGVUYXJnZXQuY29udGVudERvY3VtZW50LmhlYWQ7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGlzdGFuYnVsIGlnbm9yZSBuZXh0XG4gICAgICAgIHN0eWxlVGFyZ2V0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgbWVtb1t0YXJnZXRdID0gc3R5bGVUYXJnZXQ7XG4gIH1cbiAgcmV0dXJuIG1lbW9bdGFyZ2V0XTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBpbnNlcnRCeVNlbGVjdG9yKGluc2VydCwgc3R5bGUpIHtcbiAgdmFyIHRhcmdldCA9IGdldFRhcmdldChpbnNlcnQpO1xuICBpZiAoIXRhcmdldCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGZpbmQgYSBzdHlsZSB0YXJnZXQuIFRoaXMgcHJvYmFibHkgbWVhbnMgdGhhdCB0aGUgdmFsdWUgZm9yIHRoZSAnaW5zZXJ0JyBwYXJhbWV0ZXIgaXMgaW52YWxpZC5cIik7XG4gIH1cbiAgdGFyZ2V0LmFwcGVuZENoaWxkKHN0eWxlKTtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0QnlTZWxlY3RvcjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertBySelector.js\n\n}");
70
+
71
+ /***/ },
72
+
73
+ /***/ "./node_modules/style-loader/dist/runtime/insertStyleElement.js"
74
+ /*!**********************************************************************!*\
75
+ !*** ./node_modules/style-loader/dist/runtime/insertStyleElement.js ***!
76
+ \**********************************************************************/
77
+ (module) {
78
+
79
+ eval("{\n\n/* istanbul ignore next */\nfunction insertStyleElement(options) {\n var element = document.createElement(\"style\");\n options.setAttributes(element, options.attributes);\n options.insert(element, options.options);\n return element;\n}\nmodule.exports = insertStyleElement;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9pbnNlcnRTdHlsZUVsZW1lbnQuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvaW5zZXJ0U3R5bGVFbGVtZW50LmpzP2RlNmMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICAqL1xuZnVuY3Rpb24gaW5zZXJ0U3R5bGVFbGVtZW50KG9wdGlvbnMpIHtcbiAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3R5bGVcIik7XG4gIG9wdGlvbnMuc2V0QXR0cmlidXRlcyhlbGVtZW50LCBvcHRpb25zLmF0dHJpYnV0ZXMpO1xuICBvcHRpb25zLmluc2VydChlbGVtZW50LCBvcHRpb25zLm9wdGlvbnMpO1xuICByZXR1cm4gZWxlbWVudDtcbn1cbm1vZHVsZS5leHBvcnRzID0gaW5zZXJ0U3R5bGVFbGVtZW50OyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/insertStyleElement.js\n\n}");
80
+
81
+ /***/ },
82
+
83
+ /***/ "./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js"
84
+ /*!**********************************************************************************!*\
85
+ !*** ./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js ***!
86
+ \**********************************************************************************/
87
+ (module, __unused_webpack_exports, __webpack_require__) {
88
+
89
+ eval("{\n\n/* istanbul ignore next */\nfunction setAttributesWithoutAttributes(styleElement) {\n var nonce = true ? __webpack_require__.nc : 0;\n if (nonce) {\n styleElement.setAttribute(\"nonce\", nonce);\n }\n}\nmodule.exports = setAttributesWithoutAttributes;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zZXRBdHRyaWJ1dGVzV2l0aG91dEF0dHJpYnV0ZXMuanMiLCJtYXBwaW5ncyI6IkFBQWE7O0FBRWI7QUFDQTtBQUNBLGNBQWMsS0FBd0MsR0FBRyxzQkFBaUIsR0FBRyxDQUFJO0FBQ2pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zaWduYWxrLWVkZ2UtbGluay8uL25vZGVfbW9kdWxlcy9zdHlsZS1sb2FkZXIvZGlzdC9ydW50aW1lL3NldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcy5qcz9kZGNlIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAgKi9cbmZ1bmN0aW9uIHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlcyhzdHlsZUVsZW1lbnQpIHtcbiAgdmFyIG5vbmNlID0gdHlwZW9mIF9fd2VicGFja19ub25jZV9fICE9PSBcInVuZGVmaW5lZFwiID8gX193ZWJwYWNrX25vbmNlX18gOiBudWxsO1xuICBpZiAobm9uY2UpIHtcbiAgICBzdHlsZUVsZW1lbnQuc2V0QXR0cmlidXRlKFwibm9uY2VcIiwgbm9uY2UpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHNldEF0dHJpYnV0ZXNXaXRob3V0QXR0cmlidXRlczsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\n\n}");
90
+
91
+ /***/ },
92
+
93
+ /***/ "./node_modules/style-loader/dist/runtime/styleDomAPI.js"
94
+ /*!***************************************************************!*\
95
+ !*** ./node_modules/style-loader/dist/runtime/styleDomAPI.js ***!
96
+ \***************************************************************/
97
+ (module) {
98
+
99
+ eval("{\n\n/* istanbul ignore next */\nfunction apply(styleElement, options, obj) {\n var css = \"\";\n if (obj.supports) {\n css += \"@supports (\".concat(obj.supports, \") {\");\n }\n if (obj.media) {\n css += \"@media \".concat(obj.media, \" {\");\n }\n var needLayer = typeof obj.layer !== \"undefined\";\n if (needLayer) {\n css += \"@layer\".concat(obj.layer.length > 0 ? \" \".concat(obj.layer) : \"\", \" {\");\n }\n css += obj.css;\n if (needLayer) {\n css += \"}\";\n }\n if (obj.media) {\n css += \"}\";\n }\n if (obj.supports) {\n css += \"}\";\n }\n var sourceMap = obj.sourceMap;\n if (sourceMap && typeof btoa !== \"undefined\") {\n css += \"\\n/*# sourceMappingURL=data:application/json;base64,\".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), \" */\");\n }\n\n // For old IE\n /* istanbul ignore if */\n options.styleTagTransform(css, styleElement, options.options);\n}\nfunction removeStyleElement(styleElement) {\n // istanbul ignore if\n if (styleElement.parentNode === null) {\n return false;\n }\n styleElement.parentNode.removeChild(styleElement);\n}\n\n/* istanbul ignore next */\nfunction domAPI(options) {\n if (typeof document === \"undefined\") {\n return {\n update: function update() {},\n remove: function remove() {}\n };\n }\n var styleElement = options.insertStyleElement(options);\n return {\n update: function update(obj) {\n apply(styleElement, options, obj);\n },\n remove: function remove() {\n removeStyleElement(styleElement);\n }\n };\n}\nmodule.exports = domAPI;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZURvbUFQSS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtEQUFrRDtBQUNsRDtBQUNBO0FBQ0EsMENBQTBDO0FBQzFDO0FBQ0E7QUFDQTtBQUNBLGlGQUFpRjtBQUNqRjtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBO0FBQ0EsYUFBYTtBQUNiO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0Esa0NBQWtDO0FBQ2xDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVEb21BUEkuanM/ZTQ3OSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaikge1xuICB2YXIgY3NzID0gXCJcIjtcbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIkBzdXBwb3J0cyAoXCIuY29uY2F0KG9iai5zdXBwb3J0cywgXCIpIHtcIik7XG4gIH1cbiAgaWYgKG9iai5tZWRpYSkge1xuICAgIGNzcyArPSBcIkBtZWRpYSBcIi5jb25jYXQob2JqLm1lZGlhLCBcIiB7XCIpO1xuICB9XG4gIHZhciBuZWVkTGF5ZXIgPSB0eXBlb2Ygb2JqLmxheWVyICE9PSBcInVuZGVmaW5lZFwiO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwiQGxheWVyXCIuY29uY2F0KG9iai5sYXllci5sZW5ndGggPiAwID8gXCIgXCIuY29uY2F0KG9iai5sYXllcikgOiBcIlwiLCBcIiB7XCIpO1xuICB9XG4gIGNzcyArPSBvYmouY3NzO1xuICBpZiAobmVlZExheWVyKSB7XG4gICAgY3NzICs9IFwifVwiO1xuICB9XG4gIGlmIChvYmoubWVkaWEpIHtcbiAgICBjc3MgKz0gXCJ9XCI7XG4gIH1cbiAgaWYgKG9iai5zdXBwb3J0cykge1xuICAgIGNzcyArPSBcIn1cIjtcbiAgfVxuICB2YXIgc291cmNlTWFwID0gb2JqLnNvdXJjZU1hcDtcbiAgaWYgKHNvdXJjZU1hcCAmJiB0eXBlb2YgYnRvYSAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGNzcyArPSBcIlxcbi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCIuY29uY2F0KGJ0b2EodW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KEpTT04uc3RyaW5naWZ5KHNvdXJjZU1hcCkpKSksIFwiICovXCIpO1xuICB9XG5cbiAgLy8gRm9yIG9sZCBJRVxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgICovXG4gIG9wdGlvbnMuc3R5bGVUYWdUcmFuc2Zvcm0oY3NzLCBzdHlsZUVsZW1lbnQsIG9wdGlvbnMub3B0aW9ucyk7XG59XG5mdW5jdGlvbiByZW1vdmVTdHlsZUVsZW1lbnQoc3R5bGVFbGVtZW50KSB7XG4gIC8vIGlzdGFuYnVsIGlnbm9yZSBpZlxuICBpZiAoc3R5bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3R5bGVFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGVFbGVtZW50KTtcbn1cblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBkb21BUEkob3B0aW9ucykge1xuICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge30sXG4gICAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHt9XG4gICAgfTtcbiAgfVxuICB2YXIgc3R5bGVFbGVtZW50ID0gb3B0aW9ucy5pbnNlcnRTdHlsZUVsZW1lbnQob3B0aW9ucyk7XG4gIHJldHVybiB7XG4gICAgdXBkYXRlOiBmdW5jdGlvbiB1cGRhdGUob2JqKSB7XG4gICAgICBhcHBseShzdHlsZUVsZW1lbnQsIG9wdGlvbnMsIG9iaik7XG4gICAgfSxcbiAgICByZW1vdmU6IGZ1bmN0aW9uIHJlbW92ZSgpIHtcbiAgICAgIHJlbW92ZVN0eWxlRWxlbWVudChzdHlsZUVsZW1lbnQpO1xuICAgIH1cbiAgfTtcbn1cbm1vZHVsZS5leHBvcnRzID0gZG9tQVBJOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleDomAPI.js\n\n}");
100
+
101
+ /***/ },
102
+
103
+ /***/ "./node_modules/style-loader/dist/runtime/styleTagTransform.js"
104
+ /*!*********************************************************************!*\
105
+ !*** ./node_modules/style-loader/dist/runtime/styleTagTransform.js ***!
106
+ \*********************************************************************/
107
+ (module) {
108
+
109
+ eval("{\n\n/* istanbul ignore next */\nfunction styleTagTransform(css, styleElement) {\n if (styleElement.styleSheet) {\n styleElement.styleSheet.cssText = css;\n } else {\n while (styleElement.firstChild) {\n styleElement.removeChild(styleElement.firstChild);\n }\n styleElement.appendChild(document.createTextNode(css));\n }\n}\nmodule.exports = styleTagTransform;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9ub2RlX21vZHVsZXMvc3R5bGUtbG9hZGVyL2Rpc3QvcnVudGltZS9zdHlsZVRhZ1RyYW5zZm9ybS5qcyIsIm1hcHBpbmdzIjoiQUFBYTs7QUFFYjtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vbm9kZV9tb2R1bGVzL3N0eWxlLWxvYWRlci9kaXN0L3J1bnRpbWUvc3R5bGVUYWdUcmFuc2Zvcm0uanM/MWRkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuLyogaXN0YW5idWwgaWdub3JlIG5leHQgICovXG5mdW5jdGlvbiBzdHlsZVRhZ1RyYW5zZm9ybShjc3MsIHN0eWxlRWxlbWVudCkge1xuICBpZiAoc3R5bGVFbGVtZW50LnN0eWxlU2hlZXQpIHtcbiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzO1xuICB9IGVsc2Uge1xuICAgIHdoaWxlIChzdHlsZUVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgc3R5bGVFbGVtZW50LnJlbW92ZUNoaWxkKHN0eWxlRWxlbWVudC5maXJzdENoaWxkKTtcbiAgICB9XG4gICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzcykpO1xuICB9XG59XG5tb2R1bGUuZXhwb3J0cyA9IHN0eWxlVGFnVHJhbnNmb3JtOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./node_modules/style-loader/dist/runtime/styleTagTransform.js\n\n}");
110
+
111
+ /***/ },
112
+
113
+ /***/ "./src/webapp/index.ts"
114
+ /*!*****************************!*\
115
+ !*** ./src/webapp/index.ts ***!
116
+ \*****************************/
117
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
118
+
119
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"default\": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony import */ var _styles_css__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./styles.css */ \"./src/webapp/styles.css\");\n/* harmony import */ var _utils_apiFetch__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./utils/apiFetch */ \"./src/webapp/utils/apiFetch.ts\");\n\n\n// Constants\nconst API_BASE_PATH = \"/plugins/signalk-edge-link\";\nconst DELTA_TIMER_MIN = 100;\nconst DELTA_TIMER_MAX = 10000;\nconst NOTIFICATION_TIMEOUT = 4000;\nconst METRICS_REFRESH_INTERVAL = 15000;\nconst JSON_SYNC_DEBOUNCE = 300;\n// Escape HTML special characters to prevent XSS when inserting dynamic values into innerHTML\nfunction escapeHtml(str) {\n return String(str)\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n// HTML Template Helpers\nconst renderCard = (title, subtitle, contentId, contentClass = \"\") => `\n <div class=\"config-section\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h2>${escapeHtml(title)}</h2>\n ${subtitle ? `<p class=\"subtitle\">${escapeHtml(subtitle)}</p>` : \"\"}\n </div>\n <div class=\"card-content\">\n <div id=\"${contentId}\" class=\"${contentClass || contentId + \"-info\"}\">\n <p>Loading ${escapeHtml(title.toLowerCase())}...</p>\n </div>\n </div>\n </div>\n </div>\n`;\nconst renderStatItem = (label, value, hasError = false) => `\n <div class=\"stat-item${hasError ? \" error\" : \"\"}\">\n <span class=\"stat-label\">${escapeHtml(label)}:</span>\n <span class=\"stat-value\">${escapeHtml(value)}</span>\n </div>\n`;\nconst renderMetricItem = (label, value, statusClass = \"\") => `\n <div class=\"metric-item${statusClass ? \" \" + statusClass : \"\"}\">\n <div class=\"metric-label\">${escapeHtml(label)}</div>\n <div class=\"metric-value\">${escapeHtml(value)}</div>\n </div>\n`;\n// Variants that accept a pre-sanitized HTML string as the value (label is still escaped)\nconst renderMetricItemHtml = (label, htmlValue, statusClass = \"\") => `\n <div class=\"metric-item${statusClass ? \" \" + statusClass : \"\"}\">\n <div class=\"metric-label\">${escapeHtml(label)}</div>\n <div class=\"metric-value\">${htmlValue}</div>\n </div>\n`;\nconst renderStatItemHtml = (label, htmlValue, hasError = false) => `\n <div class=\"stat-item${hasError ? \" error\" : \"\"}\">\n <span class=\"stat-label\">${escapeHtml(label)}:</span>\n <span class=\"stat-value\">${htmlValue}</span>\n </div>\n`;\nconst renderBwStat = (label, value, isHighlight = false, isSuccess = false) => `\n <div class=\"bw-stat${isHighlight ? \" highlight\" : \"\"}\">\n <span class=\"bw-label\">${escapeHtml(label)}:</span>\n <span class=\"bw-value${isSuccess ? \" success-text\" : \"\"}\">${escapeHtml(value)}</span>\n </div>\n`;\nconst renderSectionGroup = (title, description, content, id = \"\") => `\n <section class=\"page-group\"${id ? ` id=\"${id}\"` : \"\"}>\n <div class=\"page-group-header\">\n <h2>${escapeHtml(title)}</h2>\n ${description ? `<p>${escapeHtml(description)}</p>` : \"\"}\n </div>\n <div class=\"page-group-content\">\n ${content}\n </div>\n </section>\n`;\nclass DataConnectorConfig {\n constructor() {\n /** True while syncFromJson() is rebuilding the path-input list — prevents\n * addPathItem() from triggering updateJsonFromForm() which would drop the\n * textarea's meta block on every path added. */\n this.isHydratingFromTextarea = false;\n this.connections = [];\n this.activeConnectionId = null;\n this.pluginConfig = null;\n this.pluginSchema = null;\n this.schemaCurrentMode = null;\n this.metricsInterval = null;\n this.syncTimeout = null;\n this.tokenHelpText = (0,_utils_apiFetch__WEBPACK_IMPORTED_MODULE_1__.getTokenHelpText)();\n // Per-connection state (loaded for the active tab)\n this.deltaTimerConfig = null;\n this.subscriptionConfig = null;\n this.sentenceFilterConfig = null;\n this.protocolVersion = 1;\n this.isServerMode = false;\n this._refreshInFlight = false;\n this._notificationTimer = null;\n this.init();\n }\n async init() {\n try {\n await this.loadPluginConfiguration(false);\n await this.fetchConnections();\n this.renderPage();\n this.startMetricsRefresh();\n }\n catch (error) {\n console.error(\"Initialization error:\", error);\n this.showNotification(\"Failed to initialize application: \" +\n (error instanceof Error ? error.message : String(error)), \"error\");\n }\n }\n // ── Connections list ───────────────────────────────────────────────────────\n async fetchConnections() {\n try {\n const res = await this.request(`${API_BASE_PATH}/connections`);\n if (res.ok) {\n this.connections = await res.json();\n }\n }\n catch (_e) {\n // /connections not available – fall back to legacy single-instance detection\n }\n if (!this.connections || this.connections.length === 0) {\n // Fallback: detect mode from plugin config and treat as single connection\n const type = this.detectModeFromConfig();\n this.connections = [{ id: \"_legacy\", name: \"Default\", type }];\n }\n if (!this.activeConnectionId) {\n this.activeConnectionId = this.connections[0].id;\n }\n }\n detectModeFromConfig() {\n if (this.pluginConfig) {\n const st = this.normalizeServerType(this.pluginConfig.serverType);\n if (st) {\n return st;\n }\n }\n if (this.schemaCurrentMode) {\n return this.schemaCurrentMode;\n }\n return \"client\";\n }\n getActiveConnection() {\n return this.connections.find((c) => c.id === this.activeConnectionId) || this.connections[0];\n }\n isLegacyMode() {\n return this.connections.length === 1 && this.connections[0].id === \"_legacy\";\n }\n // ── API path helpers ───────────────────────────────────────────────────────\n metricsPath(connId) {\n if (connId === \"_legacy\") {\n return `${API_BASE_PATH}/metrics`;\n }\n return `${API_BASE_PATH}/connections/${encodeURIComponent(connId)}/metrics`;\n }\n configPath(connId, filename) {\n if (connId === \"_legacy\") {\n return `${API_BASE_PATH}/config/${filename}`;\n }\n return `${API_BASE_PATH}/connections/${encodeURIComponent(connId)}/config/${filename}`;\n }\n monitoringPath(connId, sub) {\n if (connId === \"_legacy\") {\n return `${API_BASE_PATH}/monitoring/${sub}`;\n }\n return `${API_BASE_PATH}/connections/${encodeURIComponent(connId)}/monitoring/${sub}`;\n }\n congestionPath(connId) {\n if (connId === \"_legacy\") {\n return `${API_BASE_PATH}/congestion`;\n }\n return `${API_BASE_PATH}/connections/${encodeURIComponent(connId)}/congestion`;\n }\n bondingPath(connId) {\n if (connId === \"_legacy\") {\n return `${API_BASE_PATH}/bonding`;\n }\n return `${API_BASE_PATH}/connections/${encodeURIComponent(connId)}/bonding`;\n }\n bondingFailoverPath(connId) {\n if (connId === \"_legacy\") {\n return `${API_BASE_PATH}/bonding/failover`;\n }\n return `${API_BASE_PATH}/connections/${encodeURIComponent(connId)}/bonding/failover`;\n }\n async request(input, init = {}) {\n const response = await (0,_utils_apiFetch__WEBPACK_IMPORTED_MODULE_1__.apiFetch)(input, init);\n if (response.status === 401) {\n const error = new Error(_utils_apiFetch__WEBPACK_IMPORTED_MODULE_1__.MANAGEMENT_TOKEN_ERROR_MESSAGE);\n error.isUnauthorized = true;\n throw error;\n }\n return response;\n }\n authFailureMessage(context) {\n return `${_utils_apiFetch__WEBPACK_IMPORTED_MODULE_1__.MANAGEMENT_TOKEN_ERROR_MESSAGE} Failed while ${context}. ${this.tokenHelpText}`;\n }\n // ── Page rendering ─────────────────────────────────────────────────────────\n renderPage() {\n this.renderTabs();\n this.renderConnectionContent();\n }\n renderTabs() {\n const tabsDiv = document.getElementById(\"connectionTabs\");\n if (!tabsDiv) {\n return;\n }\n if (this.connections.length <= 1) {\n tabsDiv.innerHTML = \"\";\n tabsDiv.style.display = \"none\";\n return;\n }\n tabsDiv.style.display = \"\";\n tabsDiv.innerHTML = `<div class=\"tabs-container\">${this.connections\n .map((c) => {\n const icon = c.type === \"server\" ? \"&#x1F5A5;\" : \"&#x1F4F1;\";\n const statusDot = c.healthy === false\n ? '<span class=\"tab-status-dot error\"></span>'\n : c.readyToSend || c.type === \"server\"\n ? '<span class=\"tab-status-dot ok\"></span>'\n : '<span class=\"tab-status-dot warning\"></span>';\n return `<button class=\"connection-tab${c.id === this.activeConnectionId ? \" active\" : \"\"}\"\n data-connection-id=\"${this.escapeHtml(c.id)}\">\n ${statusDot}\n <span class=\"tab-icon\">${icon}</span>\n <span class=\"tab-name\">${this.escapeHtml(c.name || c.id)}</span>\n <span class=\"tab-type\">${this.escapeHtml(c.type)}</span>\n </button>`;\n })\n .join(\"\")}</div>`;\n // Attach tab click listeners\n tabsDiv.querySelectorAll(\".connection-tab\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n const id = btn.dataset.connectionId;\n if (id !== this.activeConnectionId) {\n this.activeConnectionId = id;\n this.renderPage();\n this.loadConnectionData();\n }\n });\n });\n }\n renderConnectionContent() {\n const contentDiv = document.getElementById(\"connectionContent\");\n if (!contentDiv) {\n return;\n }\n const conn = this.getActiveConnection();\n this.isServerMode = conn.type === \"server\";\n if (this.isServerMode) {\n this.renderServerContent(contentDiv);\n }\n else {\n this.renderClientContent(contentDiv);\n }\n this.setupEventListeners();\n this.loadConnectionData();\n }\n renderServerContent(container) {\n const telemetryAndHealth = renderCard(\"Performance Metrics\", \"Real-time reception statistics (auto-refreshes every 15 seconds)\", \"metrics\") +\n '<div id=\"monitoringSection\" style=\"display:none;\">' +\n renderCard(\"Network Quality\", \"Link quality score and network health indicators\", \"networkQuality\") +\n renderCard(\"Bandwidth Monitor\", \"Network reception statistics\", \"bandwidth\") +\n renderCard(\"Path Analytics\", \"Incoming data volume by SignalK path\", \"pathAnalytics\") +\n renderCard(\"Monitoring & Alerts\", \"Packet loss, retransmission tracking, and alert thresholds\", \"monitoringAlerts\") +\n \"</div>\";\n container.innerHTML =\n renderSectionGroup(\"Operations & Monitoring\", \"Track reception quality, throughput, and runtime behavior.\", telemetryAndHealth, \"operationsGroup\") +\n renderSectionGroup(\"Advanced\", \"Full plugin configurator (JSON editor).\", this.renderPluginConfigurationCard(), \"advancedGroup\");\n }\n renderClientContent(container) {\n const configuration = this.renderDeltaTimerCard() + this.renderSubscriptionCard() + this.renderSentenceFilterCard();\n const telemetryAndHealth = renderCard(\"Performance Metrics\", \"Real-time transmission statistics (auto-refreshes every 15 seconds)\", \"metrics\") +\n '<div id=\"congestionSection\" class=\"config-section\" style=\"display:none;\">' +\n renderCard(\"Network Quality\", \"Link quality score and network health indicators\", \"networkQuality\") +\n renderCard(\"Bandwidth Monitor\", \"Real-time data transmission statistics\", \"bandwidth\") +\n renderCard(\"Path Analytics\", \"Data volume by subscription path\", \"pathAnalytics\") +\n renderCard(\"Congestion Control\", \"AIMD congestion control state and delta timer auto-adjustment\", \"congestionControl\") +\n \"</div>\" +\n '<div id=\"bondingSection\" class=\"config-section\" style=\"display:none;\">' +\n renderCard(\"Connection Bonding\", \"Multi-link bonding status and failover control\", \"bondingStatus\") +\n \"</div>\" +\n '<div id=\"monitoringSection\" style=\"display:none;\">' +\n renderCard(\"Monitoring & Alerts\", \"Packet loss, retransmission tracking, and alert thresholds\", \"monitoringAlerts\") +\n \"</div>\" +\n renderCard(\"Status\", null, \"status\", \"status-info\");\n container.innerHTML =\n renderSectionGroup(\"Configuration\", \"Set up transmission behavior and plugin-level parameters.\", configuration, \"configurationGroup\") +\n renderSectionGroup(\"Operations & Monitoring\", \"Track transmission quality, reliability, and runtime performance.\", telemetryAndHealth, \"operationsGroup\") +\n renderSectionGroup(\"Advanced\", \"Full plugin configurator (JSON editor).\", this.renderPluginConfigurationCard(), \"advancedGroup\");\n }\n renderDeltaTimerCard() {\n return `\n <div class=\"config-section\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h2>Delta Timer Configuration</h2>\n <p>Controls how often deltas are collected and sent (in milliseconds)</p>\n </div>\n <div class=\"card-content\">\n <div class=\"form-group\">\n <label for=\"deltaTimer\">Delta Timer (ms):</label>\n <input type=\"number\" id=\"deltaTimer\" min=\"100\" max=\"10000\" step=\"100\" placeholder=\"1000\" />\n <small class=\"help-text\">\n Lower values = more frequent updates, higher bandwidth usage<br>\n Higher values = better compression ratio, lower bandwidth usage\n </small>\n </div>\n <button id=\"saveDeltaTimer\" class=\"btn btn-primary\">Save Delta Timer</button>\n </div>\n </div>\n </div>\n `;\n }\n renderSubscriptionCard() {\n return `\n <div class=\"config-section\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h2>Subscription Configuration</h2>\n <p>Define which SignalK data paths to subscribe to</p>\n </div>\n <div class=\"card-content\">\n <div class=\"form-group\">\n <label for=\"context\">Context:</label>\n <input type=\"text\" id=\"context\" placeholder=\"*\" />\n <small class=\"help-text\">\n Context for the subscription (e.g., \"vessels.self\", \"*\" for all)\n </small>\n </div>\n <div class=\"subscription-paths\">\n <h3>Subscription Paths</h3>\n <div id=\"pathsList\" class=\"paths-list\"></div>\n <button id=\"addPath\" class=\"btn btn-secondary\">Add Path</button>\n </div>\n <fieldset class=\"meta-config\">\n <legend>Metadata streaming</legend>\n <p class=\"help-text\">\n Also forward Signal K path metadata (units, descriptions, zones,\n display names, ...) to the remote receiver. Disabled by default.\n Meta is sent as a full snapshot at startup and re-broadcast on\n an interval so a restarted receiver can recover without a\n round-trip.\n </p>\n <div class=\"form-group\">\n <label>\n <input type=\"checkbox\" id=\"metaEnabled\" />\n Include metadata\n </label>\n </div>\n <div class=\"form-group\">\n <label for=\"metaIntervalSec\">Snapshot interval (seconds):</label>\n <input type=\"number\" id=\"metaIntervalSec\" min=\"30\" max=\"86400\" step=\"1\" placeholder=\"300\" />\n <small class=\"help-text\">Between 30 and 86400. Default 300 (5 minutes).</small>\n </div>\n <div class=\"form-group\">\n <label for=\"metaPathsRegex\">Include paths matching (regex, optional):</label>\n <input type=\"text\" id=\"metaPathsRegex\" placeholder=\"\" />\n <small class=\"help-text\">Leave empty to include every subscribed path.</small>\n </div>\n <div class=\"form-group\">\n <label for=\"metaMaxPerPacket\">Max paths per packet:</label>\n <input type=\"number\" id=\"metaMaxPerPacket\" min=\"10\" max=\"5000\" step=\"1\" placeholder=\"500\" />\n <small class=\"help-text\">Between 10 and 5000. Default 500.</small>\n </div>\n </fieldset>\n <div class=\"json-editor\">\n <h3>JSON Editor</h3>\n <textarea id=\"subscriptionJson\" rows=\"10\" placeholder='{\"context\": \"*\", \"subscribe\": [{\"path\": \"*\"}]}'></textarea>\n <small class=\"help-text\">Advanced: Edit the raw JSON configuration</small>\n </div>\n <button id=\"saveSubscription\" class=\"btn btn-primary\">Save Subscription</button>\n </div>\n </div>\n </div>\n `;\n }\n renderSentenceFilterCard() {\n return `\n <div class=\"config-section\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h2>Sentence Filter</h2>\n <p>Exclude NMEA sentences from transmission (reduces bandwidth)</p>\n </div>\n <div class=\"card-content\">\n <div class=\"form-group\">\n <label for=\"sentenceFilter\">Excluded Sentences:</label>\n <input type=\"text\" id=\"sentenceFilter\" placeholder=\"\" autocomplete=\"off\" />\n <small class=\"help-text\">\n Comma-separated list of NMEA sentence types to exclude.\n </small>\n </div>\n <button id=\"saveSentenceFilter\" class=\"btn btn-primary\">Save Sentence Filter</button>\n </div>\n </div>\n </div>\n `;\n }\n renderPluginConfigurationCard() {\n return `\n <div class=\"config-section\">\n <div class=\"card\">\n <div class=\"card-header\">\n <h2>Full Plugin Configuration</h2>\n <p>All parameters from <code>/plugin-config</code> (advanced JSON editor)</p>\n </div>\n <div class=\"card-content\">\n <div id=\"pluginConfigSummary\" class=\"plugin-config-summary\">\n <p>Loading plugin configuration...</p>\n </div>\n <div class=\"json-editor plugin-config-editor\">\n <h3>Plugin Config JSON</h3>\n <textarea\n id=\"pluginConfigJson\"\n rows=\"20\"\n placeholder='{\"serverType\":\"client\",\"udpPort\":4446,\"secretKey\":\"...\"}'\n ></textarea>\n <small class=\"help-text\">\n This editor exposes all available plugin fields. Save triggers plugin restart when supported.\n </small>\n <small class=\"help-text\">${this.escapeHtml(this.tokenHelpText)}</small>\n </div>\n <div class=\"plugin-config-actions\">\n <button id=\"savePluginConfig\" class=\"btn btn-primary\">Save Full Plugin Config</button>\n <button id=\"reloadPluginConfig\" class=\"btn btn-secondary\">Reload From Server</button>\n <button id=\"loadDefaultPluginConfig\" class=\"btn btn-secondary\">Load Schema Defaults</button>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n // ── Data loading ───────────────────────────────────────────────────────────\n async loadConnectionData() {\n const conn = this.getActiveConnection();\n const connId = conn.id;\n if (!this.isServerMode) {\n await this.loadConfigurations(connId);\n this.updateUI();\n this.updateStatus();\n }\n else {\n this.updatePluginConfigUI();\n }\n await this.loadMetrics(connId);\n }\n async loadPluginConfiguration(showErrors = true) {\n try {\n const [configResponse, schemaResponse] = await Promise.all([\n this.request(`${API_BASE_PATH}/plugin-config`),\n this.request(`${API_BASE_PATH}/plugin-schema`)\n ]);\n if (!configResponse.ok) {\n throw new Error(`Failed to load plugin configuration (${configResponse.status})`);\n }\n const configData = await configResponse.json();\n const configuration = configData &&\n configData.configuration &&\n typeof configData.configuration === \"object\" &&\n !Array.isArray(configData.configuration)\n ? configData.configuration\n : {};\n if (schemaResponse.ok) {\n const schemaData = await schemaResponse.json();\n if (schemaData && schemaData.schema && typeof schemaData.schema === \"object\") {\n this.pluginSchema = schemaData.schema;\n }\n if (schemaData &&\n (schemaData.currentMode === \"server\" || schemaData.currentMode === \"client\")) {\n this.schemaCurrentMode = schemaData.currentMode;\n }\n }\n this.pluginConfig = this.buildCompletePluginConfig(configuration);\n return true;\n }\n catch (error) {\n if (showErrors) {\n const err = error;\n this.showNotification(err.isUnauthorized\n ? this.authFailureMessage(\"loading plugin config\")\n : \"Error loading plugin config: \" + err.message, \"warning\");\n }\n return false;\n }\n }\n async loadConfigurations(connId) {\n try {\n const [deltaResponse, subResponse, filterResponse] = await Promise.all([\n this.request(this.configPath(connId, \"delta_timer.json\")),\n this.request(this.configPath(connId, \"subscription.json\")),\n this.request(this.configPath(connId, \"sentence_filter.json\"))\n ]);\n this.deltaTimerConfig = deltaResponse.ok ? await deltaResponse.json() : null;\n this.subscriptionConfig = subResponse.ok ? await subResponse.json() : null;\n this.sentenceFilterConfig = filterResponse.ok ? await filterResponse.json() : null;\n }\n catch (error) {\n const err = error;\n this.showNotification(err.isUnauthorized\n ? this.authFailureMessage(\"loading connection configuration\")\n : \"Error loading configurations: \" + err.message, \"error\");\n }\n }\n async loadMetrics(connId) {\n if (!connId) {\n connId = this.activeConnectionId;\n }\n try {\n const response = await this.request(this.metricsPath(connId));\n if (response.ok) {\n const metrics = await response.json();\n this.protocolVersion = metrics.protocolVersion || 1;\n this.updateMetricsDisplay(metrics);\n if (this.protocolVersion >= 2) {\n this.loadV2Data(connId);\n }\n }\n }\n catch (error) {\n console.error(\"Error loading metrics:\", error.message);\n }\n }\n async loadV2Data(connId) {\n const isClient = !this.isServerMode;\n const fetches = [\n this.request(this.monitoringPath(connId, \"alerts\")).catch(() => null),\n this.request(this.monitoringPath(connId, \"packet-loss\")).catch(() => null),\n this.request(this.monitoringPath(connId, \"retransmissions\")).catch(() => null)\n ];\n if (isClient) {\n fetches.push(this.request(this.congestionPath(connId)).catch(() => null), this.request(this.bondingPath(connId)).catch(() => null));\n }\n const results = await Promise.all(fetches);\n const [alertsRes, packetLossRes, retransmissionsRes, congestionRes, bondingRes] = results;\n const monitoringData = {};\n if (alertsRes && alertsRes.ok) {\n monitoringData.alerts = await alertsRes.json();\n }\n if (packetLossRes && packetLossRes.ok) {\n monitoringData.packetLoss = await packetLossRes.json();\n }\n if (retransmissionsRes && retransmissionsRes.ok) {\n monitoringData.retransmissions = await retransmissionsRes.json();\n }\n this.updateMonitoringDisplay(monitoringData);\n if (isClient && congestionRes && congestionRes.ok) {\n const congestionData = await congestionRes.json();\n this.updateCongestionDisplay(congestionData);\n }\n if (isClient && bondingRes && bondingRes.ok) {\n const bondingData = await bondingRes.json();\n this.updateBondingDisplay(bondingData);\n }\n }\n startMetricsRefresh() {\n if (this.metricsInterval) {\n clearInterval(this.metricsInterval);\n }\n this.metricsInterval = setInterval(() => {\n if (this._refreshInFlight) {\n return;\n }\n this._refreshInFlight = true;\n this.refreshActiveTab().finally(() => {\n this._refreshInFlight = false;\n });\n }, METRICS_REFRESH_INTERVAL);\n }\n async refreshActiveTab() {\n // Refresh the connections list to update tab badges\n try {\n const res = await this.request(`${API_BASE_PATH}/connections`);\n if (res.ok) {\n const updated = await res.json();\n if (updated.length > 0) {\n this.connections = updated;\n this.renderTabs();\n }\n }\n }\n catch (_e) {\n /* ignore */\n }\n await this.loadMetrics(this.activeConnectionId);\n }\n // ── Event listeners ────────────────────────────────────────────────────────\n setupEventListeners() {\n const saveDeltaTimerBtn = document.getElementById(\"saveDeltaTimer\");\n if (saveDeltaTimerBtn) {\n saveDeltaTimerBtn.addEventListener(\"click\", () => this.saveDeltaTimer());\n }\n const saveSubscriptionBtn = document.getElementById(\"saveSubscription\");\n if (saveSubscriptionBtn) {\n saveSubscriptionBtn.addEventListener(\"click\", () => this.saveSubscription());\n }\n const saveSentenceFilterBtn = document.getElementById(\"saveSentenceFilter\");\n if (saveSentenceFilterBtn) {\n saveSentenceFilterBtn.addEventListener(\"click\", () => this.saveSentenceFilter());\n }\n const addPathBtn = document.getElementById(\"addPath\");\n if (addPathBtn) {\n addPathBtn.addEventListener(\"click\", () => this.addPathItem());\n }\n const subscriptionJsonEditor = document.getElementById(\"subscriptionJson\");\n if (subscriptionJsonEditor) {\n subscriptionJsonEditor.addEventListener(\"input\", () => {\n if (this.syncTimeout) {\n clearTimeout(this.syncTimeout);\n }\n this.syncTimeout = setTimeout(() => this.syncFromJson(), JSON_SYNC_DEBOUNCE);\n });\n }\n const contextInput = document.getElementById(\"context\");\n if (contextInput) {\n contextInput.addEventListener(\"input\", () => this.updateJsonFromForm());\n }\n // Meta controls feed the same JSON-from-form sync so the textarea always\n // reflects the current state of the structured controls. Without these\n // listeners, the textarea would lag behind the form until save and the\n // user viewing the raw JSON would see stale content.\n for (const metaId of [\"metaEnabled\", \"metaIntervalSec\", \"metaPathsRegex\", \"metaMaxPerPacket\"]) {\n const el = document.getElementById(metaId);\n if (el) {\n el.addEventListener(\"input\", () => this.updateJsonFromForm());\n if (metaId === \"metaEnabled\") {\n // checkbox emits \"change\" rather than \"input\" on some browsers\n el.addEventListener(\"change\", () => this.updateJsonFromForm());\n }\n }\n }\n const savePluginConfigBtn = document.getElementById(\"savePluginConfig\");\n if (savePluginConfigBtn) {\n savePluginConfigBtn.addEventListener(\"click\", () => this.savePluginConfig());\n }\n const reloadPluginConfigBtn = document.getElementById(\"reloadPluginConfig\");\n if (reloadPluginConfigBtn) {\n reloadPluginConfigBtn.addEventListener(\"click\", () => this.reloadPluginConfiguration());\n }\n const loadDefaultPluginConfigBtn = document.getElementById(\"loadDefaultPluginConfig\");\n if (loadDefaultPluginConfigBtn) {\n loadDefaultPluginConfigBtn.addEventListener(\"click\", () => this.loadDefaultPluginConfiguration());\n }\n }\n // ── UI updates ─────────────────────────────────────────────────────────────\n updateUI() {\n this.updatePluginConfigUI();\n if (this.deltaTimerConfig && this.deltaTimerConfig.deltaTimer) {\n const el = document.getElementById(\"deltaTimer\");\n if (el) {\n el.value = String(this.deltaTimerConfig.deltaTimer);\n }\n }\n if (this.subscriptionConfig) {\n const cfg = this.subscriptionConfig;\n const ctxEl = document.getElementById(\"context\");\n if (ctxEl) {\n ctxEl.value = cfg.context || \"*\";\n }\n const pathsList = document.getElementById(\"pathsList\");\n if (pathsList) {\n pathsList.innerHTML = \"\";\n if (cfg.subscribe && Array.isArray(cfg.subscribe)) {\n cfg.subscribe.forEach((sub) => this.addPathItem(sub.path));\n }\n }\n const jsonEl = document.getElementById(\"subscriptionJson\");\n if (jsonEl) {\n jsonEl.value = JSON.stringify(this.subscriptionConfig, null, 2);\n }\n // Populate the structured metadata controls from the loaded config.\n this.populateMetaControls(cfg.meta);\n }\n if (this.sentenceFilterConfig &&\n Array.isArray(this.sentenceFilterConfig.excludedSentences)) {\n const el = document.getElementById(\"sentenceFilter\");\n if (el) {\n el.value = this.sentenceFilterConfig.excludedSentences.join(\", \");\n }\n }\n }\n updatePluginConfigUI() {\n const editor = document.getElementById(\"pluginConfigJson\");\n const summary = document.getElementById(\"pluginConfigSummary\");\n if (!editor) {\n return;\n }\n if (!this.pluginConfig) {\n editor.value = \"{}\";\n if (summary) {\n summary.innerHTML = \"<p>Plugin config unavailable.</p>\";\n }\n return;\n }\n editor.value = JSON.stringify(this.pluginConfig, null, 2);\n if (summary) {\n const hasConnections = Array.isArray(this.pluginConfig.connections) &&\n this.pluginConfig.connections.length > 0;\n let summaryScope = \"Top-level\";\n let keyLabel = \"Top-Level Fields\";\n let summaryConfig = this.pluginConfig;\n if (hasConnections) {\n const totalConnections = this.pluginConfig.connections.length;\n const runtimeIndex = this.connections.findIndex((c) => c.id === this.activeConnectionId);\n const summaryIndex = runtimeIndex >= 0 && runtimeIndex < totalConnections ? runtimeIndex : 0;\n const candidate = this.pluginConfig.connections[summaryIndex];\n summaryConfig =\n candidate && typeof candidate === \"object\" && !Array.isArray(candidate) ? candidate : {};\n summaryScope = `Connection ${summaryIndex + 1}/${totalConnections}`;\n keyLabel = \"Connection Fields\";\n }\n const mode = this.normalizeServerType(summaryConfig.serverType) || \"client\";\n const protocol = Number(summaryConfig.protocolVersion) >= 2 ? Number(summaryConfig.protocolVersion) : 1;\n const keyCount = Object.keys(summaryConfig).length;\n summary.innerHTML = `\n <div class=\"plugin-summary-grid\">\n ${renderStatItem(\"Scope\", summaryScope)}\n ${renderStatItem(\"Mode\", mode.toUpperCase())}\n ${renderStatItem(\"Protocol\", \"v\" + String(protocol))}\n ${renderStatItem(keyLabel, String(keyCount))}\n </div>\n `;\n }\n }\n // ── Form helpers (subscription paths) ──────────────────────────────────────\n addPathItem(path = \"\") {\n const pathsList = document.getElementById(\"pathsList\");\n if (!pathsList) {\n return;\n }\n const pathItem = document.createElement(\"div\");\n pathItem.className = \"path-item\";\n const input = document.createElement(\"input\");\n input.type = \"text\";\n input.value = path;\n input.placeholder = \"navigation.position\";\n input.className = \"path-input\";\n const button = document.createElement(\"button\");\n button.type = \"button\";\n button.className = \"btn btn-danger\";\n button.textContent = \"Remove\";\n input.addEventListener(\"input\", () => this.updateJsonFromForm());\n button.addEventListener(\"click\", () => {\n pathItem.remove();\n this.updateJsonFromForm();\n });\n pathItem.appendChild(input);\n pathItem.appendChild(button);\n pathsList.appendChild(pathItem);\n this.updateJsonFromForm();\n }\n updateJsonFromForm() {\n // Skip form → JSON syncing while we're hydrating the form from a\n // pasted/loaded JSON — otherwise addPathItem() would fire this on every\n // added path-input and reserialize the subscription.json as just\n // {context, subscribe} without the meta block, silently dropping meta\n // from pasted configs.\n if (this.isHydratingFromTextarea) {\n return;\n }\n const contextEl = document.getElementById(\"context\");\n const context = contextEl ? contextEl.value || \"*\" : \"*\";\n const pathInputs = document.querySelectorAll(\".path-input\");\n const subscribe = Array.from(pathInputs)\n .map((input) => ({ path: input.value }))\n .filter((sub) => sub.path.trim() !== \"\");\n // Build the meta block from the structured controls — they are the\n // authoritative source for metadata settings. The textarea becomes a\n // read-only mirror of the form state, kept in sync on every input.\n const config = { context, subscribe };\n const metaEnabledEl = document.getElementById(\"metaEnabled\");\n if (metaEnabledEl && metaEnabledEl.checked) {\n const intervalEl = document.getElementById(\"metaIntervalSec\");\n const pathsEl = document.getElementById(\"metaPathsRegex\");\n const maxEl = document.getElementById(\"metaMaxPerPacket\");\n const intervalSec = intervalEl && intervalEl.value ? Number(intervalEl.value) : 300;\n const maxPathsPerPacket = maxEl && maxEl.value ? Number(maxEl.value) : 500;\n const includePathsMatching = pathsEl && pathsEl.value ? pathsEl.value : null;\n config.meta = {\n enabled: true,\n intervalSec,\n includePathsMatching,\n maxPathsPerPacket\n };\n }\n const jsonEl = document.getElementById(\"subscriptionJson\");\n if (jsonEl) {\n jsonEl.value = JSON.stringify(config, null, 2);\n }\n }\n /** Populate the structured meta controls from a parsed `meta` block.\n * Passing undefined/null resets the controls to their empty state so the\n * UI always matches what the textarea / loaded config contains. */\n populateMetaControls(meta) {\n const metaEnabled = document.getElementById(\"metaEnabled\");\n if (metaEnabled) {\n metaEnabled.checked = !!(meta && meta.enabled === true);\n }\n const metaIntervalSec = document.getElementById(\"metaIntervalSec\");\n if (metaIntervalSec) {\n metaIntervalSec.value =\n meta && typeof meta.intervalSec === \"number\" ? String(meta.intervalSec) : \"\";\n }\n const metaPathsRegex = document.getElementById(\"metaPathsRegex\");\n if (metaPathsRegex) {\n metaPathsRegex.value =\n meta && typeof meta.includePathsMatching === \"string\" ? meta.includePathsMatching : \"\";\n }\n const metaMaxPerPacket = document.getElementById(\"metaMaxPerPacket\");\n if (metaMaxPerPacket) {\n metaMaxPerPacket.value =\n meta && typeof meta.maxPathsPerPacket === \"number\" ? String(meta.maxPathsPerPacket) : \"\";\n }\n }\n syncFromJson() {\n this.isHydratingFromTextarea = true;\n try {\n const jsonEl = document.getElementById(\"subscriptionJson\");\n if (!jsonEl) {\n return;\n }\n const config = JSON.parse(jsonEl.value);\n const ctxEl = document.getElementById(\"context\");\n if (ctxEl) {\n ctxEl.value = config.context || \"*\";\n }\n const pathsList = document.getElementById(\"pathsList\");\n if (pathsList) {\n pathsList.innerHTML = \"\";\n if (config.subscribe && Array.isArray(config.subscribe)) {\n config.subscribe.forEach((sub) => this.addPathItem(sub.path || \"\"));\n }\n }\n // Keep the meta form in sync with the raw JSON editor. Without this,\n // editing the textarea would leave the checkbox/interval/regex/max\n // controls showing the previously-loaded values.\n this.populateMetaControls(config.meta);\n }\n catch (error) {\n console.warn(\"Invalid JSON in editor:\", error.message);\n }\n finally {\n this.isHydratingFromTextarea = false;\n }\n }\n // ── Save operations ────────────────────────────────────────────────────────\n async saveConfig(filename, config, configKey, label) {\n const connId = this.activeConnectionId;\n try {\n const response = await this.request(this.configPath(connId, filename), {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(config)\n });\n if (response.ok) {\n this[configKey] = config;\n this.showNotification(`${label} saved successfully!`, \"success\");\n this.updateStatus();\n }\n else {\n throw new Error(\"Failed to save configuration\");\n }\n }\n catch (error) {\n const err = error;\n this.showNotification(err.isUnauthorized\n ? this.authFailureMessage(`saving ${label.toLowerCase()}`)\n : `Error saving ${label.toLowerCase()}: ` + err.message, \"error\");\n }\n }\n async saveDeltaTimer() {\n const deltaTimer = parseInt(document.getElementById(\"deltaTimer\").value);\n if (isNaN(deltaTimer) || deltaTimer < DELTA_TIMER_MIN || deltaTimer > DELTA_TIMER_MAX) {\n this.showNotification(`Delta timer must be between ${DELTA_TIMER_MIN} and ${DELTA_TIMER_MAX} milliseconds`, \"error\");\n return;\n }\n await this.saveConfig(\"delta_timer.json\", { deltaTimer }, \"deltaTimerConfig\", \"Delta timer configuration\");\n }\n async saveSubscription() {\n try {\n // Flush any pending JSON-from-textarea debounce so the structured form\n // controls (in particular the meta fieldset) reflect what's currently\n // in the textarea before we read either side. Without this, a user\n // editing the raw JSON and immediately clicking Save would lose their\n // textarea-only edits — saveSubscription writes meta from the form\n // controls, which would still be stale.\n if (this.syncTimeout) {\n clearTimeout(this.syncTimeout);\n this.syncTimeout = null;\n this.syncFromJson();\n }\n const jsonText = document.getElementById(\"subscriptionJson\").value;\n const config = JSON.parse(jsonText);\n if (!config.context) {\n throw new Error(\"Context is required\");\n }\n if (!config.subscribe || !Array.isArray(config.subscribe)) {\n throw new Error(\"Subscribe array is required\");\n }\n // The structured meta controls are authoritative for the meta block on\n // save. This lets users toggle the checkbox off (removing `meta` from\n // the saved config) or edit the interval/regex/max fields even after a\n // meta block has been saved before — the previous \"textarea wins\"\n // policy made those UI controls one-time-only after first enable.\n const metaEnabledEl = document.getElementById(\"metaEnabled\");\n if (metaEnabledEl && metaEnabledEl.checked) {\n const intervalEl = document.getElementById(\"metaIntervalSec\");\n const pathsEl = document.getElementById(\"metaPathsRegex\");\n const maxEl = document.getElementById(\"metaMaxPerPacket\");\n const intervalSec = intervalEl && intervalEl.value ? Number(intervalEl.value) : 300;\n const maxPathsPerPacket = maxEl && maxEl.value ? Number(maxEl.value) : 500;\n const includePathsMatching = pathsEl && pathsEl.value ? pathsEl.value : null;\n config.meta = {\n enabled: true,\n intervalSec,\n includePathsMatching,\n maxPathsPerPacket\n };\n }\n else if (config.meta !== undefined) {\n // Checkbox unchecked — drop any previously-saved meta block so the\n // runtime stops streaming metadata.\n delete config.meta;\n }\n await this.saveConfig(\"subscription.json\", config, \"subscriptionConfig\", \"Subscription configuration\");\n }\n catch (error) {\n this.showNotification(\"Error saving subscription: \" + error.message, \"error\");\n }\n }\n async saveSentenceFilter() {\n const filterInput = document.getElementById(\"sentenceFilter\").value;\n const excludedSentences = filterInput\n .split(\",\")\n .map((s) => s.trim().toUpperCase())\n .filter((s) => s.length > 0);\n await this.saveConfig(\"sentence_filter.json\", { excludedSentences }, \"sentenceFilterConfig\", \"Sentence filter\");\n }\n async savePluginConfig() {\n const editor = document.getElementById(\"pluginConfigJson\");\n if (!editor) {\n return;\n }\n try {\n const parsedConfig = JSON.parse(editor.value);\n if (!parsedConfig || typeof parsedConfig !== \"object\" || Array.isArray(parsedConfig)) {\n throw new Error(\"Plugin configuration must be a JSON object\");\n }\n const requestConfig = this.deepClone(parsedConfig);\n const normalizedServerType = this.normalizeServerType(requestConfig.serverType);\n if (normalizedServerType) {\n requestConfig.serverType = normalizedServerType;\n }\n const response = await this.request(`${API_BASE_PATH}/plugin-config`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(requestConfig)\n });\n const result = await response.json().catch(() => ({}));\n if (!response.ok || !result.success) {\n throw new Error(result.error || `Failed to save plugin configuration (${response.status})`);\n }\n this.pluginConfig = this.buildCompletePluginConfig(requestConfig);\n this.updatePluginConfigUI();\n this.showNotification(result.message || \"Plugin configuration saved. Refresh to apply changes.\", \"success\");\n }\n catch (error) {\n const err = error;\n this.showNotification(err.isUnauthorized\n ? this.authFailureMessage(\"saving full plugin config\")\n : \"Error saving full plugin config: \" + err.message, \"error\");\n }\n }\n async reloadPluginConfiguration() {\n const loaded = await this.loadPluginConfiguration(true);\n if (loaded) {\n this.updatePluginConfigUI();\n this.showNotification(\"Plugin configuration reloaded.\", \"success\");\n }\n }\n loadDefaultPluginConfiguration() {\n this.pluginConfig = this.buildCompletePluginConfig({});\n this.updatePluginConfigUI();\n this.showNotification(\"Loaded schema defaults into editor. Save to apply.\", \"warning\");\n }\n // ── Metrics display ────────────────────────────────────────────────────────\n updateMetricsDisplay(metrics) {\n this.updateNetworkQualityDisplay(metrics);\n this.updateBandwidthDisplay(metrics);\n this.updatePathAnalyticsDisplay(metrics);\n const metricsDiv = document.getElementById(\"metrics\");\n if (!metricsDiv) {\n return;\n }\n const isClient = metrics.mode === \"client\";\n const { stats, status, uptime } = metrics;\n const cryptoErrors = (stats.errorCounts && stats.errorCounts.crypto) || 0;\n const malformedPackets = stats.malformedPackets || 0;\n const dataPacketsReceived = stats.dataPacketsReceived || 0;\n const rateLimitedPackets = stats.rateLimitedPackets || 0;\n const droppedDeltaBatches = stats.droppedDeltaBatches || 0;\n const droppedDeltaCount = stats.droppedDeltaCount || 0;\n const hasErrors = stats.udpSendErrors > 0 ||\n stats.compressionErrors > 0 ||\n stats.encryptionErrors > 0 ||\n stats.subscriptionErrors > 0 ||\n cryptoErrors > 0 ||\n malformedPackets > 0 ||\n rateLimitedPackets > 0 ||\n droppedDeltaCount > 0;\n const protocolVersion = metrics.protocolVersion || 1;\n const protocolLabel = protocolVersion >= 2 ? `v${protocolVersion}` : \"v1\";\n const metricsGridItems = [\n renderMetricItem(\"Uptime\", uptime.formatted),\n renderMetricItem(\"Mode\", isClient ? \"Client\" : \"Server\"),\n renderMetricItemHtml(\"Protocol\", `<span class=\"protocol-badge protocol-${escapeHtml(protocolLabel)}\">${escapeHtml(protocolLabel.toUpperCase())}</span>`),\n renderMetricItem(\"Status\", status.readyToSend ? \"Ready\" : \"Not Ready\", status.readyToSend ? \"success\" : \"error\"),\n isClient ? renderMetricItem(\"Buffered Deltas\", status.deltasBuffered) : \"\"\n ].join(\"\");\n const subErrors = stats.subscriptionErrors;\n const subscriptionErrorStat = isClient\n ? renderStatItem(\"Subscription Errors\", subErrors, subErrors > 0)\n : \"\";\n const statsItems = [\n isClient\n ? renderStatItem(\"Deltas Sent\", stats.deltasSent.toLocaleString())\n : renderStatItem(\"Deltas Received\", stats.deltasReceived.toLocaleString()),\n !isClient\n ? renderStatItem(\"Data Packets Received\", dataPacketsReceived.toLocaleString())\n : \"\",\n isClient\n ? renderStatItem(\"UDP Send Errors\", stats.udpSendErrors, stats.udpSendErrors > 0)\n : \"\",\n isClient ? renderStatItem(\"UDP Retries\", stats.udpRetries) : \"\",\n !isClient\n ? renderStatItem(\"Rate-Limited Packets\", rateLimitedPackets.toLocaleString(), rateLimitedPackets > 0)\n : \"\",\n isClient\n ? renderStatItem(\"Dropped Delta Batches\", droppedDeltaBatches.toLocaleString(), droppedDeltaBatches > 0)\n : \"\",\n isClient\n ? renderStatItem(\"Dropped Deltas\", droppedDeltaCount.toLocaleString(), droppedDeltaCount > 0)\n : \"\",\n renderStatItem(\"Compression Errors\", stats.compressionErrors, stats.compressionErrors > 0),\n renderStatItem(\"Encryption Errors\", stats.encryptionErrors, stats.encryptionErrors > 0),\n subscriptionErrorStat,\n !isClient && stats.duplicatePackets > 0\n ? renderStatItem(\"Duplicate Packets\", stats.duplicatePackets.toLocaleString())\n : \"\",\n protocolVersion >= 3\n ? renderStatItem(\"Auth Failures (V3)\", cryptoErrors, cryptoErrors > 0)\n : \"\",\n renderStatItem(\"Malformed Packets\", malformedPackets, malformedPackets > 0)\n ].join(\"\");\n let metricsHtml = `\n <h4>Performance Metrics</h4>\n <div class=\"metrics-grid\">${metricsGridItems}</div>\n <div class=\"metrics-stats\">\n <h5>Transmission Statistics</h5>\n <div class=\"stats-grid\">${statsItems}</div>\n </div>\n `;\n if (isClient && metrics.smartBatching) {\n const sb = metrics.smartBatching;\n const totalSends = sb.earlySends + sb.timerSends;\n const earlyPercent = totalSends > 0 ? Math.round((sb.earlySends / totalSends) * 100) : 0;\n metricsHtml += `\n <div class=\"metrics-stats\">\n <h5>Smart Batching</h5>\n <div class=\"stats-grid\">\n ${renderStatItem(\"Avg Bytes/Delta\", sb.avgBytesPerDelta + \" bytes\")}\n ${renderStatItem(\"Max Deltas/Batch\", sb.maxDeltasPerBatch)}\n ${renderStatItem(\"Early Sends\", sb.earlySends.toLocaleString() + \" (\" + earlyPercent + \"%)\")}\n ${renderStatItem(\"Timer Sends\", sb.timerSends.toLocaleString())}\n ${renderStatItem(\"Oversized Packets\", sb.oversizedPackets, sb.oversizedPackets > 0)}\n </div>\n </div>\n `;\n }\n if (Array.isArray(metrics.recentErrors) && metrics.recentErrors.length > 0) {\n const errorItems = [...metrics.recentErrors]\n .reverse()\n .map((err) => {\n const timeAgo = Date.now() - err.timestamp;\n const timeStr = timeAgo < 60000\n ? `${Math.floor(timeAgo / 1000)}s ago`\n : `${Math.floor(timeAgo / 60000)}m ago`;\n return `\n <div class=\"recent-error-item\">\n <span class=\"error-category-badge\">${this.escapeHtml(err.category)}</span>\n <span class=\"recent-error-msg\">${this.escapeHtml(err.message)}</span>\n <span class=\"recent-error-time\">${this.escapeHtml(timeStr)}</span>\n </div>\n `;\n })\n .join(\"\");\n metricsHtml += `\n <div class=\"metrics-error\">\n <h5>Recent Errors (${metrics.recentErrors.length})</h5>\n <div class=\"recent-errors-list\">${errorItems}</div>\n </div>\n `;\n }\n else if (metrics.lastError) {\n const timeAgo = metrics.lastError.timeAgo;\n const timeAgoStr = timeAgo < 60000\n ? `${Math.floor(timeAgo / 1000)}s ago`\n : `${Math.floor(timeAgo / 60000)}m ago`;\n metricsHtml += `\n <div class=\"metrics-error\">\n <h5>Last Error</h5>\n <div class=\"error-message\">${this.escapeHtml(metrics.lastError.message)}</div>\n <div class=\"error-time\">Occurred ${timeAgoStr}</div>\n </div>\n `;\n }\n else if (!hasErrors) {\n metricsHtml += `\n <div class=\"metrics-success\">\n <div class=\"success-message\">No errors detected</div>\n </div>\n `;\n }\n metricsDiv.innerHTML = metricsHtml;\n }\n updateNetworkQualityDisplay(metrics) {\n const nqDiv = document.getElementById(\"networkQuality\");\n if (!nqDiv || !metrics.networkQuality) {\n return;\n }\n const nq = metrics.networkQuality;\n const isClient = metrics.mode === \"client\";\n let qualityLabel = \"N/A\";\n let qualityColor = \"#9E9E9E\";\n if (nq.linkQuality !== undefined) {\n if (nq.linkQuality >= 90) {\n qualityLabel = \"Excellent\";\n qualityColor = \"#4CAF50\";\n }\n else if (nq.linkQuality >= 70) {\n qualityLabel = \"Good\";\n qualityColor = \"#FFC107\";\n }\n else if (nq.linkQuality >= 50) {\n qualityLabel = \"Fair\";\n qualityColor = \"#FF9800\";\n }\n else {\n qualityLabel = \"Poor\";\n qualityColor = \"#F44336\";\n }\n }\n const qualityPct = nq.linkQuality !== undefined ? nq.linkQuality : 0;\n const gaugeAngle = (qualityPct / 100) * 180;\n const radStart = Math.PI;\n const radEnd = radStart + (gaugeAngle * Math.PI) / 180;\n const cx = 50, cy = 50, r = 40;\n const x1 = cx + r * Math.cos(radStart);\n const y1 = cy + r * Math.sin(radStart);\n const x2 = cx + r * Math.cos(radEnd);\n const y2 = cy + r * Math.sin(radEnd);\n const largeArc = gaugeAngle > 180 ? 1 : 0;\n const gaugeArcPath = qualityPct > 0\n ? `<path d=\"M ${x1} ${y1} A ${r} ${r} 0 ${largeArc} 1 ${x2} ${y2}\"\n fill=\"none\" stroke=\"${qualityColor}\" stroke-width=\"8\" stroke-linecap=\"round\"/>`\n : \"\";\n const gaugeSvg = `\n <svg viewBox=\"0 0 100 55\" class=\"quality-gauge\" preserveAspectRatio=\"xMidYMid meet\">\n <path d=\"M ${cx - r} ${cy} A ${r} ${r} 0 0 1 ${cx + r} ${cy}\"\n fill=\"none\" stroke=\"#E0E0E0\" stroke-width=\"8\" stroke-linecap=\"round\"/>\n ${gaugeArcPath}\n <text x=\"${cx}\" y=\"${cy - 5}\" text-anchor=\"middle\" font-size=\"16\" font-weight=\"bold\" fill=\"${qualityColor}\">\n ${qualityPct}\n </text>\n <text x=\"${cx}\" y=\"${cy + 8}\" text-anchor=\"middle\" font-size=\"7\" fill=\"#666\">\n ${qualityLabel}\n </text>\n </svg>\n `;\n const rttDisplay = nq.rtt !== undefined ? nq.rtt + \" ms\" : \"N/A\";\n const jitterDisplay = nq.jitter !== undefined ? nq.jitter + \" ms\" : \"N/A\";\n const packetLoss = Number.isFinite(nq.packetLoss) ? nq.packetLoss : 0;\n const retransmitRate = Number.isFinite(nq.retransmitRate) ? nq.retransmitRate : 0;\n const packetLossDisplay = this.formatRatioPercent(packetLoss);\n const retransmitRateDisplay = this.formatRatioPercent(retransmitRate);\n const dataSourceDisplay = nq.dataSource || \"local\";\n let nqHtml = `\n <div class=\"network-quality-dashboard\">\n <div class=\"nq-hero\">\n <div class=\"nq-gauge-container\">\n ${gaugeSvg}\n <div class=\"nq-gauge-label\">Link Quality</div>\n </div>\n <div class=\"nq-key-metrics\">\n ${renderMetricItem(\"RTT\", rttDisplay, nq.rtt > 500 ? \"error\" : nq.rtt > 200 ? \"warning\" : \"\")}\n ${renderMetricItem(\"Jitter\", jitterDisplay, nq.jitter > 100 ? \"error\" : nq.jitter > 50 ? \"warning\" : \"\")}\n ${renderMetricItem(\"Packet Loss\", packetLossDisplay, packetLoss > 0.1 ? \"error\" : packetLoss > 0.03 ? \"warning\" : \"\")}\n </div>\n </div>\n\n <div class=\"nq-details\">\n <h5>Reliability Statistics</h5>\n <div class=\"stats-grid\">\n ${renderStatItem(\"Data Source\", dataSourceDisplay)}\n ${nq.activeLink ? renderStatItem(\"Active Link\", nq.activeLink) : \"\"}\n ${renderStatItem(\"Retransmit Rate\", retransmitRateDisplay, retransmitRate > 0.1)}\n ${nq.lastRemoteUpdate\n ? renderStatItem(\"Last Remote Update\", this.formatTimestampAge(nq.lastRemoteUpdate))\n : \"\"}\n `;\n if (isClient) {\n nqHtml += `\n ${renderStatItem(\"Retransmissions\", (nq.retransmissions || 0).toLocaleString(), nq.retransmissions > 0)}\n ${renderStatItem(\"Queue Depth\", (nq.queueDepth || 0).toLocaleString(), nq.queueDepth > 100)}\n `;\n }\n else {\n nqHtml += `\n ${renderStatItem(\"ACKs Sent\", (nq.acksSent || 0).toLocaleString())}\n ${renderStatItem(\"NAKs Sent\", (nq.naksSent || 0).toLocaleString(), nq.naksSent > 0)}\n `;\n }\n nqHtml += `\n </div>\n </div>\n </div>\n `;\n nqDiv.innerHTML = nqHtml;\n }\n updateBandwidthDisplay(metrics) {\n const bandwidthDiv = document.getElementById(\"bandwidth\");\n if (!bandwidthDiv || !metrics.bandwidth) {\n return;\n }\n const bw = metrics.bandwidth;\n const isClient = metrics.mode === \"client\";\n const savedBytes = isClient ? bw.bytesOutRaw - bw.bytesOut : bw.bytesInRaw - bw.bytesIn;\n const savedFormatted = this.formatBytes(savedBytes > 0 ? savedBytes : 0);\n const metaBytesOut = bw.metaBytesOut || 0;\n const metaBytesIn = bw.metaBytesIn || 0;\n const metaPacketsOut = bw.metaPacketsOut || 0;\n const metaPacketsIn = bw.metaPacketsIn || 0;\n const metaSnapshotsSent = bw.metaSnapshotsSent || 0;\n const metaDiffsSent = bw.metaDiffsSent || 0;\n const metaRateLimitedPackets = bw.metaRateLimitedPackets || 0;\n let bandwidthStats;\n let metadataStats;\n if (isClient) {\n bandwidthStats = [\n renderBwStat(\"Total Sent (Compressed)\", bw.bytesOutFormatted),\n renderBwStat(\"Total Raw (Before Compression)\", bw.bytesOutRawFormatted),\n renderBwStat(\"Bandwidth Saved\", savedFormatted, true, true),\n renderBwStat(\"Packets Sent\", bw.packetsOut.toLocaleString())\n ];\n metadataStats = [\n renderBwStat(\"Metadata Sent\", bw.metaBytesOutFormatted || this.formatBytes(metaBytesOut)),\n renderBwStat(\"Metadata Packets Sent\", metaPacketsOut.toLocaleString()),\n renderBwStat(\"Metadata Snapshots Sent\", metaSnapshotsSent.toLocaleString()),\n renderBwStat(\"Metadata Diffs Sent\", metaDiffsSent.toLocaleString())\n ];\n }\n else {\n bandwidthStats = [\n renderBwStat(\"Total Received (Compressed)\", bw.bytesInFormatted),\n renderBwStat(\"Total Raw (After Decompression)\", bw.bytesInRawFormatted || this.formatBytes(bw.bytesInRaw || 0)),\n renderBwStat(\"Bandwidth Saved\", savedFormatted, true, true),\n renderBwStat(\"Packets Received\", bw.packetsIn.toLocaleString())\n ];\n metadataStats = [\n renderBwStat(\"Metadata Received\", bw.metaBytesInFormatted || this.formatBytes(metaBytesIn)),\n renderBwStat(\"Metadata Packets Received\", metaPacketsIn.toLocaleString()),\n renderBwStat(\"Metadata Rate-Limited\", metaRateLimitedPackets.toLocaleString())\n ];\n }\n const bandwidthHtml = `\n <div class=\"bandwidth-dashboard\">\n <div class=\"bandwidth-hero\">\n <div class=\"hero-stat ${isClient ? \"primary\" : \"secondary\"}\">\n <div class=\"hero-value\">${isClient ? bw.rateOutFormatted : bw.rateInFormatted}</div>\n <div class=\"hero-label\">${isClient ? \"Upload Rate\" : \"Download Rate\"}</div>\n </div>\n <div class=\"hero-stat success\">\n <div class=\"hero-value\">${bw.compressionRatio}%</div>\n <div class=\"hero-label\">Compression Ratio</div>\n </div>\n <div class=\"hero-stat\">\n <div class=\"hero-value\">${bw.avgPacketSizeFormatted}</div>\n <div class=\"hero-label\">Avg Packet Size</div>\n </div>\n </div>\n\n <div class=\"bandwidth-details\">\n <h5>Bandwidth Details</h5>\n <div class=\"bandwidth-grid\">${bandwidthStats.join(\"\")}</div>\n </div>\n\n <div class=\"bandwidth-details metadata-details\">\n <h5>Metadata Traffic</h5>\n <div class=\"bandwidth-grid\">${metadataStats.join(\"\")}</div>\n </div>\n\n ${this.renderBandwidthChart(bw.history, isClient)}\n </div>\n `;\n bandwidthDiv.innerHTML = bandwidthHtml;\n }\n renderBandwidthChart(history, isClient) {\n if (!history || history.length < 2) {\n return `\n <div class=\"bandwidth-chart-placeholder\">\n <p>Collecting data for chart... (${history ? history.length : 0}/2 points)</p>\n </div>\n `;\n }\n const width = 100;\n const height = 40;\n const maxRate = Math.max(...history.map((h) => (isClient ? h.rateOut : h.rateIn)), 1);\n const points = history\n .map((h, i) => {\n const x = (i / (history.length - 1)) * width;\n const y = height - ((isClient ? h.rateOut : h.rateIn) / maxRate) * height;\n return `${x},${y}`;\n })\n .join(\" \");\n const maxRateFormatted = this.formatBytes(maxRate);\n const intervalSeconds = METRICS_REFRESH_INTERVAL / 1000;\n return `\n <div class=\"bandwidth-chart\">\n <h5>Rate History (Last ${history.length * intervalSeconds}s)</h5>\n <div class=\"chart-container\">\n <svg viewBox=\"0 0 ${width} ${height}\" class=\"sparkline\" preserveAspectRatio=\"none\">\n <polyline\n fill=\"none\"\n stroke=\"var(--primary-color)\"\n stroke-width=\"1.5\"\n points=\"${points}\"\n />\n </svg>\n <div class=\"chart-labels\">\n <span class=\"chart-max\">${maxRateFormatted}/s</span>\n <span class=\"chart-min\">0</span>\n </div>\n </div>\n </div>\n `;\n }\n updatePathAnalyticsDisplay(metrics) {\n const pathDiv = document.getElementById(\"pathAnalytics\");\n if (!pathDiv || !metrics.pathStats) {\n return;\n }\n const paths = metrics.pathStats;\n if (paths.length === 0) {\n pathDiv.innerHTML = `\n <div class=\"path-analytics-empty\">\n <p>No path data collected yet. Data will appear once deltas are transmitted.</p>\n </div>\n `;\n return;\n }\n const categoryCount = new Set(paths.map((p) => p.path.split(\".\")[0])).size;\n let pathHtml = `\n <div class=\"path-analytics-dashboard\">\n <div class=\"path-summary\">\n <div class=\"summary-stat\">\n <span class=\"summary-value\">${paths.length}</span>\n <span class=\"summary-label\">Active Paths</span>\n </div>\n <div class=\"summary-stat\">\n <span class=\"summary-value\">${categoryCount}</span>\n <span class=\"summary-label\">Categories</span>\n </div>\n </div>\n\n <div class=\"path-table-container\">\n <table class=\"path-table\">\n <thead>\n <tr>\n <th>Path</th>\n <th>Updates/min</th>\n <th>Data Volume</th>\n <th>% of Total</th>\n </tr>\n </thead>\n <tbody>\n `;\n paths.slice(0, 15).forEach((p) => {\n const barWidth = Math.max(p.percentage, 2);\n pathHtml += `\n <tr>\n <td class=\"path-name\" title=\"${this.escapeHtml(p.path)}\">${this.escapeHtml(p.path)}</td>\n <td class=\"path-rate\">${p.updatesPerMinute}</td>\n <td class=\"path-bytes\">${p.bytesFormatted}</td>\n <td class=\"path-percentage\">\n <div class=\"percentage-bar-container\">\n <div class=\"percentage-bar\" style=\"width: ${barWidth}%\"></div>\n <span class=\"percentage-text\">${p.percentage}%</span>\n </div>\n </td>\n </tr>\n `;\n });\n pathHtml += `\n </tbody>\n </table>\n </div>\n `;\n if (paths.length > 15) {\n pathHtml += `\n <div class=\"path-more\">\n <p>Showing top 15 of ${paths.length} paths</p>\n </div>\n `;\n }\n pathHtml += \"</div>\";\n pathDiv.innerHTML = pathHtml;\n }\n updateCongestionDisplay(data) {\n const section = document.getElementById(\"congestionSection\");\n const div = document.getElementById(\"congestionControl\");\n if (!section || !div) {\n return;\n }\n section.style.display = \"\";\n const enabled = !!data.enabled;\n const manualMode = !!data.manualMode;\n const stateLabel = enabled ? (manualMode ? \"manual\" : \"active\") : \"disabled\";\n const stateClass = enabled ? (manualMode ? \"warning\" : \"success\") : \"error\";\n const modeLabel = manualMode ? \"Manual Override\" : \"Automatic\";\n const currentDeltaTimer = data.currentDeltaTimer || 0;\n const nominalDeltaTimer = data.nominalDeltaTimer || 0;\n const html = `\n <div class=\"v2-dashboard\">\n <div class=\"metrics-grid\">\n ${renderMetricItemHtml(\"State\", `<span class=\"congestion-state ${stateClass}\">${stateLabel}</span>`)}\n ${renderMetricItem(\"Mode\", modeLabel)}\n ${renderMetricItem(\"Current Timer\", currentDeltaTimer + \" ms\")}\n ${renderMetricItem(\"Nominal Timer\", nominalDeltaTimer + \" ms\")}\n </div>\n <div class=\"metrics-stats\">\n <h5>Congestion Details</h5>\n <div class=\"stats-grid\">\n ${renderStatItem(\"Min Delta Timer\", (data.minDeltaTimer || 0) + \" ms\")}\n ${renderStatItem(\"Max Delta Timer\", (data.maxDeltaTimer || 0) + \" ms\")}\n ${renderStatItem(\"Target RTT\", (data.targetRTT || 0) + \" ms\")}\n ${renderStatItem(\"Avg RTT\", (data.avgRTT !== undefined ? Math.round(data.avgRTT) : 0) + \" ms\")}\n ${renderStatItem(\"Avg Packet Loss\", (data.avgLoss !== undefined ? (data.avgLoss * 100).toFixed(1) : 0) + \"%\", data.avgLoss > 0.05)}\n </div>\n </div>\n </div>\n `;\n div.innerHTML = html;\n }\n updateBondingDisplay(data) {\n const section = document.getElementById(\"bondingSection\");\n const div = document.getElementById(\"bondingStatus\");\n if (!section || !div) {\n return;\n }\n if (!data.enabled) {\n section.style.display = \"none\";\n return;\n }\n section.style.display = \"\";\n const modeLabel = (data.mode || \"main-backup\").replace(/-/g, \" \");\n const activeLink = data.activeLink || \"primary\";\n let linksHtml = \"\";\n if (data.links) {\n const linkEntries = Object.entries(data.links);\n linksHtml = linkEntries\n .map(([name, link]) => {\n const isActive = name === activeLink;\n const status = (link.status || \"unknown\").toLowerCase();\n const isUp = status !== \"down\";\n const aliveClass = isUp ? \"success\" : \"error\";\n return `\n <div class=\"bonding-link ${isActive ? \"active\" : \"\"}\">\n <div class=\"link-header\">\n <span class=\"link-name\">${this.escapeHtml(name)}</span>\n ${isActive ? '<span class=\"link-badge active-badge\">ACTIVE</span>' : \"\"}\n <span class=\"link-badge ${aliveClass}\">${this.escapeHtml(status.toUpperCase())}</span>\n </div>\n <div class=\"link-stats\">\n ${renderStatItem(\"RTT\", (link.rtt || 0) + \" ms\")}\n ${renderStatItem(\"Packet Loss\", ((link.loss || 0) * 100).toFixed(1) + \"%\")}\n </div>\n </div>\n `;\n })\n .join(\"\");\n }\n const html = `\n <div class=\"v2-dashboard\">\n <div class=\"metrics-grid\">\n ${renderMetricItem(\"Mode\", modeLabel)}\n ${renderMetricItem(\"Active Link\", activeLink)}\n </div>\n <div class=\"bonding-links\">${linksHtml}</div>\n <div style=\"margin-top: 1rem;\">\n <button id=\"failoverBtn\" class=\"btn btn-secondary\">Force Failover</button>\n </div>\n </div>\n `;\n div.innerHTML = html;\n const failoverBtn = document.getElementById(\"failoverBtn\");\n if (failoverBtn) {\n failoverBtn.addEventListener(\"click\", () => this.triggerFailover());\n }\n }\n async triggerFailover() {\n const connId = this.activeConnectionId;\n const btn = document.getElementById(\"failoverBtn\");\n if (btn) {\n btn.disabled = true;\n }\n try {\n const response = await this.request(this.bondingFailoverPath(connId), { method: \"POST\" });\n if (response.ok) {\n const result = await response.json();\n this.showNotification(`Failover complete. Active link: ${result.activeLink}`, \"success\");\n this.loadMetrics(connId);\n }\n else {\n const err = await response.json();\n this.showNotification(response.status === 401\n ? this.authFailureMessage(\"triggering failover\")\n : \"Failover failed: \" + (err.error || \"Unknown error\"), \"error\");\n }\n }\n catch (error) {\n const err = error;\n this.showNotification(err.isUnauthorized\n ? this.authFailureMessage(\"triggering failover\")\n : \"Failover failed: \" + err.message, \"error\");\n }\n finally {\n if (btn) {\n btn.disabled = false;\n }\n }\n }\n updateMonitoringDisplay(data) {\n const section = document.getElementById(\"monitoringSection\");\n const div = document.getElementById(\"monitoringAlerts\");\n if (!section || !div) {\n return;\n }\n const hasData = data.alerts || data.packetLoss || data.retransmissions;\n if (!hasData) {\n section.style.display = \"none\";\n return;\n }\n section.style.display = \"\";\n let html = '<div class=\"v2-dashboard\">';\n if (data.alerts) {\n const activeAlerts = data.alerts.activeAlerts || {};\n const alertEntries = Object.entries(activeAlerts).map(([metric, alert]) => {\n let level = \"warning\";\n if (typeof alert === \"string\") {\n level = alert.toLowerCase();\n }\n else if (alert && typeof alert === \"object\" && alert.level) {\n level = String(alert.level).toLowerCase();\n }\n if (level === \"warn\") {\n level = \"warning\";\n }\n if (level === \"alert\") {\n level = \"critical\";\n }\n if (level !== \"warning\" && level !== \"critical\") {\n level = \"warning\";\n }\n return {\n metric,\n level,\n value: alert && typeof alert === \"object\" ? alert.value : undefined\n };\n });\n const alertCount = alertEntries.length;\n const alertItems = alertEntries\n .map((entry) => {\n const alertValue = entry.value !== undefined ? ` (${this.escapeHtml(String(entry.value))})` : \"\";\n return renderStatItemHtml(entry.metric, `<span class=\"alert-level alert-${entry.level}\">${this.escapeHtml(entry.level.toUpperCase())}${alertValue}</span>`, entry.level === \"critical\");\n })\n .join(\"\");\n const alertsContent = alertCount === 0\n ? '<div class=\"metrics-success\"><div class=\"success-message\">No active alerts</div></div>'\n : `<div class=\"stats-grid\">${alertItems}</div>`;\n html += `\n <div class=\"monitoring-subsection\">\n <h5>Active Alerts</h5>\n ${alertsContent}\n </div>\n `;\n }\n if (data.packetLoss && data.packetLoss.summary) {\n const summary = data.packetLoss.summary;\n html += `\n <div class=\"monitoring-subsection\">\n <h5>Packet Loss</h5>\n <div class=\"stats-grid\">\n ${renderStatItem(\"Overall Loss Rate\", (summary.overallLossRate * 100).toFixed(2) + \"%\", summary.overallLossRate > 0.05)}\n ${renderStatItem(\"Max Loss Rate\", (summary.maxLossRate * 100).toFixed(2) + \"%\", summary.maxLossRate > 0.1)}\n ${renderStatItem(\"Trend\", summary.trend || \"stable\")}\n </div>\n </div>\n `;\n }\n if (data.retransmissions && data.retransmissions.summary) {\n const summary = data.retransmissions.summary;\n html += `\n <div class=\"monitoring-subsection\">\n <h5>Retransmission Rates</h5>\n <div class=\"stats-grid\">\n ${renderStatItem(\"Current Rate\", (summary.currentRate * 100).toFixed(2) + \"%\", summary.currentRate > 0.05)}\n ${renderStatItem(\"Average Rate\", (summary.avgRate * 100).toFixed(2) + \"%\")}\n ${renderStatItem(\"Max Rate\", (summary.maxRate * 100).toFixed(2) + \"%\", summary.maxRate > 0.1)}\n </div>\n </div>\n `;\n }\n html += \"</div>\";\n div.innerHTML = html;\n }\n // ── Status display ─────────────────────────────────────────────────────────\n updateStatus() {\n const statusDiv = document.getElementById(\"status\");\n if (!statusDiv) {\n return;\n }\n let statusHtml = \"<h4>Configuration Status</h4>\";\n if (this.deltaTimerConfig) {\n statusHtml += `\n <div class=\"status-item\">\n <strong>Delta Timer:</strong> ${this.escapeHtml(String(this.deltaTimerConfig.deltaTimer))}ms\n <span class=\"status-indicator success\">Configured</span>\n </div>\n `;\n }\n else {\n statusHtml += `\n <div class=\"status-item\">\n <strong>Delta Timer:</strong>\n <span class=\"status-indicator warning\">Not configured</span>\n </div>\n `;\n }\n if (this.subscriptionConfig && this.subscriptionConfig.subscribe) {\n const cfg = this.subscriptionConfig;\n const pathCount = cfg.subscribe.length;\n const escapedContext = this.escapeHtml(cfg.context || \"\");\n const escapedPaths = cfg.subscribe\n .map((s) => this.escapeHtml(s.path))\n .join(\", \");\n statusHtml += `\n <div class=\"status-item\">\n <strong>Subscriptions:</strong> ${pathCount} path(s) configured\n <span class=\"status-indicator success\">Configured</span>\n </div>\n <div class=\"status-details\">\n <strong>Context:</strong> ${escapedContext}<br>\n <strong>Paths:</strong> ${escapedPaths}\n </div>\n `;\n }\n else {\n statusHtml += `\n <div class=\"status-item\">\n <strong>Subscriptions:</strong>\n <span class=\"status-indicator warning\">Not configured</span>\n </div>\n `;\n }\n if (this.sentenceFilterConfig &&\n this.sentenceFilterConfig.excludedSentences &&\n this.sentenceFilterConfig.excludedSentences\n .length > 0) {\n const filterCount = this.sentenceFilterConfig.excludedSentences.length;\n const escapedFilters = this.sentenceFilterConfig.excludedSentences\n .map((s) => this.escapeHtml(s))\n .join(\", \");\n statusHtml += `\n <div class=\"status-item\">\n <strong>Sentence Filter:</strong> ${filterCount} sentence(s) excluded\n <span class=\"status-indicator success\">Configured</span>\n </div>\n <div class=\"status-details\">\n <strong>Excluded:</strong> ${escapedFilters}\n </div>\n `;\n }\n statusDiv.innerHTML = statusHtml;\n }\n // ── Utility methods ────────────────────────────────────────────────────────\n buildCompletePluginConfig(currentConfig) {\n const defaults = this.extractSchemaDefaults(this.pluginSchema);\n const merged = this.deepMerge(defaults || {}, currentConfig || {});\n if (Array.isArray(merged.connections)) {\n return merged;\n }\n const normalizedServerType = this.normalizeServerType(merged.serverType);\n merged.serverType = normalizedServerType || \"client\";\n return merged;\n }\n normalizeServerType(value) {\n if (value === true || value === \"server\") {\n return \"server\";\n }\n if (value === false || value === \"client\") {\n return \"client\";\n }\n return undefined;\n }\n extractSchemaDefaults(schemaNode) {\n if (!schemaNode || typeof schemaNode !== \"object\") {\n return undefined;\n }\n const isObjectNode = schemaNode.type === \"object\" || !!schemaNode.properties;\n const merged = {};\n let hasData = false;\n if (isObjectNode && schemaNode.default && this.isPlainObject(schemaNode.default)) {\n Object.assign(merged, this.deepClone(schemaNode.default));\n hasData = true;\n }\n if (schemaNode.properties && this.isPlainObject(schemaNode.properties)) {\n for (const [key, value] of Object.entries(schemaNode.properties)) {\n const childDefaults = this.extractSchemaDefaults(value);\n if (childDefaults !== undefined) {\n merged[key] = childDefaults;\n hasData = true;\n }\n else if (value && value.type === \"object\") {\n merged[key] = {};\n hasData = true;\n }\n else if (value && value.type === \"string\") {\n merged[key] = \"\";\n hasData = true;\n }\n }\n }\n if (schemaNode.dependencies && this.isPlainObject(schemaNode.dependencies)) {\n for (const dependencyValue of Object.values(schemaNode.dependencies)) {\n const dependencyDefaults = this.extractSchemaDefaults(dependencyValue);\n if (dependencyDefaults && this.isPlainObject(dependencyDefaults)) {\n Object.assign(merged, this.deepMerge(merged, dependencyDefaults));\n hasData = true;\n }\n }\n }\n for (const compositeKey of [\"oneOf\", \"anyOf\", \"allOf\"]) {\n const composite = schemaNode[compositeKey];\n if (!Array.isArray(composite)) {\n continue;\n }\n composite.forEach((item) => {\n const itemDefaults = this.extractSchemaDefaults(item);\n if (itemDefaults === undefined) {\n return;\n }\n if (this.isPlainObject(itemDefaults)) {\n Object.assign(merged, this.deepMerge(merged, itemDefaults));\n hasData = true;\n return;\n }\n if (!hasData && schemaNode.default === undefined) {\n return;\n }\n hasData = true;\n });\n }\n if (hasData) {\n return merged;\n }\n if (schemaNode.default !== undefined) {\n return this.deepClone(schemaNode.default);\n }\n return undefined;\n }\n isPlainObject(value) {\n return value !== null && typeof value === \"object\" && !Array.isArray(value);\n }\n deepClone(value) {\n if (Array.isArray(value)) {\n return value.map((item) => this.deepClone(item));\n }\n if (this.isPlainObject(value)) {\n const clone = {};\n for (const [key, childValue] of Object.entries(value)) {\n clone[key] = this.deepClone(childValue);\n }\n return clone;\n }\n return value;\n }\n deepMerge(baseValue, overrideValue) {\n if (overrideValue === undefined) {\n return this.deepClone(baseValue);\n }\n if (Array.isArray(overrideValue)) {\n return this.deepClone(overrideValue);\n }\n if (this.isPlainObject(baseValue) && this.isPlainObject(overrideValue)) {\n const merged = this.deepClone(baseValue);\n for (const [key, value] of Object.entries(overrideValue)) {\n merged[key] = this.deepMerge(baseValue[key], value);\n }\n return merged;\n }\n return this.deepClone(overrideValue);\n }\n formatBytes(bytes) {\n if (!bytes || bytes <= 0) {\n return \"0 B\";\n }\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n }\n formatRatioPercent(value) {\n if (!Number.isFinite(value) || value <= 0) {\n return \"0.0%\";\n }\n return (value * 100).toFixed(1) + \"%\";\n }\n formatTimestampAge(timestamp) {\n if (!Number.isFinite(timestamp) || timestamp <= 0) {\n return \"N/A\";\n }\n const ageMs = Math.max(0, Date.now() - timestamp);\n if (ageMs < 1000) {\n return \"just now\";\n }\n if (ageMs < 60000) {\n return `${Math.floor(ageMs / 1000)}s ago`;\n }\n if (ageMs < 3600000) {\n return `${Math.floor(ageMs / 60000)}m ago`;\n }\n return `${Math.floor(ageMs / 3600000)}h ago`;\n }\n escapeHtml(text) {\n const div = document.createElement(\"div\");\n div.textContent = text;\n return div.innerHTML;\n }\n showNotification(message, type = \"success\") {\n const notification = document.getElementById(\"notification\");\n if (!notification) {\n return;\n }\n if (this._notificationTimer) {\n clearTimeout(this._notificationTimer);\n }\n notification.textContent = message;\n notification.className = `notification ${type} show`;\n this._notificationTimer = setTimeout(() => {\n notification.classList.remove(\"show\");\n this._notificationTimer = null;\n }, NOTIFICATION_TIMEOUT);\n }\n}\n// Initialize when DOM is loaded\ndocument.addEventListener(\"DOMContentLoaded\", () => {\n window.dataConnectorConfig = new DataConnectorConfig();\n});\n// Clean up metrics refresh interval when page is hidden or unloaded\ndocument.addEventListener(\"visibilitychange\", () => {\n if (!window.dataConnectorConfig) {\n return;\n }\n if (document.hidden) {\n if (window.dataConnectorConfig.metricsInterval) {\n clearInterval(window.dataConnectorConfig.metricsInterval);\n window.dataConnectorConfig.metricsInterval = null;\n }\n }\n else if (!window.dataConnectorConfig.metricsInterval) {\n window.dataConnectorConfig.loadMetrics();\n window.dataConnectorConfig.startMetricsRefresh();\n }\n});\nwindow.addEventListener(\"beforeunload\", () => {\n if (window.dataConnectorConfig && window.dataConnectorConfig.metricsInterval) {\n clearInterval(window.dataConnectorConfig.metricsInterval);\n window.dataConnectorConfig.metricsInterval = null;\n }\n});\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (DataConnectorConfig);\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvd2ViYXBwL2luZGV4LnRzIiwibWFwcGluZ3MiOiI7Ozs7OztBQUFzQjtBQUN3RTtBQUU5RixZQUFZO0FBQ1osTUFBTSxhQUFhLEdBQUcsNEJBQTRCLENBQUM7QUFDbkQsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDO0FBQzVCLE1BQU0sZUFBZSxHQUFHLEtBQUssQ0FBQztBQUM5QixNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQztBQUNsQyxNQUFNLHdCQUF3QixHQUFHLEtBQUssQ0FBQztBQUN2QyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQWdCL0IsNkZBQTZGO0FBQzdGLFNBQVMsVUFBVSxDQUFDLEdBQW9CO0lBQ3RDLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztTQUNmLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDO1NBQ3ZCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELHdCQUF3QjtBQUN4QixNQUFNLFVBQVUsR0FBRyxDQUNqQixLQUFhLEVBQ2IsUUFBdUIsRUFDdkIsU0FBaUIsRUFDakIsWUFBWSxHQUFHLEVBQUUsRUFDakIsRUFBRSxDQUFDOzs7O2NBSVMsVUFBVSxDQUFDLEtBQUssQ0FBQztVQUNyQixRQUFRLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixVQUFVLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRTs7O21CQUd4RCxTQUFTLFlBQVksWUFBWSxJQUFJLFNBQVMsR0FBRyxPQUFPO3VCQUNwRCxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDOzs7OztDQUtyRCxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUcsQ0FBQyxLQUFhLEVBQUUsS0FBc0IsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQzt5QkFDM0QsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7K0JBQ2xCLFVBQVUsQ0FBQyxLQUFLLENBQUM7K0JBQ2pCLFVBQVUsQ0FBQyxLQUFLLENBQUM7O0NBRS9DLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUFHLENBQUMsS0FBYSxFQUFFLEtBQXNCLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7MkJBQzNELFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDL0IsVUFBVSxDQUFDLEtBQUssQ0FBQztnQ0FDakIsVUFBVSxDQUFDLEtBQUssQ0FBQzs7Q0FFaEQsQ0FBQztBQUVGLHlGQUF5RjtBQUN6RixNQUFNLG9CQUFvQixHQUFHLENBQUMsS0FBYSxFQUFFLFNBQWlCLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUM7MkJBQzFELFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQ0FDL0IsVUFBVSxDQUFDLEtBQUssQ0FBQztnQ0FDakIsU0FBUzs7Q0FFeEMsQ0FBQztBQUVGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxLQUFhLEVBQUUsU0FBaUIsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLEVBQUUsQ0FBQzt5QkFDMUQsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7K0JBQ2xCLFVBQVUsQ0FBQyxLQUFLLENBQUM7K0JBQ2pCLFNBQVM7O0NBRXZDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRyxDQUNuQixLQUFhLEVBQ2IsS0FBc0IsRUFDdEIsV0FBVyxHQUFHLEtBQUssRUFDbkIsU0FBUyxHQUFHLEtBQUssRUFDakIsRUFBRSxDQUFDO3VCQUNrQixXQUFXLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRTs2QkFDekIsVUFBVSxDQUFDLEtBQUssQ0FBQzsyQkFDbkIsU0FBUyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxVQUFVLENBQUMsS0FBSyxDQUFDOztDQUVoRixDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxDQUN6QixLQUFhLEVBQ2IsV0FBMEIsRUFDMUIsT0FBZSxFQUNmLEVBQUUsR0FBRyxFQUFFLEVBQ1AsRUFBRSxDQUFDOytCQUMwQixFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7O1lBRTFDLFVBQVUsQ0FBQyxLQUFLLENBQUM7UUFDckIsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFOzs7UUFHdEQsT0FBTzs7O0NBR2QsQ0FBQztBQUVGLE1BQU0sbUJBQW1CO0lBcUJ2QjtRQWJBOzt5REFFaUQ7UUFDakQsNEJBQXVCLEdBQVksS0FBSyxDQUFDO1FBV3ZDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDL0IsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsYUFBYSxHQUFHLGlFQUFnQixFQUFFLENBQUM7UUFFeEMsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUMvQixJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1FBQ2pDLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDOUIsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztRQUUvQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFJLENBQUM7WUFDSCxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLHVCQUF1QixFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsb0NBQW9DO2dCQUNsQyxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUMxRCxPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsOEVBQThFO0lBRTlFLEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxjQUFjLENBQUMsQ0FBQztZQUMvRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3RDLENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNaLDZFQUE2RTtRQUMvRSxDQUFDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDdkQsMEVBQTBFO1lBQzFFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2xFLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ1AsT0FBTyxFQUFFLENBQUM7WUFDWixDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7UUFDaEMsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDO0lBQy9FLENBQUM7SUFFRCw4RUFBOEU7SUFFOUUsV0FBVyxDQUFDLE1BQWM7UUFDeEIsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsT0FBTyxHQUFHLGFBQWEsVUFBVSxDQUFDO1FBQ3BDLENBQUM7UUFDRCxPQUFPLEdBQUcsYUFBYSxnQkFBZ0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztJQUM5RSxDQUFDO0lBRUQsVUFBVSxDQUFDLE1BQWMsRUFBRSxRQUFnQjtRQUN6QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixPQUFPLEdBQUcsYUFBYSxXQUFXLFFBQVEsRUFBRSxDQUFDO1FBQy9DLENBQUM7UUFDRCxPQUFPLEdBQUcsYUFBYSxnQkFBZ0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLFdBQVcsUUFBUSxFQUFFLENBQUM7SUFDekYsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjLEVBQUUsR0FBVztRQUN4QyxJQUFJLE1BQU0sS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN6QixPQUFPLEdBQUcsYUFBYSxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEdBQUcsYUFBYSxnQkFBZ0Isa0JBQWtCLENBQUMsTUFBTSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUVELGNBQWMsQ0FBQyxNQUFjO1FBQzNCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sR0FBRyxhQUFhLGFBQWEsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxHQUFHLGFBQWEsZ0JBQWdCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDakYsQ0FBQztJQUVELFdBQVcsQ0FBQyxNQUFjO1FBQ3hCLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sR0FBRyxhQUFhLFVBQVUsQ0FBQztRQUNwQyxDQUFDO1FBQ0QsT0FBTyxHQUFHLGFBQWEsZ0JBQWdCLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDOUUsQ0FBQztJQUVELG1CQUFtQixDQUFDLE1BQWM7UUFDaEMsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDekIsT0FBTyxHQUFHLGFBQWEsbUJBQW1CLENBQUM7UUFDN0MsQ0FBQztRQUNELE9BQU8sR0FBRyxhQUFhLGdCQUFnQixrQkFBa0IsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUM7SUFDdkYsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBa0IsRUFBRSxPQUFvQixFQUFFO1FBQ3RELE1BQU0sUUFBUSxHQUFHLE1BQU0seURBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQzVCLE1BQU0sS0FBSyxHQUF1QixJQUFJLEtBQUssQ0FBQywyRUFBOEIsQ0FBQyxDQUFDO1lBQzVFLEtBQUssQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzVCLE1BQU0sS0FBSyxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxPQUFlO1FBQ2hDLE9BQU8sR0FBRywyRUFBOEIsaUJBQWlCLE9BQU8sS0FBSyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDNUYsQ0FBQztJQUVELDhFQUE4RTtJQUU5RSxVQUFVO1FBQ1IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVO1FBQ1IsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzFELElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxPQUFPLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUN2QixPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFFRCxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDM0IsT0FBTyxDQUFDLFNBQVMsR0FBRywrQkFBK0IsSUFBSSxDQUFDLFdBQVc7YUFDaEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDVCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7WUFDN0QsTUFBTSxTQUFTLEdBQ2IsQ0FBQyxDQUFDLE9BQU8sS0FBSyxLQUFLO2dCQUNqQixDQUFDLENBQUMsNENBQTRDO2dCQUM5QyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVE7b0JBQ3BDLENBQUMsQ0FBQyx5Q0FBeUM7b0JBQzNDLENBQUMsQ0FBQyw4Q0FBOEMsQ0FBQztZQUN2RCxPQUFPLGdDQUFnQyxDQUFDLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO3NDQUMxRCxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsU0FBUzttQ0FDYyxJQUFJO21DQUNKLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDO21DQUMvQixJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7a0JBQ3hDLENBQUM7UUFDYixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztRQUVwQiw2QkFBNkI7UUFDN0IsT0FBTyxDQUFDLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7WUFDMUQsR0FBRyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7Z0JBQ2pDLE1BQU0sRUFBRSxHQUFJLEdBQW1CLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQztnQkFDckQsSUFBSSxFQUFFLEtBQUssSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxFQUFHLENBQUM7b0JBQzlCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztvQkFDbEIsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELHVCQUF1QjtRQUNyQixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDeEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztRQUUzQyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsQ0FBQztRQUVELElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxTQUFzQjtRQUN4QyxNQUFNLGtCQUFrQixHQUN0QixVQUFVLENBQ1IscUJBQXFCLEVBQ3JCLGtFQUFrRSxFQUNsRSxTQUFTLENBQ1Y7WUFDRCxvREFBb0Q7WUFDcEQsVUFBVSxDQUNSLGlCQUFpQixFQUNqQixrREFBa0QsRUFDbEQsZ0JBQWdCLENBQ2pCO1lBQ0QsVUFBVSxDQUFDLG1CQUFtQixFQUFFLDhCQUE4QixFQUFFLFdBQVcsQ0FBQztZQUM1RSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsc0NBQXNDLEVBQUUsZUFBZSxDQUFDO1lBQ3JGLFVBQVUsQ0FDUixxQkFBcUIsRUFDckIsNERBQTRELEVBQzVELGtCQUFrQixDQUNuQjtZQUNELFFBQVEsQ0FBQztRQUVYLFNBQVMsQ0FBQyxTQUFTO1lBQ2pCLGtCQUFrQixDQUNoQix5QkFBeUIsRUFDekIsNERBQTRELEVBQzVELGtCQUFrQixFQUNsQixpQkFBaUIsQ0FDbEI7Z0JBQ0Qsa0JBQWtCLENBQ2hCLFVBQVUsRUFDVix5Q0FBeUMsRUFDekMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEVBQ3BDLGVBQWUsQ0FDaEIsQ0FBQztJQUNOLENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxTQUFzQjtRQUN4QyxNQUFNLGFBQWEsR0FDakIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFaEcsTUFBTSxrQkFBa0IsR0FDdEIsVUFBVSxDQUNSLHFCQUFxQixFQUNyQixxRUFBcUUsRUFDckUsU0FBUyxDQUNWO1lBQ0QsMkVBQTJFO1lBQzNFLFVBQVUsQ0FDUixpQkFBaUIsRUFDakIsa0RBQWtELEVBQ2xELGdCQUFnQixDQUNqQjtZQUNELFVBQVUsQ0FBQyxtQkFBbUIsRUFBRSx3Q0FBd0MsRUFBRSxXQUFXLENBQUM7WUFDdEYsVUFBVSxDQUFDLGdCQUFnQixFQUFFLGtDQUFrQyxFQUFFLGVBQWUsQ0FBQztZQUNqRixVQUFVLENBQ1Isb0JBQW9CLEVBQ3BCLCtEQUErRCxFQUMvRCxtQkFBbUIsQ0FDcEI7WUFDRCxRQUFRO1lBQ1Isd0VBQXdFO1lBQ3hFLFVBQVUsQ0FDUixvQkFBb0IsRUFDcEIsZ0RBQWdELEVBQ2hELGVBQWUsQ0FDaEI7WUFDRCxRQUFRO1lBQ1Isb0RBQW9EO1lBQ3BELFVBQVUsQ0FDUixxQkFBcUIsRUFDckIsNERBQTRELEVBQzVELGtCQUFrQixDQUNuQjtZQUNELFFBQVE7WUFDUixVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdEQsU0FBUyxDQUFDLFNBQVM7WUFDakIsa0JBQWtCLENBQ2hCLGVBQWUsRUFDZiwyREFBMkQsRUFDM0QsYUFBYSxFQUNiLG9CQUFvQixDQUNyQjtnQkFDRCxrQkFBa0IsQ0FDaEIseUJBQXlCLEVBQ3pCLG1FQUFtRSxFQUNuRSxrQkFBa0IsRUFDbEIsaUJBQWlCLENBQ2xCO2dCQUNELGtCQUFrQixDQUNoQixVQUFVLEVBQ1YseUNBQXlDLEVBQ3pDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxFQUNwQyxlQUFlLENBQ2hCLENBQUM7SUFDTixDQUFDO0lBRUQsb0JBQW9CO1FBQ2xCLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBb0JOLENBQUM7SUFDSixDQUFDO0lBRUQsc0JBQXNCO1FBQ3BCLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQTRETixDQUFDO0lBQ0osQ0FBQztJQUVELHdCQUF3QjtRQUN0QixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBbUJOLENBQUM7SUFDSixDQUFDO0lBRUQsNkJBQTZCO1FBQzNCLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozt5Q0FxQjhCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7OztLQVV2RSxDQUFDO0lBQ0osQ0FBQztJQUVELDhFQUE4RTtJQUU5RSxLQUFLLENBQUMsa0JBQWtCO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3hDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUM7UUFFdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLFVBQVUsR0FBRyxJQUFJO1FBQzdDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxnQkFBZ0IsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLGFBQWEsZ0JBQWdCLENBQUM7YUFDL0MsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDcEYsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9DLE1BQU0sYUFBYSxHQUNqQixVQUFVO2dCQUNWLFVBQVUsQ0FBQyxhQUFhO2dCQUN4QixPQUFPLFVBQVUsQ0FBQyxhQUFhLEtBQUssUUFBUTtnQkFDNUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQyxVQUFVLENBQUMsYUFBYTtnQkFDMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUVULElBQUksY0FBYyxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLFVBQVUsR0FBRyxNQUFNLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDL0MsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLE1BQU0sSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzdFLElBQUksQ0FBQyxZQUFZLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQztnQkFDeEMsQ0FBQztnQkFDRCxJQUNFLFVBQVU7b0JBQ1YsQ0FBQyxVQUFVLENBQUMsV0FBVyxLQUFLLFFBQVEsSUFBSSxVQUFVLENBQUMsV0FBVyxLQUFLLFFBQVEsQ0FBQyxFQUM1RSxDQUFDO29CQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxVQUFVLENBQUMsV0FBVyxDQUFDO2dCQUNsRCxDQUFDO1lBQ0gsQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUFDLE9BQU8sS0FBYyxFQUFFLENBQUM7WUFDeEIsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDZixNQUFNLEdBQUcsR0FBRyxLQUEyQixDQUFDO2dCQUN4QyxJQUFJLENBQUMsZ0JBQWdCLENBQ25CLEdBQUcsQ0FBQyxjQUFjO29CQUNoQixDQUFDLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLHVCQUF1QixDQUFDO29CQUNsRCxDQUFDLENBQUMsK0JBQStCLEdBQUcsR0FBRyxDQUFDLE9BQU8sRUFDakQsU0FBUyxDQUNWLENBQUM7WUFDSixDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxNQUFjO1FBQ3JDLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7Z0JBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsc0JBQXNCLENBQUMsQ0FBQzthQUM5RCxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUM3RSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztZQUMzRSxJQUFJLENBQUMsb0JBQW9CLEdBQUcsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxLQUEyQixDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsR0FBRyxDQUFDLGNBQWM7Z0JBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsa0NBQWtDLENBQUM7Z0JBQzdELENBQUMsQ0FBQyxnQ0FBZ0MsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUNsRCxPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFlO1FBQy9CLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxJQUFJLENBQUMsa0JBQW1CLENBQUM7UUFDcEMsQ0FBQztRQUNELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDOUQsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2hCLE1BQU0sT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDO2dCQUNwRCxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBRW5DLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDMUIsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixFQUFHLEtBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNwRSxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsTUFBYztRQUM3QixNQUFNLFFBQVEsR0FBRyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFFcEMsTUFBTSxPQUFPLEdBQStCO1lBQzFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQzFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUM7U0FDL0UsQ0FBQztRQUVGLElBQUksUUFBUSxFQUFFLENBQUM7WUFDYixPQUFPLENBQUMsSUFBSSxDQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFDM0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUN6RCxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMzQyxNQUFNLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBRTFGLE1BQU0sY0FBYyxHQUE0QixFQUFFLENBQUM7UUFDbkQsSUFBSSxTQUFTLElBQUksU0FBUyxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzlCLGNBQWMsQ0FBQyxNQUFNLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakQsQ0FBQztRQUNELElBQUksYUFBYSxJQUFJLGFBQWEsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUN0QyxjQUFjLENBQUMsVUFBVSxHQUFHLE1BQU0sYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pELENBQUM7UUFDRCxJQUFJLGtCQUFrQixJQUFJLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2hELGNBQWMsQ0FBQyxlQUFlLEdBQUcsTUFBTSxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTdDLElBQUksUUFBUSxJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEQsTUFBTSxjQUFjLEdBQUcsTUFBTSxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDbEQsSUFBSSxDQUFDLHVCQUF1QixDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFFRCxJQUFJLFFBQVEsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQzVDLE1BQU0sV0FBVyxHQUFHLE1BQU0sVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RDLENBQUM7UUFFRCxJQUFJLENBQUMsZUFBZSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDMUIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7Z0JBQ25DLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQjtRQUNwQixvREFBb0Q7UUFDcEQsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxjQUFjLENBQUMsQ0FBQztZQUMvRCxJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDWCxNQUFNLE9BQU8sR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDakMsSUFBSSxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO29CQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLE9BQU8sQ0FBQztvQkFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNwQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osWUFBWTtRQUNkLENBQUM7UUFFRCxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLGtCQUFtQixDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVELDhFQUE4RTtJQUU5RSxtQkFBbUI7UUFDakIsTUFBTSxpQkFBaUIsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsSUFBSSxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RCLGlCQUFpQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUMzRSxDQUFDO1FBRUQsTUFBTSxtQkFBbUIsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDeEUsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1lBQ3hCLG1CQUFtQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQy9FLENBQUM7UUFFRCxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUM1RSxJQUFJLHFCQUFxQixFQUFFLENBQUM7WUFDMUIscUJBQXFCLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUVELE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxVQUFVLEVBQUUsQ0FBQztZQUNmLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDakUsQ0FBQztRQUVELE1BQU0sc0JBQXNCLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNFLElBQUksc0JBQXNCLEVBQUUsQ0FBQztZQUMzQixzQkFBc0IsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFO2dCQUNwRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDckIsWUFBWSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakMsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUMvRSxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsWUFBWSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtRQUN2RSxxREFBcUQ7UUFDckQsS0FBSyxNQUFNLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDOUYsTUFBTSxFQUFFLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMzQyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNQLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxNQUFNLEtBQUssYUFBYSxFQUFFLENBQUM7b0JBQzdCLCtEQUErRDtvQkFDL0QsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO2dCQUNqRSxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN4RSxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7UUFDL0UsQ0FBQztRQUVELE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVFLElBQUkscUJBQXFCLEVBQUUsQ0FBQztZQUMxQixxQkFBcUIsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQztRQUMxRixDQUFDO1FBRUQsTUFBTSwwQkFBMEIsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDdEYsSUFBSSwwQkFBMEIsRUFBRSxDQUFDO1lBQy9CLDBCQUEwQixDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FDeEQsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQ3RDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUU5RSxRQUFRO1FBQ04sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFNUIsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUssSUFBSSxDQUFDLGdCQUE0QyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzNGLE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUE0QixDQUFDO1lBQzVFLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ1AsRUFBRSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUUsSUFBSSxDQUFDLGdCQUE0QyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ25GLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUM1QixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsa0JBQTZDLENBQUM7WUFDL0QsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQTRCLENBQUM7WUFDNUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixLQUFLLENBQUMsS0FBSyxHQUFJLEdBQUcsQ0FBQyxPQUFrQixJQUFJLEdBQUcsQ0FBQztZQUMvQyxDQUFDO1lBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUN2RCxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUNkLFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO2dCQUN6QixJQUFJLEdBQUcsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztvQkFDakQsR0FBRyxDQUFDLFNBQXFDLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMxRixDQUFDO1lBQ0gsQ0FBQztZQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQStCLENBQUM7WUFDekYsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNsRSxDQUFDO1lBRUQsb0VBQW9FO1lBQ3BFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxHQUFHLENBQUMsSUFBMkMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7UUFFRCxJQUNFLElBQUksQ0FBQyxvQkFBb0I7WUFDekIsS0FBSyxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsb0JBQWdELENBQUMsaUJBQWlCLENBQUMsRUFDdkYsQ0FBQztZQUNELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQTRCLENBQUM7WUFDaEYsSUFBSSxFQUFFLEVBQUUsQ0FBQztnQkFDUCxFQUFFLENBQUMsS0FBSyxHQUNMLElBQUksQ0FBQyxvQkFBZ0QsQ0FBQyxpQkFDeEQsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDZixDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBK0IsQ0FBQztRQUN6RixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFFL0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLFNBQVMsR0FBRyxtQ0FBbUMsQ0FBQztZQUMxRCxDQUFDO1lBQ0QsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFMUQsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE1BQU0sY0FBYyxHQUNsQixLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO2dCQUMzQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQXlCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztZQUUxRCxJQUFJLFlBQVksR0FBRyxXQUFXLENBQUM7WUFDL0IsSUFBSSxRQUFRLEdBQUcsa0JBQWtCLENBQUM7WUFDbEMsSUFBSSxhQUFhLEdBQTRCLElBQUksQ0FBQyxZQUFZLENBQUM7WUFFL0QsSUFBSSxjQUFjLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxnQkFBZ0IsR0FBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQXlCLENBQUMsTUFBTSxDQUFDO2dCQUM3RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDekYsTUFBTSxZQUFZLEdBQ2hCLFlBQVksSUFBSSxDQUFDLElBQUksWUFBWSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxTQUFTLEdBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUF5QyxDQUM1RSxZQUFZLENBQ2IsQ0FBQztnQkFDRixhQUFhO29CQUNYLFNBQVMsSUFBSSxPQUFPLFNBQVMsS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0YsWUFBWSxHQUFHLGNBQWMsWUFBWSxHQUFHLENBQUMsSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNwRSxRQUFRLEdBQUcsbUJBQW1CLENBQUM7WUFDakMsQ0FBQztZQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLElBQUksUUFBUSxDQUFDO1lBQzVFLE1BQU0sUUFBUSxHQUNaLE1BQU0sQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekYsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDbkQsT0FBTyxDQUFDLFNBQVMsR0FBRzs7WUFFZCxjQUFjLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQztZQUNyQyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUMxQyxjQUFjLENBQUMsVUFBVSxFQUFFLEdBQUcsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEQsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7O09BRS9DLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVELDhFQUE4RTtJQUU5RSxXQUFXLENBQUMsSUFBSSxHQUFHLEVBQUU7UUFDbkIsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDZixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsUUFBUSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7UUFFakMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM5QyxLQUFLLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQztRQUNwQixLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNuQixLQUFLLENBQUMsV0FBVyxHQUFHLHFCQUFxQixDQUFDO1FBQzFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDO1FBRS9CLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUM7UUFDdkIsTUFBTSxDQUFDLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztRQUNwQyxNQUFNLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUU5QixLQUFLLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDakUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDcEMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUgsUUFBUSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixRQUFRLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFNBQVMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixpRUFBaUU7UUFDakUsd0VBQXdFO1FBQ3hFLGlFQUFpRTtRQUNqRSxzRUFBc0U7UUFDdEUsdUJBQXVCO1FBQ3ZCLElBQUksSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDakMsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBNEIsQ0FBQztRQUNoRixNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDekQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBaUMsQ0FBQztRQUM1RixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQzthQUNyQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7YUFDdkMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTNDLG1FQUFtRTtRQUNuRSxxRUFBcUU7UUFDckUsbUVBQW1FO1FBQ25FLE1BQU0sTUFBTSxHQUE0QixFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQztRQUMvRCxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBNEIsQ0FBQztRQUN4RixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0MsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBNEIsQ0FBQztZQUN6RixNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUE0QixDQUFDO1lBQ3JGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQTRCLENBQUM7WUFDckYsTUFBTSxXQUFXLEdBQUcsVUFBVSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUNwRixNQUFNLGlCQUFpQixHQUFHLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7WUFDM0UsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzdFLE1BQU0sQ0FBQyxJQUFJLEdBQUc7Z0JBQ1osT0FBTyxFQUFFLElBQUk7Z0JBQ2IsV0FBVztnQkFDWCxvQkFBb0I7Z0JBQ3BCLGlCQUFpQjthQUNsQixDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQStCLENBQUM7UUFDekYsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQ7O3dFQUVvRTtJQUNwRSxvQkFBb0IsQ0FBQyxJQUFnRDtRQUNuRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBNEIsQ0FBQztRQUN0RixJQUFJLFdBQVcsRUFBRSxDQUFDO1lBQ2hCLFdBQVcsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDMUQsQ0FBQztRQUNELE1BQU0sZUFBZSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQTRCLENBQUM7UUFDOUYsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixlQUFlLENBQUMsS0FBSztnQkFDbkIsSUFBSSxJQUFJLE9BQU8sSUFBSSxDQUFDLFdBQVcsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNqRixDQUFDO1FBQ0QsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBNEIsQ0FBQztRQUM1RixJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLGNBQWMsQ0FBQyxLQUFLO2dCQUNsQixJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsb0JBQW9CLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMzRixDQUFDO1FBQ0QsTUFBTSxnQkFBZ0IsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUE0QixDQUFDO1FBQ2hHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixnQkFBZ0IsQ0FBQyxLQUFLO2dCQUNwQixJQUFJLElBQUksT0FBTyxJQUFJLENBQUMsaUJBQWlCLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3RixDQUFDO0lBQ0gsQ0FBQztJQUVELFlBQVk7UUFDVixJQUFJLENBQUMsdUJBQXVCLEdBQUcsSUFBSSxDQUFDO1FBQ3BDLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQStCLENBQUM7WUFDekYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFeEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQTRCLENBQUM7WUFDNUUsSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDVixLQUFLLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksR0FBRyxDQUFDO1lBQ3RDLENBQUM7WUFFRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ3ZELElBQUksU0FBUyxFQUFFLENBQUM7Z0JBQ2QsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7Z0JBQ3pCLElBQUksTUFBTSxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQXNCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6RixDQUFDO1lBQ0gsQ0FBQztZQUVELHFFQUFxRTtZQUNyRSxtRUFBbUU7WUFDbkUsaURBQWlEO1lBQ2pELElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxNQUFNLENBQUMsSUFBMkMsQ0FBQyxDQUFDO1FBQ2hGLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxJQUFJLENBQUMseUJBQXlCLEVBQUcsS0FBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3BFLENBQUM7Z0JBQVMsQ0FBQztZQUNULElBQUksQ0FBQyx1QkFBdUIsR0FBRyxLQUFLLENBQUM7UUFDdkMsQ0FBQztJQUNILENBQUM7SUFFRCw4RUFBOEU7SUFFOUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxRQUFnQixFQUFFLE1BQWUsRUFBRSxTQUFpQixFQUFFLEtBQWE7UUFDbEYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGtCQUFtQixDQUFDO1FBQ3hDLElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFBRTtnQkFDckUsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO2dCQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUM7YUFDN0IsQ0FBQyxDQUFDO1lBRUgsSUFBSSxRQUFRLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQ2YsSUFBZ0MsQ0FBQyxTQUFTLENBQUMsR0FBRyxNQUFNLENBQUM7Z0JBQ3RELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEtBQUssc0JBQXNCLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN0QixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDO1lBQ2xELENBQUM7UUFDSCxDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxLQUEyQixDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsR0FBRyxDQUFDLGNBQWM7Z0JBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxLQUFLLENBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQztnQkFDMUQsQ0FBQyxDQUFDLGdCQUFnQixLQUFLLENBQUMsV0FBVyxFQUFFLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxFQUN6RCxPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRS9GLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLFVBQVUsR0FBRyxlQUFlLElBQUksVUFBVSxHQUFHLGVBQWUsRUFBRSxDQUFDO1lBQ3RGLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsK0JBQStCLGVBQWUsUUFBUSxlQUFlLGVBQWUsRUFDcEYsT0FBTyxDQUNSLENBQUM7WUFDRixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FDbkIsa0JBQWtCLEVBQ2xCLEVBQUUsVUFBVSxFQUFFLEVBQ2Qsa0JBQWtCLEVBQ2xCLDJCQUEyQixDQUM1QixDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDO1lBQ0gsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSxtRUFBbUU7WUFDbkUsc0VBQXNFO1lBQ3RFLG1FQUFtRTtZQUNuRSx3Q0FBd0M7WUFDeEMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3JCLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO2dCQUN4QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsQ0FBQztZQUVELE1BQU0sUUFBUSxHQUFJLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQXlCLENBQUMsS0FBSyxDQUFDO1lBQzVGLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFFcEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1lBQ3pDLENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLENBQUMsQ0FBQztZQUNqRCxDQUFDO1lBRUQsdUVBQXVFO1lBQ3ZFLHNFQUFzRTtZQUN0RSx1RUFBdUU7WUFDdkUsa0VBQWtFO1lBQ2xFLGtFQUFrRTtZQUNsRSxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBNEIsQ0FBQztZQUN4RixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQzNDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQTRCLENBQUM7Z0JBQ3pGLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQTRCLENBQUM7Z0JBQ3JGLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQTRCLENBQUM7Z0JBQ3JGLE1BQU0sV0FBVyxHQUFHLFVBQVUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQ3BGLE1BQU0saUJBQWlCLEdBQUcsS0FBSyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztnQkFDM0UsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO2dCQUM3RSxNQUFNLENBQUMsSUFBSSxHQUFHO29CQUNaLE9BQU8sRUFBRSxJQUFJO29CQUNiLFdBQVc7b0JBQ1gsb0JBQW9CO29CQUNwQixpQkFBaUI7aUJBQ2xCLENBQUM7WUFDSixDQUFDO2lCQUFNLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckMsbUVBQW1FO2dCQUNuRSxvQ0FBb0M7Z0JBQ3BDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztZQUNyQixDQUFDO1lBRUQsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUNuQixtQkFBbUIsRUFDbkIsTUFBTSxFQUNOLG9CQUFvQixFQUNwQiw0QkFBNEIsQ0FDN0IsQ0FBQztRQUNKLENBQUM7UUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyw2QkFBNkIsR0FBSSxLQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzNGLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQjtRQUN0QixNQUFNLFdBQVcsR0FBSSxRQUFRLENBQUMsY0FBYyxDQUFDLGdCQUFnQixDQUFzQixDQUFDLEtBQUssQ0FBQztRQUMxRixNQUFNLGlCQUFpQixHQUFHLFdBQVc7YUFDbEMsS0FBSyxDQUFDLEdBQUcsQ0FBQzthQUNWLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUUvQixNQUFNLElBQUksQ0FBQyxVQUFVLENBQ25CLHNCQUFzQixFQUN0QixFQUFFLGlCQUFpQixFQUFFLEVBQ3JCLHNCQUFzQixFQUN0QixpQkFBaUIsQ0FDbEIsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsZ0JBQWdCO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsa0JBQWtCLENBQStCLENBQUM7UUFDekYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osT0FBTztRQUNULENBQUM7UUFFRCxJQUFJLENBQUM7WUFDSCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLENBQUMsWUFBWSxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7Z0JBQ3JGLE1BQU0sSUFBSSxLQUFLLENBQUMsNENBQTRDLENBQUMsQ0FBQztZQUNoRSxDQUFDO1lBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQTRCLENBQUM7WUFDOUUsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hGLElBQUksb0JBQW9CLEVBQUUsQ0FBQztnQkFDekIsYUFBYSxDQUFDLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztZQUNsRCxDQUFDO1lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsYUFBYSxnQkFBZ0IsRUFBRTtnQkFDcEUsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsT0FBTyxFQUFFLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFO2dCQUMvQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUM7YUFDcEMsQ0FBQyxDQUFDO1lBRUgsTUFBTSxNQUFNLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUE0QixDQUFDLENBQUM7WUFDbEYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSx3Q0FBd0MsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDOUYsQ0FBQztZQUVELElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1lBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsTUFBTSxDQUFDLE9BQU8sSUFBSSx1REFBdUQsRUFDekUsU0FBUyxDQUNWLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztZQUN4QixNQUFNLEdBQUcsR0FBRyxLQUEyQixDQUFDO1lBQ3hDLElBQUksQ0FBQyxnQkFBZ0IsQ0FDbkIsR0FBRyxDQUFDLGNBQWM7Z0JBQ2hCLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsMkJBQTJCLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxtQ0FBbUMsR0FBRyxHQUFHLENBQUMsT0FBTyxFQUNyRCxPQUFPLENBQ1IsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLHlCQUF5QjtRQUM3QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGdDQUFnQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDO0lBRUQsOEJBQThCO1FBQzVCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxvREFBb0QsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RixDQUFDO0lBRUQsOEVBQThFO0lBRTlFLG9CQUFvQixDQUFDLE9BQTRCO1FBQy9DLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDckMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRXpDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7UUFDM0MsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDO1FBRTFDLE1BQU0sWUFBWSxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxRSxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxDQUFDLENBQUM7UUFDckQsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUMsbUJBQW1CLElBQUksQ0FBQyxDQUFDO1FBQzNELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsQ0FBQztRQUN6RCxNQUFNLG1CQUFtQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxDQUFDLENBQUM7UUFDM0QsTUFBTSxpQkFBaUIsR0FBRyxLQUFLLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1FBRXZELE1BQU0sU0FBUyxHQUNiLEtBQUssQ0FBQyxhQUFhLEdBQUcsQ0FBQztZQUN2QixLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQztZQUMzQixLQUFLLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQztZQUMxQixLQUFLLENBQUMsa0JBQWtCLEdBQUcsQ0FBQztZQUM1QixZQUFZLEdBQUcsQ0FBQztZQUNoQixnQkFBZ0IsR0FBRyxDQUFDO1lBQ3BCLGtCQUFrQixHQUFHLENBQUM7WUFDdEIsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBRXhCLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDO1FBQ3JELE1BQU0sYUFBYSxHQUFHLGVBQWUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUUxRSxNQUFNLGdCQUFnQixHQUFHO1lBQ3ZCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDO1lBQzVDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO1lBQ3hELG9CQUFvQixDQUNsQixVQUFVLEVBQ1Ysd0NBQXdDLFVBQVUsQ0FBQyxhQUFhLENBQUMsS0FBSyxVQUFVLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FDdkg7WUFDRCxnQkFBZ0IsQ0FDZCxRQUFRLEVBQ1IsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQzFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUN6QztZQUNELFFBQVEsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1NBQzNFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRVgsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDO1FBQzNDLE1BQU0scUJBQXFCLEdBQUcsUUFBUTtZQUNwQyxDQUFDLENBQUMsY0FBYyxDQUFDLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1lBQ2pFLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFUCxNQUFNLFVBQVUsR0FBRztZQUNqQixRQUFRO2dCQUNOLENBQUMsQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ2xFLENBQUMsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUM1RSxDQUFDLFFBQVE7Z0JBQ1AsQ0FBQyxDQUFDLGNBQWMsQ0FBQyx1QkFBdUIsRUFBRSxtQkFBbUIsQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDL0UsQ0FBQyxDQUFDLEVBQUU7WUFDTixRQUFRO2dCQUNOLENBQUMsQ0FBQyxjQUFjLENBQUMsaUJBQWlCLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztnQkFDakYsQ0FBQyxDQUFDLEVBQUU7WUFDTixRQUFRLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9ELENBQUMsUUFBUTtnQkFDUCxDQUFDLENBQUMsY0FBYyxDQUNaLHNCQUFzQixFQUN0QixrQkFBa0IsQ0FBQyxjQUFjLEVBQUUsRUFDbkMsa0JBQWtCLEdBQUcsQ0FBQyxDQUN2QjtnQkFDSCxDQUFDLENBQUMsRUFBRTtZQUNOLFFBQVE7Z0JBQ04sQ0FBQyxDQUFDLGNBQWMsQ0FDWix1QkFBdUIsRUFDdkIsbUJBQW1CLENBQUMsY0FBYyxFQUFFLEVBQ3BDLG1CQUFtQixHQUFHLENBQUMsQ0FDeEI7Z0JBQ0gsQ0FBQyxDQUFDLEVBQUU7WUFDTixRQUFRO2dCQUNOLENBQUMsQ0FBQyxjQUFjLENBQ1osZ0JBQWdCLEVBQ2hCLGlCQUFpQixDQUFDLGNBQWMsRUFBRSxFQUNsQyxpQkFBaUIsR0FBRyxDQUFDLENBQ3RCO2dCQUNILENBQUMsQ0FBQyxFQUFFO1lBQ04sY0FBYyxDQUFDLG9CQUFvQixFQUFFLEtBQUssQ0FBQyxpQkFBaUIsRUFBRSxLQUFLLENBQUMsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1lBQzFGLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQztZQUN2RixxQkFBcUI7WUFDckIsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLGdCQUFnQixHQUFHLENBQUM7Z0JBQ3JDLENBQUMsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUM5RSxDQUFDLENBQUMsRUFBRTtZQUNOLGVBQWUsSUFBSSxDQUFDO2dCQUNsQixDQUFDLENBQUMsY0FBYyxDQUFDLG9CQUFvQixFQUFFLFlBQVksRUFBRSxZQUFZLEdBQUcsQ0FBQyxDQUFDO2dCQUN0RSxDQUFDLENBQUMsRUFBRTtZQUNOLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7U0FDNUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFWCxJQUFJLFdBQVcsR0FBRzs7a0NBRVksZ0JBQWdCOzs7a0NBR2hCLFVBQVU7O0tBRXZDLENBQUM7UUFFRixJQUFJLFFBQVEsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUNqQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDakQsTUFBTSxZQUFZLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV6RixXQUFXLElBQUk7Ozs7Y0FJUCxjQUFjLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixHQUFHLFFBQVEsQ0FBQztjQUNqRSxjQUFjLENBQUMsa0JBQWtCLEVBQUUsRUFBRSxDQUFDLGlCQUFpQixDQUFDO2NBQ3hELGNBQWMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsR0FBRyxJQUFJLEdBQUcsWUFBWSxHQUFHLElBQUksQ0FBQztjQUMxRixjQUFjLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsY0FBYyxFQUFFLENBQUM7Y0FDN0QsY0FBYyxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDOzs7T0FHeEYsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzNFLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDO2lCQUN6QyxPQUFPLEVBQUU7aUJBQ1QsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0JBQ1gsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7Z0JBQzNDLE1BQU0sT0FBTyxHQUNYLE9BQU8sR0FBRyxLQUFLO29CQUNiLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPO29CQUN0QyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUM1QyxPQUFPOzttREFFa0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDOytDQUNqQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7Z0RBQzNCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDOztXQUU3RCxDQUFDO1lBQ0osQ0FBQyxDQUFDO2lCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNaLFdBQVcsSUFBSTs7K0JBRVUsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNOzRDQUNkLFVBQVU7O09BRS9DLENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDN0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7WUFDMUMsTUFBTSxVQUFVLEdBQ2QsT0FBTyxHQUFHLEtBQUs7Z0JBQ2IsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU87Z0JBQ3RDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFFNUMsV0FBVyxJQUFJOzs7dUNBR2tCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7NkNBQ3BDLFVBQVU7O09BRWhELENBQUM7UUFDSixDQUFDO2FBQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3RCLFdBQVcsSUFBSTs7OztPQUlkLENBQUM7UUFDSixDQUFDO1FBRUQsVUFBVSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7SUFDckMsQ0FBQztJQUVELDJCQUEyQixDQUFDLE9BQTRCO1FBQ3RELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ3RDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxFQUFFLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQztRQUNsQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztRQUUzQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBQzdCLElBQUksRUFBRSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ3pCLFlBQVksR0FBRyxXQUFXLENBQUM7Z0JBQzNCLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxJQUFJLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLFlBQVksR0FBRyxNQUFNLENBQUM7Z0JBQ3RCLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxJQUFJLEVBQUUsQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLENBQUM7Z0JBQ2hDLFlBQVksR0FBRyxNQUFNLENBQUM7Z0JBQ3RCLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLFlBQVksR0FBRyxNQUFNLENBQUM7Z0JBQ3RCLFlBQVksR0FBRyxTQUFTLENBQUM7WUFDM0IsQ0FBQztRQUNILENBQUM7UUFFRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsV0FBVyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztRQUM1QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDO1FBQ3ZELE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFDWCxFQUFFLEdBQUcsRUFBRSxFQUNQLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDVCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsTUFBTSxRQUFRLEdBQUcsVUFBVSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFMUMsTUFBTSxZQUFZLEdBQ2hCLFVBQVUsR0FBRyxDQUFDO1lBQ1osQ0FBQyxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLFFBQVEsTUFBTSxFQUFFLElBQUksRUFBRTtvQ0FD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QUMsa0JBQWtCLEVBQUUsR0FBRyxFQUFFO0lBQ2pELElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNoQyxPQUFPO0lBQ1QsQ0FBQztJQUVELElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ3BCLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQy9DLGFBQWEsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDMUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUM7UUFDcEQsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN6QyxNQUFNLENBQUMsbUJBQW1CLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUNuRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtJQUMzQyxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDN0UsYUFBYSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMxRCxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUNwRCxDQUFDO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxpRUFBZSxtQkFBbUIsRUFBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NpZ25hbGstZWRnZS1saW5rLy4vc3JjL3dlYmFwcC9pbmRleC50cz9lNTZmIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcIi4vc3R5bGVzLmNzc1wiO1xuaW1wb3J0IHsgYXBpRmV0Y2gsIGdldFRva2VuSGVscFRleHQsIE1BTkFHRU1FTlRfVE9LRU5fRVJST1JfTUVTU0FHRSB9IGZyb20gXCIuL3V0aWxzL2FwaUZldGNoXCI7XG5cbi8vIENvbnN0YW50c1xuY29uc3QgQVBJX0JBU0VfUEFUSCA9IFwiL3BsdWdpbnMvc2lnbmFsay1lZGdlLWxpbmtcIjtcbmNvbnN0IERFTFRBX1RJTUVSX01JTiA9IDEwMDtcbmNvbnN0IERFTFRBX1RJTUVSX01BWCA9IDEwMDAwO1xuY29uc3QgTk9USUZJQ0FUSU9OX1RJTUVPVVQgPSA0MDAwO1xuY29uc3QgTUVUUklDU19SRUZSRVNIX0lOVEVSVkFMID0gMTUwMDA7XG5jb25zdCBKU09OX1NZTkNfREVCT1VOQ0UgPSAzMDA7XG5cbi8vIOKUgOKUgCBUeXBlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIENvbm5lY3Rpb25JbmZvIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBoZWFsdGh5PzogYm9vbGVhbjtcbiAgcmVhZHlUb1NlbmQ/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgQXV0aGVudGljYXRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBpc1VuYXV0aG9yaXplZD86IGJvb2xlYW47XG59XG5cbi8vIEVzY2FwZSBIVE1MIHNwZWNpYWwgY2hhcmFjdGVycyB0byBwcmV2ZW50IFhTUyB3aGVuIGluc2VydGluZyBkeW5hbWljIHZhbHVlcyBpbnRvIGlubmVySFRNTFxuZnVuY3Rpb24gZXNjYXBlSHRtbChzdHI6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmcoc3RyKVxuICAgIC5yZXBsYWNlKC8mL2csIFwiJmFtcDtcIilcbiAgICAucmVwbGFjZSgvPC9nLCBcIiZsdDtcIilcbiAgICAucmVwbGFjZSgvPi9nLCBcIiZndDtcIilcbiAgICAucmVwbGFjZSgvXCIvZywgXCImcXVvdDtcIilcbiAgICAucmVwbGFjZSgvJy9nLCBcIiYjMzk7XCIpO1xufVxuXG4vLyBIVE1MIFRlbXBsYXRlIEhlbHBlcnNcbmNvbnN0IHJlbmRlckNhcmQgPSAoXG4gIHRpdGxlOiBzdHJpbmcsXG4gIHN1YnRpdGxlOiBzdHJpbmcgfCBudWxsLFxuICBjb250ZW50SWQ6IHN0cmluZyxcbiAgY29udGVudENsYXNzID0gXCJcIlxuKSA9PiBgXG4gIDxkaXYgY2xhc3M9XCJjb25maWctc2VjdGlvblwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgPGgyPiR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9oMj5cbiAgICAgICAgJHtzdWJ0aXRsZSA/IGA8cCBjbGFzcz1cInN1YnRpdGxlXCI+JHtlc2NhcGVIdG1sKHN1YnRpdGxlKX08L3A+YCA6IFwiXCJ9XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBpZD1cIiR7Y29udGVudElkfVwiIGNsYXNzPVwiJHtjb250ZW50Q2xhc3MgfHwgY29udGVudElkICsgXCItaW5mb1wifVwiPlxuICAgICAgICAgIDxwPkxvYWRpbmcgJHtlc2NhcGVIdG1sKHRpdGxlLnRvTG93ZXJDYXNlKCkpfS4uLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5gO1xuXG5jb25zdCByZW5kZXJTdGF0SXRlbSA9IChsYWJlbDogc3RyaW5nLCB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLCBoYXNFcnJvciA9IGZhbHNlKSA9PiBgXG4gIDxkaXYgY2xhc3M9XCJzdGF0LWl0ZW0ke2hhc0Vycm9yID8gXCIgZXJyb3JcIiA6IFwiXCJ9XCI+XG4gICAgPHNwYW4gY2xhc3M9XCJzdGF0LWxhYmVsXCI+JHtlc2NhcGVIdG1sKGxhYmVsKX06PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwic3RhdC12YWx1ZVwiPiR7ZXNjYXBlSHRtbCh2YWx1ZSl9PC9zcGFuPlxuICA8L2Rpdj5cbmA7XG5cbmNvbnN0IHJlbmRlck1ldHJpY0l0ZW0gPSAobGFiZWw6IHN0cmluZywgdmFsdWU6IHN0cmluZyB8IG51bWJlciwgc3RhdHVzQ2xhc3MgPSBcIlwiKSA9PiBgXG4gIDxkaXYgY2xhc3M9XCJtZXRyaWMtaXRlbSR7c3RhdHVzQ2xhc3MgPyBcIiBcIiArIHN0YXR1c0NsYXNzIDogXCJcIn1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibWV0cmljLWxhYmVsXCI+JHtlc2NhcGVIdG1sKGxhYmVsKX08L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWV0cmljLXZhbHVlXCI+JHtlc2NhcGVIdG1sKHZhbHVlKX08L2Rpdj5cbiAgPC9kaXY+XG5gO1xuXG4vLyBWYXJpYW50cyB0aGF0IGFjY2VwdCBhIHByZS1zYW5pdGl6ZWQgSFRNTCBzdHJpbmcgYXMgdGhlIHZhbHVlIChsYWJlbCBpcyBzdGlsbCBlc2NhcGVkKVxuY29uc3QgcmVuZGVyTWV0cmljSXRlbUh0bWwgPSAobGFiZWw6IHN0cmluZywgaHRtbFZhbHVlOiBzdHJpbmcsIHN0YXR1c0NsYXNzID0gXCJcIikgPT4gYFxuICA8ZGl2IGNsYXNzPVwibWV0cmljLWl0ZW0ke3N0YXR1c0NsYXNzID8gXCIgXCIgKyBzdGF0dXNDbGFzcyA6IFwiXCJ9XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1ldHJpYy1sYWJlbFwiPiR7ZXNjYXBlSHRtbChsYWJlbCl9PC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1ldHJpYy12YWx1ZVwiPiR7aHRtbFZhbHVlfTwvZGl2PlxuICA8L2Rpdj5cbmA7XG5cbmNvbnN0IHJlbmRlclN0YXRJdGVtSHRtbCA9IChsYWJlbDogc3RyaW5nLCBodG1sVmFsdWU6IHN0cmluZywgaGFzRXJyb3IgPSBmYWxzZSkgPT4gYFxuICA8ZGl2IGNsYXNzPVwic3RhdC1pdGVtJHtoYXNFcnJvciA/IFwiIGVycm9yXCIgOiBcIlwifVwiPlxuICAgIDxzcGFuIGNsYXNzPVwic3RhdC1sYWJlbFwiPiR7ZXNjYXBlSHRtbChsYWJlbCl9Ojwvc3Bhbj5cbiAgICA8c3BhbiBjbGFzcz1cInN0YXQtdmFsdWVcIj4ke2h0bWxWYWx1ZX08L3NwYW4+XG4gIDwvZGl2PlxuYDtcblxuY29uc3QgcmVuZGVyQndTdGF0ID0gKFxuICBsYWJlbDogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBpc0hpZ2hsaWdodCA9IGZhbHNlLFxuICBpc1N1Y2Nlc3MgPSBmYWxzZVxuKSA9PiBgXG4gIDxkaXYgY2xhc3M9XCJidy1zdGF0JHtpc0hpZ2hsaWdodCA/IFwiIGhpZ2hsaWdodFwiIDogXCJcIn1cIj5cbiAgICA8c3BhbiBjbGFzcz1cImJ3LWxhYmVsXCI+JHtlc2NhcGVIdG1sKGxhYmVsKX06PC9zcGFuPlxuICAgIDxzcGFuIGNsYXNzPVwiYnctdmFsdWUke2lzU3VjY2VzcyA/IFwiIHN1Y2Nlc3MtdGV4dFwiIDogXCJcIn1cIj4ke2VzY2FwZUh0bWwodmFsdWUpfTwvc3Bhbj5cbiAgPC9kaXY+XG5gO1xuXG5jb25zdCByZW5kZXJTZWN0aW9uR3JvdXAgPSAoXG4gIHRpdGxlOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcgfCBudWxsLFxuICBjb250ZW50OiBzdHJpbmcsXG4gIGlkID0gXCJcIlxuKSA9PiBgXG4gIDxzZWN0aW9uIGNsYXNzPVwicGFnZS1ncm91cFwiJHtpZCA/IGAgaWQ9XCIke2lkfVwiYCA6IFwiXCJ9PlxuICAgIDxkaXYgY2xhc3M9XCJwYWdlLWdyb3VwLWhlYWRlclwiPlxuICAgICAgPGgyPiR7ZXNjYXBlSHRtbCh0aXRsZSl9PC9oMj5cbiAgICAgICR7ZGVzY3JpcHRpb24gPyBgPHA+JHtlc2NhcGVIdG1sKGRlc2NyaXB0aW9uKX08L3A+YCA6IFwiXCJ9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInBhZ2UtZ3JvdXAtY29udGVudFwiPlxuICAgICAgJHtjb250ZW50fVxuICAgIDwvZGl2PlxuICA8L3NlY3Rpb24+XG5gO1xuXG5jbGFzcyBEYXRhQ29ubmVjdG9yQ29uZmlnIHtcbiAgY29ubmVjdGlvbnM6IENvbm5lY3Rpb25JbmZvW107XG4gIGFjdGl2ZUNvbm5lY3Rpb25JZDogc3RyaW5nIHwgbnVsbDtcbiAgcGx1Z2luQ29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IG51bGw7XG4gIHBsdWdpblNjaGVtYTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICBzY2hlbWFDdXJyZW50TW9kZTogc3RyaW5nIHwgbnVsbDtcbiAgbWV0cmljc0ludGVydmFsOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsO1xuICBzeW5jVGltZW91dDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCBudWxsO1xuICAvKiogVHJ1ZSB3aGlsZSBzeW5jRnJvbUpzb24oKSBpcyByZWJ1aWxkaW5nIHRoZSBwYXRoLWlucHV0IGxpc3Qg4oCUIHByZXZlbnRzXG4gICAqICBhZGRQYXRoSXRlbSgpIGZyb20gdHJpZ2dlcmluZyB1cGRhdGVKc29uRnJvbUZvcm0oKSB3aGljaCB3b3VsZCBkcm9wIHRoZVxuICAgKiAgdGV4dGFyZWEncyBtZXRhIGJsb2NrIG9uIGV2ZXJ5IHBhdGggYWRkZWQuICovXG4gIGlzSHlkcmF0aW5nRnJvbVRleHRhcmVhOiBib29sZWFuID0gZmFsc2U7XG4gIHRva2VuSGVscFRleHQ6IHN0cmluZztcbiAgZGVsdGFUaW1lckNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCBudWxsO1xuICBzdWJzY3JpcHRpb25Db25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgc2VudGVuY2VGaWx0ZXJDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgbnVsbDtcbiAgcHJvdG9jb2xWZXJzaW9uOiBudW1iZXI7XG4gIGlzU2VydmVyTW9kZTogYm9vbGVhbjtcbiAgX3JlZnJlc2hJbkZsaWdodDogYm9vbGVhbjtcbiAgX25vdGlmaWNhdGlvblRpbWVyOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IG51bGw7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IFtdO1xuICAgIHRoaXMuYWN0aXZlQ29ubmVjdGlvbklkID0gbnVsbDtcbiAgICB0aGlzLnBsdWdpbkNvbmZpZyA9IG51bGw7XG4gICAgdGhpcy5wbHVnaW5TY2hlbWEgPSBudWxsO1xuICAgIHRoaXMuc2NoZW1hQ3VycmVudE1vZGUgPSBudWxsO1xuICAgIHRoaXMubWV0cmljc0ludGVydmFsID0gbnVsbDtcbiAgICB0aGlzLnN5bmNUaW1lb3V0ID0gbnVsbDtcbiAgICB0aGlzLnRva2VuSGVscFRleHQgPSBnZXRUb2tlbkhlbHBUZXh0KCk7XG5cbiAgICAvLyBQZXItY29ubmVjdGlvbiBzdGF0ZSAobG9hZGVkIGZvciB0aGUgYWN0aXZlIHRhYilcbiAgICB0aGlzLmRlbHRhVGltZXJDb25maWcgPSBudWxsO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9uQ29uZmlnID0gbnVsbDtcbiAgICB0aGlzLnNlbnRlbmNlRmlsdGVyQ29uZmlnID0gbnVsbDtcbiAgICB0aGlzLnByb3RvY29sVmVyc2lvbiA9IDE7XG4gICAgdGhpcy5pc1NlcnZlck1vZGUgPSBmYWxzZTtcbiAgICB0aGlzLl9yZWZyZXNoSW5GbGlnaHQgPSBmYWxzZTtcbiAgICB0aGlzLl9ub3RpZmljYXRpb25UaW1lciA9IG51bGw7XG5cbiAgICB0aGlzLmluaXQoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZFBsdWdpbkNvbmZpZ3VyYXRpb24oZmFsc2UpO1xuICAgICAgYXdhaXQgdGhpcy5mZXRjaENvbm5lY3Rpb25zKCk7XG4gICAgICB0aGlzLnJlbmRlclBhZ2UoKTtcbiAgICAgIHRoaXMuc3RhcnRNZXRyaWNzUmVmcmVzaCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBjb25zb2xlLmVycm9yKFwiSW5pdGlhbGl6YXRpb24gZXJyb3I6XCIsIGVycm9yKTtcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgXCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBhcHBsaWNhdGlvbjogXCIgK1xuICAgICAgICAgIChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpLFxuICAgICAgICBcImVycm9yXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIENvbm5lY3Rpb25zIGxpc3Qg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXN5bmMgZmV0Y2hDb25uZWN0aW9ucygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5yZXF1ZXN0KGAke0FQSV9CQVNFX1BBVEh9L2Nvbm5lY3Rpb25zYCk7XG4gICAgICBpZiAocmVzLm9rKSB7XG4gICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSBhd2FpdCByZXMuanNvbigpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKF9lKSB7XG4gICAgICAvLyAvY29ubmVjdGlvbnMgbm90IGF2YWlsYWJsZSDigJMgZmFsbCBiYWNrIHRvIGxlZ2FjeSBzaW5nbGUtaW5zdGFuY2UgZGV0ZWN0aW9uXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmNvbm5lY3Rpb25zIHx8IHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBGYWxsYmFjazogZGV0ZWN0IG1vZGUgZnJvbSBwbHVnaW4gY29uZmlnIGFuZCB0cmVhdCBhcyBzaW5nbGUgY29ubmVjdGlvblxuICAgICAgY29uc3QgdHlwZSA9IHRoaXMuZGV0ZWN0TW9kZUZyb21Db25maWcoKTtcbiAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSBbeyBpZDogXCJfbGVnYWN5XCIsIG5hbWU6IFwiRGVmYXVsdFwiLCB0eXBlIH1dO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5hY3RpdmVDb25uZWN0aW9uSWQpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ29ubmVjdGlvbklkID0gdGhpcy5jb25uZWN0aW9uc1swXS5pZDtcbiAgICB9XG4gIH1cblxuICBkZXRlY3RNb2RlRnJvbUNvbmZpZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnBsdWdpbkNvbmZpZykge1xuICAgICAgY29uc3Qgc3QgPSB0aGlzLm5vcm1hbGl6ZVNlcnZlclR5cGUodGhpcy5wbHVnaW5Db25maWcuc2VydmVyVHlwZSk7XG4gICAgICBpZiAoc3QpIHtcbiAgICAgICAgcmV0dXJuIHN0O1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5zY2hlbWFDdXJyZW50TW9kZSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2NoZW1hQ3VycmVudE1vZGU7XG4gICAgfVxuICAgIHJldHVybiBcImNsaWVudFwiO1xuICB9XG5cbiAgZ2V0QWN0aXZlQ29ubmVjdGlvbigpOiBDb25uZWN0aW9uSW5mbyB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnMuZmluZCgoYykgPT4gYy5pZCA9PT0gdGhpcy5hY3RpdmVDb25uZWN0aW9uSWQpIHx8IHRoaXMuY29ubmVjdGlvbnNbMF07XG4gIH1cblxuICBpc0xlZ2FjeU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoID09PSAxICYmIHRoaXMuY29ubmVjdGlvbnNbMF0uaWQgPT09IFwiX2xlZ2FjeVwiO1xuICB9XG5cbiAgLy8g4pSA4pSAIEFQSSBwYXRoIGhlbHBlcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgbWV0cmljc1BhdGgoY29ubklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjb25uSWQgPT09IFwiX2xlZ2FjeVwiKSB7XG4gICAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vbWV0cmljc2A7XG4gICAgfVxuICAgIHJldHVybiBgJHtBUElfQkFTRV9QQVRIfS9jb25uZWN0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChjb25uSWQpfS9tZXRyaWNzYDtcbiAgfVxuXG4gIGNvbmZpZ1BhdGgoY29ubklkOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjb25uSWQgPT09IFwiX2xlZ2FjeVwiKSB7XG4gICAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vY29uZmlnLyR7ZmlsZW5hbWV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGAke0FQSV9CQVNFX1BBVEh9L2Nvbm5lY3Rpb25zLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNvbm5JZCl9L2NvbmZpZy8ke2ZpbGVuYW1lfWA7XG4gIH1cblxuICBtb25pdG9yaW5nUGF0aChjb25uSWQ6IHN0cmluZywgc3ViOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjb25uSWQgPT09IFwiX2xlZ2FjeVwiKSB7XG4gICAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vbW9uaXRvcmluZy8ke3N1Yn1gO1xuICAgIH1cbiAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vY29ubmVjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoY29ubklkKX0vbW9uaXRvcmluZy8ke3N1Yn1gO1xuICB9XG5cbiAgY29uZ2VzdGlvblBhdGgoY29ubklkOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChjb25uSWQgPT09IFwiX2xlZ2FjeVwiKSB7XG4gICAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vY29uZ2VzdGlvbmA7XG4gICAgfVxuICAgIHJldHVybiBgJHtBUElfQkFTRV9QQVRIfS9jb25uZWN0aW9ucy8ke2VuY29kZVVSSUNvbXBvbmVudChjb25uSWQpfS9jb25nZXN0aW9uYDtcbiAgfVxuXG4gIGJvbmRpbmdQYXRoKGNvbm5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoY29ubklkID09PSBcIl9sZWdhY3lcIikge1xuICAgICAgcmV0dXJuIGAke0FQSV9CQVNFX1BBVEh9L2JvbmRpbmdgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vY29ubmVjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoY29ubklkKX0vYm9uZGluZ2A7XG4gIH1cblxuICBib25kaW5nRmFpbG92ZXJQYXRoKGNvbm5JZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoY29ubklkID09PSBcIl9sZWdhY3lcIikge1xuICAgICAgcmV0dXJuIGAke0FQSV9CQVNFX1BBVEh9L2JvbmRpbmcvZmFpbG92ZXJgO1xuICAgIH1cbiAgICByZXR1cm4gYCR7QVBJX0JBU0VfUEFUSH0vY29ubmVjdGlvbnMvJHtlbmNvZGVVUklDb21wb25lbnQoY29ubklkKX0vYm9uZGluZy9mYWlsb3ZlcmA7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0KGlucHV0OiBSZXF1ZXN0SW5mbywgaW5pdDogUmVxdWVzdEluaXQgPSB7fSk6IFByb21pc2U8UmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGFwaUZldGNoKGlucHV0LCBpbml0KTtcbiAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgIGNvbnN0IGVycm9yOiBBdXRoZW50aWNhdGVkRXJyb3IgPSBuZXcgRXJyb3IoTUFOQUdFTUVOVF9UT0tFTl9FUlJPUl9NRVNTQUdFKTtcbiAgICAgIGVycm9yLmlzVW5hdXRob3JpemVkID0gdHJ1ZTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2U7XG4gIH1cblxuICBhdXRoRmFpbHVyZU1lc3NhZ2UoY29udGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7TUFOQUdFTUVOVF9UT0tFTl9FUlJPUl9NRVNTQUdFfSBGYWlsZWQgd2hpbGUgJHtjb250ZXh0fS4gJHt0aGlzLnRva2VuSGVscFRleHR9YDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBQYWdlIHJlbmRlcmluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICByZW5kZXJQYWdlKCkge1xuICAgIHRoaXMucmVuZGVyVGFicygpO1xuICAgIHRoaXMucmVuZGVyQ29ubmVjdGlvbkNvbnRlbnQoKTtcbiAgfVxuXG4gIHJlbmRlclRhYnMoKSB7XG4gICAgY29uc3QgdGFic0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29ubmVjdGlvblRhYnNcIik7XG4gICAgaWYgKCF0YWJzRGl2KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ubmVjdGlvbnMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHRhYnNEaXYuaW5uZXJIVE1MID0gXCJcIjtcbiAgICAgIHRhYnNEaXYuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRhYnNEaXYuc3R5bGUuZGlzcGxheSA9IFwiXCI7XG4gICAgdGFic0Rpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz1cInRhYnMtY29udGFpbmVyXCI+JHt0aGlzLmNvbm5lY3Rpb25zXG4gICAgICAubWFwKChjKSA9PiB7XG4gICAgICAgIGNvbnN0IGljb24gPSBjLnR5cGUgPT09IFwic2VydmVyXCIgPyBcIiYjeDFGNUE1O1wiIDogXCImI3gxRjRGMTtcIjtcbiAgICAgICAgY29uc3Qgc3RhdHVzRG90ID1cbiAgICAgICAgICBjLmhlYWx0aHkgPT09IGZhbHNlXG4gICAgICAgICAgICA/ICc8c3BhbiBjbGFzcz1cInRhYi1zdGF0dXMtZG90IGVycm9yXCI+PC9zcGFuPidcbiAgICAgICAgICAgIDogYy5yZWFkeVRvU2VuZCB8fCBjLnR5cGUgPT09IFwic2VydmVyXCJcbiAgICAgICAgICAgICAgPyAnPHNwYW4gY2xhc3M9XCJ0YWItc3RhdHVzLWRvdCBva1wiPjwvc3Bhbj4nXG4gICAgICAgICAgICAgIDogJzxzcGFuIGNsYXNzPVwidGFiLXN0YXR1cy1kb3Qgd2FybmluZ1wiPjwvc3Bhbj4nO1xuICAgICAgICByZXR1cm4gYDxidXR0b24gY2xhc3M9XCJjb25uZWN0aW9uLXRhYiR7Yy5pZCA9PT0gdGhpcy5hY3RpdmVDb25uZWN0aW9uSWQgPyBcIiBhY3RpdmVcIiA6IFwiXCJ9XCJcbiAgICAgICAgICAgICAgICBkYXRhLWNvbm5lY3Rpb24taWQ9XCIke3RoaXMuZXNjYXBlSHRtbChjLmlkKX1cIj5cbiAgICAgICAgICAke3N0YXR1c0RvdH1cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi1pY29uXCI+JHtpY29ufTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi1uYW1lXCI+JHt0aGlzLmVzY2FwZUh0bWwoYy5uYW1lIHx8IGMuaWQpfTwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRhYi10eXBlXCI+JHt0aGlzLmVzY2FwZUh0bWwoYy50eXBlKX08L3NwYW4+XG4gICAgICAgIDwvYnV0dG9uPmA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCJcIil9PC9kaXY+YDtcblxuICAgIC8vIEF0dGFjaCB0YWIgY2xpY2sgbGlzdGVuZXJzXG4gICAgdGFic0Rpdi5xdWVyeVNlbGVjdG9yQWxsKFwiLmNvbm5lY3Rpb24tdGFiXCIpLmZvckVhY2goKGJ0bikgPT4ge1xuICAgICAgYnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGlkID0gKGJ0biBhcyBIVE1MRWxlbWVudCkuZGF0YXNldC5jb25uZWN0aW9uSWQ7XG4gICAgICAgIGlmIChpZCAhPT0gdGhpcy5hY3RpdmVDb25uZWN0aW9uSWQpIHtcbiAgICAgICAgICB0aGlzLmFjdGl2ZUNvbm5lY3Rpb25JZCA9IGlkITtcbiAgICAgICAgICB0aGlzLnJlbmRlclBhZ2UoKTtcbiAgICAgICAgICB0aGlzLmxvYWRDb25uZWN0aW9uRGF0YSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHJlbmRlckNvbm5lY3Rpb25Db250ZW50KCkge1xuICAgIGNvbnN0IGNvbnRlbnREaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbm5lY3Rpb25Db250ZW50XCIpO1xuICAgIGlmICghY29udGVudERpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbm4gPSB0aGlzLmdldEFjdGl2ZUNvbm5lY3Rpb24oKTtcbiAgICB0aGlzLmlzU2VydmVyTW9kZSA9IGNvbm4udHlwZSA9PT0gXCJzZXJ2ZXJcIjtcblxuICAgIGlmICh0aGlzLmlzU2VydmVyTW9kZSkge1xuICAgICAgdGhpcy5yZW5kZXJTZXJ2ZXJDb250ZW50KGNvbnRlbnREaXYpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJlbmRlckNsaWVudENvbnRlbnQoY29udGVudERpdik7XG4gICAgfVxuXG4gICAgdGhpcy5zZXR1cEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgdGhpcy5sb2FkQ29ubmVjdGlvbkRhdGEoKTtcbiAgfVxuXG4gIHJlbmRlclNlcnZlckNvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IHRlbGVtZXRyeUFuZEhlYWx0aCA9XG4gICAgICByZW5kZXJDYXJkKFxuICAgICAgICBcIlBlcmZvcm1hbmNlIE1ldHJpY3NcIixcbiAgICAgICAgXCJSZWFsLXRpbWUgcmVjZXB0aW9uIHN0YXRpc3RpY3MgKGF1dG8tcmVmcmVzaGVzIGV2ZXJ5IDE1IHNlY29uZHMpXCIsXG4gICAgICAgIFwibWV0cmljc1wiXG4gICAgICApICtcbiAgICAgICc8ZGl2IGlkPVwibW9uaXRvcmluZ1NlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj4nICtcbiAgICAgIHJlbmRlckNhcmQoXG4gICAgICAgIFwiTmV0d29yayBRdWFsaXR5XCIsXG4gICAgICAgIFwiTGluayBxdWFsaXR5IHNjb3JlIGFuZCBuZXR3b3JrIGhlYWx0aCBpbmRpY2F0b3JzXCIsXG4gICAgICAgIFwibmV0d29ya1F1YWxpdHlcIlxuICAgICAgKSArXG4gICAgICByZW5kZXJDYXJkKFwiQmFuZHdpZHRoIE1vbml0b3JcIiwgXCJOZXR3b3JrIHJlY2VwdGlvbiBzdGF0aXN0aWNzXCIsIFwiYmFuZHdpZHRoXCIpICtcbiAgICAgIHJlbmRlckNhcmQoXCJQYXRoIEFuYWx5dGljc1wiLCBcIkluY29taW5nIGRhdGEgdm9sdW1lIGJ5IFNpZ25hbEsgcGF0aFwiLCBcInBhdGhBbmFseXRpY3NcIikgK1xuICAgICAgcmVuZGVyQ2FyZChcbiAgICAgICAgXCJNb25pdG9yaW5nICYgQWxlcnRzXCIsXG4gICAgICAgIFwiUGFja2V0IGxvc3MsIHJldHJhbnNtaXNzaW9uIHRyYWNraW5nLCBhbmQgYWxlcnQgdGhyZXNob2xkc1wiLFxuICAgICAgICBcIm1vbml0b3JpbmdBbGVydHNcIlxuICAgICAgKSArXG4gICAgICBcIjwvZGl2PlwiO1xuXG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9XG4gICAgICByZW5kZXJTZWN0aW9uR3JvdXAoXG4gICAgICAgIFwiT3BlcmF0aW9ucyAmIE1vbml0b3JpbmdcIixcbiAgICAgICAgXCJUcmFjayByZWNlcHRpb24gcXVhbGl0eSwgdGhyb3VnaHB1dCwgYW5kIHJ1bnRpbWUgYmVoYXZpb3IuXCIsXG4gICAgICAgIHRlbGVtZXRyeUFuZEhlYWx0aCxcbiAgICAgICAgXCJvcGVyYXRpb25zR3JvdXBcIlxuICAgICAgKSArXG4gICAgICByZW5kZXJTZWN0aW9uR3JvdXAoXG4gICAgICAgIFwiQWR2YW5jZWRcIixcbiAgICAgICAgXCJGdWxsIHBsdWdpbiBjb25maWd1cmF0b3IgKEpTT04gZWRpdG9yKS5cIixcbiAgICAgICAgdGhpcy5yZW5kZXJQbHVnaW5Db25maWd1cmF0aW9uQ2FyZCgpLFxuICAgICAgICBcImFkdmFuY2VkR3JvdXBcIlxuICAgICAgKTtcbiAgfVxuXG4gIHJlbmRlckNsaWVudENvbnRlbnQoY29udGFpbmVyOiBIVE1MRWxlbWVudCkge1xuICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPVxuICAgICAgdGhpcy5yZW5kZXJEZWx0YVRpbWVyQ2FyZCgpICsgdGhpcy5yZW5kZXJTdWJzY3JpcHRpb25DYXJkKCkgKyB0aGlzLnJlbmRlclNlbnRlbmNlRmlsdGVyQ2FyZCgpO1xuXG4gICAgY29uc3QgdGVsZW1ldHJ5QW5kSGVhbHRoID1cbiAgICAgIHJlbmRlckNhcmQoXG4gICAgICAgIFwiUGVyZm9ybWFuY2UgTWV0cmljc1wiLFxuICAgICAgICBcIlJlYWwtdGltZSB0cmFuc21pc3Npb24gc3RhdGlzdGljcyAoYXV0by1yZWZyZXNoZXMgZXZlcnkgMTUgc2Vjb25kcylcIixcbiAgICAgICAgXCJtZXRyaWNzXCJcbiAgICAgICkgK1xuICAgICAgJzxkaXYgaWQ9XCJjb25nZXN0aW9uU2VjdGlvblwiIGNsYXNzPVwiY29uZmlnLXNlY3Rpb25cIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj4nICtcbiAgICAgIHJlbmRlckNhcmQoXG4gICAgICAgIFwiTmV0d29yayBRdWFsaXR5XCIsXG4gICAgICAgIFwiTGluayBxdWFsaXR5IHNjb3JlIGFuZCBuZXR3b3JrIGhlYWx0aCBpbmRpY2F0b3JzXCIsXG4gICAgICAgIFwibmV0d29ya1F1YWxpdHlcIlxuICAgICAgKSArXG4gICAgICByZW5kZXJDYXJkKFwiQmFuZHdpZHRoIE1vbml0b3JcIiwgXCJSZWFsLXRpbWUgZGF0YSB0cmFuc21pc3Npb24gc3RhdGlzdGljc1wiLCBcImJhbmR3aWR0aFwiKSArXG4gICAgICByZW5kZXJDYXJkKFwiUGF0aCBBbmFseXRpY3NcIiwgXCJEYXRhIHZvbHVtZSBieSBzdWJzY3JpcHRpb24gcGF0aFwiLCBcInBhdGhBbmFseXRpY3NcIikgK1xuICAgICAgcmVuZGVyQ2FyZChcbiAgICAgICAgXCJDb25nZXN0aW9uIENvbnRyb2xcIixcbiAgICAgICAgXCJBSU1EIGNvbmdlc3Rpb24gY29udHJvbCBzdGF0ZSBhbmQgZGVsdGEgdGltZXIgYXV0by1hZGp1c3RtZW50XCIsXG4gICAgICAgIFwiY29uZ2VzdGlvbkNvbnRyb2xcIlxuICAgICAgKSArXG4gICAgICBcIjwvZGl2PlwiICtcbiAgICAgICc8ZGl2IGlkPVwiYm9uZGluZ1NlY3Rpb25cIiBjbGFzcz1cImNvbmZpZy1zZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+JyArXG4gICAgICByZW5kZXJDYXJkKFxuICAgICAgICBcIkNvbm5lY3Rpb24gQm9uZGluZ1wiLFxuICAgICAgICBcIk11bHRpLWxpbmsgYm9uZGluZyBzdGF0dXMgYW5kIGZhaWxvdmVyIGNvbnRyb2xcIixcbiAgICAgICAgXCJib25kaW5nU3RhdHVzXCJcbiAgICAgICkgK1xuICAgICAgXCI8L2Rpdj5cIiArXG4gICAgICAnPGRpdiBpZD1cIm1vbml0b3JpbmdTZWN0aW9uXCIgc3R5bGU9XCJkaXNwbGF5Om5vbmU7XCI+JyArXG4gICAgICByZW5kZXJDYXJkKFxuICAgICAgICBcIk1vbml0b3JpbmcgJiBBbGVydHNcIixcbiAgICAgICAgXCJQYWNrZXQgbG9zcywgcmV0cmFuc21pc3Npb24gdHJhY2tpbmcsIGFuZCBhbGVydCB0aHJlc2hvbGRzXCIsXG4gICAgICAgIFwibW9uaXRvcmluZ0FsZXJ0c1wiXG4gICAgICApICtcbiAgICAgIFwiPC9kaXY+XCIgK1xuICAgICAgcmVuZGVyQ2FyZChcIlN0YXR1c1wiLCBudWxsLCBcInN0YXR1c1wiLCBcInN0YXR1cy1pbmZvXCIpO1xuXG4gICAgY29udGFpbmVyLmlubmVySFRNTCA9XG4gICAgICByZW5kZXJTZWN0aW9uR3JvdXAoXG4gICAgICAgIFwiQ29uZmlndXJhdGlvblwiLFxuICAgICAgICBcIlNldCB1cCB0cmFuc21pc3Npb24gYmVoYXZpb3IgYW5kIHBsdWdpbi1sZXZlbCBwYXJhbWV0ZXJzLlwiLFxuICAgICAgICBjb25maWd1cmF0aW9uLFxuICAgICAgICBcImNvbmZpZ3VyYXRpb25Hcm91cFwiXG4gICAgICApICtcbiAgICAgIHJlbmRlclNlY3Rpb25Hcm91cChcbiAgICAgICAgXCJPcGVyYXRpb25zICYgTW9uaXRvcmluZ1wiLFxuICAgICAgICBcIlRyYWNrIHRyYW5zbWlzc2lvbiBxdWFsaXR5LCByZWxpYWJpbGl0eSwgYW5kIHJ1bnRpbWUgcGVyZm9ybWFuY2UuXCIsXG4gICAgICAgIHRlbGVtZXRyeUFuZEhlYWx0aCxcbiAgICAgICAgXCJvcGVyYXRpb25zR3JvdXBcIlxuICAgICAgKSArXG4gICAgICByZW5kZXJTZWN0aW9uR3JvdXAoXG4gICAgICAgIFwiQWR2YW5jZWRcIixcbiAgICAgICAgXCJGdWxsIHBsdWdpbiBjb25maWd1cmF0b3IgKEpTT04gZWRpdG9yKS5cIixcbiAgICAgICAgdGhpcy5yZW5kZXJQbHVnaW5Db25maWd1cmF0aW9uQ2FyZCgpLFxuICAgICAgICBcImFkdmFuY2VkR3JvdXBcIlxuICAgICAgKTtcbiAgfVxuXG4gIHJlbmRlckRlbHRhVGltZXJDYXJkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgPGgyPkRlbHRhIFRpbWVyIENvbmZpZ3VyYXRpb248L2gyPlxuICAgICAgICAgICAgPHA+Q29udHJvbHMgaG93IG9mdGVuIGRlbHRhcyBhcmUgY29sbGVjdGVkIGFuZCBzZW50IChpbiBtaWxsaXNlY29uZHMpPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJkZWx0YVRpbWVyXCI+RGVsdGEgVGltZXIgKG1zKTo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIGlkPVwiZGVsdGFUaW1lclwiIG1pbj1cIjEwMFwiIG1heD1cIjEwMDAwXCIgc3RlcD1cIjEwMFwiIHBsYWNlaG9sZGVyPVwiMTAwMFwiIC8+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImhlbHAtdGV4dFwiPlxuICAgICAgICAgICAgICAgIExvd2VyIHZhbHVlcyA9IG1vcmUgZnJlcXVlbnQgdXBkYXRlcywgaGlnaGVyIGJhbmR3aWR0aCB1c2FnZTxicj5cbiAgICAgICAgICAgICAgICBIaWdoZXIgdmFsdWVzID0gYmV0dGVyIGNvbXByZXNzaW9uIHJhdGlvLCBsb3dlciBiYW5kd2lkdGggdXNhZ2VcbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmVEZWx0YVRpbWVyXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5TYXZlIERlbHRhIFRpbWVyPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHJlbmRlclN1YnNjcmlwdGlvbkNhcmQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxuICAgICAgPGRpdiBjbGFzcz1cImNvbmZpZy1zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyXCI+XG4gICAgICAgICAgICA8aDI+U3Vic2NyaXB0aW9uIENvbmZpZ3VyYXRpb248L2gyPlxuICAgICAgICAgICAgPHA+RGVmaW5lIHdoaWNoIFNpZ25hbEsgZGF0YSBwYXRocyB0byBzdWJzY3JpYmUgdG88L3A+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNvbnRleHRcIj5Db250ZXh0OjwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwiY29udGV4dFwiIHBsYWNlaG9sZGVyPVwiKlwiIC8+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImhlbHAtdGV4dFwiPlxuICAgICAgICAgICAgICAgIENvbnRleHQgZm9yIHRoZSBzdWJzY3JpcHRpb24gKGUuZy4sIFwidmVzc2Vscy5zZWxmXCIsIFwiKlwiIGZvciBhbGwpXG4gICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdWJzY3JpcHRpb24tcGF0aHNcIj5cbiAgICAgICAgICAgICAgPGgzPlN1YnNjcmlwdGlvbiBQYXRoczwvaDM+XG4gICAgICAgICAgICAgIDxkaXYgaWQ9XCJwYXRoc0xpc3RcIiBjbGFzcz1cInBhdGhzLWxpc3RcIj48L2Rpdj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImFkZFBhdGhcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCI+QWRkIFBhdGg8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPVwibWV0YS1jb25maWdcIj5cbiAgICAgICAgICAgICAgPGxlZ2VuZD5NZXRhZGF0YSBzdHJlYW1pbmc8L2xlZ2VuZD5cbiAgICAgICAgICAgICAgPHAgY2xhc3M9XCJoZWxwLXRleHRcIj5cbiAgICAgICAgICAgICAgICBBbHNvIGZvcndhcmQgU2lnbmFsIEsgcGF0aCBtZXRhZGF0YSAodW5pdHMsIGRlc2NyaXB0aW9ucywgem9uZXMsXG4gICAgICAgICAgICAgICAgZGlzcGxheSBuYW1lcywgLi4uKSB0byB0aGUgcmVtb3RlIHJlY2VpdmVyLiBEaXNhYmxlZCBieSBkZWZhdWx0LlxuICAgICAgICAgICAgICAgIE1ldGEgaXMgc2VudCBhcyBhIGZ1bGwgc25hcHNob3QgYXQgc3RhcnR1cCBhbmQgcmUtYnJvYWRjYXN0IG9uXG4gICAgICAgICAgICAgICAgYW4gaW50ZXJ2YWwgc28gYSByZXN0YXJ0ZWQgcmVjZWl2ZXIgY2FuIHJlY292ZXIgd2l0aG91dCBhXG4gICAgICAgICAgICAgICAgcm91bmQtdHJpcC5cbiAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD1cIm1ldGFFbmFibGVkXCIgLz5cbiAgICAgICAgICAgICAgICAgIEluY2x1ZGUgbWV0YWRhdGFcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibWV0YUludGVydmFsU2VjXCI+U25hcHNob3QgaW50ZXJ2YWwgKHNlY29uZHMpOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBpZD1cIm1ldGFJbnRlcnZhbFNlY1wiIG1pbj1cIjMwXCIgbWF4PVwiODY0MDBcIiBzdGVwPVwiMVwiIHBsYWNlaG9sZGVyPVwiMzAwXCIgLz5cbiAgICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJoZWxwLXRleHRcIj5CZXR3ZWVuIDMwIGFuZCA4NjQwMC4gRGVmYXVsdCAzMDAgKDUgbWludXRlcykuPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1ldGFQYXRoc1JlZ2V4XCI+SW5jbHVkZSBwYXRocyBtYXRjaGluZyAocmVnZXgsIG9wdGlvbmFsKTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGlkPVwibWV0YVBhdGhzUmVnZXhcIiBwbGFjZWhvbGRlcj1cIlwiIC8+XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC10ZXh0XCI+TGVhdmUgZW1wdHkgdG8gaW5jbHVkZSBldmVyeSBzdWJzY3JpYmVkIHBhdGguPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cIm1ldGFNYXhQZXJQYWNrZXRcIj5NYXggcGF0aHMgcGVyIHBhY2tldDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgaWQ9XCJtZXRhTWF4UGVyUGFja2V0XCIgbWluPVwiMTBcIiBtYXg9XCI1MDAwXCIgc3RlcD1cIjFcIiBwbGFjZWhvbGRlcj1cIjUwMFwiIC8+XG4gICAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC10ZXh0XCI+QmV0d2VlbiAxMCBhbmQgNTAwMC4gRGVmYXVsdCA1MDAuPC9zbWFsbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImpzb24tZWRpdG9yXCI+XG4gICAgICAgICAgICAgIDxoMz5KU09OIEVkaXRvcjwvaDM+XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD1cInN1YnNjcmlwdGlvbkpzb25cIiByb3dzPVwiMTBcIiBwbGFjZWhvbGRlcj0ne1wiY29udGV4dFwiOiBcIipcIiwgXCJzdWJzY3JpYmVcIjogW3tcInBhdGhcIjogXCIqXCJ9XX0nPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgIDxzbWFsbCBjbGFzcz1cImhlbHAtdGV4dFwiPkFkdmFuY2VkOiBFZGl0IHRoZSByYXcgSlNPTiBjb25maWd1cmF0aW9uPC9zbWFsbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGJ1dHRvbiBpZD1cInNhdmVTdWJzY3JpcHRpb25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPlNhdmUgU3Vic2NyaXB0aW9uPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHJlbmRlclNlbnRlbmNlRmlsdGVyQ2FyZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiY29uZmlnLXNlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxoMj5TZW50ZW5jZSBGaWx0ZXI8L2gyPlxuICAgICAgICAgICAgPHA+RXhjbHVkZSBOTUVBIHNlbnRlbmNlcyBmcm9tIHRyYW5zbWlzc2lvbiAocmVkdWNlcyBiYW5kd2lkdGgpPC9wPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJzZW50ZW5jZUZpbHRlclwiPkV4Y2x1ZGVkIFNlbnRlbmNlczo8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBpZD1cInNlbnRlbmNlRmlsdGVyXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJoZWxwLXRleHRcIj5cbiAgICAgICAgICAgICAgICBDb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBOTUVBIHNlbnRlbmNlIHR5cGVzIHRvIGV4Y2x1ZGUuXG4gICAgICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzYXZlU2VudGVuY2VGaWx0ZXJcIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiPlNhdmUgU2VudGVuY2UgRmlsdGVyPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgYDtcbiAgfVxuXG4gIHJlbmRlclBsdWdpbkNvbmZpZ3VyYXRpb25DYXJkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBcbiAgICAgIDxkaXYgY2xhc3M9XCJjb25maWctc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlclwiPlxuICAgICAgICAgICAgPGgyPkZ1bGwgUGx1Z2luIENvbmZpZ3VyYXRpb248L2gyPlxuICAgICAgICAgICAgPHA+QWxsIHBhcmFtZXRlcnMgZnJvbSA8Y29kZT4vcGx1Z2luLWNvbmZpZzwvY29kZT4gKGFkdmFuY2VkIEpTT04gZWRpdG9yKTwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1jb250ZW50XCI+XG4gICAgICAgICAgICA8ZGl2IGlkPVwicGx1Z2luQ29uZmlnU3VtbWFyeVwiIGNsYXNzPVwicGx1Z2luLWNvbmZpZy1zdW1tYXJ5XCI+XG4gICAgICAgICAgICAgIDxwPkxvYWRpbmcgcGx1Z2luIGNvbmZpZ3VyYXRpb24uLi48L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJqc29uLWVkaXRvciBwbHVnaW4tY29uZmlnLWVkaXRvclwiPlxuICAgICAgICAgICAgICA8aDM+UGx1Z2luIENvbmZpZyBKU09OPC9oMz5cbiAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgaWQ9XCJwbHVnaW5Db25maWdKc29uXCJcbiAgICAgICAgICAgICAgICByb3dzPVwiMjBcIlxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSd7XCJzZXJ2ZXJUeXBlXCI6XCJjbGllbnRcIixcInVkcFBvcnRcIjo0NDQ2LFwic2VjcmV0S2V5XCI6XCIuLi5cIn0nXG4gICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICA8c21hbGwgY2xhc3M9XCJoZWxwLXRleHRcIj5cbiAgICAgICAgICAgICAgICBUaGlzIGVkaXRvciBleHBvc2VzIGFsbCBhdmFpbGFibGUgcGx1Z2luIGZpZWxkcy4gU2F2ZSB0cmlnZ2VycyBwbHVnaW4gcmVzdGFydCB3aGVuIHN1cHBvcnRlZC5cbiAgICAgICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgICAgICAgPHNtYWxsIGNsYXNzPVwiaGVscC10ZXh0XCI+JHt0aGlzLmVzY2FwZUh0bWwodGhpcy50b2tlbkhlbHBUZXh0KX08L3NtYWxsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGx1Z2luLWNvbmZpZy1hY3Rpb25zXCI+XG4gICAgICAgICAgICAgIDxidXR0b24gaWQ9XCJzYXZlUGx1Z2luQ29uZmlnXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIj5TYXZlIEZ1bGwgUGx1Z2luIENvbmZpZzwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwicmVsb2FkUGx1Z2luQ29uZmlnXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiPlJlbG9hZCBGcm9tIFNlcnZlcjwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwibG9hZERlZmF1bHRQbHVnaW5Db25maWdcIiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCI+TG9hZCBTY2hlbWEgRGVmYXVsdHM8L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG4gIH1cblxuICAvLyDilIDilIAgRGF0YSBsb2FkaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIGxvYWRDb25uZWN0aW9uRGF0YSgpIHtcbiAgICBjb25zdCBjb25uID0gdGhpcy5nZXRBY3RpdmVDb25uZWN0aW9uKCk7XG4gICAgY29uc3QgY29ubklkID0gY29ubi5pZDtcblxuICAgIGlmICghdGhpcy5pc1NlcnZlck1vZGUpIHtcbiAgICAgIGF3YWl0IHRoaXMubG9hZENvbmZpZ3VyYXRpb25zKGNvbm5JZCk7XG4gICAgICB0aGlzLnVwZGF0ZVVJKCk7XG4gICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVBsdWdpbkNvbmZpZ1VJKCk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5sb2FkTWV0cmljcyhjb25uSWQpO1xuICB9XG5cbiAgYXN5bmMgbG9hZFBsdWdpbkNvbmZpZ3VyYXRpb24oc2hvd0Vycm9ycyA9IHRydWUpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgW2NvbmZpZ1Jlc3BvbnNlLCBzY2hlbWFSZXNwb25zZV0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMucmVxdWVzdChgJHtBUElfQkFTRV9QQVRIfS9wbHVnaW4tY29uZmlnYCksXG4gICAgICAgIHRoaXMucmVxdWVzdChgJHtBUElfQkFTRV9QQVRIfS9wbHVnaW4tc2NoZW1hYClcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoIWNvbmZpZ1Jlc3BvbnNlLm9rKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGxvYWQgcGx1Z2luIGNvbmZpZ3VyYXRpb24gKCR7Y29uZmlnUmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29uZmlnRGF0YSA9IGF3YWl0IGNvbmZpZ1Jlc3BvbnNlLmpzb24oKTtcbiAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPVxuICAgICAgICBjb25maWdEYXRhICYmXG4gICAgICAgIGNvbmZpZ0RhdGEuY29uZmlndXJhdGlvbiAmJlxuICAgICAgICB0eXBlb2YgY29uZmlnRGF0YS5jb25maWd1cmF0aW9uID09PSBcIm9iamVjdFwiICYmXG4gICAgICAgICFBcnJheS5pc0FycmF5KGNvbmZpZ0RhdGEuY29uZmlndXJhdGlvbilcbiAgICAgICAgICA/IGNvbmZpZ0RhdGEuY29uZmlndXJhdGlvblxuICAgICAgICAgIDoge307XG5cbiAgICAgIGlmIChzY2hlbWFSZXNwb25zZS5vaykge1xuICAgICAgICBjb25zdCBzY2hlbWFEYXRhID0gYXdhaXQgc2NoZW1hUmVzcG9uc2UuanNvbigpO1xuICAgICAgICBpZiAoc2NoZW1hRGF0YSAmJiBzY2hlbWFEYXRhLnNjaGVtYSAmJiB0eXBlb2Ygc2NoZW1hRGF0YS5zY2hlbWEgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICB0aGlzLnBsdWdpblNjaGVtYSA9IHNjaGVtYURhdGEuc2NoZW1hO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBzY2hlbWFEYXRhICYmXG4gICAgICAgICAgKHNjaGVtYURhdGEuY3VycmVudE1vZGUgPT09IFwic2VydmVyXCIgfHwgc2NoZW1hRGF0YS5jdXJyZW50TW9kZSA9PT0gXCJjbGllbnRcIilcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy5zY2hlbWFDdXJyZW50TW9kZSA9IHNjaGVtYURhdGEuY3VycmVudE1vZGU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5wbHVnaW5Db25maWcgPSB0aGlzLmJ1aWxkQ29tcGxldGVQbHVnaW5Db25maWcoY29uZmlndXJhdGlvbik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgaWYgKHNob3dFcnJvcnMpIHtcbiAgICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgQXV0aGVudGljYXRlZEVycm9yO1xuICAgICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oXG4gICAgICAgICAgZXJyLmlzVW5hdXRob3JpemVkXG4gICAgICAgICAgICA/IHRoaXMuYXV0aEZhaWx1cmVNZXNzYWdlKFwibG9hZGluZyBwbHVnaW4gY29uZmlnXCIpXG4gICAgICAgICAgICA6IFwiRXJyb3IgbG9hZGluZyBwbHVnaW4gY29uZmlnOiBcIiArIGVyci5tZXNzYWdlLFxuICAgICAgICAgIFwid2FybmluZ1wiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZENvbmZpZ3VyYXRpb25zKGNvbm5JZDogc3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IFtkZWx0YVJlc3BvbnNlLCBzdWJSZXNwb25zZSwgZmlsdGVyUmVzcG9uc2VdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgICB0aGlzLnJlcXVlc3QodGhpcy5jb25maWdQYXRoKGNvbm5JZCwgXCJkZWx0YV90aW1lci5qc29uXCIpKSxcbiAgICAgICAgdGhpcy5yZXF1ZXN0KHRoaXMuY29uZmlnUGF0aChjb25uSWQsIFwic3Vic2NyaXB0aW9uLmpzb25cIikpLFxuICAgICAgICB0aGlzLnJlcXVlc3QodGhpcy5jb25maWdQYXRoKGNvbm5JZCwgXCJzZW50ZW5jZV9maWx0ZXIuanNvblwiKSlcbiAgICAgIF0pO1xuXG4gICAgICB0aGlzLmRlbHRhVGltZXJDb25maWcgPSBkZWx0YVJlc3BvbnNlLm9rID8gYXdhaXQgZGVsdGFSZXNwb25zZS5qc29uKCkgOiBudWxsO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25Db25maWcgPSBzdWJSZXNwb25zZS5vayA/IGF3YWl0IHN1YlJlc3BvbnNlLmpzb24oKSA6IG51bGw7XG4gICAgICB0aGlzLnNlbnRlbmNlRmlsdGVyQ29uZmlnID0gZmlsdGVyUmVzcG9uc2Uub2sgPyBhd2FpdCBmaWx0ZXJSZXNwb25zZS5qc29uKCkgOiBudWxsO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBjb25zdCBlcnIgPSBlcnJvciBhcyBBdXRoZW50aWNhdGVkRXJyb3I7XG4gICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIGVyci5pc1VuYXV0aG9yaXplZFxuICAgICAgICAgID8gdGhpcy5hdXRoRmFpbHVyZU1lc3NhZ2UoXCJsb2FkaW5nIGNvbm5lY3Rpb24gY29uZmlndXJhdGlvblwiKVxuICAgICAgICAgIDogXCJFcnJvciBsb2FkaW5nIGNvbmZpZ3VyYXRpb25zOiBcIiArIGVyci5tZXNzYWdlLFxuICAgICAgICBcImVycm9yXCJcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbG9hZE1ldHJpY3MoY29ubklkPzogc3RyaW5nKSB7XG4gICAgaWYgKCFjb25uSWQpIHtcbiAgICAgIGNvbm5JZCA9IHRoaXMuYWN0aXZlQ29ubmVjdGlvbklkITtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5yZXF1ZXN0KHRoaXMubWV0cmljc1BhdGgoY29ubklkKSk7XG4gICAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgICAgY29uc3QgbWV0cmljcyA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPSBtZXRyaWNzLnByb3RvY29sVmVyc2lvbiB8fCAxO1xuICAgICAgICB0aGlzLnVwZGF0ZU1ldHJpY3NEaXNwbGF5KG1ldHJpY3MpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb3RvY29sVmVyc2lvbiA+PSAyKSB7XG4gICAgICAgICAgdGhpcy5sb2FkVjJEYXRhKGNvbm5JZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGxvYWRpbmcgbWV0cmljczpcIiwgKGVycm9yIGFzIEVycm9yKS5tZXNzYWdlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBsb2FkVjJEYXRhKGNvbm5JZDogc3RyaW5nKSB7XG4gICAgY29uc3QgaXNDbGllbnQgPSAhdGhpcy5pc1NlcnZlck1vZGU7XG5cbiAgICBjb25zdCBmZXRjaGVzOiBQcm9taXNlPFJlc3BvbnNlIHwgbnVsbD5bXSA9IFtcbiAgICAgIHRoaXMucmVxdWVzdCh0aGlzLm1vbml0b3JpbmdQYXRoKGNvbm5JZCwgXCJhbGVydHNcIikpLmNhdGNoKCgpID0+IG51bGwpLFxuICAgICAgdGhpcy5yZXF1ZXN0KHRoaXMubW9uaXRvcmluZ1BhdGgoY29ubklkLCBcInBhY2tldC1sb3NzXCIpKS5jYXRjaCgoKSA9PiBudWxsKSxcbiAgICAgIHRoaXMucmVxdWVzdCh0aGlzLm1vbml0b3JpbmdQYXRoKGNvbm5JZCwgXCJyZXRyYW5zbWlzc2lvbnNcIikpLmNhdGNoKCgpID0+IG51bGwpXG4gICAgXTtcblxuICAgIGlmIChpc0NsaWVudCkge1xuICAgICAgZmV0Y2hlcy5wdXNoKFxuICAgICAgICB0aGlzLnJlcXVlc3QodGhpcy5jb25nZXN0aW9uUGF0aChjb25uSWQpKS5jYXRjaCgoKSA9PiBudWxsKSxcbiAgICAgICAgdGhpcy5yZXF1ZXN0KHRoaXMuYm9uZGluZ1BhdGgoY29ubklkKSkuY2F0Y2goKCkgPT4gbnVsbClcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGZldGNoZXMpO1xuICAgIGNvbnN0IFthbGVydHNSZXMsIHBhY2tldExvc3NSZXMsIHJldHJhbnNtaXNzaW9uc1JlcywgY29uZ2VzdGlvblJlcywgYm9uZGluZ1Jlc10gPSByZXN1bHRzO1xuXG4gICAgY29uc3QgbW9uaXRvcmluZ0RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgaWYgKGFsZXJ0c1JlcyAmJiBhbGVydHNSZXMub2spIHtcbiAgICAgIG1vbml0b3JpbmdEYXRhLmFsZXJ0cyA9IGF3YWl0IGFsZXJ0c1Jlcy5qc29uKCk7XG4gICAgfVxuICAgIGlmIChwYWNrZXRMb3NzUmVzICYmIHBhY2tldExvc3NSZXMub2spIHtcbiAgICAgIG1vbml0b3JpbmdEYXRhLnBhY2tldExvc3MgPSBhd2FpdCBwYWNrZXRMb3NzUmVzLmpzb24oKTtcbiAgICB9XG4gICAgaWYgKHJldHJhbnNtaXNzaW9uc1JlcyAmJiByZXRyYW5zbWlzc2lvbnNSZXMub2spIHtcbiAgICAgIG1vbml0b3JpbmdEYXRhLnJldHJhbnNtaXNzaW9ucyA9IGF3YWl0IHJldHJhbnNtaXNzaW9uc1Jlcy5qc29uKCk7XG4gICAgfVxuICAgIHRoaXMudXBkYXRlTW9uaXRvcmluZ0Rpc3BsYXkobW9uaXRvcmluZ0RhdGEpO1xuXG4gICAgaWYgKGlzQ2xpZW50ICYmIGNvbmdlc3Rpb25SZXMgJiYgY29uZ2VzdGlvblJlcy5vaykge1xuICAgICAgY29uc3QgY29uZ2VzdGlvbkRhdGEgPSBhd2FpdCBjb25nZXN0aW9uUmVzLmpzb24oKTtcbiAgICAgIHRoaXMudXBkYXRlQ29uZ2VzdGlvbkRpc3BsYXkoY29uZ2VzdGlvbkRhdGEpO1xuICAgIH1cblxuICAgIGlmIChpc0NsaWVudCAmJiBib25kaW5nUmVzICYmIGJvbmRpbmdSZXMub2spIHtcbiAgICAgIGNvbnN0IGJvbmRpbmdEYXRhID0gYXdhaXQgYm9uZGluZ1Jlcy5qc29uKCk7XG4gICAgICB0aGlzLnVwZGF0ZUJvbmRpbmdEaXNwbGF5KGJvbmRpbmdEYXRhKTtcbiAgICB9XG4gIH1cblxuICBzdGFydE1ldHJpY3NSZWZyZXNoKCkge1xuICAgIGlmICh0aGlzLm1ldHJpY3NJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLm1ldHJpY3NJbnRlcnZhbCk7XG4gICAgfVxuXG4gICAgdGhpcy5tZXRyaWNzSW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5fcmVmcmVzaEluRmxpZ2h0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3JlZnJlc2hJbkZsaWdodCA9IHRydWU7XG4gICAgICB0aGlzLnJlZnJlc2hBY3RpdmVUYWIoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgdGhpcy5fcmVmcmVzaEluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9LCBNRVRSSUNTX1JFRlJFU0hfSU5URVJWQUwpO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaEFjdGl2ZVRhYigpIHtcbiAgICAvLyBSZWZyZXNoIHRoZSBjb25uZWN0aW9ucyBsaXN0IHRvIHVwZGF0ZSB0YWIgYmFkZ2VzXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IHRoaXMucmVxdWVzdChgJHtBUElfQkFTRV9QQVRIfS9jb25uZWN0aW9uc2ApO1xuICAgICAgaWYgKHJlcy5vaykge1xuICAgICAgICBjb25zdCB1cGRhdGVkID0gYXdhaXQgcmVzLmpzb24oKTtcbiAgICAgICAgaWYgKHVwZGF0ZWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRoaXMuY29ubmVjdGlvbnMgPSB1cGRhdGVkO1xuICAgICAgICAgIHRoaXMucmVuZGVyVGFicygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoX2UpIHtcbiAgICAgIC8qIGlnbm9yZSAqL1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMubG9hZE1ldHJpY3ModGhpcy5hY3RpdmVDb25uZWN0aW9uSWQhKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBFdmVudCBsaXN0ZW5lcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgc2V0dXBFdmVudExpc3RlbmVycygpIHtcbiAgICBjb25zdCBzYXZlRGVsdGFUaW1lckJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2F2ZURlbHRhVGltZXJcIik7XG4gICAgaWYgKHNhdmVEZWx0YVRpbWVyQnRuKSB7XG4gICAgICBzYXZlRGVsdGFUaW1lckJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4gdGhpcy5zYXZlRGVsdGFUaW1lcigpKTtcbiAgICB9XG5cbiAgICBjb25zdCBzYXZlU3Vic2NyaXB0aW9uQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXZlU3Vic2NyaXB0aW9uXCIpO1xuICAgIGlmIChzYXZlU3Vic2NyaXB0aW9uQnRuKSB7XG4gICAgICBzYXZlU3Vic2NyaXB0aW9uQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnNhdmVTdWJzY3JpcHRpb24oKSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZVNlbnRlbmNlRmlsdGVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXZlU2VudGVuY2VGaWx0ZXJcIik7XG4gICAgaWYgKHNhdmVTZW50ZW5jZUZpbHRlckJ0bikge1xuICAgICAgc2F2ZVNlbnRlbmNlRmlsdGVyQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnNhdmVTZW50ZW5jZUZpbHRlcigpKTtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRQYXRoQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJhZGRQYXRoXCIpO1xuICAgIGlmIChhZGRQYXRoQnRuKSB7XG4gICAgICBhZGRQYXRoQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLmFkZFBhdGhJdGVtKCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmlwdGlvbkpzb25FZGl0b3IgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInN1YnNjcmlwdGlvbkpzb25cIik7XG4gICAgaWYgKHN1YnNjcmlwdGlvbkpzb25FZGl0b3IpIHtcbiAgICAgIHN1YnNjcmlwdGlvbkpzb25FZGl0b3IuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuc3luY1RpbWVvdXQpIHtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5zeW5jVGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zeW5jVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zeW5jRnJvbUpzb24oKSwgSlNPTl9TWU5DX0RFQk9VTkNFKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRleHRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGV4dFwiKTtcbiAgICBpZiAoY29udGV4dElucHV0KSB7XG4gICAgICBjb250ZXh0SW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsICgpID0+IHRoaXMudXBkYXRlSnNvbkZyb21Gb3JtKCkpO1xuICAgIH1cblxuICAgIC8vIE1ldGEgY29udHJvbHMgZmVlZCB0aGUgc2FtZSBKU09OLWZyb20tZm9ybSBzeW5jIHNvIHRoZSB0ZXh0YXJlYSBhbHdheXNcbiAgICAvLyByZWZsZWN0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc3RydWN0dXJlZCBjb250cm9scy4gV2l0aG91dCB0aGVzZVxuICAgIC8vIGxpc3RlbmVycywgdGhlIHRleHRhcmVhIHdvdWxkIGxhZyBiZWhpbmQgdGhlIGZvcm0gdW50aWwgc2F2ZSBhbmQgdGhlXG4gICAgLy8gdXNlciB2aWV3aW5nIHRoZSByYXcgSlNPTiB3b3VsZCBzZWUgc3RhbGUgY29udGVudC5cbiAgICBmb3IgKGNvbnN0IG1ldGFJZCBvZiBbXCJtZXRhRW5hYmxlZFwiLCBcIm1ldGFJbnRlcnZhbFNlY1wiLCBcIm1ldGFQYXRoc1JlZ2V4XCIsIFwibWV0YU1heFBlclBhY2tldFwiXSkge1xuICAgICAgY29uc3QgZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtZXRhSWQpO1xuICAgICAgaWYgKGVsKSB7XG4gICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiB0aGlzLnVwZGF0ZUpzb25Gcm9tRm9ybSgpKTtcbiAgICAgICAgaWYgKG1ldGFJZCA9PT0gXCJtZXRhRW5hYmxlZFwiKSB7XG4gICAgICAgICAgLy8gY2hlY2tib3ggZW1pdHMgXCJjaGFuZ2VcIiByYXRoZXIgdGhhbiBcImlucHV0XCIgb24gc29tZSBicm93c2Vyc1xuICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoXCJjaGFuZ2VcIiwgKCkgPT4gdGhpcy51cGRhdGVKc29uRnJvbUZvcm0oKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBzYXZlUGx1Z2luQ29uZmlnQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzYXZlUGx1Z2luQ29uZmlnXCIpO1xuICAgIGlmIChzYXZlUGx1Z2luQ29uZmlnQnRuKSB7XG4gICAgICBzYXZlUGx1Z2luQ29uZmlnQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnNhdmVQbHVnaW5Db25maWcoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVsb2FkUGx1Z2luQ29uZmlnQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJyZWxvYWRQbHVnaW5Db25maWdcIik7XG4gICAgaWYgKHJlbG9hZFBsdWdpbkNvbmZpZ0J0bikge1xuICAgICAgcmVsb2FkUGx1Z2luQ29uZmlnQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnJlbG9hZFBsdWdpbkNvbmZpZ3VyYXRpb24oKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9hZERlZmF1bHRQbHVnaW5Db25maWdCdG4gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImxvYWREZWZhdWx0UGx1Z2luQ29uZmlnXCIpO1xuICAgIGlmIChsb2FkRGVmYXVsdFBsdWdpbkNvbmZpZ0J0bikge1xuICAgICAgbG9hZERlZmF1bHRQbHVnaW5Db25maWdCdG4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+XG4gICAgICAgIHRoaXMubG9hZERlZmF1bHRQbHVnaW5Db25maWd1cmF0aW9uKClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSAIFVJIHVwZGF0ZXMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgdXBkYXRlVUkoKSB7XG4gICAgdGhpcy51cGRhdGVQbHVnaW5Db25maWdVSSgpO1xuXG4gICAgaWYgKHRoaXMuZGVsdGFUaW1lckNvbmZpZyAmJiAodGhpcy5kZWx0YVRpbWVyQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5kZWx0YVRpbWVyKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZGVsdGFUaW1lclwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChlbCkge1xuICAgICAgICBlbC52YWx1ZSA9IFN0cmluZygodGhpcy5kZWx0YVRpbWVyQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5kZWx0YVRpbWVyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25Db25maWcpIHtcbiAgICAgIGNvbnN0IGNmZyA9IHRoaXMuc3Vic2NyaXB0aW9uQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgY3R4RWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbnRleHRcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoY3R4RWwpIHtcbiAgICAgICAgY3R4RWwudmFsdWUgPSAoY2ZnLmNvbnRleHQgYXMgc3RyaW5nKSB8fCBcIipcIjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGF0aHNMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwYXRoc0xpc3RcIik7XG4gICAgICBpZiAocGF0aHNMaXN0KSB7XG4gICAgICAgIHBhdGhzTGlzdC5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICBpZiAoY2ZnLnN1YnNjcmliZSAmJiBBcnJheS5pc0FycmF5KGNmZy5zdWJzY3JpYmUpKSB7XG4gICAgICAgICAgKGNmZy5zdWJzY3JpYmUgYXMgQXJyYXk8eyBwYXRoOiBzdHJpbmcgfT4pLmZvckVhY2goKHN1YikgPT4gdGhpcy5hZGRQYXRoSXRlbShzdWIucGF0aCkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGpzb25FbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic3Vic2NyaXB0aW9uSnNvblwiKSBhcyBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChqc29uRWwpIHtcbiAgICAgICAganNvbkVsLnZhbHVlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5zdWJzY3JpcHRpb25Db25maWcsIG51bGwsIDIpO1xuICAgICAgfVxuXG4gICAgICAvLyBQb3B1bGF0ZSB0aGUgc3RydWN0dXJlZCBtZXRhZGF0YSBjb250cm9scyBmcm9tIHRoZSBsb2FkZWQgY29uZmlnLlxuICAgICAgdGhpcy5wb3B1bGF0ZU1ldGFDb250cm9scyhjZmcubWV0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgdGhpcy5zZW50ZW5jZUZpbHRlckNvbmZpZyAmJlxuICAgICAgQXJyYXkuaXNBcnJheSgodGhpcy5zZW50ZW5jZUZpbHRlckNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXhjbHVkZWRTZW50ZW5jZXMpXG4gICAgKSB7XG4gICAgICBjb25zdCBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VudGVuY2VGaWx0ZXJcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgZWwudmFsdWUgPSAoXG4gICAgICAgICAgKHRoaXMuc2VudGVuY2VGaWx0ZXJDb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmV4Y2x1ZGVkU2VudGVuY2VzIGFzIHN0cmluZ1tdXG4gICAgICAgICkuam9pbihcIiwgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVBsdWdpbkNvbmZpZ1VJKCkge1xuICAgIGNvbnN0IGVkaXRvciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwicGx1Z2luQ29uZmlnSnNvblwiKSBhcyBIVE1MVGV4dEFyZWFFbGVtZW50IHwgbnVsbDtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwbHVnaW5Db25maWdTdW1tYXJ5XCIpO1xuXG4gICAgaWYgKCFlZGl0b3IpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMucGx1Z2luQ29uZmlnKSB7XG4gICAgICBlZGl0b3IudmFsdWUgPSBcInt9XCI7XG4gICAgICBpZiAoc3VtbWFyeSkge1xuICAgICAgICBzdW1tYXJ5LmlubmVySFRNTCA9IFwiPHA+UGx1Z2luIGNvbmZpZyB1bmF2YWlsYWJsZS48L3A+XCI7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZWRpdG9yLnZhbHVlID0gSlNPTi5zdHJpbmdpZnkodGhpcy5wbHVnaW5Db25maWcsIG51bGwsIDIpO1xuXG4gICAgaWYgKHN1bW1hcnkpIHtcbiAgICAgIGNvbnN0IGhhc0Nvbm5lY3Rpb25zID1cbiAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnBsdWdpbkNvbmZpZy5jb25uZWN0aW9ucykgJiZcbiAgICAgICAgKHRoaXMucGx1Z2luQ29uZmlnLmNvbm5lY3Rpb25zIGFzIHVua25vd25bXSkubGVuZ3RoID4gMDtcblxuICAgICAgbGV0IHN1bW1hcnlTY29wZSA9IFwiVG9wLWxldmVsXCI7XG4gICAgICBsZXQga2V5TGFiZWwgPSBcIlRvcC1MZXZlbCBGaWVsZHNcIjtcbiAgICAgIGxldCBzdW1tYXJ5Q29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHRoaXMucGx1Z2luQ29uZmlnO1xuXG4gICAgICBpZiAoaGFzQ29ubmVjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgdG90YWxDb25uZWN0aW9ucyA9ICh0aGlzLnBsdWdpbkNvbmZpZy5jb25uZWN0aW9ucyBhcyB1bmtub3duW10pLmxlbmd0aDtcbiAgICAgICAgY29uc3QgcnVudGltZUluZGV4ID0gdGhpcy5jb25uZWN0aW9ucy5maW5kSW5kZXgoKGMpID0+IGMuaWQgPT09IHRoaXMuYWN0aXZlQ29ubmVjdGlvbklkKTtcbiAgICAgICAgY29uc3Qgc3VtbWFyeUluZGV4ID1cbiAgICAgICAgICBydW50aW1lSW5kZXggPj0gMCAmJiBydW50aW1lSW5kZXggPCB0b3RhbENvbm5lY3Rpb25zID8gcnVudGltZUluZGV4IDogMDtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gKHRoaXMucGx1Z2luQ29uZmlnLmNvbm5lY3Rpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+W10pW1xuICAgICAgICAgIHN1bW1hcnlJbmRleFxuICAgICAgICBdO1xuICAgICAgICBzdW1tYXJ5Q29uZmlnID1cbiAgICAgICAgICBjYW5kaWRhdGUgJiYgdHlwZW9mIGNhbmRpZGF0ZSA9PT0gXCJvYmplY3RcIiAmJiAhQXJyYXkuaXNBcnJheShjYW5kaWRhdGUpID8gY2FuZGlkYXRlIDoge307XG4gICAgICAgIHN1bW1hcnlTY29wZSA9IGBDb25uZWN0aW9uICR7c3VtbWFyeUluZGV4ICsgMX0vJHt0b3RhbENvbm5lY3Rpb25zfWA7XG4gICAgICAgIGtleUxhYmVsID0gXCJDb25uZWN0aW9uIEZpZWxkc1wiO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtb2RlID0gdGhpcy5ub3JtYWxpemVTZXJ2ZXJUeXBlKHN1bW1hcnlDb25maWcuc2VydmVyVHlwZSkgfHwgXCJjbGllbnRcIjtcbiAgICAgIGNvbnN0IHByb3RvY29sID1cbiAgICAgICAgTnVtYmVyKHN1bW1hcnlDb25maWcucHJvdG9jb2xWZXJzaW9uKSA+PSAyID8gTnVtYmVyKHN1bW1hcnlDb25maWcucHJvdG9jb2xWZXJzaW9uKSA6IDE7XG4gICAgICBjb25zdCBrZXlDb3VudCA9IE9iamVjdC5rZXlzKHN1bW1hcnlDb25maWcpLmxlbmd0aDtcbiAgICAgIHN1bW1hcnkuaW5uZXJIVE1MID0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwicGx1Z2luLXN1bW1hcnktZ3JpZFwiPlxuICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJTY29wZVwiLCBzdW1tYXJ5U2NvcGUpfVxuICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJNb2RlXCIsIG1vZGUudG9VcHBlckNhc2UoKSl9XG4gICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIlByb3RvY29sXCIsIFwidlwiICsgU3RyaW5nKHByb3RvY29sKSl9XG4gICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShrZXlMYWJlbCwgU3RyaW5nKGtleUNvdW50KSl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgRm9ybSBoZWxwZXJzIChzdWJzY3JpcHRpb24gcGF0aHMpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFkZFBhdGhJdGVtKHBhdGggPSBcIlwiKSB7XG4gICAgY29uc3QgcGF0aHNMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwYXRoc0xpc3RcIik7XG4gICAgaWYgKCFwYXRoc0xpc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRoSXRlbSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgcGF0aEl0ZW0uY2xhc3NOYW1lID0gXCJwYXRoLWl0ZW1cIjtcblxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuICAgIGlucHV0LnR5cGUgPSBcInRleHRcIjtcbiAgICBpbnB1dC52YWx1ZSA9IHBhdGg7XG4gICAgaW5wdXQucGxhY2Vob2xkZXIgPSBcIm5hdmlnYXRpb24ucG9zaXRpb25cIjtcbiAgICBpbnB1dC5jbGFzc05hbWUgPSBcInBhdGgtaW5wdXRcIjtcblxuICAgIGNvbnN0IGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJidXR0b25cIik7XG4gICAgYnV0dG9uLnR5cGUgPSBcImJ1dHRvblwiO1xuICAgIGJ1dHRvbi5jbGFzc05hbWUgPSBcImJ0biBidG4tZGFuZ2VyXCI7XG4gICAgYnV0dG9uLnRleHRDb250ZW50ID0gXCJSZW1vdmVcIjtcblxuICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoXCJpbnB1dFwiLCAoKSA9PiB0aGlzLnVwZGF0ZUpzb25Gcm9tRm9ybSgpKTtcbiAgICBidXR0b24uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgIHBhdGhJdGVtLnJlbW92ZSgpO1xuICAgICAgdGhpcy51cGRhdGVKc29uRnJvbUZvcm0oKTtcbiAgICB9KTtcblxuICAgIHBhdGhJdGVtLmFwcGVuZENoaWxkKGlucHV0KTtcbiAgICBwYXRoSXRlbS5hcHBlbmRDaGlsZChidXR0b24pO1xuICAgIHBhdGhzTGlzdC5hcHBlbmRDaGlsZChwYXRoSXRlbSk7XG4gICAgdGhpcy51cGRhdGVKc29uRnJvbUZvcm0oKTtcbiAgfVxuXG4gIHVwZGF0ZUpzb25Gcm9tRm9ybSgpIHtcbiAgICAvLyBTa2lwIGZvcm0g4oaSIEpTT04gc3luY2luZyB3aGlsZSB3ZSdyZSBoeWRyYXRpbmcgdGhlIGZvcm0gZnJvbSBhXG4gICAgLy8gcGFzdGVkL2xvYWRlZCBKU09OIOKAlCBvdGhlcndpc2UgYWRkUGF0aEl0ZW0oKSB3b3VsZCBmaXJlIHRoaXMgb24gZXZlcnlcbiAgICAvLyBhZGRlZCBwYXRoLWlucHV0IGFuZCByZXNlcmlhbGl6ZSB0aGUgc3Vic2NyaXB0aW9uLmpzb24gYXMganVzdFxuICAgIC8vIHtjb250ZXh0LCBzdWJzY3JpYmV9IHdpdGhvdXQgdGhlIG1ldGEgYmxvY2ssIHNpbGVudGx5IGRyb3BwaW5nIG1ldGFcbiAgICAvLyBmcm9tIHBhc3RlZCBjb25maWdzLlxuICAgIGlmICh0aGlzLmlzSHlkcmF0aW5nRnJvbVRleHRhcmVhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29udGV4dEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJjb250ZXh0XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0RWwgPyBjb250ZXh0RWwudmFsdWUgfHwgXCIqXCIgOiBcIipcIjtcbiAgICBjb25zdCBwYXRoSW5wdXRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIi5wYXRoLWlucHV0XCIpIGFzIE5vZGVMaXN0T2Y8SFRNTElucHV0RWxlbWVudD47XG4gICAgY29uc3Qgc3Vic2NyaWJlID0gQXJyYXkuZnJvbShwYXRoSW5wdXRzKVxuICAgICAgLm1hcCgoaW5wdXQpID0+ICh7IHBhdGg6IGlucHV0LnZhbHVlIH0pKVxuICAgICAgLmZpbHRlcigoc3ViKSA9PiBzdWIucGF0aC50cmltKCkgIT09IFwiXCIpO1xuXG4gICAgLy8gQnVpbGQgdGhlIG1ldGEgYmxvY2sgZnJvbSB0aGUgc3RydWN0dXJlZCBjb250cm9scyDigJQgdGhleSBhcmUgdGhlXG4gICAgLy8gYXV0aG9yaXRhdGl2ZSBzb3VyY2UgZm9yIG1ldGFkYXRhIHNldHRpbmdzLiBUaGUgdGV4dGFyZWEgYmVjb21lcyBhXG4gICAgLy8gcmVhZC1vbmx5IG1pcnJvciBvZiB0aGUgZm9ybSBzdGF0ZSwga2VwdCBpbiBzeW5jIG9uIGV2ZXJ5IGlucHV0LlxuICAgIGNvbnN0IGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IGNvbnRleHQsIHN1YnNjcmliZSB9O1xuICAgIGNvbnN0IG1ldGFFbmFibGVkRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1ldGFFbmFibGVkXCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChtZXRhRW5hYmxlZEVsICYmIG1ldGFFbmFibGVkRWwuY2hlY2tlZCkge1xuICAgICAgY29uc3QgaW50ZXJ2YWxFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YUludGVydmFsU2VjXCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgICAgY29uc3QgcGF0aHNFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YVBhdGhzUmVnZXhcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICBjb25zdCBtYXhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YU1heFBlclBhY2tldFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGNvbnN0IGludGVydmFsU2VjID0gaW50ZXJ2YWxFbCAmJiBpbnRlcnZhbEVsLnZhbHVlID8gTnVtYmVyKGludGVydmFsRWwudmFsdWUpIDogMzAwO1xuICAgICAgY29uc3QgbWF4UGF0aHNQZXJQYWNrZXQgPSBtYXhFbCAmJiBtYXhFbC52YWx1ZSA/IE51bWJlcihtYXhFbC52YWx1ZSkgOiA1MDA7XG4gICAgICBjb25zdCBpbmNsdWRlUGF0aHNNYXRjaGluZyA9IHBhdGhzRWwgJiYgcGF0aHNFbC52YWx1ZSA/IHBhdGhzRWwudmFsdWUgOiBudWxsO1xuICAgICAgY29uZmlnLm1ldGEgPSB7XG4gICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgIGludGVydmFsU2VjLFxuICAgICAgICBpbmNsdWRlUGF0aHNNYXRjaGluZyxcbiAgICAgICAgbWF4UGF0aHNQZXJQYWNrZXRcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QganNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJzY3JpcHRpb25Kc29uXCIpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChqc29uRWwpIHtcbiAgICAgIGpzb25FbC52YWx1ZSA9IEpTT04uc3RyaW5naWZ5KGNvbmZpZywgbnVsbCwgMik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFBvcHVsYXRlIHRoZSBzdHJ1Y3R1cmVkIG1ldGEgY29udHJvbHMgZnJvbSBhIHBhcnNlZCBgbWV0YWAgYmxvY2suXG4gICAqICBQYXNzaW5nIHVuZGVmaW5lZC9udWxsIHJlc2V0cyB0aGUgY29udHJvbHMgdG8gdGhlaXIgZW1wdHkgc3RhdGUgc28gdGhlXG4gICAqICBVSSBhbHdheXMgbWF0Y2hlcyB3aGF0IHRoZSB0ZXh0YXJlYSAvIGxvYWRlZCBjb25maWcgY29udGFpbnMuICovXG4gIHBvcHVsYXRlTWV0YUNvbnRyb2xzKG1ldGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIGNvbnN0IG1ldGFFbmFibGVkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXRhRW5hYmxlZFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAobWV0YUVuYWJsZWQpIHtcbiAgICAgIG1ldGFFbmFibGVkLmNoZWNrZWQgPSAhIShtZXRhICYmIG1ldGEuZW5hYmxlZCA9PT0gdHJ1ZSk7XG4gICAgfVxuICAgIGNvbnN0IG1ldGFJbnRlcnZhbFNlYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YUludGVydmFsU2VjXCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChtZXRhSW50ZXJ2YWxTZWMpIHtcbiAgICAgIG1ldGFJbnRlcnZhbFNlYy52YWx1ZSA9XG4gICAgICAgIG1ldGEgJiYgdHlwZW9mIG1ldGEuaW50ZXJ2YWxTZWMgPT09IFwibnVtYmVyXCIgPyBTdHJpbmcobWV0YS5pbnRlcnZhbFNlYykgOiBcIlwiO1xuICAgIH1cbiAgICBjb25zdCBtZXRhUGF0aHNSZWdleCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YVBhdGhzUmVnZXhcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgaWYgKG1ldGFQYXRoc1JlZ2V4KSB7XG4gICAgICBtZXRhUGF0aHNSZWdleC52YWx1ZSA9XG4gICAgICAgIG1ldGEgJiYgdHlwZW9mIG1ldGEuaW5jbHVkZVBhdGhzTWF0Y2hpbmcgPT09IFwic3RyaW5nXCIgPyBtZXRhLmluY2x1ZGVQYXRoc01hdGNoaW5nIDogXCJcIjtcbiAgICB9XG4gICAgY29uc3QgbWV0YU1heFBlclBhY2tldCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YU1heFBlclBhY2tldFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICBpZiAobWV0YU1heFBlclBhY2tldCkge1xuICAgICAgbWV0YU1heFBlclBhY2tldC52YWx1ZSA9XG4gICAgICAgIG1ldGEgJiYgdHlwZW9mIG1ldGEubWF4UGF0aHNQZXJQYWNrZXQgPT09IFwibnVtYmVyXCIgPyBTdHJpbmcobWV0YS5tYXhQYXRoc1BlclBhY2tldCkgOiBcIlwiO1xuICAgIH1cbiAgfVxuXG4gIHN5bmNGcm9tSnNvbigpIHtcbiAgICB0aGlzLmlzSHlkcmF0aW5nRnJvbVRleHRhcmVhID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QganNvbkVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJzY3JpcHRpb25Kc29uXCIpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgICAgaWYgKCFqc29uRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShqc29uRWwudmFsdWUpO1xuXG4gICAgICBjb25zdCBjdHhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29udGV4dFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChjdHhFbCkge1xuICAgICAgICBjdHhFbC52YWx1ZSA9IGNvbmZpZy5jb250ZXh0IHx8IFwiKlwiO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYXRoc0xpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBhdGhzTGlzdFwiKTtcbiAgICAgIGlmIChwYXRoc0xpc3QpIHtcbiAgICAgICAgcGF0aHNMaXN0LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIGlmIChjb25maWcuc3Vic2NyaWJlICYmIEFycmF5LmlzQXJyYXkoY29uZmlnLnN1YnNjcmliZSkpIHtcbiAgICAgICAgICBjb25maWcuc3Vic2NyaWJlLmZvckVhY2goKHN1YjogeyBwYXRoPzogc3RyaW5nIH0pID0+IHRoaXMuYWRkUGF0aEl0ZW0oc3ViLnBhdGggfHwgXCJcIikpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEtlZXAgdGhlIG1ldGEgZm9ybSBpbiBzeW5jIHdpdGggdGhlIHJhdyBKU09OIGVkaXRvci4gV2l0aG91dCB0aGlzLFxuICAgICAgLy8gZWRpdGluZyB0aGUgdGV4dGFyZWEgd291bGQgbGVhdmUgdGhlIGNoZWNrYm94L2ludGVydmFsL3JlZ2V4L21heFxuICAgICAgLy8gY29udHJvbHMgc2hvd2luZyB0aGUgcHJldmlvdXNseS1sb2FkZWQgdmFsdWVzLlxuICAgICAgdGhpcy5wb3B1bGF0ZU1ldGFDb250cm9scyhjb25maWcubWV0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnNvbGUud2FybihcIkludmFsaWQgSlNPTiBpbiBlZGl0b3I6XCIsIChlcnJvciBhcyBFcnJvcikubWVzc2FnZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNIeWRyYXRpbmdGcm9tVGV4dGFyZWEgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIAgU2F2ZSBvcGVyYXRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGFzeW5jIHNhdmVDb25maWcoZmlsZW5hbWU6IHN0cmluZywgY29uZmlnOiB1bmtub3duLCBjb25maWdLZXk6IHN0cmluZywgbGFiZWw6IHN0cmluZykge1xuICAgIGNvbnN0IGNvbm5JZCA9IHRoaXMuYWN0aXZlQ29ubmVjdGlvbklkITtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLnJlcXVlc3QodGhpcy5jb25maWdQYXRoKGNvbm5JZCwgZmlsZW5hbWUpLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHsgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoY29uZmlnKVxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXNwb25zZS5vaykge1xuICAgICAgICAodGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbY29uZmlnS2V5XSA9IGNvbmZpZztcbiAgICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKGAke2xhYmVsfSBzYXZlZCBzdWNjZXNzZnVsbHkhYCwgXCJzdWNjZXNzXCIpO1xuICAgICAgICB0aGlzLnVwZGF0ZVN0YXR1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRmFpbGVkIHRvIHNhdmUgY29uZmlndXJhdGlvblwiKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgY29uc3QgZXJyID0gZXJyb3IgYXMgQXV0aGVudGljYXRlZEVycm9yO1xuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKFxuICAgICAgICBlcnIuaXNVbmF1dGhvcml6ZWRcbiAgICAgICAgICA/IHRoaXMuYXV0aEZhaWx1cmVNZXNzYWdlKGBzYXZpbmcgJHtsYWJlbC50b0xvd2VyQ2FzZSgpfWApXG4gICAgICAgICAgOiBgRXJyb3Igc2F2aW5nICR7bGFiZWwudG9Mb3dlckNhc2UoKX06IGAgKyBlcnIubWVzc2FnZSxcbiAgICAgICAgXCJlcnJvclwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmVEZWx0YVRpbWVyKCkge1xuICAgIGNvbnN0IGRlbHRhVGltZXIgPSBwYXJzZUludCgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJkZWx0YVRpbWVyXCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlKTtcblxuICAgIGlmIChpc05hTihkZWx0YVRpbWVyKSB8fCBkZWx0YVRpbWVyIDwgREVMVEFfVElNRVJfTUlOIHx8IGRlbHRhVGltZXIgPiBERUxUQV9USU1FUl9NQVgpIHtcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgYERlbHRhIHRpbWVyIG11c3QgYmUgYmV0d2VlbiAke0RFTFRBX1RJTUVSX01JTn0gYW5kICR7REVMVEFfVElNRVJfTUFYfSBtaWxsaXNlY29uZHNgLFxuICAgICAgICBcImVycm9yXCJcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy5zYXZlQ29uZmlnKFxuICAgICAgXCJkZWx0YV90aW1lci5qc29uXCIsXG4gICAgICB7IGRlbHRhVGltZXIgfSxcbiAgICAgIFwiZGVsdGFUaW1lckNvbmZpZ1wiLFxuICAgICAgXCJEZWx0YSB0aW1lciBjb25maWd1cmF0aW9uXCJcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgc2F2ZVN1YnNjcmlwdGlvbigpIHtcbiAgICB0cnkge1xuICAgICAgLy8gRmx1c2ggYW55IHBlbmRpbmcgSlNPTi1mcm9tLXRleHRhcmVhIGRlYm91bmNlIHNvIHRoZSBzdHJ1Y3R1cmVkIGZvcm1cbiAgICAgIC8vIGNvbnRyb2xzIChpbiBwYXJ0aWN1bGFyIHRoZSBtZXRhIGZpZWxkc2V0KSByZWZsZWN0IHdoYXQncyBjdXJyZW50bHlcbiAgICAgIC8vIGluIHRoZSB0ZXh0YXJlYSBiZWZvcmUgd2UgcmVhZCBlaXRoZXIgc2lkZS4gV2l0aG91dCB0aGlzLCBhIHVzZXJcbiAgICAgIC8vIGVkaXRpbmcgdGhlIHJhdyBKU09OIGFuZCBpbW1lZGlhdGVseSBjbGlja2luZyBTYXZlIHdvdWxkIGxvc2UgdGhlaXJcbiAgICAgIC8vIHRleHRhcmVhLW9ubHkgZWRpdHMg4oCUIHNhdmVTdWJzY3JpcHRpb24gd3JpdGVzIG1ldGEgZnJvbSB0aGUgZm9ybVxuICAgICAgLy8gY29udHJvbHMsIHdoaWNoIHdvdWxkIHN0aWxsIGJlIHN0YWxlLlxuICAgICAgaWYgKHRoaXMuc3luY1RpbWVvdXQpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuc3luY1RpbWVvdXQpO1xuICAgICAgICB0aGlzLnN5bmNUaW1lb3V0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zeW5jRnJvbUpzb24oKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QganNvblRleHQgPSAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdWJzY3JpcHRpb25Kc29uXCIpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQpLnZhbHVlO1xuICAgICAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShqc29uVGV4dCk7XG5cbiAgICAgIGlmICghY29uZmlnLmNvbnRleHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29udGV4dCBpcyByZXF1aXJlZFwiKTtcbiAgICAgIH1cbiAgICAgIGlmICghY29uZmlnLnN1YnNjcmliZSB8fCAhQXJyYXkuaXNBcnJheShjb25maWcuc3Vic2NyaWJlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTdWJzY3JpYmUgYXJyYXkgaXMgcmVxdWlyZWRcIik7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBzdHJ1Y3R1cmVkIG1ldGEgY29udHJvbHMgYXJlIGF1dGhvcml0YXRpdmUgZm9yIHRoZSBtZXRhIGJsb2NrIG9uXG4gICAgICAvLyBzYXZlLiBUaGlzIGxldHMgdXNlcnMgdG9nZ2xlIHRoZSBjaGVja2JveCBvZmYgKHJlbW92aW5nIGBtZXRhYCBmcm9tXG4gICAgICAvLyB0aGUgc2F2ZWQgY29uZmlnKSBvciBlZGl0IHRoZSBpbnRlcnZhbC9yZWdleC9tYXggZmllbGRzIGV2ZW4gYWZ0ZXIgYVxuICAgICAgLy8gbWV0YSBibG9jayBoYXMgYmVlbiBzYXZlZCBiZWZvcmUg4oCUIHRoZSBwcmV2aW91cyBcInRleHRhcmVhIHdpbnNcIlxuICAgICAgLy8gcG9saWN5IG1hZGUgdGhvc2UgVUkgY29udHJvbHMgb25lLXRpbWUtb25seSBhZnRlciBmaXJzdCBlbmFibGUuXG4gICAgICBjb25zdCBtZXRhRW5hYmxlZEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXRhRW5hYmxlZFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgIGlmIChtZXRhRW5hYmxlZEVsICYmIG1ldGFFbmFibGVkRWwuY2hlY2tlZCkge1xuICAgICAgICBjb25zdCBpbnRlcnZhbEVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJtZXRhSW50ZXJ2YWxTZWNcIikgYXMgSFRNTElucHV0RWxlbWVudCB8IG51bGw7XG4gICAgICAgIGNvbnN0IHBhdGhzRWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1ldGFQYXRoc1JlZ2V4XCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQgfCBudWxsO1xuICAgICAgICBjb25zdCBtYXhFbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0YU1heFBlclBhY2tldFwiKSBhcyBIVE1MSW5wdXRFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWxTZWMgPSBpbnRlcnZhbEVsICYmIGludGVydmFsRWwudmFsdWUgPyBOdW1iZXIoaW50ZXJ2YWxFbC52YWx1ZSkgOiAzMDA7XG4gICAgICAgIGNvbnN0IG1heFBhdGhzUGVyUGFja2V0ID0gbWF4RWwgJiYgbWF4RWwudmFsdWUgPyBOdW1iZXIobWF4RWwudmFsdWUpIDogNTAwO1xuICAgICAgICBjb25zdCBpbmNsdWRlUGF0aHNNYXRjaGluZyA9IHBhdGhzRWwgJiYgcGF0aHNFbC52YWx1ZSA/IHBhdGhzRWwudmFsdWUgOiBudWxsO1xuICAgICAgICBjb25maWcubWV0YSA9IHtcbiAgICAgICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgICAgIGludGVydmFsU2VjLFxuICAgICAgICAgIGluY2x1ZGVQYXRoc01hdGNoaW5nLFxuICAgICAgICAgIG1heFBhdGhzUGVyUGFja2V0XG4gICAgICAgIH07XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZy5tZXRhICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gQ2hlY2tib3ggdW5jaGVja2VkIOKAlCBkcm9wIGFueSBwcmV2aW91c2x5LXNhdmVkIG1ldGEgYmxvY2sgc28gdGhlXG4gICAgICAgIC8vIHJ1bnRpbWUgc3RvcHMgc3RyZWFtaW5nIG1ldGFkYXRhLlxuICAgICAgICBkZWxldGUgY29uZmlnLm1ldGE7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IHRoaXMuc2F2ZUNvbmZpZyhcbiAgICAgICAgXCJzdWJzY3JpcHRpb24uanNvblwiLFxuICAgICAgICBjb25maWcsXG4gICAgICAgIFwic3Vic2NyaXB0aW9uQ29uZmlnXCIsXG4gICAgICAgIFwiU3Vic2NyaXB0aW9uIGNvbmZpZ3VyYXRpb25cIlxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKFwiRXJyb3Igc2F2aW5nIHN1YnNjcmlwdGlvbjogXCIgKyAoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2UsIFwiZXJyb3JcIik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2F2ZVNlbnRlbmNlRmlsdGVyKCkge1xuICAgIGNvbnN0IGZpbHRlcklucHV0ID0gKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2VudGVuY2VGaWx0ZXJcIikgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgY29uc3QgZXhjbHVkZWRTZW50ZW5jZXMgPSBmaWx0ZXJJbnB1dFxuICAgICAgLnNwbGl0KFwiLFwiKVxuICAgICAgLm1hcCgocykgPT4gcy50cmltKCkudG9VcHBlckNhc2UoKSlcbiAgICAgIC5maWx0ZXIoKHMpID0+IHMubGVuZ3RoID4gMCk7XG5cbiAgICBhd2FpdCB0aGlzLnNhdmVDb25maWcoXG4gICAgICBcInNlbnRlbmNlX2ZpbHRlci5qc29uXCIsXG4gICAgICB7IGV4Y2x1ZGVkU2VudGVuY2VzIH0sXG4gICAgICBcInNlbnRlbmNlRmlsdGVyQ29uZmlnXCIsXG4gICAgICBcIlNlbnRlbmNlIGZpbHRlclwiXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHNhdmVQbHVnaW5Db25maWcoKSB7XG4gICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJwbHVnaW5Db25maWdKc29uXCIpIGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQgfCBudWxsO1xuICAgIGlmICghZWRpdG9yKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZENvbmZpZyA9IEpTT04ucGFyc2UoZWRpdG9yLnZhbHVlKTtcbiAgICAgIGlmICghcGFyc2VkQ29uZmlnIHx8IHR5cGVvZiBwYXJzZWRDb25maWcgIT09IFwib2JqZWN0XCIgfHwgQXJyYXkuaXNBcnJheShwYXJzZWRDb25maWcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlBsdWdpbiBjb25maWd1cmF0aW9uIG11c3QgYmUgYSBKU09OIG9iamVjdFwiKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVxdWVzdENvbmZpZyA9IHRoaXMuZGVlcENsb25lKHBhcnNlZENvbmZpZykgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICBjb25zdCBub3JtYWxpemVkU2VydmVyVHlwZSA9IHRoaXMubm9ybWFsaXplU2VydmVyVHlwZShyZXF1ZXN0Q29uZmlnLnNlcnZlclR5cGUpO1xuICAgICAgaWYgKG5vcm1hbGl6ZWRTZXJ2ZXJUeXBlKSB7XG4gICAgICAgIHJlcXVlc3RDb25maWcuc2VydmVyVHlwZSA9IG5vcm1hbGl6ZWRTZXJ2ZXJUeXBlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdChgJHtBUElfQkFTRV9QQVRIfS9wbHVnaW4tY29uZmlnYCwge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7IFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG4gICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RDb25maWcpXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpLmNhdGNoKCgpID0+ICh7fSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pO1xuICAgICAgaWYgKCFyZXNwb25zZS5vayB8fCAhcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5lcnJvciB8fCBgRmFpbGVkIHRvIHNhdmUgcGx1Z2luIGNvbmZpZ3VyYXRpb24gKCR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5wbHVnaW5Db25maWcgPSB0aGlzLmJ1aWxkQ29tcGxldGVQbHVnaW5Db25maWcocmVxdWVzdENvbmZpZyk7XG4gICAgICB0aGlzLnVwZGF0ZVBsdWdpbkNvbmZpZ1VJKCk7XG4gICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oXG4gICAgICAgIHJlc3VsdC5tZXNzYWdlIHx8IFwiUGx1Z2luIGNvbmZpZ3VyYXRpb24gc2F2ZWQuIFJlZnJlc2ggdG8gYXBwbHkgY2hhbmdlcy5cIixcbiAgICAgICAgXCJzdWNjZXNzXCJcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEF1dGhlbnRpY2F0ZWRFcnJvcjtcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgZXJyLmlzVW5hdXRob3JpemVkXG4gICAgICAgICAgPyB0aGlzLmF1dGhGYWlsdXJlTWVzc2FnZShcInNhdmluZyBmdWxsIHBsdWdpbiBjb25maWdcIilcbiAgICAgICAgICA6IFwiRXJyb3Igc2F2aW5nIGZ1bGwgcGx1Z2luIGNvbmZpZzogXCIgKyBlcnIubWVzc2FnZSxcbiAgICAgICAgXCJlcnJvclwiXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJlbG9hZFBsdWdpbkNvbmZpZ3VyYXRpb24oKSB7XG4gICAgY29uc3QgbG9hZGVkID0gYXdhaXQgdGhpcy5sb2FkUGx1Z2luQ29uZmlndXJhdGlvbih0cnVlKTtcbiAgICBpZiAobG9hZGVkKSB7XG4gICAgICB0aGlzLnVwZGF0ZVBsdWdpbkNvbmZpZ1VJKCk7XG4gICAgICB0aGlzLnNob3dOb3RpZmljYXRpb24oXCJQbHVnaW4gY29uZmlndXJhdGlvbiByZWxvYWRlZC5cIiwgXCJzdWNjZXNzXCIpO1xuICAgIH1cbiAgfVxuXG4gIGxvYWREZWZhdWx0UGx1Z2luQ29uZmlndXJhdGlvbigpIHtcbiAgICB0aGlzLnBsdWdpbkNvbmZpZyA9IHRoaXMuYnVpbGRDb21wbGV0ZVBsdWdpbkNvbmZpZyh7fSk7XG4gICAgdGhpcy51cGRhdGVQbHVnaW5Db25maWdVSSgpO1xuICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihcIkxvYWRlZCBzY2hlbWEgZGVmYXVsdHMgaW50byBlZGl0b3IuIFNhdmUgdG8gYXBwbHkuXCIsIFwid2FybmluZ1wiKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBNZXRyaWNzIGRpc3BsYXkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgdXBkYXRlTWV0cmljc0Rpc3BsYXkobWV0cmljczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHRoaXMudXBkYXRlTmV0d29ya1F1YWxpdHlEaXNwbGF5KG1ldHJpY3MpO1xuICAgIHRoaXMudXBkYXRlQmFuZHdpZHRoRGlzcGxheShtZXRyaWNzKTtcbiAgICB0aGlzLnVwZGF0ZVBhdGhBbmFseXRpY3NEaXNwbGF5KG1ldHJpY3MpO1xuXG4gICAgY29uc3QgbWV0cmljc0RpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibWV0cmljc1wiKTtcbiAgICBpZiAoIW1ldHJpY3NEaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBpc0NsaWVudCA9IG1ldHJpY3MubW9kZSA9PT0gXCJjbGllbnRcIjtcbiAgICBjb25zdCB7IHN0YXRzLCBzdGF0dXMsIHVwdGltZSB9ID0gbWV0cmljcztcblxuICAgIGNvbnN0IGNyeXB0b0Vycm9ycyA9IChzdGF0cy5lcnJvckNvdW50cyAmJiBzdGF0cy5lcnJvckNvdW50cy5jcnlwdG8pIHx8IDA7XG4gICAgY29uc3QgbWFsZm9ybWVkUGFja2V0cyA9IHN0YXRzLm1hbGZvcm1lZFBhY2tldHMgfHwgMDtcbiAgICBjb25zdCBkYXRhUGFja2V0c1JlY2VpdmVkID0gc3RhdHMuZGF0YVBhY2tldHNSZWNlaXZlZCB8fCAwO1xuICAgIGNvbnN0IHJhdGVMaW1pdGVkUGFja2V0cyA9IHN0YXRzLnJhdGVMaW1pdGVkUGFja2V0cyB8fCAwO1xuICAgIGNvbnN0IGRyb3BwZWREZWx0YUJhdGNoZXMgPSBzdGF0cy5kcm9wcGVkRGVsdGFCYXRjaGVzIHx8IDA7XG4gICAgY29uc3QgZHJvcHBlZERlbHRhQ291bnQgPSBzdGF0cy5kcm9wcGVkRGVsdGFDb3VudCB8fCAwO1xuXG4gICAgY29uc3QgaGFzRXJyb3JzID1cbiAgICAgIHN0YXRzLnVkcFNlbmRFcnJvcnMgPiAwIHx8XG4gICAgICBzdGF0cy5jb21wcmVzc2lvbkVycm9ycyA+IDAgfHxcbiAgICAgIHN0YXRzLmVuY3J5cHRpb25FcnJvcnMgPiAwIHx8XG4gICAgICBzdGF0cy5zdWJzY3JpcHRpb25FcnJvcnMgPiAwIHx8XG4gICAgICBjcnlwdG9FcnJvcnMgPiAwIHx8XG4gICAgICBtYWxmb3JtZWRQYWNrZXRzID4gMCB8fFxuICAgICAgcmF0ZUxpbWl0ZWRQYWNrZXRzID4gMCB8fFxuICAgICAgZHJvcHBlZERlbHRhQ291bnQgPiAwO1xuXG4gICAgY29uc3QgcHJvdG9jb2xWZXJzaW9uID0gbWV0cmljcy5wcm90b2NvbFZlcnNpb24gfHwgMTtcbiAgICBjb25zdCBwcm90b2NvbExhYmVsID0gcHJvdG9jb2xWZXJzaW9uID49IDIgPyBgdiR7cHJvdG9jb2xWZXJzaW9ufWAgOiBcInYxXCI7XG5cbiAgICBjb25zdCBtZXRyaWNzR3JpZEl0ZW1zID0gW1xuICAgICAgcmVuZGVyTWV0cmljSXRlbShcIlVwdGltZVwiLCB1cHRpbWUuZm9ybWF0dGVkKSxcbiAgICAgIHJlbmRlck1ldHJpY0l0ZW0oXCJNb2RlXCIsIGlzQ2xpZW50ID8gXCJDbGllbnRcIiA6IFwiU2VydmVyXCIpLFxuICAgICAgcmVuZGVyTWV0cmljSXRlbUh0bWwoXG4gICAgICAgIFwiUHJvdG9jb2xcIixcbiAgICAgICAgYDxzcGFuIGNsYXNzPVwicHJvdG9jb2wtYmFkZ2UgcHJvdG9jb2wtJHtlc2NhcGVIdG1sKHByb3RvY29sTGFiZWwpfVwiPiR7ZXNjYXBlSHRtbChwcm90b2NvbExhYmVsLnRvVXBwZXJDYXNlKCkpfTwvc3Bhbj5gXG4gICAgICApLFxuICAgICAgcmVuZGVyTWV0cmljSXRlbShcbiAgICAgICAgXCJTdGF0dXNcIixcbiAgICAgICAgc3RhdHVzLnJlYWR5VG9TZW5kID8gXCJSZWFkeVwiIDogXCJOb3QgUmVhZHlcIixcbiAgICAgICAgc3RhdHVzLnJlYWR5VG9TZW5kID8gXCJzdWNjZXNzXCIgOiBcImVycm9yXCJcbiAgICAgICksXG4gICAgICBpc0NsaWVudCA/IHJlbmRlck1ldHJpY0l0ZW0oXCJCdWZmZXJlZCBEZWx0YXNcIiwgc3RhdHVzLmRlbHRhc0J1ZmZlcmVkKSA6IFwiXCJcbiAgICBdLmpvaW4oXCJcIik7XG5cbiAgICBjb25zdCBzdWJFcnJvcnMgPSBzdGF0cy5zdWJzY3JpcHRpb25FcnJvcnM7XG4gICAgY29uc3Qgc3Vic2NyaXB0aW9uRXJyb3JTdGF0ID0gaXNDbGllbnRcbiAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXCJTdWJzY3JpcHRpb24gRXJyb3JzXCIsIHN1YkVycm9ycywgc3ViRXJyb3JzID4gMClcbiAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IHN0YXRzSXRlbXMgPSBbXG4gICAgICBpc0NsaWVudFxuICAgICAgICA/IHJlbmRlclN0YXRJdGVtKFwiRGVsdGFzIFNlbnRcIiwgc3RhdHMuZGVsdGFzU2VudC50b0xvY2FsZVN0cmluZygpKVxuICAgICAgICA6IHJlbmRlclN0YXRJdGVtKFwiRGVsdGFzIFJlY2VpdmVkXCIsIHN0YXRzLmRlbHRhc1JlY2VpdmVkLnRvTG9jYWxlU3RyaW5nKCkpLFxuICAgICAgIWlzQ2xpZW50XG4gICAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXCJEYXRhIFBhY2tldHMgUmVjZWl2ZWRcIiwgZGF0YVBhY2tldHNSZWNlaXZlZC50b0xvY2FsZVN0cmluZygpKVxuICAgICAgICA6IFwiXCIsXG4gICAgICBpc0NsaWVudFxuICAgICAgICA/IHJlbmRlclN0YXRJdGVtKFwiVURQIFNlbmQgRXJyb3JzXCIsIHN0YXRzLnVkcFNlbmRFcnJvcnMsIHN0YXRzLnVkcFNlbmRFcnJvcnMgPiAwKVxuICAgICAgICA6IFwiXCIsXG4gICAgICBpc0NsaWVudCA/IHJlbmRlclN0YXRJdGVtKFwiVURQIFJldHJpZXNcIiwgc3RhdHMudWRwUmV0cmllcykgOiBcIlwiLFxuICAgICAgIWlzQ2xpZW50XG4gICAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXG4gICAgICAgICAgICBcIlJhdGUtTGltaXRlZCBQYWNrZXRzXCIsXG4gICAgICAgICAgICByYXRlTGltaXRlZFBhY2tldHMudG9Mb2NhbGVTdHJpbmcoKSxcbiAgICAgICAgICAgIHJhdGVMaW1pdGVkUGFja2V0cyA+IDBcbiAgICAgICAgICApXG4gICAgICAgIDogXCJcIixcbiAgICAgIGlzQ2xpZW50XG4gICAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXG4gICAgICAgICAgICBcIkRyb3BwZWQgRGVsdGEgQmF0Y2hlc1wiLFxuICAgICAgICAgICAgZHJvcHBlZERlbHRhQmF0Y2hlcy50b0xvY2FsZVN0cmluZygpLFxuICAgICAgICAgICAgZHJvcHBlZERlbHRhQmF0Y2hlcyA+IDBcbiAgICAgICAgICApXG4gICAgICAgIDogXCJcIixcbiAgICAgIGlzQ2xpZW50XG4gICAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXG4gICAgICAgICAgICBcIkRyb3BwZWQgRGVsdGFzXCIsXG4gICAgICAgICAgICBkcm9wcGVkRGVsdGFDb3VudC50b0xvY2FsZVN0cmluZygpLFxuICAgICAgICAgICAgZHJvcHBlZERlbHRhQ291bnQgPiAwXG4gICAgICAgICAgKVxuICAgICAgICA6IFwiXCIsXG4gICAgICByZW5kZXJTdGF0SXRlbShcIkNvbXByZXNzaW9uIEVycm9yc1wiLCBzdGF0cy5jb21wcmVzc2lvbkVycm9ycywgc3RhdHMuY29tcHJlc3Npb25FcnJvcnMgPiAwKSxcbiAgICAgIHJlbmRlclN0YXRJdGVtKFwiRW5jcnlwdGlvbiBFcnJvcnNcIiwgc3RhdHMuZW5jcnlwdGlvbkVycm9ycywgc3RhdHMuZW5jcnlwdGlvbkVycm9ycyA+IDApLFxuICAgICAgc3Vic2NyaXB0aW9uRXJyb3JTdGF0LFxuICAgICAgIWlzQ2xpZW50ICYmIHN0YXRzLmR1cGxpY2F0ZVBhY2tldHMgPiAwXG4gICAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXCJEdXBsaWNhdGUgUGFja2V0c1wiLCBzdGF0cy5kdXBsaWNhdGVQYWNrZXRzLnRvTG9jYWxlU3RyaW5nKCkpXG4gICAgICAgIDogXCJcIixcbiAgICAgIHByb3RvY29sVmVyc2lvbiA+PSAzXG4gICAgICAgID8gcmVuZGVyU3RhdEl0ZW0oXCJBdXRoIEZhaWx1cmVzIChWMylcIiwgY3J5cHRvRXJyb3JzLCBjcnlwdG9FcnJvcnMgPiAwKVxuICAgICAgICA6IFwiXCIsXG4gICAgICByZW5kZXJTdGF0SXRlbShcIk1hbGZvcm1lZCBQYWNrZXRzXCIsIG1hbGZvcm1lZFBhY2tldHMsIG1hbGZvcm1lZFBhY2tldHMgPiAwKVxuICAgIF0uam9pbihcIlwiKTtcblxuICAgIGxldCBtZXRyaWNzSHRtbCA9IGBcbiAgICAgIDxoND5QZXJmb3JtYW5jZSBNZXRyaWNzPC9oND5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZXRyaWNzLWdyaWRcIj4ke21ldHJpY3NHcmlkSXRlbXN9PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1zdGF0c1wiPlxuICAgICAgICA8aDU+VHJhbnNtaXNzaW9uIFN0YXRpc3RpY3M8L2g1PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHMtZ3JpZFwiPiR7c3RhdHNJdGVtc308L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICBpZiAoaXNDbGllbnQgJiYgbWV0cmljcy5zbWFydEJhdGNoaW5nKSB7XG4gICAgICBjb25zdCBzYiA9IG1ldHJpY3Muc21hcnRCYXRjaGluZztcbiAgICAgIGNvbnN0IHRvdGFsU2VuZHMgPSBzYi5lYXJseVNlbmRzICsgc2IudGltZXJTZW5kcztcbiAgICAgIGNvbnN0IGVhcmx5UGVyY2VudCA9IHRvdGFsU2VuZHMgPiAwID8gTWF0aC5yb3VuZCgoc2IuZWFybHlTZW5kcyAvIHRvdGFsU2VuZHMpICogMTAwKSA6IDA7XG5cbiAgICAgIG1ldHJpY3NIdG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpY3Mtc3RhdHNcIj5cbiAgICAgICAgICA8aDU+U21hcnQgQmF0Y2hpbmc8L2g1PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0cy1ncmlkXCI+XG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiQXZnIEJ5dGVzL0RlbHRhXCIsIHNiLmF2Z0J5dGVzUGVyRGVsdGEgKyBcIiBieXRlc1wiKX1cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJNYXggRGVsdGFzL0JhdGNoXCIsIHNiLm1heERlbHRhc1BlckJhdGNoKX1cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJFYXJseSBTZW5kc1wiLCBzYi5lYXJseVNlbmRzLnRvTG9jYWxlU3RyaW5nKCkgKyBcIiAoXCIgKyBlYXJseVBlcmNlbnQgKyBcIiUpXCIpfVxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIlRpbWVyIFNlbmRzXCIsIHNiLnRpbWVyU2VuZHMudG9Mb2NhbGVTdHJpbmcoKSl9XG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiT3ZlcnNpemVkIFBhY2tldHNcIiwgc2Iub3ZlcnNpemVkUGFja2V0cywgc2Iub3ZlcnNpemVkUGFja2V0cyA+IDApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkobWV0cmljcy5yZWNlbnRFcnJvcnMpICYmIG1ldHJpY3MucmVjZW50RXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGVycm9ySXRlbXMgPSBbLi4ubWV0cmljcy5yZWNlbnRFcnJvcnNdXG4gICAgICAgIC5yZXZlcnNlKClcbiAgICAgICAgLm1hcCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc3QgdGltZUFnbyA9IERhdGUubm93KCkgLSBlcnIudGltZXN0YW1wO1xuICAgICAgICAgIGNvbnN0IHRpbWVTdHIgPVxuICAgICAgICAgICAgdGltZUFnbyA8IDYwMDAwXG4gICAgICAgICAgICAgID8gYCR7TWF0aC5mbG9vcih0aW1lQWdvIC8gMTAwMCl9cyBhZ29gXG4gICAgICAgICAgICAgIDogYCR7TWF0aC5mbG9vcih0aW1lQWdvIC8gNjAwMDApfW0gYWdvYDtcbiAgICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlY2VudC1lcnJvci1pdGVtXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZXJyb3ItY2F0ZWdvcnktYmFkZ2VcIj4ke3RoaXMuZXNjYXBlSHRtbChlcnIuY2F0ZWdvcnkpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNlbnQtZXJyb3ItbXNnXCI+JHt0aGlzLmVzY2FwZUh0bWwoZXJyLm1lc3NhZ2UpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWNlbnQtZXJyb3ItdGltZVwiPiR7dGhpcy5lc2NhcGVIdG1sKHRpbWVTdHIpfTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIGA7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgbWV0cmljc0h0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1lcnJvclwiPlxuICAgICAgICAgIDxoNT5SZWNlbnQgRXJyb3JzICgke21ldHJpY3MucmVjZW50RXJyb3JzLmxlbmd0aH0pPC9oNT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVjZW50LWVycm9ycy1saXN0XCI+JHtlcnJvckl0ZW1zfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIGlmIChtZXRyaWNzLmxhc3RFcnJvcikge1xuICAgICAgY29uc3QgdGltZUFnbyA9IG1ldHJpY3MubGFzdEVycm9yLnRpbWVBZ287XG4gICAgICBjb25zdCB0aW1lQWdvU3RyID1cbiAgICAgICAgdGltZUFnbyA8IDYwMDAwXG4gICAgICAgICAgPyBgJHtNYXRoLmZsb29yKHRpbWVBZ28gLyAxMDAwKX1zIGFnb2BcbiAgICAgICAgICA6IGAke01hdGguZmxvb3IodGltZUFnbyAvIDYwMDAwKX1tIGFnb2A7XG5cbiAgICAgIG1ldHJpY3NIdG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpY3MtZXJyb3JcIj5cbiAgICAgICAgICA8aDU+TGFzdCBFcnJvcjwvaDU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImVycm9yLW1lc3NhZ2VcIj4ke3RoaXMuZXNjYXBlSHRtbChtZXRyaWNzLmxhc3RFcnJvci5tZXNzYWdlKX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItdGltZVwiPk9jY3VycmVkICR7dGltZUFnb1N0cn08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH0gZWxzZSBpZiAoIWhhc0Vycm9ycykge1xuICAgICAgbWV0cmljc0h0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1zdWNjZXNzXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1Y2Nlc3MtbWVzc2FnZVwiPk5vIGVycm9ycyBkZXRlY3RlZDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgbWV0cmljc0Rpdi5pbm5lckhUTUwgPSBtZXRyaWNzSHRtbDtcbiAgfVxuXG4gIHVwZGF0ZU5ldHdvcmtRdWFsaXR5RGlzcGxheShtZXRyaWNzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgbnFEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5ldHdvcmtRdWFsaXR5XCIpO1xuICAgIGlmICghbnFEaXYgfHwgIW1ldHJpY3MubmV0d29ya1F1YWxpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBucSA9IG1ldHJpY3MubmV0d29ya1F1YWxpdHk7XG4gICAgY29uc3QgaXNDbGllbnQgPSBtZXRyaWNzLm1vZGUgPT09IFwiY2xpZW50XCI7XG5cbiAgICBsZXQgcXVhbGl0eUxhYmVsID0gXCJOL0FcIjtcbiAgICBsZXQgcXVhbGl0eUNvbG9yID0gXCIjOUU5RTlFXCI7XG4gICAgaWYgKG5xLmxpbmtRdWFsaXR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmIChucS5saW5rUXVhbGl0eSA+PSA5MCkge1xuICAgICAgICBxdWFsaXR5TGFiZWwgPSBcIkV4Y2VsbGVudFwiO1xuICAgICAgICBxdWFsaXR5Q29sb3IgPSBcIiM0Q0FGNTBcIjtcbiAgICAgIH0gZWxzZSBpZiAobnEubGlua1F1YWxpdHkgPj0gNzApIHtcbiAgICAgICAgcXVhbGl0eUxhYmVsID0gXCJHb29kXCI7XG4gICAgICAgIHF1YWxpdHlDb2xvciA9IFwiI0ZGQzEwN1wiO1xuICAgICAgfSBlbHNlIGlmIChucS5saW5rUXVhbGl0eSA+PSA1MCkge1xuICAgICAgICBxdWFsaXR5TGFiZWwgPSBcIkZhaXJcIjtcbiAgICAgICAgcXVhbGl0eUNvbG9yID0gXCIjRkY5ODAwXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWFsaXR5TGFiZWwgPSBcIlBvb3JcIjtcbiAgICAgICAgcXVhbGl0eUNvbG9yID0gXCIjRjQ0MzM2XCI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcXVhbGl0eVBjdCA9IG5xLmxpbmtRdWFsaXR5ICE9PSB1bmRlZmluZWQgPyBucS5saW5rUXVhbGl0eSA6IDA7XG4gICAgY29uc3QgZ2F1Z2VBbmdsZSA9IChxdWFsaXR5UGN0IC8gMTAwKSAqIDE4MDtcbiAgICBjb25zdCByYWRTdGFydCA9IE1hdGguUEk7XG4gICAgY29uc3QgcmFkRW5kID0gcmFkU3RhcnQgKyAoZ2F1Z2VBbmdsZSAqIE1hdGguUEkpIC8gMTgwO1xuICAgIGNvbnN0IGN4ID0gNTAsXG4gICAgICBjeSA9IDUwLFxuICAgICAgciA9IDQwO1xuICAgIGNvbnN0IHgxID0gY3ggKyByICogTWF0aC5jb3MocmFkU3RhcnQpO1xuICAgIGNvbnN0IHkxID0gY3kgKyByICogTWF0aC5zaW4ocmFkU3RhcnQpO1xuICAgIGNvbnN0IHgyID0gY3ggKyByICogTWF0aC5jb3MocmFkRW5kKTtcbiAgICBjb25zdCB5MiA9IGN5ICsgciAqIE1hdGguc2luKHJhZEVuZCk7XG4gICAgY29uc3QgbGFyZ2VBcmMgPSBnYXVnZUFuZ2xlID4gMTgwID8gMSA6IDA7XG5cbiAgICBjb25zdCBnYXVnZUFyY1BhdGggPVxuICAgICAgcXVhbGl0eVBjdCA+IDBcbiAgICAgICAgPyBgPHBhdGggZD1cIk0gJHt4MX0gJHt5MX0gQSAke3J9ICR7cn0gMCAke2xhcmdlQXJjfSAxICR7eDJ9ICR7eTJ9XCJcbiAgICAgICAgICAgICAgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCIke3F1YWxpdHlDb2xvcn1cIiBzdHJva2Utd2lkdGg9XCI4XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5gXG4gICAgICAgIDogXCJcIjtcblxuICAgIGNvbnN0IGdhdWdlU3ZnID0gYFxuICAgICAgPHN2ZyB2aWV3Qm94PVwiMCAwIDEwMCA1NVwiIGNsYXNzPVwicXVhbGl0eS1nYXVnZVwiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWlkWU1pZCBtZWV0XCI+XG4gICAgICAgIDxwYXRoIGQ9XCJNICR7Y3ggLSByfSAke2N5fSBBICR7cn0gJHtyfSAwIDAgMSAke2N4ICsgcn0gJHtjeX1cIlxuICAgICAgICAgICAgICBmaWxsPVwibm9uZVwiIHN0cm9rZT1cIiNFMEUwRTBcIiBzdHJva2Utd2lkdGg9XCI4XCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiLz5cbiAgICAgICAgJHtnYXVnZUFyY1BhdGh9XG4gICAgICAgIDx0ZXh0IHg9XCIke2N4fVwiIHk9XCIke2N5IC0gNX1cIiB0ZXh0LWFuY2hvcj1cIm1pZGRsZVwiIGZvbnQtc2l6ZT1cIjE2XCIgZm9udC13ZWlnaHQ9XCJib2xkXCIgZmlsbD1cIiR7cXVhbGl0eUNvbG9yfVwiPlxuICAgICAgICAgICR7cXVhbGl0eVBjdH1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgICA8dGV4dCB4PVwiJHtjeH1cIiB5PVwiJHtjeSArIDh9XCIgdGV4dC1hbmNob3I9XCJtaWRkbGVcIiBmb250LXNpemU9XCI3XCIgZmlsbD1cIiM2NjZcIj5cbiAgICAgICAgICAke3F1YWxpdHlMYWJlbH1cbiAgICAgICAgPC90ZXh0PlxuICAgICAgPC9zdmc+XG4gICAgYDtcblxuICAgIGNvbnN0IHJ0dERpc3BsYXkgPSBucS5ydHQgIT09IHVuZGVmaW5lZCA/IG5xLnJ0dCArIFwiIG1zXCIgOiBcIk4vQVwiO1xuICAgIGNvbnN0IGppdHRlckRpc3BsYXkgPSBucS5qaXR0ZXIgIT09IHVuZGVmaW5lZCA/IG5xLmppdHRlciArIFwiIG1zXCIgOiBcIk4vQVwiO1xuICAgIGNvbnN0IHBhY2tldExvc3MgPSBOdW1iZXIuaXNGaW5pdGUobnEucGFja2V0TG9zcykgPyBucS5wYWNrZXRMb3NzIDogMDtcbiAgICBjb25zdCByZXRyYW5zbWl0UmF0ZSA9IE51bWJlci5pc0Zpbml0ZShucS5yZXRyYW5zbWl0UmF0ZSkgPyBucS5yZXRyYW5zbWl0UmF0ZSA6IDA7XG4gICAgY29uc3QgcGFja2V0TG9zc0Rpc3BsYXkgPSB0aGlzLmZvcm1hdFJhdGlvUGVyY2VudChwYWNrZXRMb3NzKTtcbiAgICBjb25zdCByZXRyYW5zbWl0UmF0ZURpc3BsYXkgPSB0aGlzLmZvcm1hdFJhdGlvUGVyY2VudChyZXRyYW5zbWl0UmF0ZSk7XG4gICAgY29uc3QgZGF0YVNvdXJjZURpc3BsYXkgPSBucS5kYXRhU291cmNlIHx8IFwibG9jYWxcIjtcblxuICAgIGxldCBucUh0bWwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwibmV0d29yay1xdWFsaXR5LWRhc2hib2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibnEtaGVyb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJucS1nYXVnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICR7Z2F1Z2VTdmd9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibnEtZ2F1Z2UtbGFiZWxcIj5MaW5rIFF1YWxpdHk8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibnEta2V5LW1ldHJpY3NcIj5cbiAgICAgICAgICAgICR7cmVuZGVyTWV0cmljSXRlbShcIlJUVFwiLCBydHREaXNwbGF5LCBucS5ydHQgPiA1MDAgPyBcImVycm9yXCIgOiBucS5ydHQgPiAyMDAgPyBcIndhcm5pbmdcIiA6IFwiXCIpfVxuICAgICAgICAgICAgJHtyZW5kZXJNZXRyaWNJdGVtKFwiSml0dGVyXCIsIGppdHRlckRpc3BsYXksIG5xLmppdHRlciA+IDEwMCA/IFwiZXJyb3JcIiA6IG5xLmppdHRlciA+IDUwID8gXCJ3YXJuaW5nXCIgOiBcIlwiKX1cbiAgICAgICAgICAgICR7cmVuZGVyTWV0cmljSXRlbShcbiAgICAgICAgICAgICAgXCJQYWNrZXQgTG9zc1wiLFxuICAgICAgICAgICAgICBwYWNrZXRMb3NzRGlzcGxheSxcbiAgICAgICAgICAgICAgcGFja2V0TG9zcyA+IDAuMSA/IFwiZXJyb3JcIiA6IHBhY2tldExvc3MgPiAwLjAzID8gXCJ3YXJuaW5nXCIgOiBcIlwiXG4gICAgICAgICAgICApfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibnEtZGV0YWlsc1wiPlxuICAgICAgICAgIDxoNT5SZWxpYWJpbGl0eSBTdGF0aXN0aWNzPC9oNT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHMtZ3JpZFwiPlxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIkRhdGEgU291cmNlXCIsIGRhdGFTb3VyY2VEaXNwbGF5KX1cbiAgICAgICAgICAgICR7bnEuYWN0aXZlTGluayA/IHJlbmRlclN0YXRJdGVtKFwiQWN0aXZlIExpbmtcIiwgbnEuYWN0aXZlTGluaykgOiBcIlwifVxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIlJldHJhbnNtaXQgUmF0ZVwiLCByZXRyYW5zbWl0UmF0ZURpc3BsYXksIHJldHJhbnNtaXRSYXRlID4gMC4xKX1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgIG5xLmxhc3RSZW1vdGVVcGRhdGVcbiAgICAgICAgICAgICAgICA/IHJlbmRlclN0YXRJdGVtKFwiTGFzdCBSZW1vdGUgVXBkYXRlXCIsIHRoaXMuZm9ybWF0VGltZXN0YW1wQWdlKG5xLmxhc3RSZW1vdGVVcGRhdGUpKVxuICAgICAgICAgICAgICAgIDogXCJcIlxuICAgICAgICAgICAgfVxuICAgIGA7XG5cbiAgICBpZiAoaXNDbGllbnQpIHtcbiAgICAgIG5xSHRtbCArPSBgXG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiUmV0cmFuc21pc3Npb25zXCIsIChucS5yZXRyYW5zbWlzc2lvbnMgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKSwgbnEucmV0cmFuc21pc3Npb25zID4gMCl9XG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiUXVldWUgRGVwdGhcIiwgKG5xLnF1ZXVlRGVwdGggfHwgMCkudG9Mb2NhbGVTdHJpbmcoKSwgbnEucXVldWVEZXB0aCA+IDEwMCl9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBucUh0bWwgKz0gYFxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIkFDS3MgU2VudFwiLCAobnEuYWNrc1NlbnQgfHwgMCkudG9Mb2NhbGVTdHJpbmcoKSl9XG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiTkFLcyBTZW50XCIsIChucS5uYWtzU2VudCB8fCAwKS50b0xvY2FsZVN0cmluZygpLCBucS5uYWtzU2VudCA+IDApfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICBucUh0bWwgKz0gYFxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICBucURpdi5pbm5lckhUTUwgPSBucUh0bWw7XG4gIH1cblxuICB1cGRhdGVCYW5kd2lkdGhEaXNwbGF5KG1ldHJpY3M6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCBiYW5kd2lkdGhEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJhbmR3aWR0aFwiKTtcbiAgICBpZiAoIWJhbmR3aWR0aERpdiB8fCAhbWV0cmljcy5iYW5kd2lkdGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBidyA9IG1ldHJpY3MuYmFuZHdpZHRoO1xuICAgIGNvbnN0IGlzQ2xpZW50ID0gbWV0cmljcy5tb2RlID09PSBcImNsaWVudFwiO1xuXG4gICAgY29uc3Qgc2F2ZWRCeXRlcyA9IGlzQ2xpZW50ID8gYncuYnl0ZXNPdXRSYXcgLSBidy5ieXRlc091dCA6IGJ3LmJ5dGVzSW5SYXcgLSBidy5ieXRlc0luO1xuICAgIGNvbnN0IHNhdmVkRm9ybWF0dGVkID0gdGhpcy5mb3JtYXRCeXRlcyhzYXZlZEJ5dGVzID4gMCA/IHNhdmVkQnl0ZXMgOiAwKTtcbiAgICBjb25zdCBtZXRhQnl0ZXNPdXQgPSBidy5tZXRhQnl0ZXNPdXQgfHwgMDtcbiAgICBjb25zdCBtZXRhQnl0ZXNJbiA9IGJ3Lm1ldGFCeXRlc0luIHx8IDA7XG4gICAgY29uc3QgbWV0YVBhY2tldHNPdXQgPSBidy5tZXRhUGFja2V0c091dCB8fCAwO1xuICAgIGNvbnN0IG1ldGFQYWNrZXRzSW4gPSBidy5tZXRhUGFja2V0c0luIHx8IDA7XG4gICAgY29uc3QgbWV0YVNuYXBzaG90c1NlbnQgPSBidy5tZXRhU25hcHNob3RzU2VudCB8fCAwO1xuICAgIGNvbnN0IG1ldGFEaWZmc1NlbnQgPSBidy5tZXRhRGlmZnNTZW50IHx8IDA7XG4gICAgY29uc3QgbWV0YVJhdGVMaW1pdGVkUGFja2V0cyA9IGJ3Lm1ldGFSYXRlTGltaXRlZFBhY2tldHMgfHwgMDtcblxuICAgIGxldCBiYW5kd2lkdGhTdGF0czogc3RyaW5nW107XG4gICAgbGV0IG1ldGFkYXRhU3RhdHM6IHN0cmluZ1tdO1xuICAgIGlmIChpc0NsaWVudCkge1xuICAgICAgYmFuZHdpZHRoU3RhdHMgPSBbXG4gICAgICAgIHJlbmRlckJ3U3RhdChcIlRvdGFsIFNlbnQgKENvbXByZXNzZWQpXCIsIGJ3LmJ5dGVzT3V0Rm9ybWF0dGVkKSxcbiAgICAgICAgcmVuZGVyQndTdGF0KFwiVG90YWwgUmF3IChCZWZvcmUgQ29tcHJlc3Npb24pXCIsIGJ3LmJ5dGVzT3V0UmF3Rm9ybWF0dGVkKSxcbiAgICAgICAgcmVuZGVyQndTdGF0KFwiQmFuZHdpZHRoIFNhdmVkXCIsIHNhdmVkRm9ybWF0dGVkLCB0cnVlLCB0cnVlKSxcbiAgICAgICAgcmVuZGVyQndTdGF0KFwiUGFja2V0cyBTZW50XCIsIGJ3LnBhY2tldHNPdXQudG9Mb2NhbGVTdHJpbmcoKSlcbiAgICAgIF07XG4gICAgICBtZXRhZGF0YVN0YXRzID0gW1xuICAgICAgICByZW5kZXJCd1N0YXQoXCJNZXRhZGF0YSBTZW50XCIsIGJ3Lm1ldGFCeXRlc091dEZvcm1hdHRlZCB8fCB0aGlzLmZvcm1hdEJ5dGVzKG1ldGFCeXRlc091dCkpLFxuICAgICAgICByZW5kZXJCd1N0YXQoXCJNZXRhZGF0YSBQYWNrZXRzIFNlbnRcIiwgbWV0YVBhY2tldHNPdXQudG9Mb2NhbGVTdHJpbmcoKSksXG4gICAgICAgIHJlbmRlckJ3U3RhdChcIk1ldGFkYXRhIFNuYXBzaG90cyBTZW50XCIsIG1ldGFTbmFwc2hvdHNTZW50LnRvTG9jYWxlU3RyaW5nKCkpLFxuICAgICAgICByZW5kZXJCd1N0YXQoXCJNZXRhZGF0YSBEaWZmcyBTZW50XCIsIG1ldGFEaWZmc1NlbnQudG9Mb2NhbGVTdHJpbmcoKSlcbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIGJhbmR3aWR0aFN0YXRzID0gW1xuICAgICAgICByZW5kZXJCd1N0YXQoXCJUb3RhbCBSZWNlaXZlZCAoQ29tcHJlc3NlZClcIiwgYncuYnl0ZXNJbkZvcm1hdHRlZCksXG4gICAgICAgIHJlbmRlckJ3U3RhdChcbiAgICAgICAgICBcIlRvdGFsIFJhdyAoQWZ0ZXIgRGVjb21wcmVzc2lvbilcIixcbiAgICAgICAgICBidy5ieXRlc0luUmF3Rm9ybWF0dGVkIHx8IHRoaXMuZm9ybWF0Qnl0ZXMoYncuYnl0ZXNJblJhdyB8fCAwKVxuICAgICAgICApLFxuICAgICAgICByZW5kZXJCd1N0YXQoXCJCYW5kd2lkdGggU2F2ZWRcIiwgc2F2ZWRGb3JtYXR0ZWQsIHRydWUsIHRydWUpLFxuICAgICAgICByZW5kZXJCd1N0YXQoXCJQYWNrZXRzIFJlY2VpdmVkXCIsIGJ3LnBhY2tldHNJbi50b0xvY2FsZVN0cmluZygpKVxuICAgICAgXTtcbiAgICAgIG1ldGFkYXRhU3RhdHMgPSBbXG4gICAgICAgIHJlbmRlckJ3U3RhdChcIk1ldGFkYXRhIFJlY2VpdmVkXCIsIGJ3Lm1ldGFCeXRlc0luRm9ybWF0dGVkIHx8IHRoaXMuZm9ybWF0Qnl0ZXMobWV0YUJ5dGVzSW4pKSxcbiAgICAgICAgcmVuZGVyQndTdGF0KFwiTWV0YWRhdGEgUGFja2V0cyBSZWNlaXZlZFwiLCBtZXRhUGFja2V0c0luLnRvTG9jYWxlU3RyaW5nKCkpLFxuICAgICAgICByZW5kZXJCd1N0YXQoXCJNZXRhZGF0YSBSYXRlLUxpbWl0ZWRcIiwgbWV0YVJhdGVMaW1pdGVkUGFja2V0cy50b0xvY2FsZVN0cmluZygpKVxuICAgICAgXTtcbiAgICB9XG5cbiAgICBjb25zdCBiYW5kd2lkdGhIdG1sID0gYFxuICAgICAgPGRpdiBjbGFzcz1cImJhbmR3aWR0aC1kYXNoYm9hcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJhbmR3aWR0aC1oZXJvXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImhlcm8tc3RhdCAke2lzQ2xpZW50ID8gXCJwcmltYXJ5XCIgOiBcInNlY29uZGFyeVwifVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlcm8tdmFsdWVcIj4ke2lzQ2xpZW50ID8gYncucmF0ZU91dEZvcm1hdHRlZCA6IGJ3LnJhdGVJbkZvcm1hdHRlZH08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZXJvLWxhYmVsXCI+JHtpc0NsaWVudCA/IFwiVXBsb2FkIFJhdGVcIiA6IFwiRG93bmxvYWQgUmF0ZVwifTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZXJvLXN0YXQgc3VjY2Vzc1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlcm8tdmFsdWVcIj4ke2J3LmNvbXByZXNzaW9uUmF0aW99JTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlcm8tbGFiZWxcIj5Db21wcmVzc2lvbiBSYXRpbzwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZXJvLXN0YXRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZXJvLXZhbHVlXCI+JHtidy5hdmdQYWNrZXRTaXplRm9ybWF0dGVkfTwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhlcm8tbGFiZWxcIj5BdmcgUGFja2V0IFNpemU8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJhbmR3aWR0aC1kZXRhaWxzXCI+XG4gICAgICAgICAgPGg1PkJhbmR3aWR0aCBEZXRhaWxzPC9oNT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFuZHdpZHRoLWdyaWRcIj4ke2JhbmR3aWR0aFN0YXRzLmpvaW4oXCJcIil9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJiYW5kd2lkdGgtZGV0YWlscyBtZXRhZGF0YS1kZXRhaWxzXCI+XG4gICAgICAgICAgPGg1Pk1ldGFkYXRhIFRyYWZmaWM8L2g1PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYW5kd2lkdGgtZ3JpZFwiPiR7bWV0YWRhdGFTdGF0cy5qb2luKFwiXCIpfTwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICAke3RoaXMucmVuZGVyQmFuZHdpZHRoQ2hhcnQoYncuaGlzdG9yeSwgaXNDbGllbnQpfVxuICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGJhbmR3aWR0aERpdi5pbm5lckhUTUwgPSBiYW5kd2lkdGhIdG1sO1xuICB9XG5cbiAgcmVuZGVyQmFuZHdpZHRoQ2hhcnQoXG4gICAgaGlzdG9yeTogQXJyYXk8eyByYXRlT3V0OiBudW1iZXI7IHJhdGVJbjogbnVtYmVyIH0+IHwgdW5kZWZpbmVkLFxuICAgIGlzQ2xpZW50OiBib29sZWFuXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKCFoaXN0b3J5IHx8IGhpc3RvcnkubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgPGRpdiBjbGFzcz1cImJhbmR3aWR0aC1jaGFydC1wbGFjZWhvbGRlclwiPlxuICAgICAgICAgIDxwPkNvbGxlY3RpbmcgZGF0YSBmb3IgY2hhcnQuLi4gKCR7aGlzdG9yeSA/IGhpc3RvcnkubGVuZ3RoIDogMH0vMiBwb2ludHMpPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGggPSAxMDA7XG4gICAgY29uc3QgaGVpZ2h0ID0gNDA7XG4gICAgY29uc3QgbWF4UmF0ZSA9IE1hdGgubWF4KC4uLmhpc3RvcnkubWFwKChoKSA9PiAoaXNDbGllbnQgPyBoLnJhdGVPdXQgOiBoLnJhdGVJbikpLCAxKTtcbiAgICBjb25zdCBwb2ludHMgPSBoaXN0b3J5XG4gICAgICAubWFwKChoLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHggPSAoaSAvIChoaXN0b3J5Lmxlbmd0aCAtIDEpKSAqIHdpZHRoO1xuICAgICAgICBjb25zdCB5ID0gaGVpZ2h0IC0gKChpc0NsaWVudCA/IGgucmF0ZU91dCA6IGgucmF0ZUluKSAvIG1heFJhdGUpICogaGVpZ2h0O1xuICAgICAgICByZXR1cm4gYCR7eH0sJHt5fWA7XG4gICAgICB9KVxuICAgICAgLmpvaW4oXCIgXCIpO1xuXG4gICAgY29uc3QgbWF4UmF0ZUZvcm1hdHRlZCA9IHRoaXMuZm9ybWF0Qnl0ZXMobWF4UmF0ZSk7XG4gICAgY29uc3QgaW50ZXJ2YWxTZWNvbmRzID0gTUVUUklDU19SRUZSRVNIX0lOVEVSVkFMIC8gMTAwMDtcblxuICAgIHJldHVybiBgXG4gICAgICA8ZGl2IGNsYXNzPVwiYmFuZHdpZHRoLWNoYXJ0XCI+XG4gICAgICAgIDxoNT5SYXRlIEhpc3RvcnkgKExhc3QgJHtoaXN0b3J5Lmxlbmd0aCAqIGludGVydmFsU2Vjb25kc31zKTwvaDU+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGFydC1jb250YWluZXJcIj5cbiAgICAgICAgICA8c3ZnIHZpZXdCb3g9XCIwIDAgJHt3aWR0aH0gJHtoZWlnaHR9XCIgY2xhc3M9XCJzcGFya2xpbmVcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiPlxuICAgICAgICAgICAgPHBvbHlsaW5lXG4gICAgICAgICAgICAgIGZpbGw9XCJub25lXCJcbiAgICAgICAgICAgICAgc3Ryb2tlPVwidmFyKC0tcHJpbWFyeS1jb2xvcilcIlxuICAgICAgICAgICAgICBzdHJva2Utd2lkdGg9XCIxLjVcIlxuICAgICAgICAgICAgICBwb2ludHM9XCIke3BvaW50c31cIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnQtbGFiZWxzXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoYXJ0LW1heFwiPiR7bWF4UmF0ZUZvcm1hdHRlZH0vczwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hhcnQtbWluXCI+MDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICBgO1xuICB9XG5cbiAgdXBkYXRlUGF0aEFuYWx5dGljc0Rpc3BsYXkobWV0cmljczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHBhdGhEaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInBhdGhBbmFseXRpY3NcIik7XG4gICAgaWYgKCFwYXRoRGl2IHx8ICFtZXRyaWNzLnBhdGhTdGF0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhzOiBBcnJheTx7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICB1cGRhdGVzUGVyTWludXRlOiBudW1iZXI7XG4gICAgICBieXRlc0Zvcm1hdHRlZDogc3RyaW5nO1xuICAgICAgcGVyY2VudGFnZTogbnVtYmVyO1xuICAgIH0+ID0gbWV0cmljcy5wYXRoU3RhdHM7XG5cbiAgICBpZiAocGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICBwYXRoRGl2LmlubmVySFRNTCA9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhdGgtYW5hbHl0aWNzLWVtcHR5XCI+XG4gICAgICAgICAgPHA+Tm8gcGF0aCBkYXRhIGNvbGxlY3RlZCB5ZXQuIERhdGEgd2lsbCBhcHBlYXIgb25jZSBkZWx0YXMgYXJlIHRyYW5zbWl0dGVkLjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNhdGVnb3J5Q291bnQgPSBuZXcgU2V0KHBhdGhzLm1hcCgocCkgPT4gcC5wYXRoLnNwbGl0KFwiLlwiKVswXSkpLnNpemU7XG5cbiAgICBsZXQgcGF0aEh0bWwgPSBgXG4gICAgICA8ZGl2IGNsYXNzPVwicGF0aC1hbmFseXRpY3MtZGFzaGJvYXJkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXRoLXN1bW1hcnlcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1zdGF0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj4ke3BhdGhzLmxlbmd0aH08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj5BY3RpdmUgUGF0aHM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktc3RhdFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+JHtjYXRlZ29yeUNvdW50fTwvc3Bhbj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkNhdGVnb3JpZXM8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYXRoLXRhYmxlLWNvbnRhaW5lclwiPlxuICAgICAgICAgIDx0YWJsZSBjbGFzcz1cInBhdGgtdGFibGVcIj5cbiAgICAgICAgICAgIDx0aGVhZD5cbiAgICAgICAgICAgICAgPHRyPlxuICAgICAgICAgICAgICAgIDx0aD5QYXRoPC90aD5cbiAgICAgICAgICAgICAgICA8dGg+VXBkYXRlcy9taW48L3RoPlxuICAgICAgICAgICAgICAgIDx0aD5EYXRhIFZvbHVtZTwvdGg+XG4gICAgICAgICAgICAgICAgPHRoPiUgb2YgVG90YWw8L3RoPlxuICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC90aGVhZD5cbiAgICAgICAgICAgIDx0Ym9keT5cbiAgICBgO1xuXG4gICAgcGF0aHMuc2xpY2UoMCwgMTUpLmZvckVhY2goKHApID0+IHtcbiAgICAgIGNvbnN0IGJhcldpZHRoID0gTWF0aC5tYXgocC5wZXJjZW50YWdlLCAyKTtcbiAgICAgIHBhdGhIdG1sICs9IGBcbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0ZCBjbGFzcz1cInBhdGgtbmFtZVwiIHRpdGxlPVwiJHt0aGlzLmVzY2FwZUh0bWwocC5wYXRoKX1cIj4ke3RoaXMuZXNjYXBlSHRtbChwLnBhdGgpfTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicGF0aC1yYXRlXCI+JHtwLnVwZGF0ZXNQZXJNaW51dGV9PC90ZD5cbiAgICAgICAgICA8dGQgY2xhc3M9XCJwYXRoLWJ5dGVzXCI+JHtwLmJ5dGVzRm9ybWF0dGVkfTwvdGQ+XG4gICAgICAgICAgPHRkIGNsYXNzPVwicGF0aC1wZXJjZW50YWdlXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyY2VudGFnZS1iYXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwZXJjZW50YWdlLWJhclwiIHN0eWxlPVwid2lkdGg6ICR7YmFyV2lkdGh9JVwiPjwvZGl2PlxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmNlbnRhZ2UtdGV4dFwiPiR7cC5wZXJjZW50YWdlfSU8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgYDtcbiAgICB9KTtcblxuICAgIHBhdGhIdG1sICs9IGBcbiAgICAgICAgICAgIDwvdGJvZHk+XG4gICAgICAgICAgPC90YWJsZT5cbiAgICAgICAgPC9kaXY+XG4gICAgYDtcblxuICAgIGlmIChwYXRocy5sZW5ndGggPiAxNSkge1xuICAgICAgcGF0aEh0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwicGF0aC1tb3JlXCI+XG4gICAgICAgICAgPHA+U2hvd2luZyB0b3AgMTUgb2YgJHtwYXRocy5sZW5ndGh9IHBhdGhzPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfVxuXG4gICAgcGF0aEh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICBwYXRoRGl2LmlubmVySFRNTCA9IHBhdGhIdG1sO1xuICB9XG5cbiAgdXBkYXRlQ29uZ2VzdGlvbkRpc3BsYXkoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImNvbmdlc3Rpb25TZWN0aW9uXCIpO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiY29uZ2VzdGlvbkNvbnRyb2xcIik7XG4gICAgaWYgKCFzZWN0aW9uIHx8ICFkaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXG4gICAgY29uc3QgZW5hYmxlZCA9ICEhZGF0YS5lbmFibGVkO1xuICAgIGNvbnN0IG1hbnVhbE1vZGUgPSAhIWRhdGEubWFudWFsTW9kZTtcbiAgICBjb25zdCBzdGF0ZUxhYmVsID0gZW5hYmxlZCA/IChtYW51YWxNb2RlID8gXCJtYW51YWxcIiA6IFwiYWN0aXZlXCIpIDogXCJkaXNhYmxlZFwiO1xuICAgIGNvbnN0IHN0YXRlQ2xhc3MgPSBlbmFibGVkID8gKG1hbnVhbE1vZGUgPyBcIndhcm5pbmdcIiA6IFwic3VjY2Vzc1wiKSA6IFwiZXJyb3JcIjtcbiAgICBjb25zdCBtb2RlTGFiZWwgPSBtYW51YWxNb2RlID8gXCJNYW51YWwgT3ZlcnJpZGVcIiA6IFwiQXV0b21hdGljXCI7XG4gICAgY29uc3QgY3VycmVudERlbHRhVGltZXIgPSBkYXRhLmN1cnJlbnREZWx0YVRpbWVyIHx8IDA7XG4gICAgY29uc3Qgbm9taW5hbERlbHRhVGltZXIgPSBkYXRhLm5vbWluYWxEZWx0YVRpbWVyIHx8IDA7XG5cbiAgICBjb25zdCBodG1sID0gYFxuICAgICAgPGRpdiBjbGFzcz1cInYyLWRhc2hib2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1ncmlkXCI+XG4gICAgICAgICAgJHtyZW5kZXJNZXRyaWNJdGVtSHRtbChcIlN0YXRlXCIsIGA8c3BhbiBjbGFzcz1cImNvbmdlc3Rpb24tc3RhdGUgJHtzdGF0ZUNsYXNzfVwiPiR7c3RhdGVMYWJlbH08L3NwYW4+YCl9XG4gICAgICAgICAgJHtyZW5kZXJNZXRyaWNJdGVtKFwiTW9kZVwiLCBtb2RlTGFiZWwpfVxuICAgICAgICAgICR7cmVuZGVyTWV0cmljSXRlbShcIkN1cnJlbnQgVGltZXJcIiwgY3VycmVudERlbHRhVGltZXIgKyBcIiBtc1wiKX1cbiAgICAgICAgICAke3JlbmRlck1ldHJpY0l0ZW0oXCJOb21pbmFsIFRpbWVyXCIsIG5vbWluYWxEZWx0YVRpbWVyICsgXCIgbXNcIil9XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWV0cmljcy1zdGF0c1wiPlxuICAgICAgICAgIDxoNT5Db25nZXN0aW9uIERldGFpbHM8L2g1PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0cy1ncmlkXCI+XG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiTWluIERlbHRhIFRpbWVyXCIsIChkYXRhLm1pbkRlbHRhVGltZXIgfHwgMCkgKyBcIiBtc1wiKX1cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJNYXggRGVsdGEgVGltZXJcIiwgKGRhdGEubWF4RGVsdGFUaW1lciB8fCAwKSArIFwiIG1zXCIpfVxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIlRhcmdldCBSVFRcIiwgKGRhdGEudGFyZ2V0UlRUIHx8IDApICsgXCIgbXNcIil9XG4gICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiQXZnIFJUVFwiLCAoZGF0YS5hdmdSVFQgIT09IHVuZGVmaW5lZCA/IE1hdGgucm91bmQoZGF0YS5hdmdSVFQpIDogMCkgKyBcIiBtc1wiKX1cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJBdmcgUGFja2V0IExvc3NcIiwgKGRhdGEuYXZnTG9zcyAhPT0gdW5kZWZpbmVkID8gKGRhdGEuYXZnTG9zcyAqIDEwMCkudG9GaXhlZCgxKSA6IDApICsgXCIlXCIsIGRhdGEuYXZnTG9zcyA+IDAuMDUpfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxuXG4gIHVwZGF0ZUJvbmRpbmdEaXNwbGF5KGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCBzZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJib25kaW5nU2VjdGlvblwiKTtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJvbmRpbmdTdGF0dXNcIik7XG4gICAgaWYgKCFzZWN0aW9uIHx8ICFkaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWRhdGEuZW5hYmxlZCkge1xuICAgICAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gXCJub25lXCI7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2VjdGlvbi5zdHlsZS5kaXNwbGF5ID0gXCJcIjtcblxuICAgIGNvbnN0IG1vZGVMYWJlbCA9IChkYXRhLm1vZGUgfHwgXCJtYWluLWJhY2t1cFwiKS5yZXBsYWNlKC8tL2csIFwiIFwiKTtcbiAgICBjb25zdCBhY3RpdmVMaW5rID0gZGF0YS5hY3RpdmVMaW5rIHx8IFwicHJpbWFyeVwiO1xuXG4gICAgbGV0IGxpbmtzSHRtbCA9IFwiXCI7XG4gICAgaWYgKGRhdGEubGlua3MpIHtcbiAgICAgIGNvbnN0IGxpbmtFbnRyaWVzID0gT2JqZWN0LmVudHJpZXMoZGF0YS5saW5rcykgYXMgQXJyYXk8W3N0cmluZywgUmVjb3JkPHN0cmluZywgYW55Pl0+O1xuICAgICAgbGlua3NIdG1sID0gbGlua0VudHJpZXNcbiAgICAgICAgLm1hcCgoW25hbWUsIGxpbmtdKSA9PiB7XG4gICAgICAgICAgY29uc3QgaXNBY3RpdmUgPSBuYW1lID09PSBhY3RpdmVMaW5rO1xuICAgICAgICAgIGNvbnN0IHN0YXR1cyA9IChsaW5rLnN0YXR1cyB8fCBcInVua25vd25cIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICBjb25zdCBpc1VwID0gc3RhdHVzICE9PSBcImRvd25cIjtcbiAgICAgICAgICBjb25zdCBhbGl2ZUNsYXNzID0gaXNVcCA/IFwic3VjY2Vzc1wiIDogXCJlcnJvclwiO1xuICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImJvbmRpbmctbGluayAke2lzQWN0aXZlID8gXCJhY3RpdmVcIiA6IFwiXCJ9XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5rLW5hbWVcIj4ke3RoaXMuZXNjYXBlSHRtbChuYW1lKX08L3NwYW4+XG4gICAgICAgICAgICAgICR7aXNBY3RpdmUgPyAnPHNwYW4gY2xhc3M9XCJsaW5rLWJhZGdlIGFjdGl2ZS1iYWRnZVwiPkFDVElWRTwvc3Bhbj4nIDogXCJcIn1cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaW5rLWJhZGdlICR7YWxpdmVDbGFzc31cIj4ke3RoaXMuZXNjYXBlSHRtbChzdGF0dXMudG9VcHBlckNhc2UoKSl9PC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGluay1zdGF0c1wiPlxuICAgICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiUlRUXCIsIChsaW5rLnJ0dCB8fCAwKSArIFwiIG1zXCIpfVxuICAgICAgICAgICAgICAke3JlbmRlclN0YXRJdGVtKFwiUGFja2V0IExvc3NcIiwgKChsaW5rLmxvc3MgfHwgMCkgKiAxMDApLnRvRml4ZWQoMSkgKyBcIiVcIil9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYDtcbiAgICAgICAgfSlcbiAgICAgICAgLmpvaW4oXCJcIik7XG4gICAgfVxuXG4gICAgY29uc3QgaHRtbCA9IGBcbiAgICAgIDxkaXYgY2xhc3M9XCJ2Mi1kYXNoYm9hcmRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1ldHJpY3MtZ3JpZFwiPlxuICAgICAgICAgICR7cmVuZGVyTWV0cmljSXRlbShcIk1vZGVcIiwgbW9kZUxhYmVsKX1cbiAgICAgICAgICAke3JlbmRlck1ldHJpY0l0ZW0oXCJBY3RpdmUgTGlua1wiLCBhY3RpdmVMaW5rKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJib25kaW5nLWxpbmtzXCI+JHtsaW5rc0h0bWx9PC9kaXY+XG4gICAgICAgIDxkaXYgc3R5bGU9XCJtYXJnaW4tdG9wOiAxcmVtO1wiPlxuICAgICAgICAgIDxidXR0b24gaWQ9XCJmYWlsb3ZlckJ0blwiIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIj5Gb3JjZSBGYWlsb3ZlcjwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIGA7XG5cbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcblxuICAgIGNvbnN0IGZhaWxvdmVyQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmYWlsb3ZlckJ0blwiKTtcbiAgICBpZiAoZmFpbG92ZXJCdG4pIHtcbiAgICAgIGZhaWxvdmVyQnRuLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCAoKSA9PiB0aGlzLnRyaWdnZXJGYWlsb3ZlcigpKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB0cmlnZ2VyRmFpbG92ZXIoKSB7XG4gICAgY29uc3QgY29ubklkID0gdGhpcy5hY3RpdmVDb25uZWN0aW9uSWQhO1xuICAgIGNvbnN0IGJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiZmFpbG92ZXJCdG5cIikgYXMgSFRNTEJ1dHRvbkVsZW1lbnQgfCBudWxsO1xuICAgIGlmIChidG4pIHtcbiAgICAgIGJ0bi5kaXNhYmxlZCA9IHRydWU7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVxdWVzdCh0aGlzLmJvbmRpbmdGYWlsb3ZlclBhdGgoY29ubklkKSwgeyBtZXRob2Q6IFwiUE9TVFwiIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgICAgdGhpcy5zaG93Tm90aWZpY2F0aW9uKGBGYWlsb3ZlciBjb21wbGV0ZS4gQWN0aXZlIGxpbms6ICR7cmVzdWx0LmFjdGl2ZUxpbmt9YCwgXCJzdWNjZXNzXCIpO1xuICAgICAgICB0aGlzLmxvYWRNZXRyaWNzKGNvbm5JZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnIgPSBhd2FpdCByZXNwb25zZS5qc29uKCk7XG4gICAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPT09IDQwMVxuICAgICAgICAgICAgPyB0aGlzLmF1dGhGYWlsdXJlTWVzc2FnZShcInRyaWdnZXJpbmcgZmFpbG92ZXJcIilcbiAgICAgICAgICAgIDogXCJGYWlsb3ZlciBmYWlsZWQ6IFwiICsgKGVyci5lcnJvciB8fCBcIlVua25vd24gZXJyb3JcIiksXG4gICAgICAgICAgXCJlcnJvclwiXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGVyciA9IGVycm9yIGFzIEF1dGhlbnRpY2F0ZWRFcnJvcjtcbiAgICAgIHRoaXMuc2hvd05vdGlmaWNhdGlvbihcbiAgICAgICAgZXJyLmlzVW5hdXRob3JpemVkXG4gICAgICAgICAgPyB0aGlzLmF1dGhGYWlsdXJlTWVzc2FnZShcInRyaWdnZXJpbmcgZmFpbG92ZXJcIilcbiAgICAgICAgICA6IFwiRmFpbG92ZXIgZmFpbGVkOiBcIiArIGVyci5tZXNzYWdlLFxuICAgICAgICBcImVycm9yXCJcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmIChidG4pIHtcbiAgICAgICAgYnRuLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlTW9uaXRvcmluZ0Rpc3BsYXkoZGF0YTogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGNvbnN0IHNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm1vbml0b3JpbmdTZWN0aW9uXCIpO1xuICAgIGNvbnN0IGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibW9uaXRvcmluZ0FsZXJ0c1wiKTtcbiAgICBpZiAoIXNlY3Rpb24gfHwgIWRpdikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0RhdGEgPSBkYXRhLmFsZXJ0cyB8fCBkYXRhLnBhY2tldExvc3MgfHwgZGF0YS5yZXRyYW5zbWlzc2lvbnM7XG4gICAgaWYgKCFoYXNEYXRhKSB7XG4gICAgICBzZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZWN0aW9uLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXG4gICAgbGV0IGh0bWwgPSAnPGRpdiBjbGFzcz1cInYyLWRhc2hib2FyZFwiPic7XG5cbiAgICBpZiAoZGF0YS5hbGVydHMpIHtcbiAgICAgIGNvbnN0IGFjdGl2ZUFsZXJ0czogUmVjb3JkPHN0cmluZywgYW55PiA9IGRhdGEuYWxlcnRzLmFjdGl2ZUFsZXJ0cyB8fCB7fTtcbiAgICAgIGNvbnN0IGFsZXJ0RW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGFjdGl2ZUFsZXJ0cykubWFwKChbbWV0cmljLCBhbGVydF06IFtzdHJpbmcsIGFueV0pID0+IHtcbiAgICAgICAgbGV0IGxldmVsID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgIGlmICh0eXBlb2YgYWxlcnQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBsZXZlbCA9IGFsZXJ0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoYWxlcnQgJiYgdHlwZW9mIGFsZXJ0ID09PSBcIm9iamVjdFwiICYmIGFsZXJ0LmxldmVsKSB7XG4gICAgICAgICAgbGV2ZWwgPSBTdHJpbmcoYWxlcnQubGV2ZWwpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGV2ZWwgPT09IFwid2FyblwiKSB7XG4gICAgICAgICAgbGV2ZWwgPSBcIndhcm5pbmdcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGV2ZWwgPT09IFwiYWxlcnRcIikge1xuICAgICAgICAgIGxldmVsID0gXCJjcml0aWNhbFwiO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZXZlbCAhPT0gXCJ3YXJuaW5nXCIgJiYgbGV2ZWwgIT09IFwiY3JpdGljYWxcIikge1xuICAgICAgICAgIGxldmVsID0gXCJ3YXJuaW5nXCI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIG1ldHJpYyxcbiAgICAgICAgICBsZXZlbCxcbiAgICAgICAgICB2YWx1ZTogYWxlcnQgJiYgdHlwZW9mIGFsZXJ0ID09PSBcIm9iamVjdFwiID8gYWxlcnQudmFsdWUgOiB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgYWxlcnRDb3VudCA9IGFsZXJ0RW50cmllcy5sZW5ndGg7XG5cbiAgICAgIGNvbnN0IGFsZXJ0SXRlbXMgPSBhbGVydEVudHJpZXNcbiAgICAgICAgLm1hcCgoZW50cnkpID0+IHtcbiAgICAgICAgICBjb25zdCBhbGVydFZhbHVlID1cbiAgICAgICAgICAgIGVudHJ5LnZhbHVlICE9PSB1bmRlZmluZWQgPyBgICgke3RoaXMuZXNjYXBlSHRtbChTdHJpbmcoZW50cnkudmFsdWUpKX0pYCA6IFwiXCI7XG4gICAgICAgICAgcmV0dXJuIHJlbmRlclN0YXRJdGVtSHRtbChcbiAgICAgICAgICAgIGVudHJ5Lm1ldHJpYyxcbiAgICAgICAgICAgIGA8c3BhbiBjbGFzcz1cImFsZXJ0LWxldmVsIGFsZXJ0LSR7ZW50cnkubGV2ZWx9XCI+JHt0aGlzLmVzY2FwZUh0bWwoZW50cnkubGV2ZWwudG9VcHBlckNhc2UoKSl9JHthbGVydFZhbHVlfTwvc3Bhbj5gLFxuICAgICAgICAgICAgZW50cnkubGV2ZWwgPT09IFwiY3JpdGljYWxcIlxuICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5qb2luKFwiXCIpO1xuXG4gICAgICBjb25zdCBhbGVydHNDb250ZW50ID1cbiAgICAgICAgYWxlcnRDb3VudCA9PT0gMFxuICAgICAgICAgID8gJzxkaXYgY2xhc3M9XCJtZXRyaWNzLXN1Y2Nlc3NcIj48ZGl2IGNsYXNzPVwic3VjY2Vzcy1tZXNzYWdlXCI+Tm8gYWN0aXZlIGFsZXJ0czwvZGl2PjwvZGl2PidcbiAgICAgICAgICA6IGA8ZGl2IGNsYXNzPVwic3RhdHMtZ3JpZFwiPiR7YWxlcnRJdGVtc308L2Rpdj5gO1xuXG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbml0b3Jpbmctc3Vic2VjdGlvblwiPlxuICAgICAgICAgIDxoNT5BY3RpdmUgQWxlcnRzPC9oNT5cbiAgICAgICAgICAke2FsZXJ0c0NvbnRlbnR9XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5wYWNrZXRMb3NzICYmIGRhdGEucGFja2V0TG9zcy5zdW1tYXJ5KSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gZGF0YS5wYWNrZXRMb3NzLnN1bW1hcnk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbml0b3Jpbmctc3Vic2VjdGlvblwiPlxuICAgICAgICAgIDxoNT5QYWNrZXQgTG9zczwvaDU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRzLWdyaWRcIj5cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJPdmVyYWxsIExvc3MgUmF0ZVwiLCAoc3VtbWFyeS5vdmVyYWxsTG9zc1JhdGUgKiAxMDApLnRvRml4ZWQoMikgKyBcIiVcIiwgc3VtbWFyeS5vdmVyYWxsTG9zc1JhdGUgPiAwLjA1KX1cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJNYXggTG9zcyBSYXRlXCIsIChzdW1tYXJ5Lm1heExvc3NSYXRlICogMTAwKS50b0ZpeGVkKDIpICsgXCIlXCIsIHN1bW1hcnkubWF4TG9zc1JhdGUgPiAwLjEpfVxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIlRyZW5kXCIsIHN1bW1hcnkudHJlbmQgfHwgXCJzdGFibGVcIil9XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9XG5cbiAgICBpZiAoZGF0YS5yZXRyYW5zbWlzc2lvbnMgJiYgZGF0YS5yZXRyYW5zbWlzc2lvbnMuc3VtbWFyeSkge1xuICAgICAgY29uc3Qgc3VtbWFyeSA9IGRhdGEucmV0cmFuc21pc3Npb25zLnN1bW1hcnk7XG4gICAgICBodG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vbml0b3Jpbmctc3Vic2VjdGlvblwiPlxuICAgICAgICAgIDxoNT5SZXRyYW5zbWlzc2lvbiBSYXRlczwvaDU+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRzLWdyaWRcIj5cbiAgICAgICAgICAgICR7cmVuZGVyU3RhdEl0ZW0oXCJDdXJyZW50IFJhdGVcIiwgKHN1bW1hcnkuY3VycmVudFJhdGUgKiAxMDApLnRvRml4ZWQoMikgKyBcIiVcIiwgc3VtbWFyeS5jdXJyZW50UmF0ZSA+IDAuMDUpfVxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIkF2ZXJhZ2UgUmF0ZVwiLCAoc3VtbWFyeS5hdmdSYXRlICogMTAwKS50b0ZpeGVkKDIpICsgXCIlXCIpfVxuICAgICAgICAgICAgJHtyZW5kZXJTdGF0SXRlbShcIk1heCBSYXRlXCIsIChzdW1tYXJ5Lm1heFJhdGUgKiAxMDApLnRvRml4ZWQoMikgKyBcIiVcIiwgc3VtbWFyeS5tYXhSYXRlID4gMC4xKX1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIGh0bWwgKz0gXCI8L2Rpdj5cIjtcbiAgICBkaXYuaW5uZXJIVE1MID0gaHRtbDtcbiAgfVxuXG4gIC8vIOKUgOKUgCBTdGF0dXMgZGlzcGxheSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICB1cGRhdGVTdGF0dXMoKSB7XG4gICAgY29uc3Qgc3RhdHVzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJzdGF0dXNcIik7XG4gICAgaWYgKCFzdGF0dXNEaXYpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc3RhdHVzSHRtbCA9IFwiPGg0PkNvbmZpZ3VyYXRpb24gU3RhdHVzPC9oND5cIjtcblxuICAgIGlmICh0aGlzLmRlbHRhVGltZXJDb25maWcpIHtcbiAgICAgIHN0YXR1c0h0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWl0ZW1cIj5cbiAgICAgICAgICA8c3Ryb25nPkRlbHRhIFRpbWVyOjwvc3Ryb25nPiAke3RoaXMuZXNjYXBlSHRtbChTdHJpbmcoKHRoaXMuZGVsdGFUaW1lckNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZGVsdGFUaW1lcikpfW1zXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIHN1Y2Nlc3NcIj5Db25maWd1cmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c0h0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWl0ZW1cIj5cbiAgICAgICAgICA8c3Ryb25nPkRlbHRhIFRpbWVyOjwvc3Ryb25nPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3RhdHVzLWluZGljYXRvciB3YXJuaW5nXCI+Tm90IGNvbmZpZ3VyZWQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgYDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdWJzY3JpcHRpb25Db25maWcgJiYgKHRoaXMuc3Vic2NyaXB0aW9uQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5zdWJzY3JpYmUpIHtcbiAgICAgIGNvbnN0IGNmZyA9IHRoaXMuc3Vic2NyaXB0aW9uQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29uc3QgcGF0aENvdW50ID0gKGNmZy5zdWJzY3JpYmUgYXMgdW5rbm93bltdKS5sZW5ndGg7XG4gICAgICBjb25zdCBlc2NhcGVkQ29udGV4dCA9IHRoaXMuZXNjYXBlSHRtbCgoY2ZnLmNvbnRleHQgYXMgc3RyaW5nKSB8fCBcIlwiKTtcbiAgICAgIGNvbnN0IGVzY2FwZWRQYXRocyA9IChjZmcuc3Vic2NyaWJlIGFzIEFycmF5PHsgcGF0aDogc3RyaW5nIH0+KVxuICAgICAgICAubWFwKChzKSA9PiB0aGlzLmVzY2FwZUh0bWwocy5wYXRoKSlcbiAgICAgICAgLmpvaW4oXCIsIFwiKTtcbiAgICAgIHN0YXR1c0h0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWl0ZW1cIj5cbiAgICAgICAgICA8c3Ryb25nPlN1YnNjcmlwdGlvbnM6PC9zdHJvbmc+ICR7cGF0aENvdW50fSBwYXRoKHMpIGNvbmZpZ3VyZWRcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInN0YXR1cy1pbmRpY2F0b3Igc3VjY2Vzc1wiPkNvbmZpZ3VyZWQ8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWRldGFpbHNcIj5cbiAgICAgICAgICA8c3Ryb25nPkNvbnRleHQ6PC9zdHJvbmc+ICR7ZXNjYXBlZENvbnRleHR9PGJyPlxuICAgICAgICAgIDxzdHJvbmc+UGF0aHM6PC9zdHJvbmc+ICR7ZXNjYXBlZFBhdGhzfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXR1c0h0bWwgKz0gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWl0ZW1cIj5cbiAgICAgICAgICA8c3Ryb25nPlN1YnNjcmlwdGlvbnM6PC9zdHJvbmc+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIHdhcm5pbmdcIj5Ob3QgY29uZmlndXJlZDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMuc2VudGVuY2VGaWx0ZXJDb25maWcgJiZcbiAgICAgICh0aGlzLnNlbnRlbmNlRmlsdGVyQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5leGNsdWRlZFNlbnRlbmNlcyAmJlxuICAgICAgKCh0aGlzLnNlbnRlbmNlRmlsdGVyQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5leGNsdWRlZFNlbnRlbmNlcyBhcyBzdHJpbmdbXSlcbiAgICAgICAgLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgIGNvbnN0IGZpbHRlckNvdW50ID0gKFxuICAgICAgICAodGhpcy5zZW50ZW5jZUZpbHRlckNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXhjbHVkZWRTZW50ZW5jZXMgYXMgc3RyaW5nW11cbiAgICAgICkubGVuZ3RoO1xuICAgICAgY29uc3QgZXNjYXBlZEZpbHRlcnMgPSAoXG4gICAgICAgICh0aGlzLnNlbnRlbmNlRmlsdGVyQ29uZmlnIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KS5leGNsdWRlZFNlbnRlbmNlcyBhcyBzdHJpbmdbXVxuICAgICAgKVxuICAgICAgICAubWFwKChzKSA9PiB0aGlzLmVzY2FwZUh0bWwocykpXG4gICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgICBzdGF0dXNIdG1sICs9IGBcbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1pdGVtXCI+XG4gICAgICAgICAgPHN0cm9uZz5TZW50ZW5jZSBGaWx0ZXI6PC9zdHJvbmc+ICR7ZmlsdGVyQ291bnR9IHNlbnRlbmNlKHMpIGV4Y2x1ZGVkXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGF0dXMtaW5kaWNhdG9yIHN1Y2Nlc3NcIj5Db25maWd1cmVkPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0YXR1cy1kZXRhaWxzXCI+XG4gICAgICAgICAgPHN0cm9uZz5FeGNsdWRlZDo8L3N0cm9uZz4gJHtlc2NhcGVkRmlsdGVyc31cbiAgICAgICAgPC9kaXY+XG4gICAgICBgO1xuICAgIH1cblxuICAgIHN0YXR1c0Rpdi5pbm5lckhUTUwgPSBzdGF0dXNIdG1sO1xuICB9XG5cbiAgLy8g4pSA4pSAIFV0aWxpdHkgbWV0aG9kcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBidWlsZENvbXBsZXRlUGx1Z2luQ29uZmlnKGN1cnJlbnRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IGRlZmF1bHRzID0gdGhpcy5leHRyYWN0U2NoZW1hRGVmYXVsdHModGhpcy5wbHVnaW5TY2hlbWEpO1xuICAgIGNvbnN0IG1lcmdlZCA9IHRoaXMuZGVlcE1lcmdlKGRlZmF1bHRzIHx8IHt9LCBjdXJyZW50Q29uZmlnIHx8IHt9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShtZXJnZWQuY29ubmVjdGlvbnMpKSB7XG4gICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkU2VydmVyVHlwZSA9IHRoaXMubm9ybWFsaXplU2VydmVyVHlwZShtZXJnZWQuc2VydmVyVHlwZSk7XG4gICAgbWVyZ2VkLnNlcnZlclR5cGUgPSBub3JtYWxpemVkU2VydmVyVHlwZSB8fCBcImNsaWVudFwiO1xuICAgIHJldHVybiBtZXJnZWQ7XG4gIH1cblxuICBub3JtYWxpemVTZXJ2ZXJUeXBlKHZhbHVlOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IFwic2VydmVyXCIpIHtcbiAgICAgIHJldHVybiBcInNlcnZlclwiO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09IGZhbHNlIHx8IHZhbHVlID09PSBcImNsaWVudFwiKSB7XG4gICAgICByZXR1cm4gXCJjbGllbnRcIjtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGV4dHJhY3RTY2hlbWFEZWZhdWx0cyhcbiAgICBzY2hlbWFOb2RlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHwgbnVsbFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCFzY2hlbWFOb2RlIHx8IHR5cGVvZiBzY2hlbWFOb2RlICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IGlzT2JqZWN0Tm9kZSA9IHNjaGVtYU5vZGUudHlwZSA9PT0gXCJvYmplY3RcIiB8fCAhIXNjaGVtYU5vZGUucHJvcGVydGllcztcbiAgICBjb25zdCBtZXJnZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgbGV0IGhhc0RhdGEgPSBmYWxzZTtcblxuICAgIGlmIChpc09iamVjdE5vZGUgJiYgc2NoZW1hTm9kZS5kZWZhdWx0ICYmIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWFOb2RlLmRlZmF1bHQpKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgdGhpcy5kZWVwQ2xvbmUoc2NoZW1hTm9kZS5kZWZhdWx0KSk7XG4gICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hTm9kZS5wcm9wZXJ0aWVzICYmIHRoaXMuaXNQbGFpbk9iamVjdChzY2hlbWFOb2RlLnByb3BlcnRpZXMpKSB7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY2hlbWFOb2RlLnByb3BlcnRpZXMpKSB7XG4gICAgICAgIGNvbnN0IGNoaWxkRGVmYXVsdHMgPSB0aGlzLmV4dHJhY3RTY2hlbWFEZWZhdWx0cyh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgICAgICAgaWYgKGNoaWxkRGVmYXVsdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG1lcmdlZFtrZXldID0gY2hpbGREZWZhdWx0cztcbiAgICAgICAgICBoYXNEYXRhID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAmJiAodmFsdWUgYXMgUmVjb3JkPHN0cmluZywgYW55PikudHlwZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgIG1lcmdlZFtrZXldID0ge307XG4gICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgKHZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLnR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBtZXJnZWRba2V5XSA9IFwiXCI7XG4gICAgICAgICAgaGFzRGF0YSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoc2NoZW1hTm9kZS5kZXBlbmRlbmNpZXMgJiYgdGhpcy5pc1BsYWluT2JqZWN0KHNjaGVtYU5vZGUuZGVwZW5kZW5jaWVzKSkge1xuICAgICAgZm9yIChjb25zdCBkZXBlbmRlbmN5VmFsdWUgb2YgT2JqZWN0LnZhbHVlcyhzY2hlbWFOb2RlLmRlcGVuZGVuY2llcykpIHtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jeURlZmF1bHRzID0gdGhpcy5leHRyYWN0U2NoZW1hRGVmYXVsdHMoXG4gICAgICAgICAgZGVwZW5kZW5jeVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIGFueT5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKGRlcGVuZGVuY3lEZWZhdWx0cyAmJiB0aGlzLmlzUGxhaW5PYmplY3QoZGVwZW5kZW5jeURlZmF1bHRzKSkge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCB0aGlzLmRlZXBNZXJnZShtZXJnZWQsIGRlcGVuZGVuY3lEZWZhdWx0cykpO1xuICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBjb21wb3NpdGVLZXkgb2YgW1wib25lT2ZcIiwgXCJhbnlPZlwiLCBcImFsbE9mXCJdKSB7XG4gICAgICBjb25zdCBjb21wb3NpdGUgPSBzY2hlbWFOb2RlW2NvbXBvc2l0ZUtleV07XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29tcG9zaXRlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29tcG9zaXRlLmZvckVhY2goKGl0ZW06IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHtcbiAgICAgICAgY29uc3QgaXRlbURlZmF1bHRzID0gdGhpcy5leHRyYWN0U2NoZW1hRGVmYXVsdHMoaXRlbSk7XG4gICAgICAgIGlmIChpdGVtRGVmYXVsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzUGxhaW5PYmplY3QoaXRlbURlZmF1bHRzKSkge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCB0aGlzLmRlZXBNZXJnZShtZXJnZWQsIGl0ZW1EZWZhdWx0cykpO1xuICAgICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaGFzRGF0YSAmJiBzY2hlbWFOb2RlLmRlZmF1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGhhc0RhdGEgPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0RhdGEpIHtcbiAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgfVxuXG4gICAgaWYgKHNjaGVtYU5vZGUuZGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWVwQ2xvbmUoc2NoZW1hTm9kZS5kZWZhdWx0KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgfVxuXG4gIGRlZXBDbG9uZSh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlLm1hcCgoaXRlbSkgPT4gdGhpcy5kZWVwQ2xvbmUoaXRlbSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KHZhbHVlKSkge1xuICAgICAgY29uc3QgY2xvbmU6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkVmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHZhbHVlKSkge1xuICAgICAgICBjbG9uZVtrZXldID0gdGhpcy5kZWVwQ2xvbmUoY2hpbGRWYWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2xvbmU7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGRlZXBNZXJnZShiYXNlVmFsdWU6IHVua25vd24sIG92ZXJyaWRlVmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAob3ZlcnJpZGVWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWVwQ2xvbmUoYmFzZVZhbHVlKTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3ZlcnJpZGVWYWx1ZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLmRlZXBDbG9uZShvdmVycmlkZVZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1BsYWluT2JqZWN0KGJhc2VWYWx1ZSkgJiYgdGhpcy5pc1BsYWluT2JqZWN0KG92ZXJyaWRlVmFsdWUpKSB7XG4gICAgICBjb25zdCBtZXJnZWQgPSB0aGlzLmRlZXBDbG9uZShiYXNlVmFsdWUpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob3ZlcnJpZGVWYWx1ZSkpIHtcbiAgICAgICAgbWVyZ2VkW2tleV0gPSB0aGlzLmRlZXBNZXJnZSgoYmFzZVZhbHVlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldLCB2YWx1ZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWVyZ2VkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmRlZXBDbG9uZShvdmVycmlkZVZhbHVlKTtcbiAgfVxuXG4gIGZvcm1hdEJ5dGVzKGJ5dGVzOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIGlmICghYnl0ZXMgfHwgYnl0ZXMgPD0gMCkge1xuICAgICAgcmV0dXJuIFwiMCBCXCI7XG4gICAgfVxuICAgIGNvbnN0IGsgPSAxMDI0O1xuICAgIGNvbnN0IHNpemVzID0gW1wiQlwiLCBcIktCXCIsIFwiTUJcIiwgXCJHQlwiXTtcbiAgICBjb25zdCBpID0gTWF0aC5taW4oTWF0aC5mbG9vcihNYXRoLmxvZyhieXRlcykgLyBNYXRoLmxvZyhrKSksIHNpemVzLmxlbmd0aCAtIDEpO1xuICAgIHJldHVybiBwYXJzZUZsb2F0KChieXRlcyAvIE1hdGgucG93KGssIGkpKS50b0ZpeGVkKDIpKSArIFwiIFwiICsgc2l6ZXNbaV07XG4gIH1cblxuICBmb3JtYXRSYXRpb1BlcmNlbnQodmFsdWU6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUodmFsdWUpIHx8IHZhbHVlIDw9IDApIHtcbiAgICAgIHJldHVybiBcIjAuMCVcIjtcbiAgICB9XG4gICAgcmV0dXJuICh2YWx1ZSAqIDEwMCkudG9GaXhlZCgxKSArIFwiJVwiO1xuICB9XG5cbiAgZm9ybWF0VGltZXN0YW1wQWdlKHRpbWVzdGFtcDogbnVtYmVyKTogc3RyaW5nIHtcbiAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh0aW1lc3RhbXApIHx8IHRpbWVzdGFtcCA8PSAwKSB7XG4gICAgICByZXR1cm4gXCJOL0FcIjtcbiAgICB9XG4gICAgY29uc3QgYWdlTXMgPSBNYXRoLm1heCgwLCBEYXRlLm5vdygpIC0gdGltZXN0YW1wKTtcbiAgICBpZiAoYWdlTXMgPCAxMDAwKSB7XG4gICAgICByZXR1cm4gXCJqdXN0IG5vd1wiO1xuICAgIH1cbiAgICBpZiAoYWdlTXMgPCA2MDAwMCkge1xuICAgICAgcmV0dXJuIGAke01hdGguZmxvb3IoYWdlTXMgLyAxMDAwKX1zIGFnb2A7XG4gICAgfVxuICAgIGlmIChhZ2VNcyA8IDM2MDAwMDApIHtcbiAgICAgIHJldHVybiBgJHtNYXRoLmZsb29yKGFnZU1zIC8gNjAwMDApfW0gYWdvYDtcbiAgICB9XG4gICAgcmV0dXJuIGAke01hdGguZmxvb3IoYWdlTXMgLyAzNjAwMDAwKX1oIGFnb2A7XG4gIH1cblxuICBlc2NhcGVIdG1sKHRleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICBkaXYudGV4dENvbnRlbnQgPSB0ZXh0O1xuICAgIHJldHVybiBkaXYuaW5uZXJIVE1MO1xuICB9XG5cbiAgc2hvd05vdGlmaWNhdGlvbihtZXNzYWdlOiBzdHJpbmcsIHR5cGUgPSBcInN1Y2Nlc3NcIikge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwibm90aWZpY2F0aW9uXCIpO1xuICAgIGlmICghbm90aWZpY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLl9ub3RpZmljYXRpb25UaW1lcikge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX25vdGlmaWNhdGlvblRpbWVyKTtcbiAgICB9XG4gICAgbm90aWZpY2F0aW9uLnRleHRDb250ZW50ID0gbWVzc2FnZTtcbiAgICBub3RpZmljYXRpb24uY2xhc3NOYW1lID0gYG5vdGlmaWNhdGlvbiAke3R5cGV9IHNob3dgO1xuXG4gICAgdGhpcy5fbm90aWZpY2F0aW9uVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIG5vdGlmaWNhdGlvbi5jbGFzc0xpc3QucmVtb3ZlKFwic2hvd1wiKTtcbiAgICAgIHRoaXMuX25vdGlmaWNhdGlvblRpbWVyID0gbnVsbDtcbiAgICB9LCBOT1RJRklDQVRJT05fVElNRU9VVCk7XG4gIH1cbn1cblxuLy8gRXh0ZW5kIFdpbmRvdyBpbnRlcmZhY2UgZm9yIHRoZSBnbG9iYWwgY29uZmlnIGluc3RhbmNlXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIGRhdGFDb25uZWN0b3JDb25maWc6IERhdGFDb25uZWN0b3JDb25maWc7XG4gIH1cbn1cblxuLy8gSW5pdGlhbGl6ZSB3aGVuIERPTSBpcyBsb2FkZWRcbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsICgpID0+IHtcbiAgd2luZG93LmRhdGFDb25uZWN0b3JDb25maWcgPSBuZXcgRGF0YUNvbm5lY3RvckNvbmZpZygpO1xufSk7XG5cbi8vIENsZWFuIHVwIG1ldHJpY3MgcmVmcmVzaCBpbnRlcnZhbCB3aGVuIHBhZ2UgaXMgaGlkZGVuIG9yIHVubG9hZGVkXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidmlzaWJpbGl0eWNoYW5nZVwiLCAoKSA9PiB7XG4gIGlmICghd2luZG93LmRhdGFDb25uZWN0b3JDb25maWcpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoZG9jdW1lbnQuaGlkZGVuKSB7XG4gICAgaWYgKHdpbmRvdy5kYXRhQ29ubmVjdG9yQ29uZmlnLm1ldHJpY3NJbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh3aW5kb3cuZGF0YUNvbm5lY3RvckNvbmZpZy5tZXRyaWNzSW50ZXJ2YWwpO1xuICAgICAgd2luZG93LmRhdGFDb25uZWN0b3JDb25maWcubWV0cmljc0ludGVydmFsID0gbnVsbDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIXdpbmRvdy5kYXRhQ29ubmVjdG9yQ29uZmlnLm1ldHJpY3NJbnRlcnZhbCkge1xuICAgIHdpbmRvdy5kYXRhQ29ubmVjdG9yQ29uZmlnLmxvYWRNZXRyaWNzKCk7XG4gICAgd2luZG93LmRhdGFDb25uZWN0b3JDb25maWcuc3RhcnRNZXRyaWNzUmVmcmVzaCgpO1xuICB9XG59KTtcblxud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJiZWZvcmV1bmxvYWRcIiwgKCkgPT4ge1xuICBpZiAod2luZG93LmRhdGFDb25uZWN0b3JDb25maWcgJiYgd2luZG93LmRhdGFDb25uZWN0b3JDb25maWcubWV0cmljc0ludGVydmFsKSB7XG4gICAgY2xlYXJJbnRlcnZhbCh3aW5kb3cuZGF0YUNvbm5lY3RvckNvbmZpZy5tZXRyaWNzSW50ZXJ2YWwpO1xuICAgIHdpbmRvdy5kYXRhQ29ubmVjdG9yQ29uZmlnLm1ldHJpY3NJbnRlcnZhbCA9IG51bGw7XG4gIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBEYXRhQ29ubmVjdG9yQ29uZmlnO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/webapp/index.ts\n\n}");
120
+
121
+ /***/ },
122
+
123
+ /***/ "./src/webapp/utils/apiFetch.ts"
124
+ /*!**************************************!*\
125
+ !*** ./src/webapp/utils/apiFetch.ts ***!
126
+ \**************************************/
127
+ (__unused_webpack_module, __webpack_exports__, __webpack_require__) {
128
+
129
+ eval("{__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ MANAGEMENT_TOKEN_ERROR_MESSAGE: () => (/* binding */ MANAGEMENT_TOKEN_ERROR_MESSAGE),\n/* harmony export */ apiFetch: () => (/* binding */ apiFetch),\n/* harmony export */ getAuthToken: () => (/* binding */ getAuthToken),\n/* harmony export */ getTokenHelpText: () => (/* binding */ getTokenHelpText)\n/* harmony export */ });\n/// <reference lib=\"dom\" />\nconst MANAGEMENT_TOKEN_ERROR_MESSAGE = \"Management token required/invalid.\";\nconst DEFAULT_AUTH_CONFIG = {\n token: null,\n localStorageKey: \"signalkEdgeLinkManagementToken\",\n queryParam: \"edgeLinkToken\",\n // Default to false: query-parameter tokens leak into browser history, server\n // access logs, and Referer headers. Set includeTokenInQuery: true in\n // window.__EDGE_LINK_AUTH__ only when you explicitly need URL-based auth.\n includeTokenInQuery: false,\n headerMode: \"both\"\n};\nfunction readRuntimeAuthConfig() {\n if (typeof window === \"undefined\") {\n return DEFAULT_AUTH_CONFIG;\n }\n const runtime = window.__EDGE_LINK_AUTH__;\n if (!runtime || typeof runtime !== \"object\") {\n return DEFAULT_AUTH_CONFIG;\n }\n return { ...DEFAULT_AUTH_CONFIG, ...runtime };\n}\nfunction resolveToken(config) {\n if (config.token) {\n return String(config.token).trim();\n }\n if (typeof window === \"undefined\") {\n return \"\";\n }\n // SECURITY NOTE: Query parameter tokens can leak into browser history, server\n // access logs, and Referer headers. Prefer localStorage or\n // window.__EDGE_LINK_AUTH__.token for production deployments. Set\n // includeTokenInQuery: false in __EDGE_LINK_AUTH__ to disable this path.\n if (config.includeTokenInQuery && config.queryParam) {\n const tokenFromQuery = new URLSearchParams(window.location.search).get(config.queryParam);\n if (tokenFromQuery) {\n return tokenFromQuery.trim();\n }\n }\n if (config.localStorageKey && window.localStorage) {\n const tokenFromStorage = window.localStorage.getItem(config.localStorageKey);\n if (tokenFromStorage) {\n return tokenFromStorage.trim();\n }\n }\n return \"\";\n}\nfunction attachAuthHeaders(headers, token, headerMode) {\n if (!token) {\n return headers;\n }\n const normalizedMode = (headerMode || \"both\").toLowerCase();\n if (normalizedMode === \"x-edge-link-token\" ||\n normalizedMode === \"token\" ||\n normalizedMode === \"both\") {\n headers.set(\"X-Edge-Link-Token\", token);\n }\n if (normalizedMode === \"authorization\" ||\n normalizedMode === \"bearer\" ||\n normalizedMode === \"both\") {\n headers.set(\"Authorization\", `Bearer ${token}`);\n }\n return headers;\n}\nfunction getAuthToken() {\n const config = readRuntimeAuthConfig();\n return resolveToken(config);\n}\nfunction getTokenHelpText() {\n const config = readRuntimeAuthConfig();\n const modeText = config.headerMode && String(config.headerMode).toLowerCase() === \"authorization\"\n ? \"Authorization: Bearer <token>\"\n : config.headerMode && String(config.headerMode).toLowerCase() === \"x-edge-link-token\"\n ? \"X-Edge-Link-Token\"\n : \"X-Edge-Link-Token and Authorization: Bearer <token>\";\n return `The server-side token is configured in plugin settings (managementApiToken) or via the SIGNALK_EDGE_LINK_MANAGEMENT_TOKEN environment variable. To authenticate from the browser, provide the token using window.__EDGE_LINK_AUTH__.token, query parameter \"${config.queryParam}\", or localStorage key \"${config.localStorageKey}\". Requests send ${modeText} when a token is available.`;\n}\nfunction apiFetch(input, init = {}) {\n const config = readRuntimeAuthConfig();\n const token = resolveToken(config);\n const headers = new Headers(init.headers || {});\n attachAuthHeaders(headers, token, config.headerMode);\n return fetch(input, {\n ...init,\n headers\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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IjpbIndlYnBhY2s6Ly9zaWduYWxrLWVkZ2UtbGluay8uL3NyYy93ZWJhcHAvdXRpbHMvYXBpRmV0Y2gudHM/NTM2YSJdLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBsaWI9XCJkb21cIiAvPlxyXG5cclxuZXhwb3J0IGNvbnN0IE1BTkFHRU1FTlRfVE9LRU5fRVJST1JfTUVTU0FHRSA9IFwiTWFuYWdlbWVudCB0b2tlbiByZXF1aXJlZC9pbnZhbGlkLlwiO1xyXG5cclxuaW50ZXJmYWNlIEF1dGhDb25maWcge1xyXG4gIHRva2VuOiBzdHJpbmcgfCBudWxsO1xyXG4gIGxvY2FsU3RvcmFnZUtleTogc3RyaW5nO1xyXG4gIHF1ZXJ5UGFyYW06IHN0cmluZztcclxuICBpbmNsdWRlVG9rZW5JblF1ZXJ5OiBib29sZWFuO1xyXG4gIGhlYWRlck1vZGU6IHN0cmluZztcclxufVxyXG5cclxuZGVjbGFyZSBnbG9iYWwge1xyXG4gIGludGVyZmFjZSBXaW5kb3cge1xyXG4gICAgX19FREdFX0xJTktfQVVUSF9fPzogUGFydGlhbDxBdXRoQ29uZmlnPjtcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IERFRkFVTFRfQVVUSF9DT05GSUc6IEF1dGhDb25maWcgPSB7XHJcbiAgdG9rZW46IG51bGwsXHJcbiAgbG9jYWxTdG9yYWdlS2V5OiBcInNpZ25hbGtFZGdlTGlua01hbmFnZW1lbnRUb2tlblwiLFxyXG4gIHF1ZXJ5UGFyYW06IFwiZWRnZUxpbmtUb2tlblwiLFxyXG4gIC8vIERlZmF1bHQgdG8gZmFsc2U6IHF1ZXJ5LXBhcmFtZXRlciB0b2tlbnMgbGVhayBpbnRvIGJyb3dzZXIgaGlzdG9yeSwgc2VydmVyXHJcbiAgLy8gYWNjZXNzIGxvZ3MsIGFuZCBSZWZlcmVyIGhlYWRlcnMuIFNldCBpbmNsdWRlVG9rZW5JblF1ZXJ5OiB0cnVlIGluXHJcbiAgLy8gd2luZG93Ll9fRURHRV9MSU5LX0FVVEhfXyBvbmx5IHdoZW4geW91IGV4cGxpY2l0bHkgbmVlZCBVUkwtYmFzZWQgYXV0aC5cclxuICBpbmNsdWRlVG9rZW5JblF1ZXJ5OiBmYWxzZSxcclxuICBoZWFkZXJNb2RlOiBcImJvdGhcIlxyXG59O1xyXG5cclxuZnVuY3Rpb24gcmVhZFJ1bnRpbWVBdXRoQ29uZmlnKCk6IEF1dGhDb25maWcge1xyXG4gIGlmICh0eXBlb2Ygd2luZG93ID09PSBcInVuZGVmaW5lZFwiKSB7XHJcbiAgICByZXR1cm4gREVGQVVMVF9BVVRIX0NPTkZJRztcclxuICB9XHJcblxyXG4gIGNvbnN0IHJ1bnRpbWUgPSB3aW5kb3cuX19FREdFX0xJTktfQVVUSF9fO1xyXG4gIGlmICghcnVudGltZSB8fCB0eXBlb2YgcnVudGltZSAhPT0gXCJvYmplY3RcIikge1xyXG4gICAgcmV0dXJuIERFRkFVTFRfQVVUSF9DT05GSUc7XHJcbiAgfVxyXG5cclxuICByZXR1cm4geyAuLi5ERUZBVUxUX0FVVEhfQ09ORklHLCAuLi5ydW50aW1lIH07XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHJlc29sdmVUb2tlbihjb25maWc6IEF1dGhDb25maWcpOiBzdHJpbmcge1xyXG4gIGlmIChjb25maWcudG9rZW4pIHtcclxuICAgIHJldHVybiBTdHJpbmcoY29uZmlnLnRva2VuKS50cmltKCk7XHJcbiAgfVxyXG5cclxuICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgcmV0dXJuIFwiXCI7XHJcbiAgfVxyXG5cclxuICAvLyBTRUNVUklUWSBOT1RFOiBRdWVyeSBwYXJhbWV0ZXIgdG9rZW5zIGNhbiBsZWFrIGludG8gYnJvd3NlciBoaXN0b3J5LCBzZXJ2ZXJcclxuICAvLyBhY2Nlc3MgbG9ncywgYW5kIFJlZmVyZXIgaGVhZGVycy4gIFByZWZlciBsb2NhbFN0b3JhZ2Ugb3JcclxuICAvLyB3aW5kb3cuX19FREdFX0xJTktfQVVUSF9fLnRva2VuIGZvciBwcm9kdWN0aW9uIGRlcGxveW1lbnRzLiAgU2V0XHJcbiAgLy8gaW5jbHVkZVRva2VuSW5RdWVyeTogZmFsc2UgaW4gX19FREdFX0xJTktfQVVUSF9fIHRvIGRpc2FibGUgdGhpcyBwYXRoLlxyXG4gIGlmIChjb25maWcuaW5jbHVkZVRva2VuSW5RdWVyeSAmJiBjb25maWcucXVlcnlQYXJhbSkge1xyXG4gICAgY29uc3QgdG9rZW5Gcm9tUXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldChjb25maWcucXVlcnlQYXJhbSk7XHJcbiAgICBpZiAodG9rZW5Gcm9tUXVlcnkpIHtcclxuICAgICAgcmV0dXJuIHRva2VuRnJvbVF1ZXJ5LnRyaW0oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlmIChjb25maWcubG9jYWxTdG9yYWdlS2V5ICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2UpIHtcclxuICAgIGNvbnN0IHRva2VuRnJvbVN0b3JhZ2UgPSB3aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oY29uZmlnLmxvY2FsU3RvcmFnZUtleSk7XHJcbiAgICBpZiAodG9rZW5Gcm9tU3RvcmFnZSkge1xyXG4gICAgICByZXR1cm4gdG9rZW5Gcm9tU3RvcmFnZS50cmltKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZXR1cm4gXCJcIjtcclxufVxyXG5cclxuZnVuY3Rpb24gYXR0YWNoQXV0aEhlYWRlcnMoaGVhZGVyczogSGVhZGVycywgdG9rZW46IHN0cmluZywgaGVhZGVyTW9kZTogc3RyaW5nKTogSGVhZGVycyB7XHJcbiAgaWYgKCF0b2tlbikge1xyXG4gICAgcmV0dXJuIGhlYWRlcnM7XHJcbiAgfVxyXG5cclxuICBjb25zdCBub3JtYWxpemVkTW9kZSA9IChoZWFkZXJNb2RlIHx8IFwiYm90aFwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gIGlmIChcclxuICAgIG5vcm1hbGl6ZWRNb2RlID09PSBcIngtZWRnZS1saW5rLXRva2VuXCIgfHxcclxuICAgIG5vcm1hbGl6ZWRNb2RlID09PSBcInRva2VuXCIgfHxcclxuICAgIG5vcm1hbGl6ZWRNb2RlID09PSBcImJvdGhcIlxyXG4gICkge1xyXG4gICAgaGVhZGVycy5zZXQoXCJYLUVkZ2UtTGluay1Ub2tlblwiLCB0b2tlbik7XHJcbiAgfVxyXG4gIGlmIChcclxuICAgIG5vcm1hbGl6ZWRNb2RlID09PSBcImF1dGhvcml6YXRpb25cIiB8fFxyXG4gICAgbm9ybWFsaXplZE1vZGUgPT09IFwiYmVhcmVyXCIgfHxcclxuICAgIG5vcm1hbGl6ZWRNb2RlID09PSBcImJvdGhcIlxyXG4gICkge1xyXG4gICAgaGVhZGVycy5zZXQoXCJBdXRob3JpemF0aW9uXCIsIGBCZWFyZXIgJHt0b2tlbn1gKTtcclxuICB9XHJcbiAgcmV0dXJuIGhlYWRlcnM7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRBdXRoVG9rZW4oKTogc3RyaW5nIHtcclxuICBjb25zdCBjb25maWcgPSByZWFkUnVudGltZUF1dGhDb25maWcoKTtcclxuICByZXR1cm4gcmVzb2x2ZVRva2VuKGNvbmZpZyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRUb2tlbkhlbHBUZXh0KCk6IHN0cmluZyB7XHJcbiAgY29uc3QgY29uZmlnID0gcmVhZFJ1bnRpbWVBdXRoQ29uZmlnKCk7XHJcbiAgY29uc3QgbW9kZVRleHQgPVxyXG4gICAgY29uZmlnLmhlYWRlck1vZGUgJiYgU3RyaW5nKGNvbmZpZy5oZWFkZXJNb2RlKS50b0xvd2VyQ2FzZSgpID09PSBcImF1dGhvcml6YXRpb25cIlxyXG4gICAgICA/IFwiQXV0aG9yaXphdGlvbjogQmVhcmVyIDx0b2tlbj5cIlxyXG4gICAgICA6IGNvbmZpZy5oZWFkZXJNb2RlICYmIFN0cmluZyhjb25maWcuaGVhZGVyTW9kZSkudG9Mb3dlckNhc2UoKSA9PT0gXCJ4LWVkZ2UtbGluay10b2tlblwiXHJcbiAgICAgICAgPyBcIlgtRWRnZS1MaW5rLVRva2VuXCJcclxuICAgICAgICA6IFwiWC1FZGdlLUxpbmstVG9rZW4gYW5kIEF1dGhvcml6YXRpb246IEJlYXJlciA8dG9rZW4+XCI7XHJcblxyXG4gIHJldHVybiBgVGhlIHNlcnZlci1zaWRlIHRva2VuIGlzIGNvbmZpZ3VyZWQgaW4gcGx1Z2luIHNldHRpbmdzIChtYW5hZ2VtZW50QXBpVG9rZW4pIG9yIHZpYSB0aGUgU0lHTkFMS19FREdFX0xJTktfTUFOQUdFTUVOVF9UT0tFTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gVG8gYXV0aGVudGljYXRlIGZyb20gdGhlIGJyb3dzZXIsIHByb3ZpZGUgdGhlIHRva2VuIHVzaW5nIHdpbmRvdy5fX0VER0VfTElOS19BVVRIX18udG9rZW4sIHF1ZXJ5IHBhcmFtZXRlciBcIiR7Y29uZmlnLnF1ZXJ5UGFyYW19XCIsIG9yIGxvY2FsU3RvcmFnZSBrZXkgXCIke2NvbmZpZy5sb2NhbFN0b3JhZ2VLZXl9XCIuIFJlcXVlc3RzIHNlbmQgJHttb2RlVGV4dH0gd2hlbiBhIHRva2VuIGlzIGF2YWlsYWJsZS5gO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYXBpRmV0Y2goaW5wdXQ6IHN0cmluZyB8IFJlcXVlc3QsIGluaXQ6IFJlcXVlc3RJbml0ID0ge30pOiBQcm9taXNlPFJlc3BvbnNlPiB7XHJcbiAgY29uc3QgY29uZmlnID0gcmVhZFJ1bnRpbWVBdXRoQ29uZmlnKCk7XHJcbiAgY29uc3QgdG9rZW4gPSByZXNvbHZlVG9rZW4oY29uZmlnKTtcclxuICBjb25zdCBoZWFkZXJzID0gbmV3IEhlYWRlcnMoaW5pdC5oZWFkZXJzIHx8IHt9KTtcclxuICBhdHRhY2hBdXRoSGVhZGVycyhoZWFkZXJzLCB0b2tlbiwgY29uZmlnLmhlYWRlck1vZGUpO1xyXG5cclxuICByZXR1cm4gZmV0Y2goaW5wdXQsIHtcclxuICAgIC4uLmluaXQsXHJcbiAgICBoZWFkZXJzXHJcbiAgfSk7XHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/webapp/utils/apiFetch.ts\n\n}");
130
+
131
+ /***/ }
132
+
133
+ /******/ });
134
+ /************************************************************************/
135
+ /******/ // The module cache
136
+ /******/ var __webpack_module_cache__ = {};
137
+ /******/
138
+ /******/ // The require function
139
+ /******/ function __webpack_require__(moduleId) {
140
+ /******/ // Check if module is in cache
141
+ /******/ var cachedModule = __webpack_module_cache__[moduleId];
142
+ /******/ if (cachedModule !== undefined) {
143
+ /******/ return cachedModule.exports;
144
+ /******/ }
145
+ /******/ // Create a new module (and put it into the cache)
146
+ /******/ var module = __webpack_module_cache__[moduleId] = {
147
+ /******/ id: moduleId,
148
+ /******/ // no module.loaded needed
149
+ /******/ exports: {}
150
+ /******/ };
151
+ /******/
152
+ /******/ // Execute the module function
153
+ /******/ if (!(moduleId in __webpack_modules__)) {
154
+ /******/ delete __webpack_module_cache__[moduleId];
155
+ /******/ var e = new Error("Cannot find module '" + moduleId + "'");
156
+ /******/ e.code = 'MODULE_NOT_FOUND';
157
+ /******/ throw e;
158
+ /******/ }
159
+ /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
160
+ /******/
161
+ /******/ // Return the exports of the module
162
+ /******/ return module.exports;
163
+ /******/ }
164
+ /******/
165
+ /******/ // expose the modules object (__webpack_modules__)
166
+ /******/ __webpack_require__.m = __webpack_modules__;
167
+ /******/
168
+ /******/ // expose the module cache
169
+ /******/ __webpack_require__.c = __webpack_module_cache__;
170
+ /******/
171
+ /************************************************************************/
172
+ /******/ /* webpack/runtime/compat get default export */
173
+ /******/ (() => {
174
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
175
+ /******/ __webpack_require__.n = (module) => {
176
+ /******/ var getter = module && module.__esModule ?
177
+ /******/ () => (module['default']) :
178
+ /******/ () => (module);
179
+ /******/ __webpack_require__.d(getter, { a: getter });
180
+ /******/ return getter;
181
+ /******/ };
182
+ /******/ })();
183
+ /******/
184
+ /******/ /* webpack/runtime/define property getters */
185
+ /******/ (() => {
186
+ /******/ // define getter functions for harmony exports
187
+ /******/ __webpack_require__.d = (exports, definition) => {
188
+ /******/ for(var key in definition) {
189
+ /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
190
+ /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
191
+ /******/ }
192
+ /******/ }
193
+ /******/ };
194
+ /******/ })();
195
+ /******/
196
+ /******/ /* webpack/runtime/ensure chunk */
197
+ /******/ (() => {
198
+ /******/ __webpack_require__.f = {};
199
+ /******/ // This file contains only the entry chunk.
200
+ /******/ // The chunk loading function for additional chunks
201
+ /******/ __webpack_require__.e = (chunkId) => {
202
+ /******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
203
+ /******/ __webpack_require__.f[key](chunkId, promises);
204
+ /******/ return promises;
205
+ /******/ }, []));
206
+ /******/ };
207
+ /******/ })();
208
+ /******/
209
+ /******/ /* webpack/runtime/get javascript chunk filename */
210
+ /******/ (() => {
211
+ /******/ // This function allow to reference async chunks
212
+ /******/ __webpack_require__.u = (chunkId) => {
213
+ /******/ // return url for filenames based on template
214
+ /******/ return "" + chunkId + ".js";
215
+ /******/ };
216
+ /******/ })();
217
+ /******/
218
+ /******/ /* webpack/runtime/global */
219
+ /******/ (() => {
220
+ /******/ __webpack_require__.g = (function() {
221
+ /******/ if (typeof globalThis === 'object') return globalThis;
222
+ /******/ try {
223
+ /******/ return this || new Function('return this')();
224
+ /******/ } catch (e) {
225
+ /******/ if (typeof window === 'object') return window;
226
+ /******/ }
227
+ /******/ })();
228
+ /******/ })();
229
+ /******/
230
+ /******/ /* webpack/runtime/hasOwnProperty shorthand */
231
+ /******/ (() => {
232
+ /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
233
+ /******/ })();
234
+ /******/
235
+ /******/ /* webpack/runtime/load script */
236
+ /******/ (() => {
237
+ /******/ var inProgress = {};
238
+ /******/ var dataWebpackPrefix = "signalk-edge-link:";
239
+ /******/ // loadScript function to load a script via script tag
240
+ /******/ __webpack_require__.l = (url, done, key, chunkId) => {
241
+ /******/ if(inProgress[url]) { inProgress[url].push(done); return; }
242
+ /******/ var script, needAttach;
243
+ /******/ if(key !== undefined) {
244
+ /******/ var scripts = document.getElementsByTagName("script");
245
+ /******/ for(var i = 0; i < scripts.length; i++) {
246
+ /******/ var s = scripts[i];
247
+ /******/ if(s.getAttribute("src") == url || s.getAttribute("data-webpack") == dataWebpackPrefix + key) { script = s; break; }
248
+ /******/ }
249
+ /******/ }
250
+ /******/ if(!script) {
251
+ /******/ needAttach = true;
252
+ /******/ script = document.createElement('script');
253
+ /******/
254
+ /******/ script.charset = 'utf-8';
255
+ /******/ if (__webpack_require__.nc) {
256
+ /******/ script.setAttribute("nonce", __webpack_require__.nc);
257
+ /******/ }
258
+ /******/ script.setAttribute("data-webpack", dataWebpackPrefix + key);
259
+ /******/
260
+ /******/ script.src = url;
261
+ /******/ }
262
+ /******/ inProgress[url] = [done];
263
+ /******/ var onScriptComplete = (prev, event) => {
264
+ /******/ // avoid mem leaks in IE.
265
+ /******/ script.onerror = script.onload = null;
266
+ /******/ clearTimeout(timeout);
267
+ /******/ var doneFns = inProgress[url];
268
+ /******/ delete inProgress[url];
269
+ /******/ script.parentNode && script.parentNode.removeChild(script);
270
+ /******/ doneFns && doneFns.forEach((fn) => (fn(event)));
271
+ /******/ if(prev) return prev(event);
272
+ /******/ }
273
+ /******/ var timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);
274
+ /******/ script.onerror = onScriptComplete.bind(null, script.onerror);
275
+ /******/ script.onload = onScriptComplete.bind(null, script.onload);
276
+ /******/ needAttach && document.head.appendChild(script);
277
+ /******/ };
278
+ /******/ })();
279
+ /******/
280
+ /******/ /* webpack/runtime/make namespace object */
281
+ /******/ (() => {
282
+ /******/ // define __esModule on exports
283
+ /******/ __webpack_require__.r = (exports) => {
284
+ /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
285
+ /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
286
+ /******/ }
287
+ /******/ Object.defineProperty(exports, '__esModule', { value: true });
288
+ /******/ };
289
+ /******/ })();
290
+ /******/
291
+ /******/ /* webpack/runtime/sharing */
292
+ /******/ (() => {
293
+ /******/ __webpack_require__.S = {};
294
+ /******/ var initPromises = {};
295
+ /******/ var initTokens = {};
296
+ /******/ __webpack_require__.I = (name, initScope) => {
297
+ /******/ if(!initScope) initScope = [];
298
+ /******/ // handling circular init calls
299
+ /******/ var initToken = initTokens[name];
300
+ /******/ if(!initToken) initToken = initTokens[name] = {};
301
+ /******/ if(initScope.indexOf(initToken) >= 0) return;
302
+ /******/ initScope.push(initToken);
303
+ /******/ // only runs once
304
+ /******/ if(initPromises[name]) return initPromises[name];
305
+ /******/ // creates a new share scope if needed
306
+ /******/ if(!__webpack_require__.o(__webpack_require__.S, name)) __webpack_require__.S[name] = {};
307
+ /******/ // runs all init snippets from all modules reachable
308
+ /******/ var scope = __webpack_require__.S[name];
309
+ /******/ var warn = (msg) => {
310
+ /******/ if (typeof console !== "undefined" && console.warn) console.warn(msg);
311
+ /******/ };
312
+ /******/ var uniqueName = "signalk-edge-link";
313
+ /******/ var register = (name, version, factory, eager) => {
314
+ /******/ var versions = scope[name] = scope[name] || {};
315
+ /******/ var activeVersion = versions[version];
316
+ /******/ if(!activeVersion || (!activeVersion.loaded && (!eager != !activeVersion.eager ? eager : uniqueName > activeVersion.from))) versions[version] = { get: factory, from: uniqueName, eager: !!eager };
317
+ /******/ };
318
+ /******/ var initExternal = (id) => {
319
+ /******/ var handleError = (err) => (warn("Initialization of sharing external failed: " + err));
320
+ /******/ try {
321
+ /******/ var module = __webpack_require__(id);
322
+ /******/ if(!module) return;
323
+ /******/ var initFn = (module) => (module && module.init && module.init(__webpack_require__.S[name], initScope))
324
+ /******/ if(module.then) return promises.push(module.then(initFn, handleError));
325
+ /******/ var initResult = initFn(module);
326
+ /******/ if(initResult && initResult.then) return promises.push(initResult['catch'](handleError));
327
+ /******/ } catch(err) { handleError(err); }
328
+ /******/ }
329
+ /******/ var promises = [];
330
+ /******/ switch(name) {
331
+ /******/ case "default": {
332
+ /******/ register("react", "16.14.0", () => (__webpack_require__.e("vendors-node_modules_react_index_js").then(() => (() => (__webpack_require__(/*! ./node_modules/react/index.js */ "./node_modules/react/index.js"))))));
333
+ /******/ }
334
+ /******/ break;
335
+ /******/ }
336
+ /******/ if(!promises.length) return initPromises[name] = 1;
337
+ /******/ return initPromises[name] = Promise.all(promises).then(() => (initPromises[name] = 1));
338
+ /******/ };
339
+ /******/ })();
340
+ /******/
341
+ /******/ /* webpack/runtime/publicPath */
342
+ /******/ (() => {
343
+ /******/ var scriptUrl;
344
+ /******/ if (__webpack_require__.g.importScripts) scriptUrl = __webpack_require__.g.location + "";
345
+ /******/ var document = __webpack_require__.g.document;
346
+ /******/ if (!scriptUrl && document) {
347
+ /******/ if (document.currentScript && document.currentScript.tagName.toUpperCase() === 'SCRIPT')
348
+ /******/ scriptUrl = document.currentScript.src;
349
+ /******/ if (!scriptUrl) {
350
+ /******/ var scripts = document.getElementsByTagName("script");
351
+ /******/ if(scripts.length) {
352
+ /******/ var i = scripts.length - 1;
353
+ /******/ while (i > -1 && (!scriptUrl || !/^http(s?):/.test(scriptUrl))) scriptUrl = scripts[i--].src;
354
+ /******/ }
355
+ /******/ }
356
+ /******/ }
357
+ /******/ // When supporting browsers where an automatic publicPath is not supported you must specify an output.publicPath manually via configuration
358
+ /******/ // or pass an empty string ("") and set the __webpack_public_path__ variable from your code to use your own logic.
359
+ /******/ if (!scriptUrl) throw new Error("Automatic publicPath is not supported in this browser");
360
+ /******/ scriptUrl = scriptUrl.replace(/^blob:/, "").replace(/#.*$/, "").replace(/\?.*$/, "").replace(/\/[^\/]+$/, "/");
361
+ /******/ __webpack_require__.p = scriptUrl;
362
+ /******/ })();
363
+ /******/
364
+ /******/ /* webpack/runtime/jsonp chunk loading */
365
+ /******/ (() => {
366
+ /******/ // no baseURI
367
+ /******/
368
+ /******/ // object to store loaded and loading chunks
369
+ /******/ // undefined = chunk not loaded, null = chunk preloaded/prefetched
370
+ /******/ // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded
371
+ /******/ var installedChunks = {
372
+ /******/ "main": 0
373
+ /******/ };
374
+ /******/
375
+ /******/ __webpack_require__.f.j = (chunkId, promises) => {
376
+ /******/ // JSONP chunk loading for javascript
377
+ /******/ var installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;
378
+ /******/ if(installedChunkData !== 0) { // 0 means "already installed".
379
+ /******/
380
+ /******/ // a Promise means "currently loading".
381
+ /******/ if(installedChunkData) {
382
+ /******/ promises.push(installedChunkData[2]);
383
+ /******/ } else {
384
+ /******/ if(true) { // all chunks have JS
385
+ /******/ // setup Promise in chunk cache
386
+ /******/ var promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));
387
+ /******/ promises.push(installedChunkData[2] = promise);
388
+ /******/
389
+ /******/ // start chunk loading
390
+ /******/ var url = __webpack_require__.p + __webpack_require__.u(chunkId);
391
+ /******/ // create error before stack unwound to get useful stacktrace later
392
+ /******/ var error = new Error();
393
+ /******/ var loadingEnded = (event) => {
394
+ /******/ if(__webpack_require__.o(installedChunks, chunkId)) {
395
+ /******/ installedChunkData = installedChunks[chunkId];
396
+ /******/ if(installedChunkData !== 0) installedChunks[chunkId] = undefined;
397
+ /******/ if(installedChunkData) {
398
+ /******/ var errorType = event && (event.type === 'load' ? 'missing' : event.type);
399
+ /******/ var realSrc = event && event.target && event.target.src;
400
+ /******/ error.message = 'Loading chunk ' + chunkId + ' failed.\n(' + errorType + ': ' + realSrc + ')';
401
+ /******/ error.name = 'ChunkLoadError';
402
+ /******/ error.type = errorType;
403
+ /******/ error.request = realSrc;
404
+ /******/ installedChunkData[1](error);
405
+ /******/ }
406
+ /******/ }
407
+ /******/ };
408
+ /******/ __webpack_require__.l(url, loadingEnded, "chunk-" + chunkId, chunkId);
409
+ /******/ }
410
+ /******/ }
411
+ /******/ }
412
+ /******/ };
413
+ /******/
414
+ /******/ // no prefetching
415
+ /******/
416
+ /******/ // no preloaded
417
+ /******/
418
+ /******/ // no HMR
419
+ /******/
420
+ /******/ // no HMR manifest
421
+ /******/
422
+ /******/ // no on chunks loaded
423
+ /******/
424
+ /******/ // install a JSONP callback for chunk loading
425
+ /******/ var webpackJsonpCallback = (parentChunkLoadingFunction, data) => {
426
+ /******/ var [chunkIds, moreModules, runtime] = data;
427
+ /******/ // add "moreModules" to the modules object,
428
+ /******/ // then flag all "chunkIds" as loaded and fire callback
429
+ /******/ var moduleId, chunkId, i = 0;
430
+ /******/ if(chunkIds.some((id) => (installedChunks[id] !== 0))) {
431
+ /******/ for(moduleId in moreModules) {
432
+ /******/ if(__webpack_require__.o(moreModules, moduleId)) {
433
+ /******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
434
+ /******/ }
435
+ /******/ }
436
+ /******/ if(runtime) var result = runtime(__webpack_require__);
437
+ /******/ }
438
+ /******/ if(parentChunkLoadingFunction) parentChunkLoadingFunction(data);
439
+ /******/ for(;i < chunkIds.length; i++) {
440
+ /******/ chunkId = chunkIds[i];
441
+ /******/ if(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {
442
+ /******/ installedChunks[chunkId][0]();
443
+ /******/ }
444
+ /******/ installedChunks[chunkId] = 0;
445
+ /******/ }
446
+ /******/
447
+ /******/ }
448
+ /******/
449
+ /******/ var chunkLoadingGlobal = self["webpackChunksignalk_edge_link"] = self["webpackChunksignalk_edge_link"] || [];
450
+ /******/ chunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));
451
+ /******/ chunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));
452
+ /******/ })();
453
+ /******/
454
+ /******/ /* webpack/runtime/nonce */
455
+ /******/ (() => {
456
+ /******/ __webpack_require__.nc = undefined;
457
+ /******/ })();
458
+ /******/
459
+ /************************************************************************/
460
+ /******/
461
+ /******/ // module cache are used so entry inlining is disabled
462
+ /******/ // startup
463
+ /******/ // Load entry module and return exports
464
+ /******/ var __webpack_exports__ = __webpack_require__("./src/webapp/index.ts");
465
+ /******/
466
+ /******/ })()
467
+ ;