raain-app 1.5.33 → 1.5.35

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/CHANGELOG.md CHANGED
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ### Fixed
11
+
12
+ - RAD-136: RefreshManager build current Frameset
13
+
14
+ ## [1.5.34] - 2025-08-05
15
+
10
16
  ### Changed
11
17
 
12
18
  - rainComputationMapOriginalMin and Max added
@@ -340,10 +340,10 @@ export class RaainDetailsComponent {
340
340
  }
341
341
  }
342
342
  RaainDetailsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RaainDetailsComponent, deps: [{ token: i1.Storage }], target: i0.ɵɵFactoryTarget.Component });
343
- RaainDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RaainDetailsComponent, selector: "raain-details", inputs: { toggleAdmin: "toggleAdmin", rainNode: "rainNode", compareManager: "compareManager", refreshManager: "refreshManager", profileService: "profileService", radarService: "radarService", toggleCumulative: "toggleCumulative" }, usesOnChanges: true, ngImport: i0, template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSelect, selector: "ion-select", inputs: ["cancelText", "compareWith", "disabled", "interface", "interfaceOptions", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "value"] }, { kind: "component", type: i4.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i4.IonToggle, selector: "ion-toggle", inputs: ["checked", "color", "disabled", "enableOnOffLabels", "mode", "name", "value"] }, { kind: "directive", type: i4.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i4.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i5.RaainMapComponent, selector: "raain-map", inputs: ["coordinates", "markers", "timeframeContainers", "autoplay", "showMarkers", "showCumulative", "currentHeight", "timeframeDates", "defaultDate", "sumValues", "sumFn"], outputs: ["selectedMarker", "changedDate", "changedSum"] }, { kind: "component", type: i6.RaainCompareStackComponent, selector: "raain-compare-stack", inputs: ["compareManager", "currentHeight", "cumulative"], outputs: ["selectedPoint"] }, { kind: "component", type: i7.RaainDateFocusComponent, selector: "raain-date-focus", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight"] }, { kind: "component", type: i8.RaainDateDynamicComponent, selector: "raain-date-dynamic", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight", "fetchData"], outputs: ["changedDate"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
343
+ RaainDetailsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: RaainDetailsComponent, selector: "raain-details", inputs: { toggleAdmin: "toggleAdmin", rainNode: "rainNode", compareManager: "compareManager", refreshManager: "refreshManager", profileService: "profileService", radarService: "radarService", toggleCumulative: "toggleCumulative" }, usesOnChanges: true, ngImport: i0, template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: i4.IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: i4.IonCardContent, selector: "ion-card-content", inputs: ["mode"] }, { kind: "component", type: i4.IonCardHeader, selector: "ion-card-header", inputs: ["color", "mode", "translucent"] }, { kind: "component", type: i4.IonCardTitle, selector: "ion-card-title", inputs: ["color", "mode"] }, { kind: "component", type: i4.IonCol, selector: "ion-col", inputs: ["offset", "offsetLg", "offsetMd", "offsetSm", "offsetXl", "offsetXs", "pull", "pullLg", "pullMd", "pullSm", "pullXl", "pullXs", "push", "pushLg", "pushMd", "pushSm", "pushXl", "pushXs", "size", "sizeLg", "sizeMd", "sizeSm", "sizeXl", "sizeXs"] }, { kind: "component", type: i4.IonGrid, selector: "ion-grid", inputs: ["fixed"] }, { kind: "component", type: i4.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: i4.IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: i4.IonProgressBar, selector: "ion-progress-bar", inputs: ["buffer", "color", "mode", "reversed", "type", "value"] }, { kind: "component", type: i4.IonRow, selector: "ion-row" }, { kind: "component", type: i4.IonSelect, selector: "ion-select", inputs: ["cancelText", "compareWith", "disabled", "interface", "interfaceOptions", "mode", "multiple", "name", "okText", "placeholder", "selectedText", "value"] }, { kind: "component", type: i4.IonSelectOption, selector: "ion-select-option", inputs: ["disabled", "value"] }, { kind: "component", type: i4.IonToggle, selector: "ion-toggle", inputs: ["checked", "color", "disabled", "enableOnOffLabels", "mode", "name", "value"] }, { kind: "directive", type: i4.BooleanValueAccessor, selector: "ion-checkbox,ion-toggle" }, { kind: "directive", type: i4.SelectValueAccessor, selector: "ion-range, ion-select, ion-radio-group, ion-segment, ion-datetime" }, { kind: "component", type: i5.RaainMapComponent, selector: "raain-map", inputs: ["coordinates", "markers", "timeframeContainers", "autoplay", "showMarkers", "showCumulative", "currentHeight", "timeframeDates", "defaultDate", "sumValues", "sumFn"], outputs: ["selectedMarker", "changedDate", "changedSum"] }, { kind: "component", type: i6.RaainCompareStackComponent, selector: "raain-compare-stack", inputs: ["compareManager", "currentHeight", "cumulative"], outputs: ["selectedPoint"] }, { kind: "component", type: i7.RaainDateFocusComponent, selector: "raain-date-focus", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight"] }, { kind: "component", type: i8.RaainDateDynamicComponent, selector: "raain-date-dynamic", inputs: ["points", "focusDate", "focusRange", "withoutAll", "currentHeight", "fetchData"], outputs: ["changedDate"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
344
344
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: RaainDetailsComponent, decorators: [{
345
345
  type: Component,
346
- args: [{ selector: 'raain-details', template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"] }]
346
+ args: [{ selector: 'raain-details', template: "<!-- Main content container -->\n<div *ngIf=\"rainNode\" class=\"raain-details-container\">\n\n <!-- Header section with node info\n <ion-card class=\"node-info-card\">\n <ion-card-content>\n <div class=\"node-header\">\n <div class=\"node-status\">\n <ion-icon *ngIf=\"(rainNode | hasGoodQuality)\" color=\"success\" name=\"checkmark-circle\"></ion-icon>\n <ion-icon *ngIf=\"!(rainNode | hasGoodQuality)\" color=\"warning\" name=\"alert-circle\"></ion-icon>\n </div>\n <div class=\"node-titles\">\n <ion-card-title>{{ rainNode.name }}</ion-card-title>\n <ion-card-subtitle>by {{ teamNode?.name }}</ion-card-subtitle>\n </div>\n <div class=\"node-controls\">\n <ion-label class=\"toggle-label\">History</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n </ion-card-content>\n </ion-card>\n-->\n\n <!-- Period selection section -->\n <ion-card class=\"period-card\">\n <ion-card-content>\n <div class=\"period-controls\">\n <div class=\"period-row\">\n <ion-button (click)=\"setPeriodOfNow()\" class=\"now-button\" fill=\"outline\">\n <ion-icon name=\"time-outline\" slot=\"start\"></ion-icon>\n Now\n </ion-button>\n\n <div class=\"period-start ion-hide-md-down\">\n <ion-label>Start:</ion-label>\n <input (change)=\"onPeriodBeginChange($event)\"\n [value]=\"periodBeginAsString\"\n class=\"datetime-input\"\n type=\"datetime-local\">\n </div>\n\n <div class=\"period-duration ion-hide-md-down\">\n <ion-label>Duration:</ion-label>\n <ion-select (ionDismiss)=\"onPeriodDurationChange($event)\"\n [(ngModel)]=\"periodDurationAsString\"\n class=\"duration-select\"\n id=\"periodDuration\"\n interface=\"popover\">\n <ion-select-option value=\"0.25\">15 minutes</ion-select-option>\n <ion-select-option value=\"0.5\">30 minutes</ion-select-option>\n <ion-select-option value=\"1\">1 hour</ion-select-option>\n <ion-select-option value=\"2\">2 hours</ion-select-option>\n <ion-select-option value=\"3\">3 hours</ion-select-option>\n <ion-select-option value=\"4\">4 hours</ion-select-option>\n <ion-select-option value=\"5\">5 hours</ion-select-option>\n <ion-select-option value=\"6\">6 hours</ion-select-option>\n </ion-select>\n </div>\n\n <div id=\"all-dates\" slot=\"end\">\n <ion-label class=\"toggle-label\">All dates</ion-label>\n <ion-toggle (ionChange)=\"onEnableCountHistoryTab(rainNode)\"\n [(ngModel)]=\"toggleHistory\"\n [checked]=\"toggleHistory\">\n </ion-toggle>\n </div>\n </div>\n\n <!-- Hidden label for change detection -->\n <div class=\"hidden-label\">{{ onChangeDetectionTest(rainNode) }}</div>\n </div>\n\n <!-- Historical map section -->\n <div *ngIf=\"toggleHistory\" class=\"period-controls\">\n <raain-date-dynamic (changedDate)=\"onDateChangeInCount($event)\"\n [currentHeight]=\"300\"\n [fetchData]=\"fetchDataWrapper\"\n [points]=\"countPoints\">\n </raain-date-dynamic>\n </div>\n </ion-card-content>\n </ion-card>\n\n\n <!-- Map section -->\n <ion-card class=\"map-card\">\n <ion-card-content class=\"map-content\">\n <ion-grid>\n <ion-row id=\"progressAndRefresh\">\n <ion-label>\n <span *ngIf=\"getPercentOfComputations()\" class=\"map-stats\">\n {{ getPercentOfComputations() }}% Images\n <i *ngIf=\"countsPeriod.progress\" class=\"progress-indicator\">\n In Progress: {{ countsPeriod.progress }}...\n </i>\n </span>\n <span *ngIf=\"!getPercentOfComputations()\" class=\"no-data\">\n No image available\n </span>\n </ion-label>\n\n <ion-button (click)=\"refreshMap()\" *ngIf=\"!refreshInProgress\" class=\"refresh-button\">\n <ion-icon name=\"refresh-outline\" slot=\"start\"></ion-icon>\n Refresh Map\n </ion-button>\n\n <!-- Progress indicator -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n <ion-row *ngIf=\"toggleMap && getPercentOfImages()\">\n <!-- Map component -->\n <ion-col class=\"map-column\" size-lg=\"7\">\n <div class=\"map-container\">\n <raain-map\n (changedDate)=\"onDateChangeInMap($event)\"\n (changedSum)=\"onSumChangeInMap($event)\"\n (selectedMarker)=\"onGaugeSelectInMap($event)\"\n [coordinates]=\"coordinates\"\n [currentHeight]=\"500\"\n [defaultDate]=\"dateShown\"\n [markers]=\"{\n borders,\n gauges: compareManager.gaugesInMap,\n gaugesInCompare: compareManager.gaugesInCompare,\n selectedGauges: compareManager.selectedGauges,\n pixels: compareManager.selectedPixels,\n pixelsSolution: compareManager.pixelsSolutions?.length ? compareManager.pixelsSolutions[0] : []\n }\"\n [showCumulative]=\"toggleCumulative\"\n [sumFn]=\"refreshManager.sumFn\"\n [sumValues]=\"refreshManager.sumValues\"\n [timeframeContainers]=\"timeframeContainers\"\n [timeframeDates]=\"timeframeDates\">\n </raain-map>\n </div>\n\n <div class=\"data-column\">\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Image Details</summary>\n <div class=\"details-content\">\n <div class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Date:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapDate?.toISOString() }}\n | {{ refreshManager.rainComputationMapDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Water in the map:</span>\n <span class=\"detail-value\">{{ sumDetails }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ min:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMin }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Source DBZ max:</span>\n <span class=\"detail-value\">{{ refreshManager.rainComputationMapOriginalMax }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n\n <!-- Data panel -->\n <ion-col class=\"data-column\" size-lg=\"5\">\n <div class=\"data-panel\">\n <!-- Compare stack component -->\n <div class=\"compare-stack\">\n <raain-compare-stack\n (selectedPoint)=\"onGaugeSelectInCompare($event)\"\n [compareManager]=\"compareManager\"\n [cumulative]=\"toggleCumulative\">\n </raain-compare-stack>\n </div>\n\n <!-- Technical details (collapsible for cleaner UI) -->\n <details class=\"technical-details\">\n <summary>Compare Details</summary>\n <div class=\"details-content\">\n <div [ngClass]=\"{'warning': refreshManager.rainComputationMapDoneDate?.getTime() > compareManager.currentQualityDoneDate?.getTime() + 60000}\"\n class=\"detail-row\">\n <span class=\"detail-label\">Computed:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityDoneDate | date:'yyyy-MM-dd HH:mm' }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Version:</span>\n <span class=\"detail-value\">{{ compareManager.compareVersion }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Launched by:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityLaunchedBy }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Time spent:</span>\n <span class=\"detail-value\">{{ compareManager.currentQualityTimeSpentInMs }}\n ms</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Gauges:</span>\n <span class=\"detail-value\">{{ compareManager.gaugesInCompare.length }}</span>\n </div>\n <div class=\"detail-row\">\n <span class=\"detail-label\">Points:</span>\n <span class=\"detail-value\">{{ compareManager.globalComparePoints.length }}</span>\n </div>\n </div>\n </details>\n </div>\n </ion-col>\n </ion-row>\n <ion-row>\n <!-- Bottom progress bar -->\n <ion-progress-bar *ngIf=\"refreshInProgress\"\n [buffer]=\"(countsPeriod.progress / ((timeframeDates?.length || 10) +3))+0.01\"\n [value]=\"countsPeriod.progress / ((timeframeDates?.length || 10) +3)\"\n color=\"primary\">\n </ion-progress-bar>\n </ion-row>\n </ion-grid>\n </ion-card-content>\n </ion-card>\n\n <!-- Gauge values section -->\n <ion-card *ngIf=\"gaugeSelectedPoints.length && gaugeSelectedPoints[0].values.length\" class=\"gauge-card\">\n <ion-card-header>\n <ion-card-title>\n <ion-icon name=\"analytics-outline\"></ion-icon>\n Selected Gauge Data\n </ion-card-title>\n </ion-card-header>\n <ion-card-content>\n <raain-date-focus\n [currentHeight]=\"300\"\n [focusDate]=\"periodBegin\"\n [focusRange]=\"DateRange.DAY\"\n [points]=\"gaugeSelectedPoints\"\n [withoutAll]=\"true\">\n </raain-date-focus>\n </ion-card-content>\n </ion-card>\n\n</div>\n", styles: [".raain-details-container{max-width:var(--app-max-width);margin:0 auto;padding:0 0 24px}.raain-details-card{width:100%;margin-bottom:20px}.raain-details-card ion-card-header{border-bottom:1px solid rgba(var(--ion-color-medium-rgb),.2)}.raain-details-card ion-card-header ion-card-title{display:flex;align-items:center}.raain-details-card ion-card-header ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary)}.node-info-card{background-color:var(--ion-color-light)}.node-info-card .node-header{display:flex;align-items:center}.node-info-card .node-header .node-status{margin-right:16px}.node-info-card .node-header .node-status ion-icon{font-size:24px}.node-info-card .node-header .node-titles{flex:1}.node-info-card .node-header .node-titles ion-card-title{margin:0;font-size:1.4rem;font-weight:600;color:var(--ion-color-dark)}.node-info-card .node-header .node-titles ion-card-subtitle{padding-left:0;margin:4px 0 0;font-size:.9rem;color:var(--ion-color-medium)}.count-map-card,.period-card{background-color:var(--ion-color-light)}.period-card ion-card-title{display:flex;align-items:center}.period-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}.period-row{display:flex;flex-wrap:wrap;align-items:center;gap:16px;position:relative}.now-button{min-width:100px}#all-dates{display:flex;align-items:center;margin-left:auto}#all-dates .toggle-label{margin-right:8px;white-space:nowrap}.refresh-button ion-icon{margin-right:4px;color:var(--ion-color-light)}.period-start,.period-duration{display:flex;align-items:center}.hidden-label{display:none}.datetime-input,#periodDuration,.duration-select{padding:8px 12px;border:1px solid rgba(var(--ion-color-medium-rgb),.3);border-radius:var(--ion-border-radius);background-color:var(--ion-color-light);font-family:var(--ion-font-family)}.datetime-input:focus,#periodDuration:focus,.duration-select:focus{outline:none;border-color:var(--ion-color-primary)}#periodDuration,.duration-select{min-width:150px}.map-card{background-color:var(--ion-color-light)}.map-card .map-header{display:flex;justify-content:space-between;align-items:center;flex-direction:row;gap:16px}.map-card .map-stats,.map-card .no-data{font-size:.8rem;font-weight:400;color:var(--ion-color-medium);margin-left:8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.map-card .progress-indicator{color:var(--ion-color-primary)}.map-card .map-toggle{display:flex;align-items:center}.map-card .map-content{padding:0}.map-card .map-content ion-grid,.map-card .map-content ion-row{padding:0;margin:0}.map-card .map-content #progressAndRefresh{display:flex;justify-content:flex-end;align-items:center;padding:8px 16px}.map-card .map-content #progressAndRefresh ion-label{margin-right:16px}.map-card .map-content .map-column{padding:0}.map-card .map-content .map-column .map-container{border-radius:var(--ion-border-radius);overflow:visible}.map-card .map-content .data-column{padding:16px}.map-card .map-content .data-column .data-panel{height:100%;display:flex;flex-direction:column}.map-card .map-content .data-column .panel-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.map-card .map-content .data-column .panel-header h3{margin:0;font-size:1.2rem;font-weight:600}.map-card .map-content .data-column .computation-info,.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px;margin-bottom:16px}.map-card .map-content .data-column .info-row,.map-card .map-content .data-column .detail-row{display:flex;margin-bottom:4px;font-size:.9rem}.map-card .map-content .data-column .info-row:last-child,.map-card .map-content .data-column .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .compare-stack{flex:1;margin-bottom:16px}.map-card .map-content .data-column .technical-details{background-color:rgba(var(--ion-color-light-rgb),.5);border-radius:var(--ion-border-radius);padding:12px}.map-card .map-content .data-column .technical-details summary{font-weight:500;color:var(--ion-color-medium);cursor:pointer}.map-card .map-content .data-column .technical-details summary:hover{color:var(--ion-color-primary)}.map-card .map-content .data-column .technical-details .details-content{margin-top:8px;font-size:.85rem}.map-card .map-content .data-column .technical-details .details-content .detail-row{display:flex;flex-wrap:wrap;margin-bottom:4px}.map-card .map-content .data-column .technical-details .details-content .detail-row:last-child{margin-bottom:0}.map-card .map-content .data-column .technical-details .details-content .detail-row.warning{color:var(--ion-color-warning)}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-label{font-weight:500;color:var(--ion-color-dark);width:140px}.map-card .map-content .data-column .technical-details .details-content .detail-row .detail-value{color:var(--ion-color-medium)}.map-card .map-content .data-column .technical-details .details-content .detail-row .warning-text{color:var(--ion-color-danger);margin-left:8px}.gauge-card{background-color:var(--ion-color-light)}.gauge-card ion-card-title{display:flex;align-items:center}.gauge-card ion-card-title ion-icon{margin-right:8px;color:var(--ion-color-primary);font-size:20px}raain-compare-stack{width:100%;display:block}@media (max-width: 768px){.period-row{flex-direction:row;justify-content:space-between;align-items:center}#all-dates{margin-left:auto;padding-left:8px}#all-dates .toggle-label{font-size:.9rem}.map-header{flex-direction:row;justify-content:space-between;align-items:center;gap:16px}}\n"] }]
347
347
  }], ctorParameters: function () { return [{ type: i1.Storage }]; }, propDecorators: { toggleAdmin: [{
348
348
  type: Input
349
349
  }], rainNode: [{
@@ -359,4 +359,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
359
359
  }], toggleCumulative: [{
360
360
  type: Input
361
361
  }] } });
362
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBQyxxQkFBcUIsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUEyQixvQkFBb0IsRUFBaUIsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7QUFVeEYsTUFBTSxPQUFPLHFCQUFxQjtJQXVEOUIsWUFBc0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUZuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBMEl6QyxnRUFBZ0U7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxFQUFFLFNBQWUsRUFBRSxVQUFxQixFQUFFLEVBQUU7WUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQTNJdUMsQ0FBQztJQUVsQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLEVBQUU7WUFDTixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUM7WUFDekQsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsTUFBTSxvQkFBb0IsR0FBRyxrQkFBa0IsQ0FBQztRQUNoRCxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxNQUFNLENBQUMsT0FBTyxDQUFDLElBQVk7UUFDL0IsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDZixNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEtBQUssQ0FBQztZQUN6RCxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxHQUFHLGtCQUFrQixDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFFTSxLQUFLLENBQUMsU0FBUyxDQUFDLFNBQWUsRUFBRSxVQUFxQjtRQUN6RCxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN6QixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBQyxDQUFDLENBQUM7U0FDekQ7UUFDRCxNQUFNLFFBQVEsR0FBRztZQUNiO2dCQUNJLEtBQUssRUFBRSxTQUFTO2dCQUNoQixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNO2FBQ1Q7WUFDRDtnQkFDSSxLQUFLLEVBQUUsVUFBVTtnQkFDakIsS0FBSyxFQUFFLEtBQUs7Z0JBQ1osTUFBTTthQUNUO1lBQ0QsS0FBSztZQUNMLDJCQUEyQjtZQUMzQixzQkFBc0I7WUFDdEIsZUFBZTtZQUNmLE1BQU07U0FDVCxDQUFDO1FBRUYsTUFBTSxLQUFLLEdBQUcsb0JBQW9CLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDL0MsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLFVBQVUsS0FBSyxTQUFTLENBQUMsT0FBTyxFQUFFO1lBQ2xDLE9BQU87U0FDVjthQUFNLElBQUksVUFBVSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7WUFDdEMsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRTtnQkFDekUsV0FBVyxFQUFFLFNBQVM7YUFDekIsQ0FBQyxDQUFDO1lBRUgsSUFBSSxHQUFHO2dCQUNIO29CQUNJLEtBQUssRUFBRSxhQUFhO29CQUNwQixLQUFLLEVBQUUsTUFBTTtvQkFDYixNQUFNLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTt3QkFDcEMsT0FBTzs0QkFDSCxJQUFJLEVBQUUscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQzNDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM1QixDQUFDO29CQUNOLENBQUMsQ0FBQztpQkFDTDtnQkFDRDtvQkFDSSxLQUFLLEVBQUUsVUFBVTtvQkFDakIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osTUFBTSxFQUFFLFVBQVUsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ3ZDLE9BQU87NEJBQ0gsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUIsQ0FBQztvQkFDTixDQUFDLENBQUM7aUJBQ0w7Z0JBQ0Q7b0JBQ0ksS0FBSyxFQUFFLFdBQVc7b0JBQ2xCLEtBQUssRUFBRSxNQUFNO29CQUNiLE1BQU0sRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNsQyxPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVCLENBQUM7b0JBQ04sQ0FBQyxDQUFDO2lCQUNMO2FBQ0osQ0FBQztTQUNMO2FBQU07WUFDSCxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMvRCxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxFQUFFO2dCQUNqRSxLQUFLO2dCQUNMLFdBQVcsRUFBRSxTQUFTO2FBQ3pCLENBQUMsQ0FBQztZQUVILElBQUksR0FBRztnQkFDSDtvQkFDSSxLQUFLLEVBQUUsU0FBUztvQkFDaEIsS0FBSyxFQUFFLEtBQUs7b0JBQ1osTUFBTSxFQUFFLE1BQU0sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7d0JBQ2xDLE9BQU87NEJBQ0gsSUFBSSxFQUFFLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDOzRCQUMzQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDNUIsQ0FBQztvQkFDTixDQUFDLENBQUM7aUJBQ0w7Z0JBQ0Q7b0JBQ0ksS0FBSyxFQUFFLFVBQVU7b0JBQ2pCLEtBQUssRUFBRSxLQUFLO29CQUNaLE1BQU0sRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO3dCQUNuQyxPQUFPOzRCQUNILElBQUksRUFBRSxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzs0QkFDM0MsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzVCLENBQUM7b0JBQ04sQ0FBQyxDQUFDO2lCQUNMO2dCQUNELEtBQUs7Z0JBQ0wsMkJBQTJCO2dCQUMzQixzQkFBc0I7Z0JBQ3RCLDRDQUE0QztnQkFDNUMsb0JBQW9CO2dCQUNwQiw0REFBNEQ7Z0JBQzVELDBDQUEwQztnQkFDMUMsY0FBYztnQkFDZCxXQUFXO2dCQUNYLE1BQU07YUFDVCxDQUFDO1NBQ0w7UUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixLQUFLLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM3QyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBT00sV0FBVyxDQUFDLE9BQXNCO1FBQ3JDLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRSxDQUFDLENBQUMsQ0FBQztJQUMvQyxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQsS0FBSyxDQUFDLHVCQUF1QixDQUFDLElBQWM7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7WUFDckIsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7U0FDekI7SUFDTCxDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLEtBQVU7UUFDaEMsTUFBTSxRQUFRLEdBQUcsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQ2xFLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLFFBQVEsQ0FBQztRQUNwQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFeEQsTUFBTSxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxNQUFhO1FBQ3RDLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLEdBQUcsY0FBYyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDdEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztJQUNoRixDQUFDO0lBRUQsS0FBSyxDQUFDLG1CQUFtQixDQUFDLFdBQWlCO1FBQ3ZDLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLG1CQUFtQjtZQUNwQixXQUFXLENBQUMsV0FBVyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFDLFdBQVcsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFlO1FBQ25DLCtDQUErQztRQUMvQyxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixNQUFNLGVBQWUsR0FBVyxDQUFDLElBQUksQ0FBQyxnQkFBZ0I7WUFDbEQsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBQzlDLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsMkJBQTJCLEVBQUUsQ0FBQztRQUNoRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGdCQUFnQixDQUFDLEdBQVc7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUFvQjtRQUN6QyxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQ3pELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUM1RCxDQUFDO1FBQ0YsSUFBSSxjQUFjLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixPQUFPO1NBQ1Y7UUFDRCxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFeEMsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBQyxFQUFFLEVBQUUsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLElBQUksRUFBQyxDQUFDLENBQUM7UUFFaEYsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsYUFBeUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0UsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RSxNQUFNLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQzVELGFBQWEsQ0FBQyxFQUFFLEVBQ2hCLFFBQVEsRUFDUixNQUFNLENBQ1QsQ0FBQztRQUNGLE1BQU0sV0FBVyxHQUFrQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7WUFDeEUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLHFCQUFxQixDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFRLENBQUMsQ0FBQztZQUM3RSxNQUFNLEtBQUssR0FBRyxxQkFBcUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUNsRSxPQUFPLEVBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsbUJBQW1CLEdBQUc7WUFDdkI7Z0JBQ0ksS0FBSyxFQUFFLGFBQWEsQ0FBQyxJQUFJO2dCQUN6QixLQUFLLEVBQUUsS0FBSztnQkFDWixNQUFNLEVBQUUsV0FBVzthQUN0QjtTQUNKLENBQUM7UUFDRixPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQixFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBd0M7UUFDakUsTUFBTSxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQztRQUVwRSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFhO1FBQzNCLHdCQUF3QjtRQUN4Qiw4QkFBOEI7UUFDOUIsSUFBSTtJQUNSLENBQUM7SUFFRCxxQkFBcUIsQ0FBQyxRQUFrQjtRQUNwQywrREFBK0Q7UUFDL0QsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDWixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBQzlCLHNGQUFzRjtRQUN0RiwrRkFBK0Y7UUFDL0YsSUFBSSxDQUFDLE9BQU8sR0FBRztRQUNYLHVFQUF1RTtRQUN2RSx1RUFBdUU7UUFDdkUsdUVBQXVFO1FBQ3ZFLHVFQUF1RTtTQUMxRSxDQUFDO1FBRUYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUMvQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDM0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQsS0FBSyxDQUFDLGlCQUFpQjtRQUNuQixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFFRCxLQUFLLENBQUMsY0FBYztRQUNoQix1Q0FBdUM7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUM1QixRQUFRLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsbUJBQW1CO1lBQ3BCLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUYsSUFBSSxDQUFDLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELGtCQUFrQjtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLEVBQUU7WUFDMUMsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FDdkQsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNGLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRTtZQUN4RCxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FDN0QsQ0FBQztRQUNGLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCx3QkFBd0I7UUFDcEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFO1lBQ25CLE9BQU8sQ0FBQyxDQUFDO1NBQ1o7UUFFRCxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM5RSxNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTyxRQUFRO1FBQ1osSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLElBQUksbUJBQW1CLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztRQUNuQyxJQUFJLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxHQUFHLEVBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUUsQ0FBQyxFQUFFLGFBQWEsRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxDQUFDO1FBRTlCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLDRCQUE0QixHQUFHLElBQUksQ0FBQztRQUV6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRixJQUFJLENBQUMsaUJBQWlCLEdBQUcscUJBQXFCLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsc0JBQXNCO1lBQ3ZCLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBRWhGLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUVsQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLElBQUksQ0FBQyxjQUFjLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDaEMsSUFBSSxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBRU8sS0FBSyxDQUFDLElBQUk7UUFDZCxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxRQUFRO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2hCLE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7UUFDN0MsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUU3QyxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FDMUIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFDbkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUM5QixDQUFDO1FBRUYsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUN6QyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRXpGLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3BDLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxHQUFHLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUMsQ0FBQztZQUM1RSxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUQ7SUFDTCxDQUFDO0lBRU8sS0FBSyxDQUFDLG1CQUFtQixDQUM3QixZQUlDLEVBQ0QsY0FBc0I7UUFFdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztJQUN6QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxjQUFzQjtRQUM5QyxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsV0FBVyxDQUFDLG1CQUF3QztRQUM5RCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7SUFDbkQsQ0FBQztJQUVPLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBc0I7UUFDdkMsTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEIsQ0FBQzs7bUhBOWJRLHFCQUFxQjt1R0FBckIscUJBQXFCLGtUQ2RsQyxpemVBMlFBOzRGRDdQYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0ksZUFBZTs4RkFNbEIsV0FBVztzQkFEakIsS0FBSztnQkFHQyxRQUFRO3NCQURkLEtBQUs7Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBR0MsWUFBWTtzQkFEbEIsS0FBSztnQkFHQyxnQkFBZ0I7c0JBRHRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UHJvZmlsZVNlcnZpY2V9IGZyb20gJy4uL3Byb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge0NhcnRlc2lhbk1lYXN1cmVWYWx1ZSwgUmFpbk5vZGUsIFRlYW1Ob2RlfSBmcm9tICdyYWFpbi1tb2RlbCc7XG5pbXBvcnQge0RhdGVSYW5nZSwgTWFwTGF0TG5nLCBUaW1lZnJhbWVDb250YWluZXJzfSBmcm9tICdyYWFpbi11aSc7XG5pbXBvcnQge0NvbXBhcmVNYW5hZ2VyLCBGcmFtZVNldCwgbWFwRGF0ZVJhbmdlVG9TdHJpbmcsIFJlZnJlc2hNYW5hZ2VyfSBmcm9tICcuLi90b29scyc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7UmFkYXJTZXJ2aWNlfSBmcm9tICcuLi9yYWRhci5zZXJ2aWNlJztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnLi4vc3RvcmFnZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyYWFpbi1kZXRhaWxzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydyYWFpbi1kZXRhaWxzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJhYWluRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0b2dnbGVBZG1pbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByYWluTm9kZTogUmFpbk5vZGU7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlZnJlc2hNYW5hZ2VyOiBSZWZyZXNoTWFuYWdlcjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmFkYXJTZXJ2aWNlOiBSYWRhclNlcnZpY2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG9nZ2xlQ3VtdWxhdGl2ZTogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBwZXJpb2RCZWdpbjogRGF0ZTtcbiAgICBwdWJsaWMgcGVyaW9kRW5kOiBEYXRlO1xuXG4gICAgLy8gcHVibGljIFVJIHZhcmlhYmxlc1xuICAgIHB1YmxpYyB0ZWFtTm9kZTogVGVhbU5vZGU7XG4gICAgcHVibGljIHBlcmlvZEJlZ2luQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgcGVyaW9kRW5kQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgcGVyaW9kRHVyYXRpb25Bc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBkYXRlU2hvd246IERhdGU7XG4gICAgcHVibGljIGNvb3JkaW5hdGVzOiBNYXBMYXRMbmc7XG4gICAgcHVibGljIGJvcmRlcnM6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyB0aW1lZnJhbWVDb250YWluZXJzOiBUaW1lZnJhbWVDb250YWluZXJzO1xuICAgIHB1YmxpYyBjdXJyZW50VGltZWZyYW1lVGFyZ2V0OiBGcmFtZVNldDtcbiAgICBwdWJsaWMgdGltZWZyYW1lRGF0ZXM6IERhdGVbXTtcbiAgICBwdWJsaWMgY291bnRQb2ludHM6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgc3R5bGU6IHN0cmluZztcbiAgICAgICAgdmFsdWVzOiB7ZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlcn1bXTtcbiAgICB9W107XG4gICAgcHVibGljIGNvdW50c1BlcmlvZDoge1xuICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgfTtcblxuICAgIHB1YmxpYyBnYXVnZVNlbGVjdGVkUG9pbnRzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHN0eWxlOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W107XG4gICAgfVtdO1xuICAgIHB1YmxpYyB0b2dnbGVIaXN0b3J5OiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2dnbGVNYXA6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZUNvbXBhcmU6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZUdhdWdlTWVhc3VyZXM6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZVJlbW92ZUNvbXBhcmVEdXBsaWNhdGU6IGJvb2xlYW47XG4gICAgcHVibGljIHJlZnJlc2hJblByb2dyZXNzOiBib29sZWFuO1xuICAgIHB1YmxpYyBzdW1EZXRhaWxzOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGVSYW5nZSA9IERhdGVSYW5nZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yYWdlOiBTdG9yYWdlKSB7fVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgUGVyaW9kRGlzcGxheShkYXRlOiBEYXRlIHwgc3RyaW5nKSB7XG4gICAgICAgIGxldCBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgIGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJUaW1lem9uZU9mZnNldCA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuICAgICAgICAgICAgZCA9IG5ldyBEYXRlKGQuZ2V0VGltZSgpIC0gdXNlclRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGFtcGxlRm9ybWF0dGVkRGF0ZSA9ICcyMDE3LTA2LTAxVDA4OjMwJztcbiAgICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgZXhhbXBsZUZvcm1hdHRlZERhdGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBEYXRlVVRDKGRhdGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBoYXNJU09Gb3JtYXQgPSBkYXRlLm1hdGNoKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aJC8pO1xuICAgICAgICBsZXQgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICBpZiAoIWhhc0lTT0Zvcm1hdCkge1xuICAgICAgICAgICAgY29uc3QgdXNlclRpbWV6b25lT2Zmc2V0ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XG4gICAgICAgICAgICBkID0gbmV3IERhdGUoZC5nZXRUaW1lKCkgLSB1c2VyVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaERhdGEoZm9jdXNEYXRlOiBEYXRlLCBmb2N1c1JhbmdlOiBEYXRlUmFuZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goe2RhdGU6IG5ldyBEYXRlKDIwMjAgKyBpLCAwKSwgdmFsdWU6IDEwfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFrZURhdGEgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICclIFJhaW55JyxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAvLyAgICAgIGxhYmVsOiAnJSBRdWFsaXR5JyxcbiAgICAgICAgICAgIC8vICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgIC8vICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBtYXBEYXRlUmFuZ2VUb1N0cmluZyhmb2N1c1JhbmdlKTtcbiAgICAgICAgbGV0IGRhdGEgPSBmYWtlRGF0YTtcbiAgICAgICAgaWYgKCF0aGlzLnJhaW5Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb2N1c1JhbmdlID09PSBEYXRlUmFuZ2UuQ0VOVFVSWSkge1xuICAgICAgICAgICAgLy8gZmFrZVxuICAgICAgICB9IGVsc2UgaWYgKGZvY3VzUmFuZ2UgPT09IERhdGVSYW5nZS5IT1VSKSB7XG4gICAgICAgICAgICBjb25zdCBob3VyQ291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHNIb3VyKHRoaXMucmFpbk5vZGUuaWQsIHtcbiAgICAgICAgICAgICAgICBwZXJpb2RCZWdpbjogZm9jdXNEYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRhdGEgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JhaW55IENvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnJhaW55Q291bnQubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucGVyY2VudEltYWdlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmFpbnkgU3VtJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnJhaW55U3VtLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaERhdGEgVE9ETzonLCBmb2N1c0RhdGUudG9JU09TdHJpbmcoKSwgcmFuZ2UpO1xuICAgICAgICAgICAgY29uc3QgY291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHModGhpcy5yYWluTm9kZS5pZCwge1xuICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgIHBlcmlvZEJlZ2luOiBmb2N1c0RhdGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBSYWlueScsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudFJhaW55Lm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclIEltYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudEltYWdlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyAge1xuICAgICAgICAgICAgICAgIC8vICAgICAgbGFiZWw6ICclIFF1YWxpdHknLFxuICAgICAgICAgICAgICAgIC8vICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgIHZhbHVlczogY291bnRzLnBlcmNlbnRRLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBmZXRjaERhdGEgRE9ORSAke3JhbmdlfWAsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIHRoZSBhc3luYyBuYXR1cmUgb2YgZmV0Y2hEYXRhXG4gICAgcHVibGljIGZldGNoRGF0YVdyYXBwZXIgPSBhc3luYyAoZm9jdXNEYXRlOiBEYXRlLCBmb2N1c1JhbmdlOiBEYXRlUmFuZ2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hEYXRhKGZvY3VzRGF0ZSwgZm9jdXNSYW5nZSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhbmdlKGNoYW5nZXMpLnRoZW4oKGlnbm9yZWQpID0+IHt9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRW5hYmxlQ291bnRIaXN0b3J5VGFiKHJhaW46IFJhaW5Ob2RlKSB7XG4gICAgICAgIGlmICghdGhpcy50b2dnbGVIaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50UG9pbnRzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblBlcmlvZEJlZ2luQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZSA/PyB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmc7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW4gPSBuZXcgRGF0ZShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdyYWFpbi1wZXJpb2RCZWdpbicsIHRoaXMucGVyaW9kQmVnaW4pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25QZXJpb2REdXJhdGlvbkNoYW5nZShldmVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25QZXJpb2REdXJhdGlvbkNoYW5nZShfZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uSW5Ib3VyID0gcGFyc2VGbG9hdCh0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZCA9IG5ldyBEYXRlKHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpICsgZHVyYXRpb25JbkhvdXIgKiAoNjAgKiA2MDAwMCkpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZEFzU3RyaW5nID0gdGhpcy5wZXJpb2RFbmQudG9JU09TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgncmFhaW4tcGVyaW9kRW5kJywgdGhpcy5wZXJpb2RFbmQpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnBlcmlvZCA9IHtiZWdpbjogdGhpcy5wZXJpb2RCZWdpbiwgZW5kOiB0aGlzLnBlcmlvZEVuZH07XG4gICAgfVxuXG4gICAgYXN5bmMgb25EYXRlQ2hhbmdlSW5Db3VudChkYXRlQ2hhbmdlZDogRGF0ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnb25EYXRlQ2hhbmdlSW5Db3VudCcsIGRhdGVDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID1cbiAgICAgICAgICAgIGRhdGVDaGFuZ2VkLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDExKSArXG4gICAgICAgICAgICBkYXRlQ2hhbmdlZC50b0xvY2FsZVRpbWVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9ICcxJztcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZEJlZ2luQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRGF0ZUNoYW5nZUluTWFwKGRhdGVTaG93bjogRGF0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25EYXRlQ2hhbmdlSW5NYXAnLCBkYXRlU2hvd24pO1xuICAgICAgICB0aGlzLmRhdGVTaG93biA9IGRhdGVTaG93bjtcbiAgICAgICAgY29uc3QgY3VtdWxhdGl2ZUhvdXJzOiBudW1iZXIgPSAhdGhpcy50b2dnbGVDdW11bGF0aXZlXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogcGFyc2VGbG9hdCh0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLmZldGNoKHRoaXMuZGF0ZVNob3duLCB0aGlzLnRvZ2dsZUdhdWdlTWVhc3VyZXMsIGN1bXVsYXRpdmVIb3Vycyk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZVRhcmdldCA9IHRoaXMucmVmcmVzaE1hbmFnZXIuZ2V0VGltZWxpbmVTZWxlY3RlZEZyYW1lU2V0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hbmFnZXIuc2V0UmVwb3J0UGVyaW9kKHRoaXMuZGF0ZVNob3duKTtcbiAgICB9XG5cbiAgICBhc3luYyBvblN1bUNoYW5nZUluTWFwKHN1bTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3VtRGV0YWlscyA9IHN1bTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkdhdWdlU2VsZWN0SW5NYXAobWFwTGF0TG5nOiBNYXBMYXRMbmcpIHtcbiAgICAgICAgY29uc3QgZ2F1Z2VzRmlsdGVyZWQgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luTWFwLmZpbHRlcihcbiAgICAgICAgICAgIChnKSA9PiBnLmxhdCA9PT0gbWFwTGF0TG5nLmxhdCAmJiBnLmxuZyA9PT0gbWFwTGF0TG5nLmxuZ1xuICAgICAgICApO1xuICAgICAgICBpZiAoZ2F1Z2VzRmlsdGVyZWQubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F1Z2VTZWxlY3RlZCA9IGdhdWdlc0ZpbHRlcmVkWzBdO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdhdWdlVmFsdWVzKHtpZDogZ2F1Z2VTZWxlY3RlZC5pZCwgbmFtZTogZ2F1Z2VTZWxlY3RlZC5uYW1lfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZWxlY3RHYXVnZShnYXVnZVNlbGVjdGVkLmlkLCAwKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoR2F1Z2VWYWx1ZXMoZ2F1Z2VTZWxlY3RlZDoge2lkOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3QgZGF5QmVnaW4gPSBuZXcgRGF0ZSh0aGlzLnBlcmlvZEJlZ2luLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKSk7XG4gICAgICAgIGNvbnN0IGRheUVuZCA9IG5ldyBEYXRlKGRheUJlZ2luLmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDAgLSAxKTtcbiAgICAgICAgY29uc3QgZ2F1Z2VNZWFzdXJlcyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0R2F1Z2VNZWFzdXJlcyhcbiAgICAgICAgICAgIGdhdWdlU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICBkYXlCZWdpbixcbiAgICAgICAgICAgIGRheUVuZFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBnYXVnZVZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W10gPSBnYXVnZU1lYXN1cmVzLm1hcCgoZ20pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZSA9IG5ldyBDYXJ0ZXNpYW5NZWFzdXJlVmFsdWUoZ20udmFsdWVzWzBdIGFzIGFueSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZS5nZXRDYXJ0ZXNpYW5WYWx1ZXMoKVswXS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB7ZGF0ZTogZ20uZGF0ZSwgdmFsdWV9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBnYXVnZVNlbGVjdGVkLm5hbWUsXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgIHZhbHVlczogZ2F1Z2VWYWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzOicsIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25HYXVnZVNlbGVjdEluQ29tcGFyZShlOiB7cG9pbnQ6IFhZVHlwZTsgY29tcGFyZUluZGV4OiBudW1iZXJ9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdhdWdlVmFsdWVzKHtpZDogZS5wb2ludC5pZCwgbmFtZTogZS5wb2ludC5uYW1lfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZWxlY3RHYXVnZShlLnBvaW50LmlkLCBlLmNvbXBhcmVJbmRleCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25Ub2dnbGVNYXAoJGV2ZW50OiBFdmVudCkge1xuICAgICAgICAvLyBpZiAodGhpcy50b2dnbGVNYXApIHtcbiAgICAgICAgLy8gICAgYXdhaXQgdGhpcy5yZWZyZXNoTWFwKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZURldGVjdGlvblRlc3QocmFpbk5vZGU6IFJhaW5Ob2RlKSB7XG4gICAgICAgIC8vIFRPRE8gY29uc29sZS5sb2coVEVTVF9ERVRFQ1RJT04rKywgJ29uQ2hhbmdlRGV0ZWN0aW9uVGVzdCcpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaE1hcCgpIHtcbiAgICAgICAgdGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzID0gW107XG4gICAgICAgIC8vIHRoaXMucXVhbGl0eUNvbmYudHJ1c3RmdWxHYXVnZUlkcyA9IHRoaXMucXVhbGl0eUNvbmYudHJ1c3RmdWxHYXVnZUlkcz8ubGVuZ3RoID4gMCA/XG4gICAgICAgIC8vICB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHMgOiB0aGlzLmdhdWdlc1RvRmlsdGVyLmZpbHRlcihnID0+IGcuaXNJbikubWFwKGcgPT4gZy5pZCk7XG4gICAgICAgIHRoaXMuYm9yZGVycyA9IFtcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlIC0gMjUwICogMC4wMDgsIHJhaW5Ob2RlLmxvbmdpdHVkZSksXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSwgcmFpbk5vZGUubG9uZ2l0dWRlIC0gMjUwICogMC4wMTMpLFxuICAgICAgICAgICAgLy8gIG5ldyBNYXBMYXRMbmcocmFpbk5vZGUubGF0aXR1ZGUsIHJhaW5Ob2RlLmxvbmdpdHVkZSArIDI1MCAqIDAuMDEzKSxcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlICsgMjUwICogMC4wMDgsIHJhaW5Ob2RlLmxvbmdpdHVkZSksXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wYXJlTWFuYWdlci5jbGVhbkFsbCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBhcmVNYW5hZ2VyLnNldEdhdWdlc0luTWFwKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdGhpcy50b2dnbGVBZG1pbik7XG4gICAgfVxuXG4gICAgYXN5bmMgbGF1bmNoQ29tcHV0YXRpb24oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UubGF1bmNoUmFpbkNvbXB1dGF0aW9uKHRoaXMucmFpbk5vZGUuaWQsIHRoaXMuZGF0ZVNob3duKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRQZXJpb2RPZk5vdygpIHtcbiAgICAgICAgLy8gc2hvdWxkIGxvb2sgbGlrZTogXCIyMDI0LTA4LTI2VDEyOjEzXCJcbiAgICAgICAgY29uc3QgbGFzdDMwbW4gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsYXN0MzBtbi5zZXRNaW51dGVzKGxhc3QzMG1uLmdldE1pbnV0ZXMoKSAtIDMwKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID1cbiAgICAgICAgICAgIGxhc3QzMG1uLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDExKSArIGxhc3QzMG1uLnRvTG9jYWxlVGltZVN0cmluZygpLnN1YnN0cmluZygwLCA1KTtcbiAgICAgICAgdGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nID0gJzEnO1xuICAgICAgICBhd2FpdCB0aGlzLm9uUGVyaW9kQmVnaW5DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0UGVyY2VudE9mSW1hZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY291bnRzUGVyaW9kLnBlcmNlbnRJbWFnZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJpbmdQZXJpb2QgPSB0aGlzLmNvdW50c1BlcmlvZC5wZXJjZW50SW1hZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChhKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpIDw9IG5ldyBEYXRlKGEubmFtZSkuZ2V0VGltZSgpICYmXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoYS5uYW1lKS5nZXRUaW1lKCkgPD0gdGhpcy5wZXJpb2RFbmQuZ2V0VGltZSgpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN1bW1lZCA9IGR1cmluZ1BlcmlvZC5yZWR1Y2UoKGEsIGIpID0+IGEgKyAoYi54ID8/IDApLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoc3VtbWVkIC8gZHVyaW5nUGVyaW9kLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkge1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IHRoaXMucmVmcmVzaE1hbmFnZXIuZ2V0VGltZWxpbmVGcmFtZVNldCgpO1xuICAgICAgICBpZiAoIXRpbWVsaW5lPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZWxpbmVXaXRoQ29tcHV0YXRpb24gPSB0aW1lbGluZS5maWx0ZXIoKGEpID0+ICEhYS5yYWluQ29tcHV0YXRpb25JZCk7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gdGltZWxpbmVXaXRoQ29tcHV0YXRpb24ubGVuZ3RoIC8gdGltZWxpbmUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChyYXRpbyAqIDEwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbkFsbCgpIHtcbiAgICAgICAgdGhpcy5ib3JkZXJzID0gW107XG5cbiAgICAgICAgdGhpcy50aW1lZnJhbWVDb250YWluZXJzID0gbmV3IFRpbWVmcmFtZUNvbnRhaW5lcnMoW10pO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWVUYXJnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gW107XG4gICAgICAgIHRoaXMuY291bnRQb2ludHMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudHNQZXJpb2QgPSB7cHJvZ3Jlc3M6IDAsIHF1ZXVlUnVubmluZzogMCwgcGVyY2VudEltYWdlczogW119O1xuICAgICAgICB0aGlzLmdhdWdlU2VsZWN0ZWRQb2ludHMgPSBbXTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVNYXAgPSB0cnVlO1xuICAgICAgICB0aGlzLnRvZ2dsZUNvbXBhcmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVHYXVnZU1lYXN1cmVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9nZ2xlUmVtb3ZlQ29tcGFyZUR1cGxpY2F0ZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbiA9IG5ldyBEYXRlKHRoaXMuc3RvcmFnZS5nZXQoJ3JhYWluLXBlcmlvZEJlZ2luJykpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZCA9IG5ldyBEYXRlKHRoaXMuc3RvcmFnZS5nZXQoJ3JhYWluLXBlcmlvZEVuZCcpKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID0gUmFhaW5EZXRhaWxzQ29tcG9uZW50LlBlcmlvZERpc3BsYXkodGhpcy5wZXJpb2RCZWdpbik7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kQXNTdHJpbmcgPSBSYWFpbkRldGFpbHNDb21wb25lbnQuUGVyaW9kRGlzcGxheSh0aGlzLnBlcmlvZEVuZCk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9XG4gICAgICAgICAgICAnJyArICh0aGlzLnBlcmlvZEVuZC5nZXRUaW1lKCkgLSB0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSkgLyAoNjAgKiA2MDAwMCk7XG5cbiAgICAgICAgdGhpcy5kYXRlU2hvd24gPSB0aGlzLnBlcmlvZEJlZ2luO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNvbXBhcmVNYW5hZ2VyPy5jbGVhbkFsbCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyPy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRSYWluKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UmFpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhaW5Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJhaW5Ob2RlID0gdGhpcy5yYWluTm9kZTtcbiAgICAgICAgdGhpcy5jb21wYXJlTWFuYWdlci5yYWluTm9kZSA9IHRoaXMucmFpbk5vZGU7XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5zZXRNZXRob2RzKFxuICAgICAgICAgICAgdGhpcy5vblJlZnJlc2hJblByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaERvbmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMub25GZXRjaERvbmUuYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKCk7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBuZXcgTWFwTGF0TG5nKGNlbnRlci5sYXQsIGNlbnRlci5sbmcpO1xuICAgICAgICB0aGlzLnRlYW1Ob2RlID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRUZWFtKHRoaXMucmFpbk5vZGUuZ2V0TGluaygndGVhbScpLmdldElkKCkpO1xuXG4gICAgICAgIGlmICh0aGlzLnBlcmlvZEJlZ2luICYmIHRoaXMucGVyaW9kRW5kKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnBlcmlvZCA9IHtiZWdpbjogdGhpcy5wZXJpb2RCZWdpbiwgZW5kOiB0aGlzLnBlcmlvZEVuZH07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRoaXMudG9nZ2xlQWRtaW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblJlZnJlc2hJblByb2dyZXNzKFxuICAgICAgICBjb3VudFBlcmlvZHM6IHtcbiAgICAgICAgICAgIHBlcmNlbnRJbWFnZXM/OiBYWVR5cGVbXTtcbiAgICAgICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lZnJhbWVEYXRlczogRGF0ZVtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IGNvdW50UGVyaW9kcztcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRpbWVmcmFtZURhdGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25SZWZyZXNoRG9uZSh0aW1lZnJhbWVEYXRlczogRGF0ZVtdKSB7XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSB0aW1lZnJhbWVEYXRlcztcbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25GZXRjaERvbmUodGltZWZyYW1lQ29udGFpbmVyczogVGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICB0aGlzLnRpbWVmcmFtZUNvbnRhaW5lcnMgPSB0aW1lZnJhbWVDb250YWluZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgfVxufVxuIiwiPCEtLSBNYWluIGNvbnRlbnQgY29udGFpbmVyIC0tPlxuPGRpdiAqbmdJZj1cInJhaW5Ob2RlXCIgY2xhc3M9XCJyYWFpbi1kZXRhaWxzLWNvbnRhaW5lclwiPlxuXG4gICAgPCEtLSBIZWFkZXIgc2VjdGlvbiB3aXRoIG5vZGUgaW5mb1xuICAgIDxpb24tY2FyZCBjbGFzcz1cIm5vZGUtaW5mby1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cIihyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwic3VjY2Vzc1wiIG5hbWU9XCJjaGVja21hcmstY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiIShyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwid2FybmluZ1wiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RlLXRpdGxlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+e3sgcmFpbk5vZGUubmFtZSB9fTwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5ieSB7eyB0ZWFtTm9kZT8ubmFtZSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPkhpc3Rvcnk8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgKGlvbkNoYW5nZSk9XCJvbkVuYWJsZUNvdW50SGlzdG9yeVRhYihyYWluTm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRvZ2dsZUhpc3RvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cbi0tPlxuXG4gICAgPCEtLSBQZXJpb2Qgc2VsZWN0aW9uIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwicGVyaW9kLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInNldFBlcmlvZE9mTm93KClcIiBjbGFzcz1cIm5vdy1idXR0b25cIiBmaWxsPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm93XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLXN0YXJ0IGlvbi1oaWRlLW1kLWRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+U3RhcnQ6PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvblBlcmlvZEJlZ2luQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwZXJpb2RCZWdpbkFzU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1kdXJhdGlvbiBpb24taGlkZS1tZC1kb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPkR1cmF0aW9uOjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3QgKGlvbkRpc21pc3MpPVwib25QZXJpb2REdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGVyaW9kRHVyYXRpb25Bc1N0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR1cmF0aW9uLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlcmlvZER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZT1cInBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIwLjI1XCI+MTUgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMC41XCI+MzAgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMVwiPjEgaG91cjwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMlwiPjIgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjNcIj4zIGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCI0XCI+NCBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiNVwiPjUgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjZcIj42IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImFsbC1kYXRlc1wiIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5BbGwgZGF0ZXM8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIChpb25DaGFuZ2UpPVwib25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbk5vZGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidG9nZ2xlSGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIaWRkZW4gbGFiZWwgZm9yIGNoYW5nZSBkZXRlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbi1sYWJlbFwiPnt7IG9uQ2hhbmdlRGV0ZWN0aW9uVGVzdChyYWluTm9kZSkgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEhpc3RvcmljYWwgbWFwIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlSGlzdG9yeVwiIGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWRhdGUtZHluYW1pYyAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5Db3VudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hEYXRhXT1cImZldGNoRGF0YVdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb3VudFBvaW50c1wiPlxuICAgICAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1keW5hbWljPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG5cbiAgICA8IS0tIE1hcCBzZWN0aW9uIC0tPlxuICAgIDxpb24tY2FyZCBjbGFzcz1cIm1hcC1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwibWFwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxpb24tZ3JpZD5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdyBpZD1cInByb2dyZXNzQW5kUmVmcmVzaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRQZXJjZW50T2ZDb21wdXRhdGlvbnMoKVwiIGNsYXNzPVwibWFwLXN0YXRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkgfX0lIEltYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY291bnRzUGVyaW9kLnByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gUHJvZ3Jlc3M6IHt7IGNvdW50c1BlcmlvZC5wcm9ncmVzcyB9fS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpXCIgY2xhc3M9XCJuby1kYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJyZWZyZXNoTWFwKClcIiAqbmdJZj1cIiFyZWZyZXNoSW5Qcm9ncmVzc1wiIGNsYXNzPVwicmVmcmVzaC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVmcmVzaC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2ggTWFwXG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgKm5nSWY9XCJyZWZyZXNoSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJdPVwiKGNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpKSswLjAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXByb2dyZXNzLWJhcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJ0b2dnbGVNYXAgJiYgZ2V0UGVyY2VudE9mSW1hZ2VzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNYXAgY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cIm1hcC1jb2x1bW5cIiBzaXplLWxnPVwiN1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFhaW4tbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5NYXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlZFN1bSk9XCJvblN1bUNoYW5nZUluTWFwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTWFya2VyKT1cIm9uR2F1Z2VTZWxlY3RJbk1hcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb29yZGluYXRlc109XCJjb29yZGluYXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVudEhlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHREYXRlXT1cImRhdGVTaG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWFya2Vyc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VzOiBjb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlc0luQ29tcGFyZTogY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5Db21wYXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHYXVnZXM6IGNvbXBhcmVNYW5hZ2VyLnNlbGVjdGVkR2F1Z2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzOiBjb21wYXJlTWFuYWdlci5zZWxlY3RlZFBpeGVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1NvbHV0aW9uOiBjb21wYXJlTWFuYWdlci5waXhlbHNTb2x1dGlvbnM/Lmxlbmd0aCA/IGNvbXBhcmVNYW5hZ2VyLnBpeGVsc1NvbHV0aW9uc1swXSA6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDdW11bGF0aXZlXT1cInRvZ2dsZUN1bXVsYXRpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1bUZuXT1cInJlZnJlc2hNYW5hZ2VyLnN1bUZuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdW1WYWx1ZXNdPVwicmVmcmVzaE1hbmFnZXIuc3VtVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lZnJhbWVDb250YWluZXJzXT1cInRpbWVmcmFtZUNvbnRhaW5lcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpbWVmcmFtZURhdGVzXT1cInRpbWVmcmFtZURhdGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yYWFpbi1tYXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZWNobmljYWwgZGV0YWlscyAoY29sbGFwc2libGUgZm9yIGNsZWFuZXIgVUkpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPVwidGVjaG5pY2FsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+SW1hZ2UgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkNvbXB1dGVkOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcERvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5MYXVuY2hlZCBieTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+RGF0ZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlLnRvSVNPU3RyaW5nKCkgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB7eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5XYXRlciBpbiB0aGUgbWFwOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHN1bURldGFpbHMgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Tb3VyY2UgREJaIG1pbjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1pbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlNvdXJjZSBEQlogbWF4Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcE9yaWdpbmFsTWF4IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1jb2w+XG5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBEYXRhIHBhbmVsIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cImRhdGEtY29sdW1uXCIgc2l6ZS1sZz1cIjVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRhLXBhbmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb21wYXJlIHN0YWNrIGNvbXBvbmVudCAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29tcGFyZS1zdGFja1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFhaW4tY29tcGFyZS1zdGFja1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZFBvaW50KT1cIm9uR2F1Z2VTZWxlY3RJbkNvbXBhcmUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBhcmVNYW5hZ2VyXT1cImNvbXBhcmVNYW5hZ2VyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VtdWxhdGl2ZV09XCJ0b2dnbGVDdW11bGF0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmFhaW4tY29tcGFyZS1zdGFjaz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVGVjaG5pY2FsIGRldGFpbHMgKGNvbGxhcHNpYmxlIGZvciBjbGVhbmVyIFVJKSAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscyBjbGFzcz1cInRlY2huaWNhbC1kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdW1tYXJ5PkNvbXBhcmUgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3dhcm5pbmcnOiByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEb25lRGF0ZT8uZ2V0VGltZSgpID4gY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlEb25lRGF0ZT8uZ2V0VGltZSgpICsgNjAwMDB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Db21wdXRlZDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jdXJyZW50UXVhbGl0eURvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmNvbXBhcmVWZXJzaW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+TGF1bmNoZWQgYnk6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jdXJyZW50UXVhbGl0eVRpbWVTcGVudEluTXMgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXM8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5HYXVnZXM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5Db21wYXJlLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlBvaW50czo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5nbG9iYWxDb21wYXJlUG9pbnRzLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdz5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBCb3R0b20gcHJvZ3Jlc3MgYmFyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLXByb2dyZXNzLWJhciAqbmdJZj1cInJlZnJlc2hJblByb2dyZXNzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2J1ZmZlcl09XCIoY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMykpKzAuMDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwiY291bnRzUGVyaW9kLnByb2dyZXNzIC8gKCh0aW1lZnJhbWVEYXRlcz8ubGVuZ3RoIHx8IDEwKSArMylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tcHJvZ3Jlc3MtYmFyPlxuICAgICAgICAgICAgICAgIDwvaW9uLXJvdz5cbiAgICAgICAgICAgIDwvaW9uLWdyaWQ+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG4gICAgPCEtLSBHYXVnZSB2YWx1ZXMgc2VjdGlvbiAtLT5cbiAgICA8aW9uLWNhcmQgKm5nSWY9XCJnYXVnZVNlbGVjdGVkUG9pbnRzLmxlbmd0aCAmJiBnYXVnZVNlbGVjdGVkUG9pbnRzWzBdLnZhbHVlcy5sZW5ndGhcIiBjbGFzcz1cImdhdWdlLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT5cbiAgICAgICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFuYWx5dGljcy1vdXRsaW5lXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICBTZWxlY3RlZCBHYXVnZSBEYXRhXG4gICAgICAgICAgICA8L2lvbi1jYXJkLXRpdGxlPlxuICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8cmFhaW4tZGF0ZS1mb2N1c1xuICAgICAgICAgICAgICAgICAgICBbY3VycmVudEhlaWdodF09XCIzMDBcIlxuICAgICAgICAgICAgICAgICAgICBbZm9jdXNEYXRlXT1cInBlcmlvZEJlZ2luXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZvY3VzUmFuZ2VdPVwiRGF0ZVJhbmdlLkRBWVwiXG4gICAgICAgICAgICAgICAgICAgIFtwb2ludHNdPVwiZ2F1Z2VTZWxlY3RlZFBvaW50c1wiXG4gICAgICAgICAgICAgICAgICAgIFt3aXRob3V0QWxsXT1cInRydWVcIj5cbiAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1mb2N1cz5cbiAgICAgICAgPC9pb24tY2FyZC1jb250ZW50PlxuICAgIDwvaW9uLWNhcmQ+XG5cbjwvZGl2PlxuIl19
362
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFhaW4tZGV0YWlscy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29yZS9zaGFyZWQvcmFhaW4tZGV0YWlscy9yYWFpbi1kZXRhaWxzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uL3NyYy9jb3JlL3NoYXJlZC9yYWFpbi1kZXRhaWxzL3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQXNDLE1BQU0sZUFBZSxDQUFDO0FBRXBGLE9BQU8sRUFBQyxxQkFBcUIsRUFBcUIsTUFBTSxhQUFhLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDbkUsT0FBTyxFQUEyQixvQkFBb0IsRUFBaUIsTUFBTSxVQUFVLENBQUM7Ozs7Ozs7Ozs7QUFVeEYsTUFBTSxPQUFPLHFCQUFxQjtJQXVEOUIsWUFBc0IsT0FBZ0I7UUFBaEIsWUFBTyxHQUFQLE9BQU8sQ0FBUztRQUZuQixjQUFTLEdBQUcsU0FBUyxDQUFDO1FBMEl6QyxnRUFBZ0U7UUFDekQscUJBQWdCLEdBQUcsS0FBSyxFQUFFLFNBQWUsRUFBRSxVQUFxQixFQUFFLEVBQUU7WUFDdkUsT0FBTyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ3ZELENBQUMsQ0FBQztJQTNJdUMsQ0FBQztJQUVsQyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQW1CO1FBQzVDLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLEVBQUU7WUFDTixDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxLQUFLLENBQUM7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Z0JBR0MsY0FBYztzQkFEcEIsS0FBSztnQkFHQyxjQUFjO3NCQURwQixLQUFLO2dCQUdDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBR0MsWUFBWTtzQkFEbEIsS0FBSztnQkFHQyxnQkFBZ0I7c0JBRHRCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UHJvZmlsZVNlcnZpY2V9IGZyb20gJy4uL3Byb2ZpbGUuc2VydmljZSc7XG5pbXBvcnQge0NhcnRlc2lhbk1lYXN1cmVWYWx1ZSwgUmFpbk5vZGUsIFRlYW1Ob2RlfSBmcm9tICdyYWFpbi1tb2RlbCc7XG5pbXBvcnQge0RhdGVSYW5nZSwgTWFwTGF0TG5nLCBUaW1lZnJhbWVDb250YWluZXJzfSBmcm9tICdyYWFpbi11aSc7XG5pbXBvcnQge0NvbXBhcmVNYW5hZ2VyLCBGcmFtZVNldCwgbWFwRGF0ZVJhbmdlVG9TdHJpbmcsIFJlZnJlc2hNYW5hZ2VyfSBmcm9tICcuLi90b29scyc7XG5pbXBvcnQge1hZVHlwZX0gZnJvbSAnLi4veHl0eXBlJztcbmltcG9ydCB7UmFkYXJTZXJ2aWNlfSBmcm9tICcuLi9yYWRhci5zZXJ2aWNlJztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnLi4vc3RvcmFnZS5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdyYWFpbi1kZXRhaWxzJyxcbiAgICB0ZW1wbGF0ZVVybDogJ3JhYWluLWRldGFpbHMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWydyYWFpbi1kZXRhaWxzLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFJhYWluRGV0YWlsc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyB0b2dnbGVBZG1pbjogYm9vbGVhbjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByYWluTm9kZTogUmFpbk5vZGU7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgY29tcGFyZU1hbmFnZXI6IENvbXBhcmVNYW5hZ2VyO1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHJlZnJlc2hNYW5hZ2VyOiBSZWZyZXNoTWFuYWdlcjtcbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwcm9maWxlU2VydmljZTogUHJvZmlsZVNlcnZpY2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcmFkYXJTZXJ2aWNlOiBSYWRhclNlcnZpY2U7XG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgdG9nZ2xlQ3VtdWxhdGl2ZTogYm9vbGVhbjtcblxuICAgIHB1YmxpYyBwZXJpb2RCZWdpbjogRGF0ZTtcbiAgICBwdWJsaWMgcGVyaW9kRW5kOiBEYXRlO1xuXG4gICAgLy8gcHVibGljIFVJIHZhcmlhYmxlc1xuICAgIHB1YmxpYyB0ZWFtTm9kZTogVGVhbU5vZGU7XG4gICAgcHVibGljIHBlcmlvZEJlZ2luQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgcGVyaW9kRW5kQXNTdHJpbmc6IHN0cmluZztcbiAgICBwdWJsaWMgcGVyaW9kRHVyYXRpb25Bc1N0cmluZzogc3RyaW5nO1xuICAgIHB1YmxpYyBkYXRlU2hvd246IERhdGU7XG4gICAgcHVibGljIGNvb3JkaW5hdGVzOiBNYXBMYXRMbmc7XG4gICAgcHVibGljIGJvcmRlcnM6IE1hcExhdExuZ1tdO1xuICAgIHB1YmxpYyB0aW1lZnJhbWVDb250YWluZXJzOiBUaW1lZnJhbWVDb250YWluZXJzO1xuICAgIHB1YmxpYyBjdXJyZW50VGltZWZyYW1lVGFyZ2V0OiBGcmFtZVNldDtcbiAgICBwdWJsaWMgdGltZWZyYW1lRGF0ZXM6IERhdGVbXTtcbiAgICBwdWJsaWMgY291bnRQb2ludHM6IHtcbiAgICAgICAgbGFiZWw6IHN0cmluZztcbiAgICAgICAgc3R5bGU6IHN0cmluZztcbiAgICAgICAgdmFsdWVzOiB7ZGF0ZTogRGF0ZTsgdmFsdWU6IG51bWJlcn1bXTtcbiAgICB9W107XG4gICAgcHVibGljIGNvdW50c1BlcmlvZDoge1xuICAgICAgICBwZXJjZW50SW1hZ2VzPzogWFlUeXBlW107XG4gICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgcHJvZ3Jlc3M/OiBudW1iZXI7XG4gICAgfTtcblxuICAgIHB1YmxpYyBnYXVnZVNlbGVjdGVkUG9pbnRzOiB7XG4gICAgICAgIGxhYmVsOiBzdHJpbmc7XG4gICAgICAgIHN0eWxlOiBzdHJpbmc7XG4gICAgICAgIHZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W107XG4gICAgfVtdO1xuICAgIHB1YmxpYyB0b2dnbGVIaXN0b3J5OiBib29sZWFuO1xuICAgIHB1YmxpYyB0b2dnbGVNYXA6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZUNvbXBhcmU6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZUdhdWdlTWVhc3VyZXM6IGJvb2xlYW47XG4gICAgcHVibGljIHRvZ2dsZVJlbW92ZUNvbXBhcmVEdXBsaWNhdGU6IGJvb2xlYW47XG4gICAgcHVibGljIHJlZnJlc2hJblByb2dyZXNzOiBib29sZWFuO1xuICAgIHB1YmxpYyBzdW1EZXRhaWxzOiBzdHJpbmc7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGVSYW5nZSA9IERhdGVSYW5nZTtcblxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBzdG9yYWdlOiBTdG9yYWdlKSB7fVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgUGVyaW9kRGlzcGxheShkYXRlOiBEYXRlIHwgc3RyaW5nKSB7XG4gICAgICAgIGxldCBkID0gbmV3IERhdGUoKTtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgIGQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgICAgIGNvbnN0IHVzZXJUaW1lem9uZU9mZnNldCA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIDYwMDAwO1xuICAgICAgICAgICAgZCA9IG5ldyBEYXRlKGQuZ2V0VGltZSgpIC0gdXNlclRpbWV6b25lT2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBleGFtcGxlRm9ybWF0dGVkRGF0ZSA9ICcyMDE3LTA2LTAxVDA4OjMwJztcbiAgICAgICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgZXhhbXBsZUZvcm1hdHRlZERhdGUubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBEYXRlVVRDKGRhdGU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBoYXNJU09Gb3JtYXQgPSBkYXRlLm1hdGNoKC9eXFxkezR9LVxcZHsyfS1cXGR7Mn1UXFxkezJ9OlxcZHsyfTpcXGR7Mn1cXC5cXGR7M31aJC8pO1xuICAgICAgICBsZXQgZCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgICAgICBpZiAoIWhhc0lTT0Zvcm1hdCkge1xuICAgICAgICAgICAgY29uc3QgdXNlclRpbWV6b25lT2Zmc2V0ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpICogNjAwMDA7XG4gICAgICAgICAgICBkID0gbmV3IERhdGUoZC5nZXRUaW1lKCkgLSB1c2VyVGltZXpvbmVPZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyBmZXRjaERhdGEoZm9jdXNEYXRlOiBEYXRlLCBmb2N1c1JhbmdlOiBEYXRlUmFuZ2UpIHtcbiAgICAgICAgY29uc3QgdmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTA7IGkrKykge1xuICAgICAgICAgICAgdmFsdWVzLnB1c2goe2RhdGU6IG5ldyBEYXRlKDIwMjAgKyBpLCAwKSwgdmFsdWU6IDEwfSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmFrZURhdGEgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICclIFJhaW55JyxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICBzdHlsZTogJ2JhcicsXG4gICAgICAgICAgICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICB7XG4gICAgICAgICAgICAvLyAgICAgIGxhYmVsOiAnJSBRdWFsaXR5JyxcbiAgICAgICAgICAgIC8vICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgIC8vICAgICAgdmFsdWVzLFxuICAgICAgICAgICAgLy8gIH0sXG4gICAgICAgIF07XG5cbiAgICAgICAgY29uc3QgcmFuZ2UgPSBtYXBEYXRlUmFuZ2VUb1N0cmluZyhmb2N1c1JhbmdlKTtcbiAgICAgICAgbGV0IGRhdGEgPSBmYWtlRGF0YTtcbiAgICAgICAgaWYgKCF0aGlzLnJhaW5Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb2N1c1JhbmdlID09PSBEYXRlUmFuZ2UuQ0VOVFVSWSkge1xuICAgICAgICAgICAgLy8gZmFrZVxuICAgICAgICB9IGVsc2UgaWYgKGZvY3VzUmFuZ2UgPT09IERhdGVSYW5nZS5IT1VSKSB7XG4gICAgICAgICAgICBjb25zdCBob3VyQ291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHNIb3VyKHRoaXMucmFpbk5vZGUuaWQsIHtcbiAgICAgICAgICAgICAgICBwZXJpb2RCZWdpbjogZm9jdXNEYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGRhdGEgPSBbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJ1JhaW55IENvdW50JyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnJhaW55Q291bnQubWFwKChjKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IE1hdGgubWluKDEwMCwgYy54KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogJyUgSW1hZ2VzJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IGhvdXJDb3VudHMucGVyY2VudEltYWdlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnUmFpbnkgU3VtJyxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBob3VyQ291bnRzLnJhaW55U3VtLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdmZXRjaERhdGEgVE9ETzonLCBmb2N1c0RhdGUudG9JU09TdHJpbmcoKSwgcmFuZ2UpO1xuICAgICAgICAgICAgY29uc3QgY291bnRzID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDb3VudHModGhpcy5yYWluTm9kZS5pZCwge1xuICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgIHBlcmlvZEJlZ2luOiBmb2N1c0RhdGUsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgZGF0YSA9IFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnJSBSYWlueScsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudFJhaW55Lm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiBSYWFpbkRldGFpbHNDb21wb25lbnQuRGF0ZVVUQyhjLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICclIEltYWdlcycsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlOiAnYmFyJyxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjb3VudHMucGVyY2VudEltYWdlcy5tYXAoKGMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogUmFhaW5EZXRhaWxzQ29tcG9uZW50LkRhdGVVVEMoYy5uYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogTWF0aC5taW4oMTAwLCBjLngpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyAge1xuICAgICAgICAgICAgICAgIC8vICAgICAgbGFiZWw6ICclIFF1YWxpdHknLFxuICAgICAgICAgICAgICAgIC8vICAgICAgc3R5bGU6ICdsaW5lJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgIHZhbHVlczogY291bnRzLnBlcmNlbnRRLm1hcCgoYykgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIGRhdGU6IFJhYWluRGV0YWlsc0NvbXBvbmVudC5EYXRlVVRDKGMubmFtZSksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgIHZhbHVlOiBNYXRoLm1pbigxMDAsIGMueCksXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAvLyAgICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBmZXRjaERhdGEgRE9ORSAke3JhbmdlfWAsIGRhdGEpO1xuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICAvLyBXcmFwcGVyIGZ1bmN0aW9uIHRoYXQgcHJlc2VydmVzIHRoZSBhc3luYyBuYXR1cmUgb2YgZmV0Y2hEYXRhXG4gICAgcHVibGljIGZldGNoRGF0YVdyYXBwZXIgPSBhc3luYyAoZm9jdXNEYXRlOiBEYXRlLCBmb2N1c1JhbmdlOiBEYXRlUmFuZ2UpID0+IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZmV0Y2hEYXRhKGZvY3VzRGF0ZSwgZm9jdXNSYW5nZSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2hhbmdlKGNoYW5nZXMpLnRoZW4oKGlnbm9yZWQpID0+IHt9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRW5hYmxlQ291bnRIaXN0b3J5VGFiKHJhaW46IFJhaW5Ob2RlKSB7XG4gICAgICAgIGlmICghdGhpcy50b2dnbGVIaXN0b3J5KSB7XG4gICAgICAgICAgICB0aGlzLmNvdW50UG9pbnRzID0gW107XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhc3luYyBvblBlcmlvZEJlZ2luQ2hhbmdlKGV2ZW50OiBhbnkpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBldmVudD8udGFyZ2V0Py52YWx1ZSA/PyB0aGlzLnBlcmlvZEJlZ2luQXNTdHJpbmc7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW4gPSBuZXcgRGF0ZShuZXdWYWx1ZSk7XG4gICAgICAgIHRoaXMucGVyaW9kQmVnaW5Bc1N0cmluZyA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLnN0b3JhZ2Uuc2V0KCdyYWFpbi1wZXJpb2RCZWdpbicsIHRoaXMucGVyaW9kQmVnaW4pO1xuXG4gICAgICAgIGF3YWl0IHRoaXMub25QZXJpb2REdXJhdGlvbkNoYW5nZShldmVudCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25QZXJpb2REdXJhdGlvbkNoYW5nZShfZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGR1cmF0aW9uSW5Ib3VyID0gcGFyc2VGbG9hdCh0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZCA9IG5ldyBEYXRlKHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpICsgZHVyYXRpb25JbkhvdXIgKiAoNjAgKiA2MDAwMCkpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZEFzU3RyaW5nID0gdGhpcy5wZXJpb2RFbmQudG9JU09TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5zdG9yYWdlLnNldCgncmFhaW4tcGVyaW9kRW5kJywgdGhpcy5wZXJpb2RFbmQpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnBlcmlvZCA9IHtiZWdpbjogdGhpcy5wZXJpb2RCZWdpbiwgZW5kOiB0aGlzLnBlcmlvZEVuZH07XG4gICAgfVxuXG4gICAgYXN5bmMgb25EYXRlQ2hhbmdlSW5Db3VudChkYXRlQ2hhbmdlZDogRGF0ZSkge1xuICAgICAgICBjb25zb2xlLmxvZygnb25EYXRlQ2hhbmdlSW5Db3VudCcsIGRhdGVDaGFuZ2VkKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID1cbiAgICAgICAgICAgIGRhdGVDaGFuZ2VkLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDExKSArXG4gICAgICAgICAgICBkYXRlQ2hhbmdlZC50b0xvY2FsZVRpbWVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgNSk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9ICcxJztcbiAgICAgICAgYXdhaXQgdGhpcy5vblBlcmlvZEJlZ2luQ2hhbmdlKG51bGwpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIGFzeW5jIG9uRGF0ZUNoYW5nZUluTWFwKGRhdGVTaG93bjogRGF0ZSkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnb25EYXRlQ2hhbmdlSW5NYXAnLCBkYXRlU2hvd24pO1xuICAgICAgICB0aGlzLmRhdGVTaG93biA9IGRhdGVTaG93bjtcbiAgICAgICAgY29uc3QgY3VtdWxhdGl2ZUhvdXJzOiBudW1iZXIgPSAhdGhpcy50b2dnbGVDdW11bGF0aXZlXG4gICAgICAgICAgICA/IDBcbiAgICAgICAgICAgIDogcGFyc2VGbG9hdCh0aGlzLnBlcmlvZER1cmF0aW9uQXNTdHJpbmcpO1xuICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLmZldGNoKHRoaXMuZGF0ZVNob3duLCB0aGlzLnRvZ2dsZUdhdWdlTWVhc3VyZXMsIGN1bXVsYXRpdmVIb3Vycyk7XG4gICAgICAgIHRoaXMuY3VycmVudFRpbWVmcmFtZVRhcmdldCA9IHRoaXMucmVmcmVzaE1hbmFnZXIuZ2V0VGltZWxpbmVTZWxlY3RlZEZyYW1lU2V0KCk7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaE1hbmFnZXIuc2V0UmVwb3J0UGVyaW9kKHRoaXMuZGF0ZVNob3duKTtcbiAgICB9XG5cbiAgICBhc3luYyBvblN1bUNoYW5nZUluTWFwKHN1bTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuc3VtRGV0YWlscyA9IHN1bTtcbiAgICB9XG5cbiAgICBhc3luYyBvbkdhdWdlU2VsZWN0SW5NYXAobWFwTGF0TG5nOiBNYXBMYXRMbmcpIHtcbiAgICAgICAgY29uc3QgZ2F1Z2VzRmlsdGVyZWQgPSB0aGlzLmNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luTWFwLmZpbHRlcihcbiAgICAgICAgICAgIChnKSA9PiBnLmxhdCA9PT0gbWFwTGF0TG5nLmxhdCAmJiBnLmxuZyA9PT0gbWFwTGF0TG5nLmxuZ1xuICAgICAgICApO1xuICAgICAgICBpZiAoZ2F1Z2VzRmlsdGVyZWQubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2F1Z2VTZWxlY3RlZCA9IGdhdWdlc0ZpbHRlcmVkWzBdO1xuXG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdhdWdlVmFsdWVzKHtpZDogZ2F1Z2VTZWxlY3RlZC5pZCwgbmFtZTogZ2F1Z2VTZWxlY3RlZC5uYW1lfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZWxlY3RHYXVnZShnYXVnZVNlbGVjdGVkLmlkLCAwKTtcbiAgICB9XG5cbiAgICBhc3luYyByZWZyZXNoR2F1Z2VWYWx1ZXMoZ2F1Z2VTZWxlY3RlZDoge2lkOiBzdHJpbmc7IG5hbWU6IHN0cmluZ30pIHtcbiAgICAgICAgY29uc3QgZGF5QmVnaW4gPSBuZXcgRGF0ZSh0aGlzLnBlcmlvZEJlZ2luLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDEwKSk7XG4gICAgICAgIGNvbnN0IGRheUVuZCA9IG5ldyBEYXRlKGRheUJlZ2luLmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDAgLSAxKTtcbiAgICAgICAgY29uc3QgZ2F1Z2VNZWFzdXJlcyA9IGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UuZ2V0R2F1Z2VNZWFzdXJlcyhcbiAgICAgICAgICAgIGdhdWdlU2VsZWN0ZWQuaWQsXG4gICAgICAgICAgICBkYXlCZWdpbixcbiAgICAgICAgICAgIGRheUVuZFxuICAgICAgICApO1xuICAgICAgICBjb25zdCBnYXVnZVZhbHVlczoge2RhdGU6IERhdGU7IHZhbHVlOiBudW1iZXJ9W10gPSBnYXVnZU1lYXN1cmVzLm1hcCgoZ20pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZSA9IG5ldyBDYXJ0ZXNpYW5NZWFzdXJlVmFsdWUoZ20udmFsdWVzWzBdIGFzIGFueSk7XG4gICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNhcnRlc2lhbk1lYXN1cmVWYWx1ZS5nZXRDYXJ0ZXNpYW5WYWx1ZXMoKVswXS52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB7ZGF0ZTogZ20uZGF0ZSwgdmFsdWV9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxhYmVsOiBnYXVnZVNlbGVjdGVkLm5hbWUsXG4gICAgICAgICAgICAgICAgc3R5bGU6ICdiYXInLFxuICAgICAgICAgICAgICAgIHZhbHVlczogZ2F1Z2VWYWx1ZXMsXG4gICAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzOicsIHRoaXMuZ2F1Z2VTZWxlY3RlZFBvaW50cyk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25HYXVnZVNlbGVjdEluQ29tcGFyZShlOiB7cG9pbnQ6IFhZVHlwZTsgY29tcGFyZUluZGV4OiBudW1iZXJ9KSB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVmcmVzaEdhdWdlVmFsdWVzKHtpZDogZS5wb2ludC5pZCwgbmFtZTogZS5wb2ludC5uYW1lfSk7XG5cbiAgICAgICAgYXdhaXQgdGhpcy5jb21wYXJlTWFuYWdlci5zZWxlY3RHYXVnZShlLnBvaW50LmlkLCBlLmNvbXBhcmVJbmRleCk7XG4gICAgfVxuXG4gICAgYXN5bmMgb25Ub2dnbGVNYXAoJGV2ZW50OiBFdmVudCkge1xuICAgICAgICAvLyBpZiAodGhpcy50b2dnbGVNYXApIHtcbiAgICAgICAgLy8gICAgYXdhaXQgdGhpcy5yZWZyZXNoTWFwKCk7XG4gICAgICAgIC8vIH1cbiAgICB9XG5cbiAgICBvbkNoYW5nZURldGVjdGlvblRlc3QocmFpbk5vZGU6IFJhaW5Ob2RlKSB7XG4gICAgICAgIC8vIFRPRE8gY29uc29sZS5sb2coVEVTVF9ERVRFQ1RJT04rKywgJ29uQ2hhbmdlRGV0ZWN0aW9uVGVzdCcpO1xuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgYXN5bmMgcmVmcmVzaE1hcCgpIHtcbiAgICAgICAgdGhpcy5nYXVnZVNlbGVjdGVkUG9pbnRzID0gW107XG4gICAgICAgIC8vIHRoaXMucXVhbGl0eUNvbmYudHJ1c3RmdWxHYXVnZUlkcyA9IHRoaXMucXVhbGl0eUNvbmYudHJ1c3RmdWxHYXVnZUlkcz8ubGVuZ3RoID4gMCA/XG4gICAgICAgIC8vICB0aGlzLnF1YWxpdHlDb25mLnRydXN0ZnVsR2F1Z2VJZHMgOiB0aGlzLmdhdWdlc1RvRmlsdGVyLmZpbHRlcihnID0+IGcuaXNJbikubWFwKGcgPT4gZy5pZCk7XG4gICAgICAgIHRoaXMuYm9yZGVycyA9IFtcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlIC0gMjUwICogMC4wMDgsIHJhaW5Ob2RlLmxvbmdpdHVkZSksXG4gICAgICAgICAgICAvLyAgbmV3IE1hcExhdExuZyhyYWluTm9kZS5sYXRpdHVkZSwgcmFpbk5vZGUubG9uZ2l0dWRlIC0gMjUwICogMC4wMTMpLFxuICAgICAgICAgICAgLy8gIG5ldyBNYXBMYXRMbmcocmFpbk5vZGUubGF0aXR1ZGUsIHJhaW5Ob2RlLmxvbmdpdHVkZSArIDI1MCAqIDAuMDEzKSxcbiAgICAgICAgICAgIC8vICBuZXcgTWFwTGF0TG5nKHJhaW5Ob2RlLmxhdGl0dWRlICsgMjUwICogMC4wMDgsIHJhaW5Ob2RlLmxvbmdpdHVkZSksXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5jb21wYXJlTWFuYWdlci5jbGVhbkFsbCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmNvbXBhcmVNYW5hZ2VyLnNldEdhdWdlc0luTWFwKCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdGhpcy50b2dnbGVBZG1pbik7XG4gICAgfVxuXG4gICAgYXN5bmMgbGF1bmNoQ29tcHV0YXRpb24oKSB7XG4gICAgICAgIGF3YWl0IHRoaXMucHJvZmlsZVNlcnZpY2UubGF1bmNoUmFpbkNvbXB1dGF0aW9uKHRoaXMucmFpbk5vZGUuaWQsIHRoaXMuZGF0ZVNob3duKTtcbiAgICB9XG5cbiAgICBhc3luYyBzZXRQZXJpb2RPZk5vdygpIHtcbiAgICAgICAgLy8gc2hvdWxkIGxvb2sgbGlrZTogXCIyMDI0LTA4LTI2VDEyOjEzXCJcbiAgICAgICAgY29uc3QgbGFzdDMwbW4gPSBuZXcgRGF0ZSgpO1xuICAgICAgICBsYXN0MzBtbi5zZXRNaW51dGVzKGxhc3QzMG1uLmdldE1pbnV0ZXMoKSAtIDMwKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID1cbiAgICAgICAgICAgIGxhc3QzMG1uLnRvSVNPU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDExKSArIGxhc3QzMG1uLnRvTG9jYWxlVGltZVN0cmluZygpLnN1YnN0cmluZygwLCA1KTtcbiAgICAgICAgdGhpcy5wZXJpb2REdXJhdGlvbkFzU3RyaW5nID0gJzEnO1xuICAgICAgICBhd2FpdCB0aGlzLm9uUGVyaW9kQmVnaW5DaGFuZ2UobnVsbCk7XG4gICAgICAgIHRoaXMucmVmcmVzaE1hbmFnZXIucmVmcmVzaChmYWxzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgZ2V0UGVyY2VudE9mSW1hZ2VzKCkge1xuICAgICAgICBpZiAoIXRoaXMuY291bnRzUGVyaW9kLnBlcmNlbnRJbWFnZXM/Lmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkdXJpbmdQZXJpb2QgPSB0aGlzLmNvdW50c1BlcmlvZC5wZXJjZW50SW1hZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChhKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucGVyaW9kQmVnaW4uZ2V0VGltZSgpIDw9IG5ldyBEYXRlKGEubmFtZSkuZ2V0VGltZSgpICYmXG4gICAgICAgICAgICAgICAgbmV3IERhdGUoYS5uYW1lKS5nZXRUaW1lKCkgPD0gdGhpcy5wZXJpb2RFbmQuZ2V0VGltZSgpXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHN1bW1lZCA9IGR1cmluZ1BlcmlvZC5yZWR1Y2UoKGEsIGIpID0+IGEgKyAoYi54ID8/IDApLCAwKTtcbiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoc3VtbWVkIC8gZHVyaW5nUGVyaW9kLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkge1xuICAgICAgICBjb25zdCB0aW1lbGluZSA9IHRoaXMucmVmcmVzaE1hbmFnZXIuZ2V0VGltZWxpbmVGcmFtZVNldCgpO1xuICAgICAgICBpZiAoIXRpbWVsaW5lPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdGltZWxpbmVXaXRoQ29tcHV0YXRpb24gPSB0aW1lbGluZS5maWx0ZXIoKGEpID0+ICEhYS5yYWluQ29tcHV0YXRpb25JZCk7XG4gICAgICAgIGNvbnN0IHJhdGlvID0gdGltZWxpbmVXaXRoQ29tcHV0YXRpb24ubGVuZ3RoIC8gdGltZWxpbmUubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChyYXRpbyAqIDEwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbkFsbCgpIHtcbiAgICAgICAgdGhpcy5ib3JkZXJzID0gW107XG5cbiAgICAgICAgdGhpcy50aW1lZnJhbWVDb250YWluZXJzID0gbmV3IFRpbWVmcmFtZUNvbnRhaW5lcnMoW10pO1xuICAgICAgICB0aGlzLmN1cnJlbnRUaW1lZnJhbWVUYXJnZXQgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbWVmcmFtZURhdGVzID0gW107XG4gICAgICAgIHRoaXMuY291bnRQb2ludHMgPSBbXTtcbiAgICAgICAgdGhpcy5jb3VudHNQZXJpb2QgPSB7cHJvZ3Jlc3M6IDAsIHF1ZXVlUnVubmluZzogMCwgcGVyY2VudEltYWdlczogW119O1xuICAgICAgICB0aGlzLmdhdWdlU2VsZWN0ZWRQb2ludHMgPSBbXTtcblxuICAgICAgICB0aGlzLnRvZ2dsZUhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVNYXAgPSB0cnVlO1xuICAgICAgICB0aGlzLnRvZ2dsZUNvbXBhcmUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2dnbGVHYXVnZU1lYXN1cmVzID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9nZ2xlUmVtb3ZlQ29tcGFyZUR1cGxpY2F0ZSA9IHRydWU7XG5cbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbiA9IG5ldyBEYXRlKHRoaXMuc3RvcmFnZS5nZXQoJ3JhYWluLXBlcmlvZEJlZ2luJykpO1xuICAgICAgICB0aGlzLnBlcmlvZEVuZCA9IG5ldyBEYXRlKHRoaXMuc3RvcmFnZS5nZXQoJ3JhYWluLXBlcmlvZEVuZCcpKTtcbiAgICAgICAgdGhpcy5wZXJpb2RCZWdpbkFzU3RyaW5nID0gUmFhaW5EZXRhaWxzQ29tcG9uZW50LlBlcmlvZERpc3BsYXkodGhpcy5wZXJpb2RCZWdpbik7XG4gICAgICAgIHRoaXMucGVyaW9kRW5kQXNTdHJpbmcgPSBSYWFpbkRldGFpbHNDb21wb25lbnQuUGVyaW9kRGlzcGxheSh0aGlzLnBlcmlvZEVuZCk7XG4gICAgICAgIHRoaXMucGVyaW9kRHVyYXRpb25Bc1N0cmluZyA9XG4gICAgICAgICAgICAnJyArICh0aGlzLnBlcmlvZEVuZC5nZXRUaW1lKCkgLSB0aGlzLnBlcmlvZEJlZ2luLmdldFRpbWUoKSkgLyAoNjAgKiA2MDAwMCk7XG5cbiAgICAgICAgdGhpcy5kYXRlU2hvd24gPSB0aGlzLnBlcmlvZEJlZ2luO1xuXG4gICAgICAgIHRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmNvbXBhcmVNYW5hZ2VyPy5jbGVhbkFsbCgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyPy5jbGVhbkFsbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgaW5pdCgpIHtcbiAgICAgICAgdGhpcy5jbGVhbkFsbCgpO1xuICAgICAgICBhd2FpdCB0aGlzLmluaXRSYWluKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBpbml0UmFpbigpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJhaW5Ob2RlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJhaW5Ob2RlID0gdGhpcy5yYWluTm9kZTtcbiAgICAgICAgdGhpcy5jb21wYXJlTWFuYWdlci5yYWluTm9kZSA9IHRoaXMucmFpbk5vZGU7XG5cbiAgICAgICAgdGhpcy5yZWZyZXNoTWFuYWdlci5zZXRNZXRob2RzKFxuICAgICAgICAgICAgdGhpcy5vblJlZnJlc2hJblByb2dyZXNzLmJpbmQodGhpcyksXG4gICAgICAgICAgICB0aGlzLm9uUmVmcmVzaERvbmUuYmluZCh0aGlzKSxcbiAgICAgICAgICAgIHRoaXMub25GZXRjaERvbmUuYmluZCh0aGlzKVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGNlbnRlciA9IHRoaXMucmFpbk5vZGUuZ2V0Q2VudGVyKCk7XG4gICAgICAgIHRoaXMuY29vcmRpbmF0ZXMgPSBuZXcgTWFwTGF0TG5nKGNlbnRlci5sYXQsIGNlbnRlci5sbmcpO1xuICAgICAgICB0aGlzLnRlYW1Ob2RlID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRUZWFtKHRoaXMucmFpbk5vZGUuZ2V0TGluaygndGVhbScpLmdldElkKCkpO1xuXG4gICAgICAgIGlmICh0aGlzLnBlcmlvZEJlZ2luICYmIHRoaXMucGVyaW9kRW5kKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hNYW5hZ2VyLnBlcmlvZCA9IHtiZWdpbjogdGhpcy5wZXJpb2RCZWdpbiwgZW5kOiB0aGlzLnBlcmlvZEVuZH07XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnJlZnJlc2hNYW5hZ2VyLnJlZnJlc2goZmFsc2UsIHRoaXMudG9nZ2xlQWRtaW4pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBvblJlZnJlc2hJblByb2dyZXNzKFxuICAgICAgICBjb3VudFBlcmlvZHM6IHtcbiAgICAgICAgICAgIHBlcmNlbnRJbWFnZXM/OiBYWVR5cGVbXTtcbiAgICAgICAgICAgIHF1ZXVlUnVubmluZz86IG51bWJlcjtcbiAgICAgICAgICAgIHByb2dyZXNzPzogbnVtYmVyO1xuICAgICAgICB9LFxuICAgICAgICB0aW1lZnJhbWVEYXRlczogRGF0ZVtdXG4gICAgKSB7XG4gICAgICAgIHRoaXMucmVmcmVzaEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICB0aGlzLmNvdW50c1BlcmlvZCA9IGNvdW50UGVyaW9kcztcbiAgICAgICAgdGhpcy50aW1lZnJhbWVEYXRlcyA9IHRpbWVmcmFtZURhdGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25SZWZyZXNoRG9uZSh0aW1lZnJhbWVEYXRlczogRGF0ZVtdKSB7XG4gICAgICAgIHRoaXMudGltZWZyYW1lRGF0ZXMgPSB0aW1lZnJhbWVEYXRlcztcbiAgICAgICAgdGhpcy5yZWZyZXNoSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgb25GZXRjaERvbmUodGltZWZyYW1lQ29udGFpbmVyczogVGltZWZyYW1lQ29udGFpbmVycykge1xuICAgICAgICB0aGlzLnRpbWVmcmFtZUNvbnRhaW5lcnMgPSB0aW1lZnJhbWVDb250YWluZXJzO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgY2hhbmdlKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5pbml0KCk7XG4gICAgfVxufVxuIiwiPCEtLSBNYWluIGNvbnRlbnQgY29udGFpbmVyIC0tPlxuPGRpdiAqbmdJZj1cInJhaW5Ob2RlXCIgY2xhc3M9XCJyYWFpbi1kZXRhaWxzLWNvbnRhaW5lclwiPlxuXG4gICAgPCEtLSBIZWFkZXIgc2VjdGlvbiB3aXRoIG5vZGUgaW5mb1xuICAgIDxpb24tY2FyZCBjbGFzcz1cIm5vZGUtaW5mby1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtc3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiAqbmdJZj1cIihyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwic3VjY2Vzc1wiIG5hbWU9XCJjaGVja21hcmstY2lyY2xlXCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiIShyYWluTm9kZSB8IGhhc0dvb2RRdWFsaXR5KVwiIGNvbG9yPVwid2FybmluZ1wiIG5hbWU9XCJhbGVydC1jaXJjbGVcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub2RlLXRpdGxlc1wiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+e3sgcmFpbk5vZGUubmFtZSB9fTwvaW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgICAgIDxpb24tY2FyZC1zdWJ0aXRsZT5ieSB7eyB0ZWFtTm9kZT8ubmFtZSB9fTwvaW9uLWNhcmQtc3VidGl0bGU+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vZGUtY29udHJvbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbCBjbGFzcz1cInRvZ2dsZS1sYWJlbFwiPkhpc3Rvcnk8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi10b2dnbGUgKGlvbkNoYW5nZSk9XCJvbkVuYWJsZUNvdW50SGlzdG9yeVRhYihyYWluTm9kZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRvZ2dsZUhpc3RvcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXRvZ2dsZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cbi0tPlxuXG4gICAgPCEtLSBQZXJpb2Qgc2VsZWN0aW9uIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkIGNsYXNzPVwicGVyaW9kLWNhcmRcIj5cbiAgICAgICAgPGlvbi1jYXJkLWNvbnRlbnQ+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cInNldFBlcmlvZE9mTm93KClcIiBjbGFzcz1cIm5vdy1idXR0b25cIiBmaWxsPVwib3V0bGluZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0aW1lLW91dGxpbmVcIiBzbG90PVwic3RhcnRcIj48L2lvbi1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgTm93XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGVyaW9kLXN0YXJ0IGlvbi1oaWRlLW1kLWRvd25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+U3RhcnQ6PC9pb24tbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvblBlcmlvZEJlZ2luQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJwZXJpb2RCZWdpbkFzU3RyaW5nXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImRhdGV0aW1lLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBlcmlvZC1kdXJhdGlvbiBpb24taGlkZS1tZC1kb3duXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPkR1cmF0aW9uOjwvaW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3QgKGlvbkRpc21pc3MpPVwib25QZXJpb2REdXJhdGlvbkNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGVyaW9kRHVyYXRpb25Bc1N0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImR1cmF0aW9uLXNlbGVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cInBlcmlvZER1cmF0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZT1cInBvcG92ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCIwLjI1XCI+MTUgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMC41XCI+MzAgbWludXRlczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMVwiPjEgaG91cjwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiMlwiPjIgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjNcIj4zIGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW9uLXNlbGVjdC1vcHRpb24gdmFsdWU9XCI0XCI+NCBob3VyczwvaW9uLXNlbGVjdC1vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlvbi1zZWxlY3Qtb3B0aW9uIHZhbHVlPVwiNVwiPjUgaG91cnM8L2lvbi1zZWxlY3Qtb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tc2VsZWN0LW9wdGlvbiB2YWx1ZT1cIjZcIj42IGhvdXJzPC9pb24tc2VsZWN0LW9wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvaW9uLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD1cImFsbC1kYXRlc1wiIHNsb3Q9XCJlbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWwgY2xhc3M9XCJ0b2dnbGUtbGFiZWxcIj5BbGwgZGF0ZXM8L2lvbi1sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24tdG9nZ2xlIChpb25DaGFuZ2UpPVwib25FbmFibGVDb3VudEhpc3RvcnlUYWIocmFpbk5vZGUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidG9nZ2xlSGlzdG9yeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJ0b2dnbGVIaXN0b3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2lvbi10b2dnbGU+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBIaWRkZW4gbGFiZWwgZm9yIGNoYW5nZSBkZXRlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImhpZGRlbi1sYWJlbFwiPnt7IG9uQ2hhbmdlRGV0ZWN0aW9uVGVzdChyYWluTm9kZSkgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8IS0tIEhpc3RvcmljYWwgbWFwIHNlY3Rpb24gLS0+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidG9nZ2xlSGlzdG9yeVwiIGNsYXNzPVwicGVyaW9kLWNvbnRyb2xzXCI+XG4gICAgICAgICAgICAgICAgPHJhYWluLWRhdGUtZHluYW1pYyAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5Db3VudCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjdXJyZW50SGVpZ2h0XT1cIjMwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmV0Y2hEYXRhXT1cImZldGNoRGF0YVdyYXBwZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvaW50c109XCJjb3VudFBvaW50c1wiPlxuICAgICAgICAgICAgICAgIDwvcmFhaW4tZGF0ZS1keW5hbWljPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG5cbiAgICA8IS0tIE1hcCBzZWN0aW9uIC0tPlxuICAgIDxpb24tY2FyZCBjbGFzcz1cIm1hcC1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50IGNsYXNzPVwibWFwLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxpb24tZ3JpZD5cbiAgICAgICAgICAgICAgICA8aW9uLXJvdyBpZD1cInByb2dyZXNzQW5kUmVmcmVzaFwiPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJnZXRQZXJjZW50T2ZDb21wdXRhdGlvbnMoKVwiIGNsYXNzPVwibWFwLXN0YXRzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZ2V0UGVyY2VudE9mQ29tcHV0YXRpb25zKCkgfX0lIEltYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY291bnRzUGVyaW9kLnByb2dyZXNzXCIgY2xhc3M9XCJwcm9ncmVzcy1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gUHJvZ3Jlc3M6IHt7IGNvdW50c1BlcmlvZC5wcm9ncmVzcyB9fS4uLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiIWdldFBlcmNlbnRPZkNvbXB1dGF0aW9ucygpXCIgY2xhc3M9XCJuby1kYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm8gaW1hZ2UgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWxhYmVsPlxuXG4gICAgICAgICAgICAgICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJyZWZyZXNoTWFwKClcIiAqbmdJZj1cIiFyZWZyZXNoSW5Qcm9ncmVzc1wiIGNsYXNzPVwicmVmcmVzaC1idXR0b25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicmVmcmVzaC1vdXRsaW5lXCIgc2xvdD1cInN0YXJ0XCI+PC9pb24taWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFJlZnJlc2ggTWFwXG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWJ1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIFByb2dyZXNzIGluZGljYXRvciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgKm5nSWY9XCJyZWZyZXNoSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJdPVwiKGNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpKSswLjAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXByb2dyZXNzLWJhcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3cgKm5nSWY9XCJ0b2dnbGVNYXAgJiYgZ2V0UGVyY2VudE9mSW1hZ2VzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSBNYXAgY29tcG9uZW50IC0tPlxuICAgICAgICAgICAgICAgICAgICA8aW9uLWNvbCBjbGFzcz1cIm1hcC1jb2x1bW5cIiBzaXplLWxnPVwiN1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1hcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmFhaW4tbWFwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlZERhdGUpPVwib25EYXRlQ2hhbmdlSW5NYXAoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhbmdlZFN1bSk9XCJvblN1bUNoYW5nZUluTWFwKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkTWFya2VyKT1cIm9uR2F1Z2VTZWxlY3RJbk1hcCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb29yZGluYXRlc109XCJjb29yZGluYXRlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY3VycmVudEhlaWdodF09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RlZmF1bHREYXRlXT1cImRhdGVTaG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWFya2Vyc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VzOiBjb21wYXJlTWFuYWdlci5nYXVnZXNJbk1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlc0luQ29tcGFyZTogY29tcGFyZU1hbmFnZXIuZ2F1Z2VzSW5Db21wYXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRHYXVnZXM6IGNvbXBhcmVNYW5hZ2VyLnNlbGVjdGVkR2F1Z2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWxzOiBjb21wYXJlTWFuYWdlci5zZWxlY3RlZFBpeGVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpeGVsc1NvbHV0aW9uOiBjb21wYXJlTWFuYWdlci5waXhlbHNTb2x1dGlvbnM/Lmxlbmd0aCA/IGNvbXBhcmVNYW5hZ2VyLnBpeGVsc1NvbHV0aW9uc1swXSA6IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dDdW11bGF0aXZlXT1cInRvZ2dsZUN1bXVsYXRpdmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1bUZuXT1cInJlZnJlc2hNYW5hZ2VyLnN1bUZuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdW1WYWx1ZXNdPVwicmVmcmVzaE1hbmFnZXIuc3VtVmFsdWVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aW1lZnJhbWVDb250YWluZXJzXT1cInRpbWVmcmFtZUNvbnRhaW5lcnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RpbWVmcmFtZURhdGVzXT1cInRpbWVmcmFtZURhdGVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yYWFpbi1tYXA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGEtY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUZWNobmljYWwgZGV0YWlscyAoY29sbGFwc2libGUgZm9yIGNsZWFuZXIgVUkpIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzPVwidGVjaG5pY2FsLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+SW1hZ2UgRGV0YWlsczwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkNvbXB1dGVkOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcERvbmVEYXRlIHwgZGF0ZToneXl5eS1NTS1kZCBISDptbScgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5WZXJzaW9uOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IHJlZnJlc2hNYW5hZ2VyLnJhaW5Db21wdXRhdGlvbk1hcFZlcnNpb24gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5MYXVuY2hlZCBieTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBMYXVuY2hlZEJ5IH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VGltZSBzcGVudDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+RGF0ZTo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBEYXRlPy50b0lTT1N0cmluZygpIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwge3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+V2F0ZXIgaW4gdGhlIG1hcDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBzdW1EZXRhaWxzIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+U291cmNlIERCWiBtaW46PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwT3JpZ2luYWxNaW4gfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Tb3VyY2UgREJaIG1heDo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyByZWZyZXNoTWFuYWdlci5yYWluQ29tcHV0YXRpb25NYXBPcmlnaW5hbE1heCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9pb24tY29sPlxuXG4gICAgICAgICAgICAgICAgICAgIDwhLS0gRGF0YSBwYW5lbCAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1jb2wgY2xhc3M9XCJkYXRhLWNvbHVtblwiIHNpemUtbGc9XCI1XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0YS1wYW5lbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ29tcGFyZSBzdGFjayBjb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbXBhcmUtc3RhY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJhYWluLWNvbXBhcmUtc3RhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWRQb2ludCk9XCJvbkdhdWdlU2VsZWN0SW5Db21wYXJlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wYXJlTWFuYWdlcl09XCJjb21wYXJlTWFuYWdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2N1bXVsYXRpdmVdPVwidG9nZ2xlQ3VtdWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JhYWluLWNvbXBhcmUtc3RhY2s+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRlY2huaWNhbCBkZXRhaWxzIChjb2xsYXBzaWJsZSBmb3IgY2xlYW5lciBVSSkgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRldGFpbHMgY2xhc3M9XCJ0ZWNobmljYWwtZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3VtbWFyeT5Db21wYXJlIERldGFpbHM8L3N1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3YXJuaW5nJzogcmVmcmVzaE1hbmFnZXIucmFpbkNvbXB1dGF0aW9uTWFwRG9uZURhdGU/LmdldFRpbWUoKSA+IGNvbXBhcmVNYW5hZ2VyLmN1cnJlbnRRdWFsaXR5RG9uZURhdGU/LmdldFRpbWUoKSArIDYwMDAwfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+Q29tcHV0ZWQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlEb25lRGF0ZSB8IGRhdGU6J3l5eXktTU0tZGQgSEg6bW0nIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VmVyc2lvbjo8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj57eyBjb21wYXJlTWFuYWdlci5jb21wYXJlVmVyc2lvbiB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPkxhdW5jaGVkIGJ5Ojwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmN1cnJlbnRRdWFsaXR5TGF1bmNoZWRCeSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlRpbWUgc3BlbnQ6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuY3VycmVudFF1YWxpdHlUaW1lU3BlbnRJbk1zIH19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlsLXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+R2F1Z2VzOjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPnt7IGNvbXBhcmVNYW5hZ2VyLmdhdWdlc0luQ29tcGFyZS5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWwtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5Qb2ludHM6PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3sgY29tcGFyZU1hbmFnZXIuZ2xvYmFsQ29tcGFyZVBvaW50cy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXRhaWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLWNvbD5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICAgICAgPGlvbi1yb3c+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gQm90dG9tIHByb2dyZXNzIGJhciAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGlvbi1wcm9ncmVzcy1iYXIgKm5nSWY9XCJyZWZyZXNoSW5Qcm9ncmVzc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtidWZmZXJdPVwiKGNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpKSswLjAxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cImNvdW50c1BlcmlvZC5wcm9ncmVzcyAvICgodGltZWZyYW1lRGF0ZXM/Lmxlbmd0aCB8fCAxMCkgKzMpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCI+XG4gICAgICAgICAgICAgICAgICAgIDwvaW9uLXByb2dyZXNzLWJhcj5cbiAgICAgICAgICAgICAgICA8L2lvbi1yb3c+XG4gICAgICAgICAgICA8L2lvbi1ncmlkPlxuICAgICAgICA8L2lvbi1jYXJkLWNvbnRlbnQ+XG4gICAgPC9pb24tY2FyZD5cblxuICAgIDwhLS0gR2F1Z2UgdmFsdWVzIHNlY3Rpb24gLS0+XG4gICAgPGlvbi1jYXJkICpuZ0lmPVwiZ2F1Z2VTZWxlY3RlZFBvaW50cy5sZW5ndGggJiYgZ2F1Z2VTZWxlY3RlZFBvaW50c1swXS52YWx1ZXMubGVuZ3RoXCIgY2xhc3M9XCJnYXVnZS1jYXJkXCI+XG4gICAgICAgIDxpb24tY2FyZC1oZWFkZXI+XG4gICAgICAgICAgICA8aW9uLWNhcmQtdGl0bGU+XG4gICAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhbmFseXRpY3Mtb3V0bGluZVwiPjwvaW9uLWljb24+XG4gICAgICAgICAgICAgICAgU2VsZWN0ZWQgR2F1Z2UgRGF0YVxuICAgICAgICAgICAgPC9pb24tY2FyZC10aXRsZT5cbiAgICAgICAgPC9pb24tY2FyZC1oZWFkZXI+XG4gICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxuICAgICAgICAgICAgPHJhYWluLWRhdGUtZm9jdXNcbiAgICAgICAgICAgICAgICAgICAgW2N1cnJlbnRIZWlnaHRdPVwiMzAwXCJcbiAgICAgICAgICAgICAgICAgICAgW2ZvY3VzRGF0ZV09XCJwZXJpb2RCZWdpblwiXG4gICAgICAgICAgICAgICAgICAgIFtmb2N1c1JhbmdlXT1cIkRhdGVSYW5nZS5EQVlcIlxuICAgICAgICAgICAgICAgICAgICBbcG9pbnRzXT1cImdhdWdlU2VsZWN0ZWRQb2ludHNcIlxuICAgICAgICAgICAgICAgICAgICBbd2l0aG91dEFsbF09XCJ0cnVlXCI+XG4gICAgICAgICAgICA8L3JhYWluLWRhdGUtZm9jdXM+XG4gICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cbiAgICA8L2lvbi1jYXJkPlxuXG48L2Rpdj5cbiJdfQ==