@eqproject/eqp-dynamic-module 2.10.57 → 2.10.60

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.
@@ -17,7 +17,8 @@ import * as i4 from "@angular/material/core";
17
17
  import * as i5 from "@angular/material/select";
18
18
  import * as i6 from "@angular/material/card";
19
19
  import * as i7 from "@angular/material/table";
20
- import * as i8 from "tmw-picker";
20
+ import * as i8 from "@angular/forms";
21
+ import * as i9 from "tmw-picker";
21
22
  export class HListFormRecordComponent {
22
23
  //#region Constructor
23
24
  constructor(utilityHelperService, changeDetector, datepipe) {
@@ -782,10 +783,10 @@ export class HListFormRecordComponent {
782
783
  }
783
784
  }
784
785
  HListFormRecordComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: HListFormRecordComponent, deps: [{ token: i1.UtilityHelperService }, { token: i0.ChangeDetectorRef }, { token: i2.DatePipe }], target: i0.ɵɵFactoryTarget.Component });
785
- HListFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: HListFormRecordComponent, selector: "hlist-form-record", inputs: { configurations: "configurations", endPointConfiguration: "endPointConfiguration", formID: "formID", form: "form", formulaObject: "formulaObject", externalButtons: "externalButtons", actionButtons: "actionButtons" }, outputs: { onViewRecord: "onViewRecord", onAddViewEditRecord: "onAddViewEditRecord", onDeleteRecord: "onDeleteRecord", onAfterDeleteRecord: "onAfterDeleteRecord" }, viewQueries: [{ propertyName: "tableRecords", first: true, predicate: ["tableRecords"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card class=\"list-form-record\">\r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"loadedFilters && showTitle\"\r\n >Elenco {{ form.Name }}</mat-card-title\r\n >\r\n <!-- <mat-card-actions>\r\n <button\r\n class=\"btn btn-primary\"\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </mat-card-actions> -->\r\n </mat-card-header>\r\n <mat-card-content>\r\n <!--#region FILTERS -->\r\n <div class=\"row mt-2\" *ngIf=\"loadedFilters\">\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo inizio'\"\r\n [label]=\"'Periodo inizio'\"\r\n [(ngModelInput)]=\"minDate\"\r\n (ngModelInputChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'DD/MM/YYYY'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo fine'\"\r\n [label]=\"'Periodo fine'\"\r\n [(ngModelInput)]=\"maxDate\"\r\n (ngModelInputChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'DD/MM/YYYY'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Selezione dei campi</mat-label>\r\n <mat-select (selectionChange)=\"onSelectionChange($event)\" multiple>\r\n <mat-option *ngFor=\"let property of properties\" [value]=\"property\">\r\n {{ propertiesLabel[property.label] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <!-- <div class=\"col-sm-12 col-md-3 mt-2\">\r\n <button\r\n [disabled]=\"\r\n selectedProperties == null || selectedProperties.length == 0\r\n \"\r\n class=\"btn btn-graph-generate button-next me-2\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"filterDataAnswers()\"\r\n >\r\n Genera\r\n </button>\r\n </div> -->\r\n </div>\r\n <!--#endregion FILTERS -->\r\n\r\n <!--#region TABLE -->\r\n <div\r\n *ngIf=\"filteredAnswers && filteredAnswers.length > 0; else no_answers\"\r\n class=\"table-container mt-3 mb-2\"\r\n >\r\n <table\r\n mat-table\r\n [dataSource]=\"selectedProperties\"\r\n class=\"mat-elevation-z8 mat-table-fixed\"\r\n >\r\n <!-- Colonna fissa per le propriet\u00E0 -->\r\n <ng-container matColumnDef=\"property\" sticky>\r\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column\">\r\n Data Inserimento\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let selectedProperties\"\r\n class=\"sticky-column\"\r\n >\r\n {{ propertiesLabel[selectedProperties.label] }}\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Genera dinamicamente le colonne per ogni risposta -->\r\n <ng-container\r\n *ngFor=\"let value of filteredAnswers; let i = index\"\r\n [matColumnDef]=\"'col' + i\"\r\n >\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span *ngIf=\"value.ID != '0'\">{{ value.AnswerDate | date : \"dd/MM/yyyy HH:mm\" }}</span>\r\n <span *ngIf=\"value.ID == '0'\">{{ value.AnswerDate }}</span>\r\n </th>\r\n <!-- <th mat-header-cell *matHeaderCellDef> {{ value.AnswerDate | date:'dd/MM/yyyy HH:mm' }} </th> -->\r\n <td mat-cell *matCellDef=\"let selectedProperties\">\r\n {{\r\n selectedProperties.label === \"AnswerDate\"\r\n ? (value.AnswerDate | date : \"dd/MM/yyyy HH:mm\")\r\n : printValue(\r\n selectedProperties.type,\r\n value[selectedProperties.label],\r\n selectedProperties.config,\r\n value\r\n ) ?? \"N/A\"\r\n }}\r\n <!-- - \r\n {{selectedProperties.type}}\r\n {{selectedProperties.label}} -->\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Header della tabella -->\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n\r\n <!-- Righe della tabella -->\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n </table>\r\n </div>\r\n\r\n <ng-template #no_answers>\r\n <div class=\"mt-3 mb-2 text-center\">\r\n <span> Non ci sono risposte </span>\r\n </div>\r\n </ng-template>\r\n <!--#region TABLE -->\r\n </mat-card-content>\r\n <mat-card-footer>\r\n <!-- <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar> -->\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!-- <div class=\"row eqp-dynamic-module-title list-form-record-header\">\r\n <div class=\"col-md-6\">\r\n <h4 *ngIf=\"showTitle\">\r\n <b>Elenco {{ form.Name }}</b>\r\n </h4>\r\n </div>\r\n <div class=\"col-md-6 text-right\" *ngIf=\"defaultListActions.add\">\r\n <button class=\"btn btn-primary\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<eqp-table class=\"list-form-record-table\" #tableRecords *ngIf=\"loader && configurations.values\"\r\n [data]=\"configurations.values\" [columns]=\"columns\"></eqp-table> -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}.table-container{max-width:100%;overflow-x:auto;border:1px solid #ddd}.sticky-column{position:sticky;left:0;background:white;z-index:10;box-shadow:2px 0 5px #0000001a}.mat-table-fixed{width:-moz-max-content;width:max-content;min-width:100%;table-layout:fixed}th,td{text-align:center;padding:10px;min-width:100px;max-width:200px}\n"], dependencies: [{ kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i6.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i7.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i8.TmwDateTimePickerComponent, selector: "tmw-datetimepicker", inputs: ["debugMode", "ngModelInput", "formGroupInput", "formControlNameInput", "pickerMode", "timeType", "label", "placeholder", "hint", "minDate", "maxDate", "locale", "inputFormat", "outputFormat", "forSaveLocalOnDB", "disabled", "readonly", "currentDateAsDefault", "showSpinners", "touchUi", "enableMeridian", "hideTime", "stepHour", "showHours", "hourLabel", "stepMinute", "showMinutes", "minuteLabel", "stepSecond", "showSeconds", "secondLabel", "disableMinute", "dayLabel", "monthLabel", "yearLabel", "highLightedDates", "highLightedAriaFormat"], outputs: ["ngModelInputChange"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
786
+ HListFormRecordComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: HListFormRecordComponent, selector: "hlist-form-record", inputs: { configurations: "configurations", endPointConfiguration: "endPointConfiguration", formID: "formID", form: "form", formulaObject: "formulaObject", externalButtons: "externalButtons", actionButtons: "actionButtons" }, outputs: { onViewRecord: "onViewRecord", onAddViewEditRecord: "onAddViewEditRecord", onDeleteRecord: "onDeleteRecord", onAfterDeleteRecord: "onAfterDeleteRecord" }, viewQueries: [{ propertyName: "tableRecords", first: true, predicate: ["tableRecords"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<mat-card class=\"list-form-record\">\r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"loadedFilters && showTitle\"\r\n >Elenco {{ form.Name }}</mat-card-title\r\n >\r\n <!-- <mat-card-actions>\r\n <button\r\n class=\"btn btn-primary\"\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </mat-card-actions> -->\r\n </mat-card-header>\r\n <mat-card-content>\r\n <!--#region FILTERS -->\r\n <div class=\"row mt-2\" *ngIf=\"loadedFilters\">\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo inizio'\"\r\n [label]=\"'Periodo inizio'\"\r\n [(ngModel)]=\"minDate\"\r\n (dateChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'dd/MM/yyyy'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo fine'\"\r\n [label]=\"'Periodo fine'\"\r\n [(ngModel)]=\"maxDate\"\r\n (dateChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'dd/MM/yyyy'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Selezione dei campi</mat-label>\r\n <mat-select (selectionChange)=\"onSelectionChange($event)\" multiple>\r\n <mat-option *ngFor=\"let property of properties\" [value]=\"property\">\r\n {{ propertiesLabel[property.label] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <!-- <div class=\"col-sm-12 col-md-3 mt-2\">\r\n <button\r\n [disabled]=\"\r\n selectedProperties == null || selectedProperties.length == 0\r\n \"\r\n class=\"btn btn-graph-generate button-next me-2\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"filterDataAnswers()\"\r\n >\r\n Genera\r\n </button>\r\n </div> -->\r\n </div>\r\n <!--#endregion FILTERS -->\r\n\r\n <!--#region TABLE -->\r\n <div\r\n *ngIf=\"filteredAnswers && filteredAnswers.length > 0; else no_answers\"\r\n class=\"table-container mt-3 mb-2\"\r\n >\r\n <table\r\n mat-table\r\n [dataSource]=\"selectedProperties\"\r\n class=\"mat-elevation-z8 mat-table-fixed\"\r\n >\r\n <!-- Colonna fissa per le propriet\u00E0 -->\r\n <ng-container matColumnDef=\"property\" sticky>\r\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column\">\r\n Data Inserimento\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let selectedProperties\"\r\n class=\"sticky-column\"\r\n >\r\n {{ propertiesLabel[selectedProperties.label] }}\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Genera dinamicamente le colonne per ogni risposta -->\r\n <ng-container\r\n *ngFor=\"let value of filteredAnswers; let i = index\"\r\n [matColumnDef]=\"'col' + i\"\r\n >\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span *ngIf=\"value.ID != '0'\">{{ value.AnswerDate | date : \"dd/MM/yyyy HH:mm\" }}</span>\r\n <span *ngIf=\"value.ID == '0'\">{{ value.AnswerDate }}</span>\r\n </th>\r\n <!-- <th mat-header-cell *matHeaderCellDef> {{ value.AnswerDate | date:'dd/MM/yyyy HH:mm' }} </th> -->\r\n <td mat-cell *matCellDef=\"let selectedProperties\">\r\n {{\r\n selectedProperties.label === \"AnswerDate\"\r\n ? (value.AnswerDate | date : \"dd/MM/yyyy HH:mm\")\r\n : printValue(\r\n selectedProperties.type,\r\n value[selectedProperties.label],\r\n selectedProperties.config,\r\n value\r\n ) ?? \"N/A\"\r\n }}\r\n <!-- - \r\n {{selectedProperties.type}}\r\n {{selectedProperties.label}} -->\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Header della tabella -->\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n\r\n <!-- Righe della tabella -->\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n </table>\r\n </div>\r\n\r\n <ng-template #no_answers>\r\n <div class=\"mt-3 mb-2 text-center\">\r\n <span> Non ci sono risposte </span>\r\n </div>\r\n </ng-template>\r\n <!--#region TABLE -->\r\n </mat-card-content>\r\n <mat-card-footer>\r\n <!-- <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar> -->\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!-- <div class=\"row eqp-dynamic-module-title list-form-record-header\">\r\n <div class=\"col-md-6\">\r\n <h4 *ngIf=\"showTitle\">\r\n <b>Elenco {{ form.Name }}</b>\r\n </h4>\r\n </div>\r\n <div class=\"col-md-6 text-right\" *ngIf=\"defaultListActions.add\">\r\n <button class=\"btn btn-primary\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<eqp-table class=\"list-form-record-table\" #tableRecords *ngIf=\"loader && configurations.values\"\r\n [data]=\"configurations.values\" [columns]=\"columns\"></eqp-table> -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}.table-container{max-width:100%;overflow-x:auto;border:1px solid #ddd}.sticky-column{position:sticky;left:0;background:white;z-index:10;box-shadow:2px 0 5px #0000001a}.mat-table-fixed{width:-moz-max-content;width:max-content;min-width:100%;table-layout:fixed}th,td{text-align:center;padding:10px;min-width:100px;max-width:200px}\n"], dependencies: [{ kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "component", type: i4.MatOption, selector: "mat-option", exportAs: ["matOption"] }, { kind: "component", type: i5.MatSelect, selector: "mat-select", inputs: ["disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator"], exportAs: ["matSelect"] }, { kind: "component", type: i6.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i6.MatCardContent, selector: "mat-card-content" }, { kind: "directive", type: i6.MatCardFooter, selector: "mat-card-footer" }, { kind: "component", type: i6.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i6.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "component", type: i7.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i7.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i7.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i7.MatColumnDef, selector: "[matColumnDef]", inputs: ["sticky", "matColumnDef"] }, { kind: "directive", type: i7.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i7.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i7.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i7.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i7.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i7.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i9.TmwDateTimePickerComponent, selector: "tmw-datetimepicker", inputs: ["debugMode", "pickerMode", "timeType", "label", "placeholder", "hint", "minDate", "maxDate", "locale", "inputFormat", "outputFormat", "forSaveLocalOnDB", "timeZone", "disabled", "readonly", "currentDateAsDefault", "showSpinners", "touchUi", "enableMeridian", "hideTime", "stepHour", "showHours", "hourLabel", "stepMinute", "showMinutes", "minuteLabel", "stepSecond", "showSeconds", "secondLabel", "disableMinute", "dayLabel", "monthLabel", "yearLabel", "highLightedDates"], outputs: ["dateChange"] }, { kind: "pipe", type: i2.DatePipe, name: "date" }] });
786
787
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: HListFormRecordComponent, decorators: [{
787
788
  type: Component,
788
- args: [{ selector: "hlist-form-record", template: "<mat-card class=\"list-form-record\">\r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"loadedFilters && showTitle\"\r\n >Elenco {{ form.Name }}</mat-card-title\r\n >\r\n <!-- <mat-card-actions>\r\n <button\r\n class=\"btn btn-primary\"\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </mat-card-actions> -->\r\n </mat-card-header>\r\n <mat-card-content>\r\n <!--#region FILTERS -->\r\n <div class=\"row mt-2\" *ngIf=\"loadedFilters\">\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo inizio'\"\r\n [label]=\"'Periodo inizio'\"\r\n [(ngModelInput)]=\"minDate\"\r\n (ngModelInputChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'DD/MM/YYYY'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo fine'\"\r\n [label]=\"'Periodo fine'\"\r\n [(ngModelInput)]=\"maxDate\"\r\n (ngModelInputChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'DD/MM/YYYY'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Selezione dei campi</mat-label>\r\n <mat-select (selectionChange)=\"onSelectionChange($event)\" multiple>\r\n <mat-option *ngFor=\"let property of properties\" [value]=\"property\">\r\n {{ propertiesLabel[property.label] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <!-- <div class=\"col-sm-12 col-md-3 mt-2\">\r\n <button\r\n [disabled]=\"\r\n selectedProperties == null || selectedProperties.length == 0\r\n \"\r\n class=\"btn btn-graph-generate button-next me-2\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"filterDataAnswers()\"\r\n >\r\n Genera\r\n </button>\r\n </div> -->\r\n </div>\r\n <!--#endregion FILTERS -->\r\n\r\n <!--#region TABLE -->\r\n <div\r\n *ngIf=\"filteredAnswers && filteredAnswers.length > 0; else no_answers\"\r\n class=\"table-container mt-3 mb-2\"\r\n >\r\n <table\r\n mat-table\r\n [dataSource]=\"selectedProperties\"\r\n class=\"mat-elevation-z8 mat-table-fixed\"\r\n >\r\n <!-- Colonna fissa per le propriet\u00E0 -->\r\n <ng-container matColumnDef=\"property\" sticky>\r\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column\">\r\n Data Inserimento\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let selectedProperties\"\r\n class=\"sticky-column\"\r\n >\r\n {{ propertiesLabel[selectedProperties.label] }}\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Genera dinamicamente le colonne per ogni risposta -->\r\n <ng-container\r\n *ngFor=\"let value of filteredAnswers; let i = index\"\r\n [matColumnDef]=\"'col' + i\"\r\n >\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span *ngIf=\"value.ID != '0'\">{{ value.AnswerDate | date : \"dd/MM/yyyy HH:mm\" }}</span>\r\n <span *ngIf=\"value.ID == '0'\">{{ value.AnswerDate }}</span>\r\n </th>\r\n <!-- <th mat-header-cell *matHeaderCellDef> {{ value.AnswerDate | date:'dd/MM/yyyy HH:mm' }} </th> -->\r\n <td mat-cell *matCellDef=\"let selectedProperties\">\r\n {{\r\n selectedProperties.label === \"AnswerDate\"\r\n ? (value.AnswerDate | date : \"dd/MM/yyyy HH:mm\")\r\n : printValue(\r\n selectedProperties.type,\r\n value[selectedProperties.label],\r\n selectedProperties.config,\r\n value\r\n ) ?? \"N/A\"\r\n }}\r\n <!-- - \r\n {{selectedProperties.type}}\r\n {{selectedProperties.label}} -->\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Header della tabella -->\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n\r\n <!-- Righe della tabella -->\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n </table>\r\n </div>\r\n\r\n <ng-template #no_answers>\r\n <div class=\"mt-3 mb-2 text-center\">\r\n <span> Non ci sono risposte </span>\r\n </div>\r\n </ng-template>\r\n <!--#region TABLE -->\r\n </mat-card-content>\r\n <mat-card-footer>\r\n <!-- <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar> -->\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!-- <div class=\"row eqp-dynamic-module-title list-form-record-header\">\r\n <div class=\"col-md-6\">\r\n <h4 *ngIf=\"showTitle\">\r\n <b>Elenco {{ form.Name }}</b>\r\n </h4>\r\n </div>\r\n <div class=\"col-md-6 text-right\" *ngIf=\"defaultListActions.add\">\r\n <button class=\"btn btn-primary\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<eqp-table class=\"list-form-record-table\" #tableRecords *ngIf=\"loader && configurations.values\"\r\n [data]=\"configurations.values\" [columns]=\"columns\"></eqp-table> -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}.table-container{max-width:100%;overflow-x:auto;border:1px solid #ddd}.sticky-column{position:sticky;left:0;background:white;z-index:10;box-shadow:2px 0 5px #0000001a}.mat-table-fixed{width:-moz-max-content;width:max-content;min-width:100%;table-layout:fixed}th,td{text-align:center;padding:10px;min-width:100px;max-width:200px}\n"] }]
789
+ args: [{ selector: "hlist-form-record", template: "<mat-card class=\"list-form-record\">\r\n <mat-card-header class=\"align-items-center justify-content-between\">\r\n <mat-card-title *ngIf=\"loadedFilters && showTitle\"\r\n >Elenco {{ form.Name }}</mat-card-title\r\n >\r\n <!-- <mat-card-actions>\r\n <button\r\n class=\"btn btn-primary\"\r\n mat-raised-button\r\n color=\"primary\"\r\n type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\"\r\n >\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </mat-card-actions> -->\r\n </mat-card-header>\r\n <mat-card-content>\r\n <!--#region FILTERS -->\r\n <div class=\"row mt-2\" *ngIf=\"loadedFilters\">\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo inizio'\"\r\n [label]=\"'Periodo inizio'\"\r\n [(ngModel)]=\"minDate\"\r\n (dateChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'dd/MM/yyyy'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3 align-content-end\">\r\n <tmw-datetimepicker\r\n class=\"date\"\r\n [placeholder]=\"'Periodo fine'\"\r\n [label]=\"'Periodo fine'\"\r\n [(ngModel)]=\"maxDate\"\r\n (dateChange)=\"filterDataAnswers()\"\r\n [pickerMode]=\"modes.DATEPICKER\"\r\n [outputFormat]=\"'dd/MM/yyyy'\"\r\n [showSeconds]=\"false\"\r\n >\r\n </tmw-datetimepicker>\r\n </div>\r\n <div class=\"col-sm-12 col-md-3\">\r\n <mat-form-field appearance=\"outline\">\r\n <mat-label>Selezione dei campi</mat-label>\r\n <mat-select (selectionChange)=\"onSelectionChange($event)\" multiple>\r\n <mat-option *ngFor=\"let property of properties\" [value]=\"property\">\r\n {{ propertiesLabel[property.label] }}\r\n </mat-option>\r\n </mat-select>\r\n </mat-form-field>\r\n </div>\r\n <!-- <div class=\"col-sm-12 col-md-3 mt-2\">\r\n <button\r\n [disabled]=\"\r\n selectedProperties == null || selectedProperties.length == 0\r\n \"\r\n class=\"btn btn-graph-generate button-next me-2\"\r\n mat-raised-button\r\n color=\"primary\"\r\n (click)=\"filterDataAnswers()\"\r\n >\r\n Genera\r\n </button>\r\n </div> -->\r\n </div>\r\n <!--#endregion FILTERS -->\r\n\r\n <!--#region TABLE -->\r\n <div\r\n *ngIf=\"filteredAnswers && filteredAnswers.length > 0; else no_answers\"\r\n class=\"table-container mt-3 mb-2\"\r\n >\r\n <table\r\n mat-table\r\n [dataSource]=\"selectedProperties\"\r\n class=\"mat-elevation-z8 mat-table-fixed\"\r\n >\r\n <!-- Colonna fissa per le propriet\u00E0 -->\r\n <ng-container matColumnDef=\"property\" sticky>\r\n <th mat-header-cell *matHeaderCellDef class=\"sticky-column\">\r\n Data Inserimento\r\n </th>\r\n <td\r\n mat-cell\r\n *matCellDef=\"let selectedProperties\"\r\n class=\"sticky-column\"\r\n >\r\n {{ propertiesLabel[selectedProperties.label] }}\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Genera dinamicamente le colonne per ogni risposta -->\r\n <ng-container\r\n *ngFor=\"let value of filteredAnswers; let i = index\"\r\n [matColumnDef]=\"'col' + i\"\r\n >\r\n <th mat-header-cell *matHeaderCellDef>\r\n <span *ngIf=\"value.ID != '0'\">{{ value.AnswerDate | date : \"dd/MM/yyyy HH:mm\" }}</span>\r\n <span *ngIf=\"value.ID == '0'\">{{ value.AnswerDate }}</span>\r\n </th>\r\n <!-- <th mat-header-cell *matHeaderCellDef> {{ value.AnswerDate | date:'dd/MM/yyyy HH:mm' }} </th> -->\r\n <td mat-cell *matCellDef=\"let selectedProperties\">\r\n {{\r\n selectedProperties.label === \"AnswerDate\"\r\n ? (value.AnswerDate | date : \"dd/MM/yyyy HH:mm\")\r\n : printValue(\r\n selectedProperties.type,\r\n value[selectedProperties.label],\r\n selectedProperties.config,\r\n value\r\n ) ?? \"N/A\"\r\n }}\r\n <!-- - \r\n {{selectedProperties.type}}\r\n {{selectedProperties.label}} -->\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Header della tabella -->\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns\"></tr>\r\n\r\n <!-- Righe della tabella -->\r\n <tr mat-row *matRowDef=\"let row; columns: displayedColumns\"></tr>\r\n </table>\r\n </div>\r\n\r\n <ng-template #no_answers>\r\n <div class=\"mt-3 mb-2 text-center\">\r\n <span> Non ci sono risposte </span>\r\n </div>\r\n </ng-template>\r\n <!--#region TABLE -->\r\n </mat-card-content>\r\n <mat-card-footer>\r\n <!-- <mat-progress-bar mode=\"indeterminate\"></mat-progress-bar> -->\r\n </mat-card-footer>\r\n</mat-card>\r\n\r\n<!-- <div class=\"row eqp-dynamic-module-title list-form-record-header\">\r\n <div class=\"col-md-6\">\r\n <h4 *ngIf=\"showTitle\">\r\n <b>Elenco {{ form.Name }}</b>\r\n </h4>\r\n </div>\r\n <div class=\"col-md-6 text-right\" *ngIf=\"defaultListActions.add\">\r\n <button class=\"btn btn-primary\" mat-raised-button color=\"primary\" type=\"button\"\r\n (click)=\"onAddViewEditRecord.emit(null)\">\r\n <mat-icon>add</mat-icon>\r\n <span style=\"margin-left: 10px\">Aggiungi</span>\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<eqp-table class=\"list-form-record-table\" #tableRecords *ngIf=\"loader && configurations.values\"\r\n [data]=\"configurations.values\" [columns]=\"columns\"></eqp-table> -->\r\n", styles: ["::ng-deep .error-color{color:var(--danger)}::ng-deep .success-color{color:var(--success)}.table-container{max-width:100%;overflow-x:auto;border:1px solid #ddd}.sticky-column{position:sticky;left:0;background:white;z-index:10;box-shadow:2px 0 5px #0000001a}.mat-table-fixed{width:-moz-max-content;width:max-content;min-width:100%;table-layout:fixed}th,td{text-align:center;padding:10px;min-width:100px;max-width:200px}\n"] }]
789
790
  }], ctorParameters: function () { return [{ type: i1.UtilityHelperService }, { type: i0.ChangeDetectorRef }, { type: i2.DatePipe }]; }, propDecorators: { configurations: [{
790
791
  type: Input
791
792
  }], endPointConfiguration: [{
@@ -812,4 +813,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
812
813
  }], onAfterDeleteRecord: [{
813
814
  type: Output
814
815
  }] } });
815
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGxpc3QtZm9ybS1yZWNvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2Zvcm0tcmVjb3Jkcy9obGlzdC1mb3JtLXJlY29yZC9obGlzdC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2hsaXN0LWZvcm0tcmVjb3JkL2hsaXN0LWZvcm0tcmVjb3JkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxHQUliLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxVQUFVLEdBQ1gsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQWEsYUFBYSxFQUFlLE1BQU0sb0NBQW9DLENBQUM7QUFDM0YsT0FBTyxFQUFhLE1BQU0sRUFBZ0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRixPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sMkNBQTJDLENBQUM7QUFHbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHlDQUF5QyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFFekgsT0FBTyxFQUdMLGFBQWEsR0FDZCxNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBS3RDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDOzs7Ozs7Ozs7O0FBUW5GLE1BQU0sT0FBTyx3QkFBd0I7SUE0Q25DLHFCQUFxQjtJQUNyQixZQUNVLG9CQUEwQyxFQUMxQyxjQUFpQyxFQUNqQyxRQUFrQjtRQUZsQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBMUNuQixTQUFJLEdBQVMsSUFBSSxDQUFDLENBQUMscUJBQXFCO1FBQ3hDLGtCQUFhLEdBQVEsRUFBRSxDQUFDO1FBQ3hCLG9CQUFlLEdBQXdCLElBQUksS0FBSyxFQUFnQixDQUFDO1FBQ2pFLGtCQUFhLEdBQXdCLElBQUksS0FBSyxFQUFnQixDQUFDO1FBRXhFLHVCQUFrQixHQUNoQixJQUFJLHlDQUF5QyxFQUFFLENBQUM7UUFDbEQsY0FBUyxHQUFHLElBQUksQ0FBQztRQUdqQixZQUFPLEdBQUcsSUFBSSxLQUFLLEVBQWdCLENBQUM7UUFDcEMsa0JBQWEsR0FBWSxLQUFLLENBQUM7UUFDL0IsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFbkIsaUJBQVksR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNoRSx3QkFBbUIsR0FBeUQsSUFBSSxZQUFZLEVBQXlDLENBQUM7UUFFdEksbUJBQWMsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNsRSx3QkFBbUIsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUVqRixVQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ2pCLFlBQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ3JCLFlBQU8sR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXJCLHNEQUFzRDtRQUN0RCxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLGlGQUFpRjtRQUNqRixvQkFBZSxHQUFHLEVBQUUsQ0FBQztRQU1yQixtRkFBbUY7UUFDbkYscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLHlCQUFvQixHQUF5QyxJQUFJLENBQUM7UUFDbEUsa0NBQTZCLEdBQUcsNkJBQTZCLENBQUM7UUFRNUQsK0NBQStDO0lBQ2pELENBQUM7SUFDRCx3QkFBd0I7SUFFeEIsbUJBQW1CO0lBQ25CLFFBQVE7UUFDTixJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQztRQUNqRSxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDO1FBQy9DLGFBQWEsQ0FBQyxRQUFRLENBQUMsOENBQThDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRTVGLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0Qsc0JBQXNCO0lBRXRCLHFCQUFxQjtJQUNyQixXQUFXLENBQUMsT0FBc0I7UUFDaEMsYUFBYSxDQUFDLFFBQVEsQ0FBQyw0QkFBNEIsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM5RCwwRUFBMEU7UUFDMUUsa0dBQWtHO1FBQ2xHLHlFQUF5RTtRQUN6RSx5QkFBeUI7UUFDekIsSUFBSTtJQUNOLENBQUM7SUFDRCx3QkFBd0I7SUFFeEIscUJBQXFCO0lBQ3JCLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBYSxJQUFJLENBQUMsTUFBTTtRQUN4QyxhQUFhLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVwRSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3JCLE1BQU0sbUJBQW1CLEdBQ3ZCLElBQUksS0FBSyxFQUFzQixDQUFDO1lBQ2xDLG1CQUFtQixDQUFDLElBQUksQ0FBQztnQkFDdkIsU0FBUyxFQUFFLElBQUk7Z0JBQ2YsVUFBVSxFQUFFLEVBQUU7Z0JBQ2QsU0FBUyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUM7YUFDeEMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUMsZUFBZSxDQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFDaEQsbUJBQW1CLEVBQ25CLENBQUMsR0FBUyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUM7Z0JBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzFCLENBQUMsRUFDRCxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUNiLENBQUM7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7U0FDekI7SUFDSCxDQUFDO0lBQ0Qsd0JBQXdCO0lBRXhCLDRCQUE0QjtJQUM1Qjs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxrQkFBa0I7UUFDdEI7Ozs7V0FJRztRQUNILE1BQU0sZ0NBQWdDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUNuRCxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1lBQ2pELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxNQUFNLEdBQVcsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQzdDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO2dCQUM1QixNQUFNLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUM7Z0JBQ2hDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDOUIsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO2dCQUN0QyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUE7UUFFRDs7OztXQUlHO1FBQ0gsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLEVBQUU7WUFDbkMsNEVBQTRFO1lBQzVFLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUM7WUFDbEQsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBRXRCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUNmLElBQUksQ0FBQyxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdEMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtRQUN0QixDQUFDLENBQUE7UUFFRCxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFO1lBQzlCLHNFQUFzRTtZQUN0RSxhQUFhLENBQUMsUUFBUSxDQUFDLDhCQUE4QixFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQTtZQUMzRSx1QkFBdUIsRUFBRSxDQUFDO1NBQzNCO2FBQU07WUFDTCwrREFBK0Q7WUFDL0QsYUFBYSxDQUFDLFFBQVEsQ0FBQyw4QkFBOEIsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7WUFDM0UsSUFBSTtnQkFDRixJQUNFLElBQUksQ0FBQyxxQkFBcUI7b0JBQzFCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPO29CQUNsQyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUN0RDtvQkFDQSxJQUFJLG1CQUFtQixHQUFHO3dCQUN4Qjs0QkFDRSxTQUFTLEVBQUUsT0FBTzs0QkFDbEIsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTs0QkFDeEIsU0FBUyxFQUFFLGFBQWEsQ0FBQyxhQUFhLENBQUM7eUJBQ3hDO3FCQUNGLENBQUM7b0JBQ0YsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLEVBQUU7d0JBQ3RDLCtCQUErQjt3QkFDL0Isb0NBQW9DO3dCQUNwQyxNQUFNLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxlQUFlLENBQzdDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLENBQUMsbUJBQW1CLEVBQ3RELG1CQUFtQixFQUNuQixDQUFDLEdBQXFCLEVBQUUsRUFBRTs0QkFDeEIsZ0NBQWdDLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RDLHVCQUF1QixFQUFFLENBQUM7d0JBQzVCLENBQUMsQ0FDRixDQUFDO3FCQUNIO3lCQUFNO3dCQUNMLG1CQUFtQjt3QkFDbkIsbUNBQW1DO3dCQUNuQyxtQkFBbUIsQ0FBQyxJQUFJLENBQ3RCOzRCQUNFLFNBQVMsRUFBRSxRQUFROzRCQUNuQixVQUFVLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNOzRCQUN0QyxTQUFTLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQzt5QkFDeEMsQ0FBQyxDQUFDO3dCQUNMLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDLGVBQWUsQ0FDN0MsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyw0QkFBNEIsRUFDL0QsbUJBQW1CLEVBQ25CLENBQUMsR0FBcUIsRUFBRSxFQUFFOzRCQUN4QixnQ0FBZ0MsQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDdEMsdUJBQXVCLEVBQUUsQ0FBQzt3QkFDNUIsQ0FBQyxDQUNGLENBQUM7cUJBRUg7aUJBQ0Y7YUFDRjtZQUFDLE9BQU8sQ0FBQyxFQUFFO2dCQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFBO2FBQzlCO1NBQ0Y7SUFDSCxDQUFDO0lBQ0QsK0JBQStCO0lBRy9CLDBCQUEwQjtJQUMxQjs7T0FFRztJQUNLLGdCQUFnQjtRQUN0QixJQUFJLENBQUMsT0FBTyxHQUFHO1lBQ2I7Z0JBQ0UsR0FBRyxFQUFFLFFBQVE7Z0JBQ2IsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsSUFBSSxFQUFFLFVBQVUsQ0FBQyxVQUFVO2dCQUMzQixjQUFjLEVBQUUsV0FBVztnQkFDM0IsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRTtnQkFDMUIsT0FBTyxFQUFFLEVBQUU7YUFDWjtTQUNGLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ3hDLElBQUksQ0FBQyxPQUFPO2lCQUNULElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUM7aUJBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1osSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLElBQUksRUFBRSxNQUFNO2dCQUNaLEVBQUUsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQzthQUN0RCxDQUFDLENBQUM7U0FDTjtRQUNELElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDeEMsSUFBSSxDQUFDLE9BQU87aUJBQ1QsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQztpQkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDWixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsSUFBSSxFQUFFLE1BQU07Z0JBQ1osRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDO2FBQ25FLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtZQUM3Qzs7Ozs7O21CQU1PO1NBQ1I7UUFDRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQzFDLElBQUksQ0FBQyxPQUFPO2lCQUNULElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxRQUFRLENBQUM7aUJBQy9CLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ1osSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsSUFBSSxFQUFFLFFBQVE7Z0JBQ2QsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO2FBQ3hELENBQUMsQ0FBQztTQUNOO1FBRUQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsT0FBTztpQkFDVCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssUUFBUSxDQUFDO2lCQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDO2dCQUNaLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2dCQUNqQixFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTthQUN6QyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQywyQkFBMkIsRUFBRSxDQUFDO1FBQ25DLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFDRCw2QkFBNkI7SUFFN0IsaUNBQWlDO0lBQ2pDOzs7T0FHRztJQUNLLHVCQUF1QjtRQUM3QixhQUFhLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVoRixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckUsSUFBSSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQ3RDLENBQUMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLGVBQWU7Z0JBQ25DLENBQUMsQ0FBQyxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxlQUFlO29CQUNyQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNKLENBQUMsQ0FBQyxDQUFDLENBQ1IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtnQkFDbkIsSUFBSSxDQUFDLE9BQU87cUJBQ1QsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFFBQVEsQ0FBQztxQkFDL0IsT0FBTyxDQUFDLElBQUksQ0FBQztvQkFDWixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7b0JBQ2pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtvQkFDakIsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsRUFBRTt3QkFDMUIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDO3dCQUNwQixNQUFNLEdBQUcsR0FBRyxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7d0JBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3BCLDZCQUE2QjtvQkFDL0IsQ0FBQztpQkFDRixDQUFDLENBQUM7WUFDUCxDQUFDLENBQUMsQ0FBQztTQUNKO0lBQ0gsQ0FBQztJQUNELG9DQUFvQztJQUdwQyxxQ0FBcUM7SUFDckM7Ozs7OztPQU1HO0lBQ0ssMkJBQTJCO1FBQ2pDLGFBQWEsQ0FBQyxRQUFRLENBQUMsZ0RBQWdELEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBGLElBQUksZ0JBQWtDLENBQUM7UUFDdkMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDL0MsNEJBQTRCO1lBQzVCLElBQUcsQ0FBQyxDQUFDLFNBQVMsSUFBSSxhQUFhLENBQUMsV0FBVyxDQUFDLEVBQUM7Z0JBQzNDLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7WUFDRCxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUU7Z0JBQ2pCLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsT0FBTyxDQUFDLENBQUMsVUFBVSxDQUFDO2FBQ3JCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDO1FBRS9CLGdCQUFnQjthQUNiLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUNiLENBQUMsQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLGVBQWU7WUFDbkMsQ0FBQyxDQUFDLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsZUFBZTtnQkFDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQyxDQUNSO2FBQ0EsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFFakIsb0RBQW9EO1lBQ3BELElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDbkYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQztZQUV0RCxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDL0QsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDekMsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDO3dCQUN2RCxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO3dCQUM1Qyw4RkFBOEY7cUJBQy9GO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFJSCxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO0lBRTVDLENBQUM7SUFDRCx3Q0FBd0M7SUFFeEMsMkJBQTJCO0lBQzNCOzs7O09BSUc7SUFDSCw4REFBOEQ7SUFDOUQsMEVBQTBFO0lBQzFFLCtCQUErQjtJQUMvQixzQ0FBc0M7SUFDdEMsMENBQTBDO0lBQzFDLGlDQUFpQztJQUNqQyw0REFBNEQ7SUFDNUQsNkRBQTZEO0lBQzdELFdBQVc7SUFDWCwwQkFBMEI7SUFDMUIsMEJBQTBCO0lBQzFCLG1EQUFtRDtJQUNuRCxXQUFXO0lBQ1gsZUFBZTtJQUNmLDBDQUEwQztJQUMxQyxhQUFhO0lBQ2IsNkVBQTZFO0lBQzdFLFlBQVk7SUFDWix5Q0FBeUM7SUFDekMsZUFBZTtJQUNmLDhFQUE4RTtJQUM5RSxjQUFjO0lBQ2QsZ0RBQWdEO0lBQ2hELHNCQUFzQjtJQUN0Qiw2RUFBNkU7SUFDN0UsY0FBYztJQUNkLDREQUE0RDtJQUM1RCxvRUFBb0U7SUFDcEUsOEJBQThCO0lBQzlCLFlBQVk7SUFDWixVQUFVO0lBQ1YsZUFBZTtJQUNmLDRDQUE0QztJQUM1QyxzREFBc0Q7SUFDdEQseURBQXlEO0lBQ3pELDRFQUE0RTtJQUM1RSx5REFBeUQ7SUFDekQsd0RBQXdEO0lBQ3hELFVBQVU7SUFDVixlQUFlO0lBQ2Ysc0NBQXNDO0lBQ3RDLHNDQUFzQztJQUV0QyxXQUFXO0lBQ1gsZ0RBQWdEO0lBQ2hELGlCQUFpQjtJQUNqQiwwREFBMEQ7SUFDMUQseURBQXlEO0lBQ3pELHNFQUFzRTtJQUN0RSxnQkFBZ0I7SUFDaEIsbUZBQW1GO0lBQ25GLGlFQUFpRTtJQUNqRSw0Q0FBNEM7SUFDNUMsZ0NBQWdDO0lBQ2hDLHdCQUF3QjtJQUN4QixxQkFBcUI7SUFDckIsbUZBQW1GO0lBQ25GLDZFQUE2RTtJQUM3RSx3QkFBd0I7SUFDeEIsY0FBYztJQUNkLGFBQWE7SUFDYixxQ0FBcUM7SUFDckMsdUNBQXVDO0lBQ3ZDLFdBQVc7SUFFWCxlQUFlO0lBQ2YsNkNBQTZDO0lBQzdDLDhDQUE4QztJQUM5QywwREFBMEQ7SUFDMUQsMkVBQTJFO0lBQzNFLDJCQUEyQjtJQUMzQixxQkFBcUI7SUFDckIsdUVBQXVFO0lBQ3ZFLCtCQUErQjtJQUMvQixnREFBZ0Q7SUFDaEQsNERBQTREO0lBQzVELG9CQUFvQjtJQUNwQixrQkFBa0I7SUFDbEIsNkJBQTZCO0lBQzdCLGNBQWM7SUFDZCxtQkFBbUI7SUFDbkIsMkVBQTJFO0lBQzNFLHFCQUFxQjtJQUNyQiwrRUFBK0U7SUFDL0UsZUFBZTtJQUNmLFlBQVk7SUFDWixXQUFXO0lBQ1gsbUNBQW1DO0lBQ25DLHFDQUFxQztJQUNyQyxlQUFlO0lBQ2Ysb0NBQW9DO0lBQ3BDLGdCQUFnQjtJQUNoQixlQUFlO0lBQ2YsTUFBTTtJQUNOLG1CQUFtQjtJQUNuQixJQUFJO0lBQ0osOEJBQThCO0lBRTlCLG9CQUFvQjtJQUNwQixVQUFVLENBQUMsTUFBYztRQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBQ0QsdUJBQXVCO0lBRXZCOzs7OztPQUtHO0lBQ0ssZ0JBQWdCLENBQUMsTUFBYyxFQUFFLFFBQWlCO1FBQ3hELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsWUFBWSxDQUFDLE1BQWM7UUFDekIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ssWUFBWTtRQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDckIsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsQ0FBQztTQUNyQztJQUNILENBQUM7SUFFRCwyQkFBMkI7SUFDM0I7Ozs7T0FJRztJQUNILGlCQUFpQixDQUFDLGtCQUFrQjtRQUNsQyxhQUFhLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxFQUFDLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlGLElBQUksa0JBQWtCLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQztTQUNwRDthQUFNO1lBQ0wsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDM0M7UUFDRCxhQUFhLENBQUMsUUFBUSxDQUFDLG1DQUFtQyxFQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCw4QkFBOEI7SUFFOUIsMkJBQTJCO0lBQzNCOztPQUVHO0lBQ0gsaUJBQWlCO1FBQ2YsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1lBRTFCLElBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUNmLDBEQUEwRDtnQkFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLHlEQUF5RDtnQkFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RTtZQUVELElBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFDO2dCQUNmLDBEQUEwRDtnQkFDMUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xGLHlEQUF5RDtnQkFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RTtZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBRXRDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUU3SixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUM7Z0JBQ3hFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtvQkFDaEQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNqRSxNQUFNLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQztvQkFDaEIsTUFBTSxDQUFDLFVBQVUsR0FBRyw2QkFBNkIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDeEYsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3BDLENBQUMsQ0FBQyxDQUFDO2dCQUVILElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO2FBQ25DO1lBR0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUV6RixDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDVixDQUFDO0lBQ0QsOEJBQThCO0lBRTlCLHdCQUF3QjtJQUN4QixpRUFBaUU7SUFDakUsY0FBYztRQUNaLDBEQUEwRDtRQUMxRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQUVsRix5REFBeUQ7UUFDekQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCwyQkFBMkI7SUFFM0IsZ0NBQWdDO0lBQ2hDLHNCQUFzQjtRQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDaEUsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFFbkMsZ0RBQWdEO2dCQUVoRCxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUM7b0JBQUUsT0FBTztpQkFBRTtnQkFDN0IsSUFBSSxZQUFZLEdBQVEsS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFFM0MsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFDO29CQUN2QixJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQzt3QkFDdEcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUM7cUJBQ3JFO3lCQUNJLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDO3dCQUN2RyxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7d0JBQ1osSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEdBQUcsSUFBSSxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDN0csT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztxQkFDcEI7eUJBQ0ksSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLEtBQUssSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUM7d0JBQ3ZHLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDWixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLFFBQVEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUM3RyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7cUJBQzdGO3lCQUNJLElBQUksT0FBTyxDQUFDLFVBQVUsSUFBSSxLQUFLLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFDO3dCQUN2RyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUM7d0JBQ2YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxFQUFFOzRCQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7eUJBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFDeEksT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQztxQkFDcEI7eUJBQ0ksSUFBSSxPQUFPLENBQUMsVUFBVSxJQUFJLEtBQUssSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUM7d0JBQ3ZHLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQzt3QkFDZixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLEVBQUU7NEJBQUUsR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQzt5QkFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUN4SSxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO3FCQUNwQjt5QkFDSSxJQUFJLE9BQU8sQ0FBQyxVQUFVLElBQUksT0FBTyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBQzt3QkFDM0csSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO3dCQUNoQixJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dCQUNuSCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUMvQzt5QkFBTTt3QkFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO3FCQUNuQjtpQkFDRjtxQkFBTSxJQUFJLFlBQVksSUFBSSxJQUFJLElBQUksWUFBWSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7b0JBQzNELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUM7aUJBQ25CO1lBSUgsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVDLE9BQU87SUFDYixDQUFDO0lBQ0QsbUNBQW1DO0lBRW5DLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxhQUFhLEdBQUcsS0FBSztRQUMxQyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FDZCxHQUFHO2FBQ0EsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7YUFDdkQsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLENBQUM7WUFDbkMsQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3pDLENBQUM7SUFDSixDQUFDO0lBQUEsQ0FBQztJQUVGLG9CQUFvQjtJQUNwQixVQUFVLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTTtRQUM5QyxRQUFRLFNBQVMsRUFBRTtZQUNqQixLQUFLLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQztnQkFBRTtvQkFDckMsSUFBSSxLQUFLLElBQUksRUFBRSxFQUFDO3dCQUFFLE9BQU8sS0FBSyxDQUFDO3FCQUFFO29CQUNqQyxJQUFHLENBQUMsS0FBSyxFQUFDO3dCQUNSLE9BQU8sS0FBSyxDQUFDO3FCQUNkO29CQUNELElBQUksTUFBTSxDQUFDO29CQUNYLElBQUksVUFBVSxHQUF5QixFQUFFLENBQUM7b0JBQzFDLDZCQUE2QjtvQkFDN0IsSUFBSSxXQUFXLENBQUMsT0FBTyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsT0FBTyxFQUFFO3dCQUN0RCxJQUFJLElBQUksR0FBRyxvQkFBb0IsQ0FBQyxvQkFBb0IsQ0FDbEQsV0FBVyxDQUFDLE9BQU8sRUFDbkIsTUFBTSxFQUNOLElBQUksQ0FBQyxhQUFhLENBQ25CLENBQUM7d0JBQ0osSUFBRyxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7NEJBQzNCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQzVCLElBQUksR0FBRyxFQUFFLENBQUE7NEJBQ1QsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQ0FDbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDaEMsSUFBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBQztvQ0FDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQ0FDN0M7cUNBQU07b0NBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQ0FDN0M7NEJBQ0gsQ0FBQyxDQUFDLENBQUE7eUJBQ0g7d0JBRUQsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7NEJBQ3JCLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7eUJBQzdCO3FCQUNGO3lCQUFNLElBQXFCLFdBQVksQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFxQixXQUFZLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ2xILGVBQWU7d0JBQ2YsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBa0IsV0FBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7cUJBQ25GO3lCQUFNLElBQXFCLFdBQVksQ0FBQyxXQUFXLElBQUksSUFBSSxJQUFxQixXQUFZLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRTt3QkFDL0csNkNBQTZDO3dCQUM3QyxVQUFVLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFrQixXQUFZLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQzFGO29CQUVELHNEQUFzRDtvQkFDdEQsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO29CQUNsQix5R0FBeUc7b0JBQ3pHLG1DQUFtQztvQkFDbkMsS0FBSyxJQUFJLEdBQUcsSUFBSSxVQUFVLEVBQUU7d0JBQzFCLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7cUJBQ2pDO29CQUNELFVBQVUsR0FBRyxRQUFRLENBQUM7b0JBRXRCLHNDQUFzQztvQkFDdEMsSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksSUFBcUIsV0FBWSxDQUFDLGNBQWMsRUFBRTt3QkFDcEYsbUJBQW1CO3dCQUNuQixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFOzRCQUM5QyxRQUFRLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDOzRCQUNoQyxRQUFRLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7d0JBQ2xFLENBQUMsQ0FBQyxDQUFDO3dCQUNILE1BQU0sR0FBRyxRQUFRLENBQUM7cUJBQ25CO3lCQUFNO3dCQUNMLHNCQUFzQjt3QkFDdEIsTUFBTSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7cUJBQy9DO29CQUNELE9BQU8sTUFBTSxDQUFDO2lCQUNmO2dCQUFBLENBQUM7WUFDRixLQUFLLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQztnQkFBRTtvQkFDcEMsSUFBSSxLQUFLLElBQUksRUFBRSxFQUFDO3dCQUFFLE9BQU8sS0FBSyxDQUFDO3FCQUFFO29CQUNqQyxJQUFtQixXQUFZLENBQUMsU0FBUyxFQUFFO3dCQUN6QyxJQUFtQixXQUFZLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFOzRCQUN4RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7eUJBQzFCOzZCQUFNOzRCQUNMLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7NEJBQ25ELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsUUFBUSxDQUFDO3lCQUNoRDtxQkFDRjt5QkFBTTt3QkFDTCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO3dCQUNuRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLFFBQVEsQ0FBQztxQkFDaEQ7b0JBQ0QsTUFBTTtpQkFDUDtnQkFBQSxDQUFDO1lBRUYsS0FBSyxhQUFhLENBQUMsVUFBVSxDQUFDO2dCQUFFO29CQUM5QixPQUFPLFVBQVUsQ0FBQztvQkFDbEIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUE7b0JBQ3RFLGlFQUFpRTtvQkFDakUsNkhBQTZIO29CQUU3SCx5Q0FBeUM7b0JBQ3pDLG1HQUFtRztvQkFFbkcsTUFBTTtpQkFDUDtnQkFBQSxDQUFDO1lBR0YsS0FBSyxhQUFhLENBQUMsVUFBVSxDQUFDO2dCQUFFO29CQUM5QixPQUFPLFVBQVUsQ0FBQztvQkFDbEIsMkVBQTJFO29CQUUzRSxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7d0JBQ2pCLElBQUksYUFBYSxDQUFDO3dCQUNsQiwwQkFBMEI7d0JBQzFCLG1FQUFtRTt3QkFDbkUsaUlBQWlJO3dCQUNqSSx1RUFBdUU7d0JBQ3ZFLDJDQUEyQzt3QkFDM0MsOEhBQThIO3dCQUM5SCw4REFBOEQ7d0JBQzlELDBJQUEwSTt3QkFDMUksV0FBVzt3QkFDWCwySkFBMko7d0JBQzNKLElBQUk7d0JBRUosc0NBQXNDO3dCQUN0Qyx1R0FBdUc7d0JBQ3ZHLHNGQUFzRjtxQkFDdkY7b0JBRUQsTUFBTTtpQkFDUDtnQkFBQSxDQUFDO1lBRUYsS0FBSyxhQUFhLENBQUMsc0JBQXNCLENBQUM7Z0JBQUU7b0JBQzFDLE9BQU8sc0JBQXNCLENBQUM7b0JBRTlCLDhEQUE4RDtvQkFDOUQsNkhBQTZIO29CQUU3SCxzQ0FBc0M7b0JBQ3RDLG1HQUFtRztvQkFFbkcsTUFBTTtpQkFDUDtnQkFBQSxDQUFDO1lBRUYsS0FBSyxhQUFhLENBQUMsaUJBQWlCLENBQUM7Z0JBQUU7b0JBQ3JDLE9BQU8saUJBQWlCLENBQUM7b0JBQ3pCLElBQUksaUJBQWlCLEdBQUcsRUFBRSxDQUFDO29CQUMzQixJQUFJLEtBQUssSUFBSSxJQUFJLElBQXlCLFdBQVksQ0FBQyxjQUFjLEVBQUU7d0JBQ3JFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFnQixFQUFFLEVBQUU7NEJBQ2pDLElBQUksZ0JBQWdCLEdBQXVDLFdBQVksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxRQUFRLENBQUMsQ0FBQzs0QkFDbkgsSUFBSSxnQkFBZ0IsSUFBSSxJQUFJLEVBQUU7Z0NBQzVCLGlCQUFpQixJQUFJLGdCQUFnQixDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7NkJBQ3hEO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNILElBQUksS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDMUMsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDcEQ7eUJBQ0k7d0JBQ0gsSUFBSSxnQkFBZ0IsR0FBdUMsV0FBWSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEtBQUssQ0FBQyxDQUFDO3dCQUNoSCxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRTs0QkFDNUIsT0FBTyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7eUJBQ25DO3FCQUNGO29CQUVELE1BQU07aUJBQ1A7Z0JBQUEsQ0FBQztZQUNGLEtBQUssYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xDLElBQUksS0FBSyxJQUFJLEVBQUUsRUFBQztvQkFBRSxPQUFPLEtBQUssQ0FBQztpQkFBRTtnQkFDakMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ3BELElBQWdCLFdBQVksQ0FBQyxVQUFVLElBQUksSUFBSSxFQUFFO29CQUMvQyxJQUFJLGFBQWEsR0FBZSxXQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQzVFLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO2lCQUN0RDtxQkFDSTtvQkFDSCxJQUFnQixXQUFZLENBQUMsVUFBVSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUN4RSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztxQkFDckQ7eUJBQU0sSUFBZ0IsV0FBWSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsRUFBRTt3QkFDaEYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztxQkFDM0Q7eUJBQU0sSUFBZ0IsV0FBWSxDQUFDLFVBQVUsSUFBSSxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsRUFBRTt3QkFDakYsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7cUJBQ2hEO2lCQUNGO2dCQUNELE1BQU07YUFDUDtZQUVELE9BQU8sQ0FBQyxDQUFDO2dCQUNQLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtJQUVILENBQUM7SUFDRCx1QkFBdUI7SUFFdkIsMkJBQTJCO0lBQ25CLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxXQUFtQjtRQUNqRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sU0FBUyxHQUFHLHNCQUFzQixDQUFDO1lBQ3pDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUN4QixHQUFHLENBQUMsR0FBRyxHQUFHLFdBQVcsQ0FBQztZQUN0QixHQUFHLENBQUMsTUFBTSxHQUFHO2dCQUNYLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3BDLE1BQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7Z0JBQ3hCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUM7Z0JBQzFCLE1BQU0sV0FBVyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7Z0JBRW5DLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztnQkFDdEIsTUFBTSxRQUFRLEdBQUcsU0FBUyxHQUFHLFdBQVcsQ0FBQztnQkFFekMsTUFBTSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ3hCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO2dCQUMxQixHQUFHLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDOUMsSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO2dCQUNsQixJQUFJLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQzdELE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O3NIQS8wQlUsd0JBQXdCOzBHQUF4Qix3QkFBd0IsaWxCQy9DckMsOGdNQWlLQTs0RkRsSGEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLG1CQUFtQjtrS0FLcEIsY0FBYztzQkFBdEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBR0csTUFBTTtzQkFBZCxLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxhQUFhO3NCQUFyQixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFLdUMsWUFBWTtzQkFBeEQsU0FBUzt1QkFBQyxjQUFjLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQU1qQyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFFRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLG1CQUFtQjtzQkFBNUIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBJbnB1dCxcclxuICBWaWV3Q2hpbGQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1xyXG4gIENvbmZpZ0NvbHVtbixcclxuICBFcXBUYWJsZUNvbXBvbmVudCxcclxuICBUeXBlQ29sdW1uLFxyXG59IGZyb20gXCJAZXFwcm9qZWN0L2VxcC10YWJsZVwiO1xyXG5pbXBvcnQgeyBGb3JtIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9mb3JtLm1vZGVsXCI7XHJcbmltcG9ydCB7IEJhc2VGaWVsZCwgRmllbGRUeXBlRW51bSwgQW5zd2VyU3R5bGUgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvYmFzZUZpZWxkLm1vZGVsJztcclxuaW1wb3J0IHsgRHluUmVjb3JkLCBSZWNvcmQsIFJlY29yZEJ1dHRvbiB9IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvcmVjb3JkLm1vZGVsXCI7XHJcbmltcG9ydCB7XHJcbiAgRGF0ZUZpZWxkLFxyXG4gIERhdGVUaW1lVHlwZUVudW0sXHJcbn0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvZGF0ZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IExpc3RWYWx1ZUZpZWxkIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvbGlzdFZhbHVlRmllbGQubW9kZWxcIjtcclxuaW1wb3J0IHsgTnVtZXJpY0ZpZWxkIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvbnVtZXJpY0ZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IFV0aWxpdHlIZWxwZXJTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL3V0aWxpdHlIZWxwZXIuc2VydmljZXNcIjtcclxuaW1wb3J0IHsgRHluYW1pY01vZHVsZUxpc3RGb3JtUmVjb3JkQWN0aW9uc0RlZmF1bHQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbW9kZWxzL2R5bmFtaWNNb2R1bGVMaXN0Rm9ybVJlY29yZEFjdGlvbnNEZWZhdWx0XCI7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVMaXN0Q29uZmlnIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9keW5hbWljTW9kdWxlTGlzdENvbmZpZy5tb2RlbFwiO1xyXG5pbXBvcnQge1xyXG4gIEVuZFBvaW50Q29uZmlndXJhdGlvbixcclxuICBFbmRQb2ludERhdGFQYXJhbXMsXHJcbiAgUGFyYW1UeXBlRW51bSxcclxufSBmcm9tIFwiLi4vLi4vLi4vLi4vbW9kZWxzL2VuZFBvaW50Q29uZmlndXJhdGlvbi5tb2RlbFwiO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXJ2aWNlIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NlcnZpY2VzL2dsb2JhbC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE1vZGVFbnVtIH0gZnJvbSBcInRtdy1waWNrZXJcIjtcclxuaW1wb3J0IHsgSW1hZ2VTZWxlY3RvckZpZWxkIH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9maWVsZHMvaW1hZ2VTZWxlY3RvckZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IER5bkF0dGFjaG1lbnQgfSBmcm9tIFwiLi4vLi4vLi4vLi4vbW9kZWxzL2R5bkF0dGFjaG1lbnRcIjtcclxuaW1wb3J0IHsgRGF0ZVBpcGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCI7XHJcbmltcG9ydCB7IEFjdGlvbkJ1dHRvbiB9IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy90cmlnZ2VyLm1vZGVsJztcclxuaW1wb3J0IHsgTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvc3RhdGlzdGljLm1vZGVsJztcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogXCJobGlzdC1mb3JtLXJlY29yZFwiLFxyXG4gIHRlbXBsYXRlVXJsOiBcImhsaXN0LWZvcm0tcmVjb3JkLmNvbXBvbmVudC5odG1sXCIsXHJcbiAgc3R5bGVVcmxzOiBbXCIuL2hsaXN0LWZvcm0tcmVjb3JkLmNvbXBvbmVudC5zY3NzXCJdLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSExpc3RGb3JtUmVjb3JkQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG4gIEBJbnB1dCgpIGNvbmZpZ3VyYXRpb25zOiBEeW5hbWljTW9kdWxlTGlzdENvbmZpZztcclxuICBASW5wdXQoKSBlbmRQb2ludENvbmZpZ3VyYXRpb246IEVuZFBvaW50Q29uZmlndXJhdGlvbjtcclxuXHJcbiAgLy8gbCd1bmEgbyBsJ2FsdHJhIHBlciBkdWUgbW9kYWxpdMOgIGQndXNvXHJcbiAgQElucHV0KCkgZm9ybUlEOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZm9ybTogRm9ybSA9IG51bGw7IC8vIGJvaCBtYSBjJ2VyYSBwcmltYVxyXG4gIEBJbnB1dCgpIGZvcm11bGFPYmplY3Q6IGFueSA9IHt9O1xyXG4gIEBJbnB1dCgpIGV4dGVybmFsQnV0dG9uczogQXJyYXk8UmVjb3JkQnV0dG9uPiA9IG5ldyBBcnJheTxSZWNvcmRCdXR0b24+KCk7XHJcbiAgQElucHV0KCkgYWN0aW9uQnV0dG9uczogQXJyYXk8QWN0aW9uQnV0dG9uPiA9IG5ldyBBcnJheTxBY3Rpb25CdXR0b24+KCk7XHJcblxyXG4gIGRlZmF1bHRMaXN0QWN0aW9uczogRHluYW1pY01vZHVsZUxpc3RGb3JtUmVjb3JkQWN0aW9uc0RlZmF1bHQgPVxyXG4gICAgbmV3IER5bmFtaWNNb2R1bGVMaXN0Rm9ybVJlY29yZEFjdGlvbnNEZWZhdWx0KCk7XHJcbiAgc2hvd1RpdGxlID0gdHJ1ZTtcclxuICBAVmlld0NoaWxkKFwidGFibGVSZWNvcmRzXCIsIHsgc3RhdGljOiB0cnVlIH0pIHRhYmxlUmVjb3JkczogRXFwVGFibGVDb21wb25lbnQ7XHJcblxyXG4gIGNvbHVtbnMgPSBuZXcgQXJyYXk8Q29uZmlnQ29sdW1uPigpO1xyXG4gIGxvYWRlZEZpbHRlcnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBsb2FkZWRUYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAT3V0cHV0KCkgb25WaWV3UmVjb3JkOiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBvbkFkZFZpZXdFZGl0UmVjb3JkOiBFdmVudEVtaXR0ZXI8eyByZWNvcmQ6IFJlY29yZDsgb25seVZpZXc6IGJvb2xlYW47IH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHJlY29yZDogUmVjb3JkOyBvbmx5VmlldzogYm9vbGVhbiB9PigpO1xyXG5cclxuICBAT3V0cHV0KCkgb25EZWxldGVSZWNvcmQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcbiAgQE91dHB1dCgpIG9uQWZ0ZXJEZWxldGVSZWNvcmQ6IEV2ZW50RW1pdHRlcjxSZWNvcmQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSZWNvcmQ+KCk7XHJcblxyXG4gIG1vZGVzID0gTW9kZUVudW07XHJcbiAgbWluRGF0ZSA9IG5ldyBEYXRlKCk7XHJcbiAgbWF4RGF0ZSA9IG5ldyBEYXRlKCk7XHJcblxyXG4gIC8vIGxlIHByb3ByaWV0w6AgZGVsbGEgcmlzcG9zdGEgZGEgc3RhbXBhcmUgbmVsbGUgcmlnaGVcclxuICBwcm9wZXJ0aWVzID0gW107XHJcbiAgLy8gbGUgbGFiZWwgYXNzb2NpYXRlIGFsbGUgcHJvcHJpZXTDoCBkYSBzdGFtcGFyZSBjaGUgY29uZGl2aWRvbm8gbG8gc3Rlc3NvIGluZGljZVxyXG4gIHByb3BlcnRpZXNMYWJlbCA9IFtdO1xyXG4gIHNlbGVjdGVkUHJvcGVydGllczogc3RyaW5nW107XHJcblxyXG4gIC8vIGkgZGF0aSBkZWxsZSByaXNwb3N0ZSBkYSBzdGFtcGFyZVxyXG4gIGZpbHRlcmVkQW5zd2VycyAvL2xlIHJpc3Bvc3RlIGZpbHRyYXRlIFxyXG5cclxuICAvLyBDb2xvbm5lIGRhIHZpc3VhbGl6emFyZSAoZmlzc2EgbGEgcHJpbWEgY29sb25uYSBlIGdlbmVyYSBkaW5hbWljYW1lbnRlIGxlIGFsdHJlKVxyXG4gIGRpc3BsYXllZENvbHVtbnMgPSBbXTtcclxuICBleGlzdGluZ0FnZ3JlZ2F0aW9uczogQXJyYXk8TnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW0+ID0gbnVsbDtcclxuICBudW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bSA9IE51bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtO1xyXG5cclxuICAvLyNyZWdpb24gQ29uc3RydWN0b3JcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgdXRpbGl0eUhlbHBlclNlcnZpY2U6IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICBwcml2YXRlIGRhdGVwaXBlOiBEYXRlUGlwZVxyXG4gICkge1xyXG4gICAgLy8gdGhpcy5wcm9wZXJ0aWVzTGFiZWxbXCJBbnN3ZXJEYXRlXCJdID0gXCJEYXRhXCI7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBDb25zdHJ1Y3RvclxyXG5cclxuICAvLyNyZWdpb24gbmdPbkludGl0XHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLmRlZmF1bHRMaXN0QWN0aW9ucyA9IHRoaXMuY29uZmlndXJhdGlvbnMuZGVmYXVsdExpc3RBY3Rpb25zO1xyXG4gICAgdGhpcy5zaG93VGl0bGUgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLnNob3dUaXRsZTtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ2xpc3QtZm9ybS1yZWNvcmQgLSBuZ09uSW5pdCAtIGNvbmZpZ3VyYXRpb25zJywgdGhpcy5jb25maWd1cmF0aW9ucyk7XHJcblxyXG4gICAgdGhpcy5nZXRGb3JtQnlJRCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gbmdPbkludGl0XHJcblxyXG4gIC8vI3JlZ2lvbiBuZ09uQ2hhbmdlc1xyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ2xpc3QtZm9ybS1yZWNvcmQgLSBjaGFuZ2VzJywgY2hhbmdlcyk7XHJcbiAgICAvLyBTZSB2aWVuZSBtb2RpZmljYXRvIGlsIHZhbG9yZSBkaSBcIm5nTW9kZWxJbnB1dFwiIGFsbG9yYSBhZ2dpb3JuYSBsJ2lucHV0XHJcbiAgICAvLyBpZiAoY2hhbmdlc1snY29uZmlndXJhdGlvbnMnXSAhPSB1bmRlZmluZWQgJiYgY2hhbmdlc1snY29uZmlndXJhdGlvbnMnXS5maXJzdENoYW5nZSA9PSBmYWxzZSkge1xyXG4gICAgLy8gICB0aGlzLmNvbmZpZ3VyYXRpb25zLnZhbHVlcyA9IGNoYW5nZXNbJ2NvbmZpZ3VyYXRpb25zJ10uY3VycmVudFZhbHVlO1xyXG4gICAgLy8gICB0aGlzLnJlbG9hZFRhYmxlcygpO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gbmdPbkNoYW5nZXNcclxuXHJcbiAgLy8jcmVnaW9uIGdldEZvcm1CeUlEXHJcbiAgYXN5bmMgZ2V0Rm9ybUJ5SUQoaWQ6IHN0cmluZyA9IHRoaXMuZm9ybUlEKSB7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdsaXN0LWZvcm0tcmVjb3JkIC0gZ2V0Rm9ybUJ5SUQnLCB0aGlzLmZvcm0pO1xyXG5cclxuICAgIGlmICh0aGlzLmZvcm0gPT0gbnVsbCkge1xyXG4gICAgICBjb25zdCBkeW5hbWljTW9kdWxlUGFyYW1zOiBBcnJheTxFbmRQb2ludERhdGFQYXJhbXM+ID1cclxuICAgICAgICBuZXcgQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPigpO1xyXG4gICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLnB1c2goe1xyXG4gICAgICAgIFBhcmFtTmFtZTogXCJpZFwiLFxyXG4gICAgICAgIFBhcmFtVmFsdWU6IGlkLFxyXG4gICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICB9KTtcclxuICAgICAgYXdhaXQgdGhpcy51dGlsaXR5SGVscGVyU2VydmljZS5SdW5FbmRQb2ludENhbGwoXHJcbiAgICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uRm9ybXMuR2V0QnlJREVuZFBvaW50LFxyXG4gICAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMsXHJcbiAgICAgICAgKHJlczogRm9ybSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5mb3JtID0gcmVzO1xyXG4gICAgICAgICAgdGhpcy5jb25maWd1cmVDb2x1bW5zKCk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICAoZXJyKSA9PiB7IH1cclxuICAgICAgKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29uZmlndXJlQ29sdW1ucygpO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0Rm9ybUJ5SURcclxuXHJcbiAgLy8jcmVnaW9uIGdldFJlY29yZHNCeUZvcm1JRFxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgcmVjdXBlcmFyZSB0dXR0aSBpIHJlY29yZCBzYWx2YXRpIHBlciB1bmEgcGFydGljb2xhcmUgRm9ybS5cclxuICAgKiBMYSBjaGlhbWF0YSB2aWVuZSBlZmZldHR1YXRhIHNvbG8gc2Ugw6ggc3RhdG8gY29uZmlndXJhdG8gbCdlbmRQb2ludCBkYSB1c2FyZS5cclxuICAgKiBMYSByaXNwb3N0YSBkZWxsYSBjaGlhbWF0YSBkZXZlIGVzc2VyZSB1biBhcnJheSBkaSBvZ2dldHRpIGRpIHRpcG8gXCJEeW5SZWNvcmRcIlxyXG4gICAqIGEgcGFydGlyZSBkYWkgcXVhbGkgdmVuZ29ubyByaWNyZWF0aSBpIFJlY29yZCB1c2F0aSBuZWwgY2xpZW50LlxyXG4gICAqL1xyXG4gIGFzeW5jIGdldFJlY29yZHNCeUZvcm1JRCgpIHtcclxuICAgIC8qKlxyXG4gICAgICogcHJlbmRlIGxlIHJpc3Bvc3RlIGUgbGUgcmVuZGUgcGlhdHRlLCBhZGF0dGUgYSBkaXZlbnRhcmUgdW5hIHJpZ2EgZGEgdGFiZWxsYVxyXG4gICAgICogbWV0dGUgdHV0dGUgbGUgcmlzcG9zdGUgbmVsbGUgc3RydXR0dXJlIG5lY2Vzc2FyaWUgcGVyIGlsIHJlY3VwZXJvIGUgbGEgdmlzdWFsaXp6YXppb25lXHJcbiAgICAgKiBAcGFyYW0gYW5zd2VycyBcclxuICAgICAqL1xyXG4gICAgY29uc3QgcmVhcnJhbmdlQW5zd2Vyc0FuZFBvcHVsYXRlTGlzdHMgPSAoYW5zd2VycykgPT4ge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb25zLnZhbHVlcyA9IG5ldyBBcnJheTxSZWNvcmQ+KCk7XHJcbiAgICAgIGFuc3dlcnMuZm9yRWFjaCgoYW5zd2VyKSA9PiB7XHJcbiAgICAgICAgdmFyIHRtcFJlYzogUmVjb3JkID0gbmV3IFJlY29yZCgpO1xyXG4gICAgICAgIHRtcFJlYyA9IEpTT04ucGFyc2UoYW5zd2VyLlNlcmlhbGl6ZWRWYWx1ZXMpO1xyXG4gICAgICAgIHRtcFJlYy5JRCA9IGFuc3dlci5JRDtcclxuICAgICAgICB0bXBSZWMuRW50SUQgPSBhbnN3ZXIuRW50SUQ7XHJcbiAgICAgICAgdG1wUmVjLlZlcnNpb24gPSBhbnN3ZXIuVmVyc2lvbjtcclxuICAgICAgICB0bXBSZWMudXNlcklEID0gYW5zd2VyLnVzZXJJRDtcclxuICAgICAgICB0bXBSZWMuQW5zd2VyRGF0ZSA9IGFuc3dlci5BbnN3ZXJEYXRlO1xyXG4gICAgICAgIHRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzLnB1c2godG1wUmVjKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBwcmVwYXJhIGxhIGxpc3RhIGRlbGxlIGNvbG9ubmUgZGEgbW9zdHJhcmUgKHVuYSBwZXIgb2duaSByaXNwb3N0YSwgcGnDuSBsYSBjb2xvbm5hIGRlbGxlIHByb3ByaWV0w6ApXHJcbiAgICAgKiBpbXBvc3RhIGxhIGxpc3RhIGRlbGxlIHJpc3Bvc3RlIGRhIHZpc3VhbGl6emFyZVxyXG4gICAgICogbGliZXJhIGxlIHZhcmlhYmlsaSBkaSBjYXJpY2FtZW50byBwZXIgbW9zdHJhcmUgaSBjb250ZW51dGkgZGVsbGEgdmlzdGFcclxuICAgICAqL1xyXG4gICAgY29uc3QgbmFtZUNvbHVtbnNBbmRTdGFydFZpZXcgPSAoKSA9PiB7XHJcbiAgICAgIC8vZGVzdHJ1dHR1cmEgbCdhcnJheSByaXNwb3N0ZSBlIHBlciBvZ25pIHJpc3Bvc3RhIGdlbmVyYSB1biBlbGVtZW50byBjb2xbaV1cclxuICAgICAgdGhpcy5kaXNwbGF5ZWRDb2x1bW5zID0gW1wicHJvcGVydHlcIiwgLi4udGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXMubWFwKChfLCBpKSA9PiBgY29sJHtpfWApXTtcclxuICAgICAgdGhpcy5maWx0ZXJlZEFuc3dlcnMgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLnZhbHVlcztcclxuICAgICAgdGhpcy5zZXRNaW5NYXhEYXRlcygpO1xyXG5cclxuICAgICAgdGhpcy5sb2FkZWRGaWx0ZXJzID0gdHJ1ZTtcclxuICAgICAgdGhpcy5sb2FkZWRUYWJsZSA9IHRydWU7XHJcbiAgICAgIHNldFRpbWVvdXQoKF8pID0+IHtcclxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgfSwgMCk7IC8vIHJlZnJlc2ggdWlcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXMpIHtcclxuICAgICAgLy8gdmVuZ28gZGEgdW4nYWx0cmEgdmlzdWFsaXp6YXppb25lIGNoZSBoYSBnacOgIHJlY3VwZXJhdG8gbGUgcmlzcG9zdGVcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImhMaXN0IC0gZ2V0UmVjb3Jkc0J5Rm9ybUlEIEFcIiwgdGhpcy5jb25maWd1cmF0aW9ucylcclxuICAgICAgbmFtZUNvbHVtbnNBbmRTdGFydFZpZXcoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHNvbm8gaW4gdW5hIG51b3ZhIGlzdGFuemEgaW4gY3VpIGRldm8gcmVjdXBlcmFyZSBsZSByaXNwb3N0ZVxyXG4gICAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiaExpc3QgLSBnZXRSZWNvcmRzQnlGb3JtSUQgQlwiLCB0aGlzLmNvbmZpZ3VyYXRpb25zKVxyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uICYmXHJcbiAgICAgICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzICYmXHJcbiAgICAgICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEJ5Rm9ybUlERW5kUG9pbnRcclxuICAgICAgICApIHtcclxuICAgICAgICAgIGxldCBkeW5hbWljTW9kdWxlUGFyYW1zID0gW1xyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgUGFyYW1OYW1lOiBcIkVudElEXCIsXHJcbiAgICAgICAgICAgICAgUGFyYW1WYWx1ZTogdGhpcy5mb3JtLklELFxyXG4gICAgICAgICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgXTtcclxuICAgICAgICAgIGlmICh0aGlzLmNvbmZpZ3VyYXRpb25zLnVzZXJJRCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgIC8vIG5vbiBobyBzcGVjaWZpY2F0byB1biB1dGVudGVcclxuICAgICAgICAgICAgLy8gdmVkbyB0dXR0ZSBsZSByaXNwb3N0ZSBkZWwgbW9kdWxvXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICAgICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuR2V0QnlGb3JtSURFbmRQb2ludCxcclxuICAgICAgICAgICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAgICAgICAgIChyZXM6IEFycmF5PER5blJlY29yZD4pID0+IHtcclxuICAgICAgICAgICAgICAgIHJlYXJyYW5nZUFuc3dlcnNBbmRQb3B1bGF0ZUxpc3RzKHJlcyk7XHJcbiAgICAgICAgICAgICAgICBuYW1lQ29sdW1uc0FuZFN0YXJ0VmlldygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIGNvbm9zY28gbCd1dGVudGVcclxuICAgICAgICAgICAgLy8gdm9nbGlvIHNvbGFtZW50ZSBsZSBzdWUgcmlzcG9zdGVcclxuICAgICAgICAgICAgZHluYW1pY01vZHVsZVBhcmFtcy5wdXNoKFxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIFBhcmFtTmFtZTogXCJVc2VySURcIixcclxuICAgICAgICAgICAgICAgIFBhcmFtVmFsdWU6IHRoaXMuY29uZmlndXJhdGlvbnMudXNlcklELFxyXG4gICAgICAgICAgICAgICAgUGFyYW1UeXBlOiBQYXJhbVR5cGVFbnVtW1wiUXVlcnkgcGFyYW1cIl0sXHJcbiAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICAgICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLlJlY29yZHMuR2V0QWxsQnlFbnRBbmRVc2VySURFbmRQb2ludCxcclxuICAgICAgICAgICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAgICAgICAgIChyZXM6IEFycmF5PER5blJlY29yZD4pID0+IHtcclxuICAgICAgICAgICAgICAgIHJlYXJyYW5nZUFuc3dlcnNBbmRQb3B1bGF0ZUxpc3RzKHJlcyk7XHJcbiAgICAgICAgICAgICAgICBuYW1lQ29sdW1uc0FuZFN0YXJ0VmlldygpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignZXhjZXB0aW9uJywgZSlcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gZ2V0UmVjb3Jkc0J5Rm9ybUlEXHJcblxyXG5cclxuICAvLyNyZWdpb24gY29uZmlndXJlQ29sdW1uc1xyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY29uZmlndXJhcmUgbGUgY29sb25uZSBkZWxsYSBlcXAtdGFibGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjb25maWd1cmVDb2x1bW5zKCkge1xyXG4gICAgdGhpcy5jb2x1bW5zID0gW1xyXG4gICAgICB7XHJcbiAgICAgICAga2V5OiBcImFjdGlvblwiLFxyXG4gICAgICAgIGRpc3BsYXk6IFwiXCIsXHJcbiAgICAgICAgdHlwZTogVHlwZUNvbHVtbi5NZW51QWN0aW9uLFxyXG4gICAgICAgIGJ1dHRvbk1lbnVJY29uOiBcIm1vcmVfdmVydFwiLFxyXG4gICAgICAgIHN0eWxlczogeyBmbGV4OiBcIjAgMCA2JVwiIH0sXHJcbiAgICAgICAgYWN0aW9uczogW10sXHJcbiAgICAgIH0sXHJcbiAgICBdO1xyXG5cclxuICAgIGlmICh0aGlzLmRlZmF1bHRMaXN0QWN0aW9ucy52aWV3ID09IHRydWUpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbmQoKGMpID0+IGMua2V5ID09PSBcImFjdGlvblwiKVxyXG4gICAgICAgIC5hY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgbmFtZTogXCJWaXN1YWxpenphXCIsXHJcbiAgICAgICAgICBpY29uOiBcImluZm9cIixcclxuICAgICAgICAgIGZuOiAoZWxlbWVudCwgaW5kZXgsIGNvbCkgPT4gdGhpcy52aWV3UmVjb3JkKGVsZW1lbnQpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGVmYXVsdExpc3RBY3Rpb25zLmVkaXQgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNcclxuICAgICAgICAuZmluZCgoYykgPT4gYy5rZXkgPT09IFwiYWN0aW9uXCIpXHJcbiAgICAgICAgLmFjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiBcIk1vZGlmaWNhXCIsXHJcbiAgICAgICAgICBpY29uOiBcImVkaXRcIixcclxuICAgICAgICAgIGZuOiAoZWxlbWVudCwgaW5kZXgsIGNvbCkgPT4gdGhpcy52aWV3T3JFZGl0UmVjb3JkKGVsZW1lbnQsIGZhbHNlKSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlZmF1bHRMaXN0QWN0aW9ucy5kdXBsaWNhdGUgPT0gdHJ1ZSkge1xyXG4gICAgICAvKnRoaXMuY29sdW1uc1xyXG4gICAgICAgIC5maW5kKChjKSA9PiBjLmtleSA9PT0gXCJhY3Rpb25cIilcclxuICAgICAgICAuYWN0aW9ucy5wdXNoKHtcclxuICAgICAgICAgIG5hbWU6IFwiRHVwbGljYVwiLFxyXG4gICAgICAgICAgaWNvbjogXCJmaWxlX2NvcHlcIixcclxuICAgICAgICAgIGZuOiAoZWxlbWVudCwgaW5kZXgsIGNvbCkgPT4gdGhpcy5kdXBsaWNhdGVSZWNvcmQoZWxlbWVudCksXHJcbiAgICAgICAgfSk7Ki9cclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlZmF1bHRMaXN0QWN0aW9ucy5kZWxldGUgPT0gdHJ1ZSkge1xyXG4gICAgICB0aGlzLmNvbHVtbnNcclxuICAgICAgICAuZmluZCgoYykgPT4gYy5rZXkgPT09IFwiYWN0aW9uXCIpXHJcbiAgICAgICAgLmFjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiBcIkVsaW1pbmFcIixcclxuICAgICAgICAgIGljb246IFwiZGVsZXRlXCIsXHJcbiAgICAgICAgICBmbjogKGVsZW1lbnQsIGluZGV4LCBjb2wpID0+IHRoaXMuZGVsZXRlUmVjb3JkKGVsZW1lbnQpLFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZXh0ZXJuYWxCdXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xyXG4gICAgICB0aGlzLmNvbHVtbnNcclxuICAgICAgICAuZmluZCgoYykgPT4gYy5rZXkgPT09IFwiYWN0aW9uXCIpXHJcbiAgICAgICAgLmFjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiBidXR0b24udGV4dCxcclxuICAgICAgICAgIGljb246IGJ1dHRvbi5pY29uLFxyXG4gICAgICAgICAgZm46IChlbGVtZW50LCBpbmRleCwgY29sKSA9PiBidXR0b24uZm4oKSxcclxuICAgICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY3JlYXRlQWRkaXRpb25hbEFjdGlvbnMoKTtcclxuICAgIHRoaXMuY3JlYXRlQ29sdW1uc0Zyb21Gb3JtRmllbGRzKCk7XHJcbiAgICB0aGlzLmdldFJlY29yZHNCeUZvcm1JRCgpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gY29uZmlndXJlQ29sdW1uc1xyXG5cclxuICAvLyNyZWdpb24gY3JlYXRlQWRkaXRpb25hbEFjdGlvbnNcclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGFnZ2l1bmdlcmUgbmVsbGEgY29sb25uYSBcImFjdGlvblwiIGRlbGxhIGVxcC10YWJsZSBsZSBhemlvbmkgc3VpIHJlY29yZFxyXG4gICAqIGRlZmluaXRlIGRhbGwndXRlbnRlIGFsbCdpbnRlcm5vIGRlbGxhIEZvcm0uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVBZGRpdGlvbmFsQWN0aW9ucygpIHtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coJ2xpc3QtZm9ybS1yZWNvcmQgLSBjcmVhdGVBZGRpdGlvbmFsQWN0aW9ucycsIHRoaXMuZm9ybSk7XHJcblxyXG4gICAgaWYgKHRoaXMuZm9ybS5BY3Rpb25zT25SZWNvcmQgJiYgdGhpcy5mb3JtLkFjdGlvbnNPblJlY29yZC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5BY3Rpb25zT25SZWNvcmQuc29ydCgoYSwgYikgPT5cclxuICAgICAgICBhLk9yZGluYWxQb3NpdGlvbiA+IGIuT3JkaW5hbFBvc2l0aW9uXHJcbiAgICAgICAgICA/IDFcclxuICAgICAgICAgIDogYi5PcmRpbmFsUG9zaXRpb24gPiBhLk9yZGluYWxQb3NpdGlvblxyXG4gICAgICAgICAgICA/IC0xXHJcbiAgICAgICAgICAgIDogMFxyXG4gICAgICApLmZvckVhY2goKGFjdGlvbikgPT4ge1xyXG4gICAgICAgIHRoaXMuY29sdW1uc1xyXG4gICAgICAgICAgLmZpbmQoKGMpID0+IGMua2V5ID09PSBcImFjdGlvblwiKVxyXG4gICAgICAgICAgLmFjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICAgIG5hbWU6IGFjdGlvbi5OYW1lLFxyXG4gICAgICAgICAgICBpY29uOiBhY3Rpb24uSWNvbixcclxuICAgICAgICAgICAgZm46IChlbGVtZW50LCBpbmRleCwgY29sKSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3QgcmVjID0gZWxlbWVudDtcclxuICAgICAgICAgICAgICBjb25zdCBjdHggPSBVdGlsaXR5SGVscGVyU2VydmljZS5jb250ZXh0O1xyXG4gICAgICAgICAgICAgIGV2YWwoYWN0aW9uLkFjdGlvbik7XHJcbiAgICAgICAgICAgICAgLy8gVE9ETzogc2FsdmFyZSBsZSBtb2RpZmljaGVcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGNyZWF0ZUFkZGl0aW9uYWxBY3Rpb25zXHJcblxyXG5cclxuICAvLyNyZWdpb24gY3JlYXRlQ29sdW1uc0Zyb21Gb3JtRmllbGRzXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBjcmVhcmUgbGEgY29uZmlndXJhemlvbmUgZGVsbGUgY29sb25uZSBwZXIgbGEgZXFwLXRhYmxlLlxyXG4gICAqIEluZGl2aWR1YSBpIEJhc2VGaWVsZCBkYSBtb3N0cmFyZSBlIGxpIHVzYSBwZXIgY3JlYXJlIGxlIENvbmZpZ0NvbHVtbi5cclxuICAgKiBMZSBjb2xvbm5lIHZlbmdvbm8gY3JlYXRlIHBlciBpIEJhc2VGaWVsZCBjb24gaWwgZmxhZyBJbkxpc3RWaWV3IGEgVFJVRVxyXG4gICAqIG9wcHVyZSwgbmVsIGNhc28gbm9uIHNpYW5vIHN0YXRpIHNwZWNpZmljYXRpIGkgY2FtcGkgZGEgdmlzdWFsaXp6YXJlLFxyXG4gICAqIHNlbGV6aW9uYSBpIHByaW1pIDYuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVDb2x1bW5zRnJvbUZvcm1GaWVsZHMoKSB7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdsaXN0LWZvcm0tcmVjb3JkIC0gY3JlYXRlQ29sdW1uc0Zyb21Gb3JtRmllbGRzJywgdGhpcy5mb3JtKTtcclxuXHJcbiAgICB2YXIgZmllbGRzRm9yQ29sdW1uczogQXJyYXk8QmFzZUZpZWxkPjtcclxuICAgIGZpZWxkc0ZvckNvbHVtbnMgPSB0aGlzLmZvcm0uRmllbGRzLmZpbHRlcigoZikgPT4ge1xyXG4gICAgICAvL25hc2NvbmRlcmUgY2FtcGkgZXRpY2hldHRhXHJcbiAgICAgIGlmKGYuRmllbGRUeXBlID09IEZpZWxkVHlwZUVudW1bXCJFdGljaGV0dGFcIl0pe1xyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoZi5BbnN3ZXJTdHlsZSkge1xyXG4gICAgICAgIHJldHVybiBmLkFuc3dlclN0eWxlLkluTGlzdFZpZXc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGYuSW5MaXN0VmlldztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5leGlzdGluZ0FnZ3JlZ2F0aW9ucyA9IFtdO1xyXG5cclxuICAgIGZpZWxkc0ZvckNvbHVtbnNcclxuICAgICAgLnNvcnQoKGEsIGIpID0+XHJcbiAgICAgICAgYS5PcmRpbmFsUG9zaXRpb24gPiBiLk9yZGluYWxQb3NpdGlvblxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IGIuT3JkaW5hbFBvc2l0aW9uID4gYS5PcmRpbmFsUG9zaXRpb25cclxuICAgICAgICAgICAgPyAtMVxyXG4gICAgICAgICAgICA6IDBcclxuICAgICAgKVxyXG4gICAgICAuZm9yRWFjaCgoZmllbGQpID0+IHtcclxuICAgICAgICBcclxuICAgICAgICAvLyB0aGlzLmNvbHVtbnMucHVzaCh0aGlzLmNyZWF0ZUZpZWxkQ29sdW1uKGZpZWxkKSk7XHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1c2goeyBsYWJlbDogZmllbGQuTGFiZWwsIHR5cGU6IGZpZWxkLkZpZWxkVHlwZSwgY29uZmlnOiBmaWVsZCB9KTtcclxuICAgICAgICB0aGlzLnByb3BlcnRpZXNMYWJlbFtmaWVsZC5MYWJlbF0gPSBmaWVsZC5EZXNjcmlwdGlvbjtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLkFnZ3JlZ2F0aW9ucyAhPSBudWxsICYmIGZpZWxkLkFnZ3JlZ2F0aW9ucy5sZW5ndGggPiAwICl7XHJcbiAgICAgICAgICBmaWVsZC5BZ2dyZWdhdGlvbnMuZm9yRWFjaCgoYWdncmVnYXRpb24pID0+IHsgIFxyXG4gICAgICAgICAgICBpZiAodGhpcy5leGlzdGluZ0FnZ3JlZ2F0aW9ucy5pbmRleE9mKGFnZ3JlZ2F0aW9uKSA9PSAtMSl7XHJcbiAgICAgICAgICAgICAgdGhpcy5leGlzdGluZ0FnZ3JlZ2F0aW9ucy5wdXNoKGFnZ3JlZ2F0aW9uKTtcclxuICAgICAgICAgICAgICAvL3RoaXMucHJvcGVydGllc0xhYmVsW051bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtW2FnZ3JlZ2F0aW9uXS50b1N0cmluZygpLnRvVXBwZXJDYXNlKCldID0gXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pOyBcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIFxyXG5cclxuICAgICAgfSk7XHJcbiAgICAgIFxyXG4gICAgdGhpcy5zZWxlY3RlZFByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XHJcblxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gY3JlYXRlQ29sdW1uc0Zyb21Gb3JtRmllbGRzXHJcblxyXG4gIC8vI3JlZ2lvbiBjcmVhdGVGaWVsZENvbHVtblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIGwnb2dnZXR0byBDb25maWd1cmVDb2x1bW4gY2hlIHJhcHByZXNlbnRhIGlsIEJhc2VGaWVsZCBwYXNzYXRvIGluIGlucHV0LlxyXG4gICAqIEBwYXJhbSBmaWVsZCBCYXNlRmllbGQgcGVyIGN1aSBjcmVhcmUgbGEgY29sb25uYSBuZWxsYSBlcXAtdGFibGVcclxuICAgKiBAcmV0dXJucyBSZXN0aXR1aXNjZSB1bmEgQ29uZmlnQ29sdW1uIHBlciBsYSBlcXAtdGFibGVcclxuICAgKi9cclxuICAvLyBwcml2YXRlIGNyZWF0ZUZpZWxkQ29sdW1uKGZpZWxkOiBCYXNlRmllbGQpOiBDb25maWdDb2x1bW4ge1xyXG4gIC8vICAgdmFyIGNvbHVtbjogQ29uZmlnQ29sdW1uID0geyBrZXk6IGZpZWxkLk5hbWUsIGRpc3BsYXk6IGZpZWxkLkxhYmVsIH07XHJcbiAgLy8gICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkge1xyXG4gIC8vICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJCb29sZWFub1wiXTpcclxuICAvLyAgICAgICBjb2x1bW4udHlwZSA9IFR5cGVDb2x1bW4uQm9vbGVhbjtcclxuICAvLyAgICAgICBjb2x1bW4uYm9vbGVhblZhbHVlcyA9IHtcclxuICAvLyAgICAgICAgIGZhbHNlOiAnPGkgY2xhc3M9XCJmYSBmYS10aW1lcyBlcnJvci1jb2xvclwiPjwvaT4nLFxyXG4gIC8vICAgICAgICAgdHJ1ZTogJzxpIGNsYXNzPVwiZmEgZmEtY2hlY2sgc3VjY2Vzcy1jb2xvclwiPjwvaT4nLFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgICAgY29sdW1uLnN0eWxlcyA9IHtcclxuICAvLyAgICAgICAgIGZsZXg6IFwiMCAwIDclXCIsXHJcbiAgLy8gICAgICAgICBjZWxsQWxpZ25tZW50OiBDZWxsQWxpZ25tZW50RW51bS5DRU5URVIsXHJcbiAgLy8gICAgICAgfTtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRGF0YSBlL28gb3JhXCJdOlxyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIChmaWVsZCBhcyBEYXRlRmllbGQpLklzT25seURhdGUgIT0gRGF0ZVRpbWVUeXBlRW51bVtcIlNvbG8gb3JhcmlvXCJdXHJcbiAgLy8gICAgICAgKSB7XHJcbiAgLy8gICAgICAgICBjb2x1bW4udHlwZSA9IFR5cGVDb2x1bW4uRGF0ZTtcclxuICAvLyAgICAgICAgIGlmIChcclxuICAvLyAgICAgICAgICAgKGZpZWxkIGFzIERhdGVGaWVsZCkuSXNPbmx5RGF0ZSA9PSBEYXRlVGltZVR5cGVFbnVtW1wiRGF0YSBlIG9yYVwiXVxyXG4gIC8vICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbHVtbi5mb3JtYXQgPSBcImRkL01NL3l5eXkgSEg6bW1cIjtcclxuICAvLyAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgLy8gICAgICAgICAgIChmaWVsZCBhcyBEYXRlRmllbGQpLklzT25seURhdGUgPT0gRGF0ZVRpbWVUeXBlRW51bVtcIlNvbG8gZGF0YVwiXVxyXG4gIC8vICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgIGNvbHVtbi5mb3JtYXQgPSAoZmllbGQgYXMgRGF0ZUZpZWxkKS5EYXRlRm9ybWF0XHJcbiAgLy8gICAgICAgICAgICAgPyAoZmllbGQgYXMgRGF0ZUZpZWxkKS5EYXRlRm9ybWF0LnJlcGxhY2UoXCJERFwiLCBcImRkXCIpXHJcbiAgLy8gICAgICAgICAgICAgOiBcImRkL01NL3l5eXlcIjtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIG51bWVyaWNvXCJdOlxyXG4gIC8vICAgICAgIGlmICgoZmllbGQgYXMgTnVtZXJpY0ZpZWxkKS5DdXJyZW5jeVN5bWJvbCkge1xyXG4gIC8vICAgICAgICAgY29sdW1uLm51bWJlclBpcGUgPSBOdW1iZXJDb2x1bW5QaXBlLkNVUlJFTkNZO1xyXG4gIC8vICAgICAgICAgY29sdW1uLmN1cnJlbmN5UGlwZUNvZGUgPSAoZmllbGQgYXMgTnVtZXJpY0ZpZWxkKS5DdXJyZW5jeVN5bWJvbDtcclxuICAvLyAgICAgICB9IGVsc2UgaWYgKCEoZmllbGQgYXMgTnVtZXJpY0ZpZWxkKS5Jc0ludGVnZXIpIHtcclxuICAvLyAgICAgICAgIGNvbHVtbi5udW1iZXJQaXBlID0gTnVtYmVyQ29sdW1uUGlwZS5ERUNJTUFMO1xyXG4gIC8vICAgICAgIH1cclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQWxsZWdhdG9cIl06XHJcbiAgLy8gICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkltbWFnaW5lXCJdOlxyXG5cclxuICAvLyAgICAgICAvKlxyXG4gIC8vICAgICAgICAgY29sdW1uLnZhbHVlID0gKGVsZW1lbnQ6IFJlY29yZCkgPT4ge1xyXG4gIC8vICAgICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgICAgKGZpZWxkIGFzIEF0dGFjaG1lbnRGaWVsZCkuSXNNdWx0aUF0dGFjaCB8fFxyXG4gIC8vICAgICAgICAgICAgICgoZmllbGQgYXMgSW1hZ2VGaWVsZCkuQXR0YWNoRGVmaW5pdGlvbiAmJlxyXG4gIC8vICAgICAgICAgICAgICAgKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24uSXNNdWx0aUF0dGFjaClcclxuICAvLyAgICAgICAgICAgKSB7XHJcbiAgLy8gICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRbZmllbGQuTmFtZV0gIT0gbnVsbCAmJiBlbGVtZW50W2ZpZWxkLk5hbWVdLmxlbmd0aCA+IDBcclxuICAvLyAgICAgICAgICAgICAgID8gKGVsZW1lbnRbZmllbGQuTmFtZV0gYXMgQXJyYXk8SUF0dGFjaG1lbnREVE8+KVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIC5tYXAoKGEpID0+IGEuRmlsZU5hbWUpXHJcbiAgLy8gICAgICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKVxyXG4gIC8vICAgICAgICAgICAgICAgOiBudWxsO1xyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHJldHVybiBlbGVtZW50W2ZpZWxkLk5hbWVdICE9IG51bGwgJiYgZWxlbWVudFtmaWVsZC5OYW1lXS5sZW5ndGggPiAwXHJcbiAgLy8gICAgICAgICAgICAgICA/IChlbGVtZW50W2ZpZWxkLk5hbWVdIGFzIEFycmF5PElBdHRhY2htZW50RFRPPilbMF0uRmlsZU5hbWVcclxuICAvLyAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfTtcclxuICAvLyAgICAgICAgIGNvbHVtbi5pc1NvcnRhYmxlID0gZmFsc2U7XHJcbiAgLy8gICAgICAgICBjb2x1bW4uaXNTZWFyY2hhYmxlID0gZmFsc2U7XHJcbiAgLy8gICAgICAgKi9cclxuXHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXTpcclxuICAvLyAgICAgICBjb2x1bW4udmFsdWUgPSAoZWxlbWVudDogUmVjb3JkKSA9PiB7XHJcbiAgLy8gICAgICAgICBpZiAoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKS5Jc011bHRpQ2hvaWNoZSkge1xyXG4gIC8vICAgICAgICAgICBpZiAoIWVsZW1lbnRbZmllbGQuTmFtZV0gfHwgZWxlbWVudFtmaWVsZC5OYW1lXS5sZW5ndGggPT0gMCkge1xyXG4gIC8vICAgICAgICAgICAgIHJldHVybiBudWxsO1xyXG4gIC8vICAgICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cygoZmllbGQgYXMgTGlzdFZhbHVlRmllbGQpLlZhbHVlUGFpcnMpXHJcbiAgLy8gICAgICAgICAgICAgICAuZmlsdGVyKChrKSA9PlxyXG4gIC8vICAgICAgICAgICAgICAgICBlbGVtZW50W2ZpZWxkLk5hbWVdLmluY2x1ZGVzKFxyXG4gIC8vICAgICAgICAgICAgICAgICAgIChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuVmFsdWVQYWlyc1trXVxyXG4gIC8vICAgICAgICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICAgICAgICApXHJcbiAgLy8gICAgICAgICAgICAgICAuam9pbihcIiwgXCIpO1xyXG4gIC8vICAgICAgICAgICB9XHJcbiAgLy8gICAgICAgICB9IGVsc2Uge1xyXG4gIC8vICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKS5WYWx1ZVBhaXJzKS5maW5kKFxyXG4gIC8vICAgICAgICAgICAgIChrKSA9PlxyXG4gIC8vICAgICAgICAgICAgICAgKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKS5WYWx1ZVBhaXJzW2tdID09IGVsZW1lbnRbZmllbGQuTmFtZV1cclxuICAvLyAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGNvbHVtbi5pc1NvcnRhYmxlID0gZmFsc2U7XHJcbiAgLy8gICAgICAgY29sdW1uLmlzU2VhcmNoYWJsZSA9IGZhbHNlO1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJMb29rdXBcIl06XHJcbiAgLy8gICAgICAgLy8gVE9ET1xyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgfVxyXG4gIC8vICAgcmV0dXJuIGNvbHVtbjtcclxuICAvLyB9XHJcbiAgLy8jZW5kcmVnaW9uIGNyZWF0ZUZpZWxkQ29sdW1uXHJcblxyXG4gIC8vI3JlZ2lvbiB2aWV3UmVjb3JkXHJcbiAgdmlld1JlY29yZChyZWNvcmQ6IFJlY29yZCkge1xyXG4gICAgdGhpcy5vblZpZXdSZWNvcmQuZW1pdChyZWNvcmQpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gdmlld1JlY29yZFxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gY2hlIHNjYXRlbmEgbCdldmVudG8gZGkgT3V0cHV0IHBlciBtb3N0cmFyZSBvIG1vZGlmaWNhcmUgaWwgcmVjb3JkXHJcbiAgICogc2VsZXppb25hdG8gc3VsbGEgZXFwLXRhYmxlLlxyXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkIGRhIHZpc3VhbGl6emFyZSBvIG1vZGlmaWNhcmUgc2VsZXppb25hdG8gc3VsbGEgZXFwLXRhYmxlLlxyXG4gICAqIEBwYXJhbSBvbmx5VmlldyBTZSBUUlVFIHZpZW5lIG1vc3RyYXRvIGlsIGNvbXBvbmVudGUgYWRkLWZvcm0tcmVjb3JkIGluIHNvbGEgbGV0dHVyYS5cclxuICAgKi9cclxuICBwcml2YXRlIHZpZXdPckVkaXRSZWNvcmQocmVjb3JkOiBSZWNvcmQsIG9ubHlWaWV3OiBib29sZWFuKSB7XHJcbiAgICB0aGlzLm9uQWRkVmlld0VkaXRSZWNvcmQuZW1pdCh7IHJlY29yZCwgb25seVZpZXcgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGVsaW1pbmFyZSB1biByZWNvcmQgZGFsbGEgbGlzdGEuXHJcbiAgICogQHBhcmFtIHJlY29yZCBSZWNvcmQgZGEgZWxpbWluYXJlIHNlbGV6aW9uYXRvIHN1bGxhIGVxcC10YWJsZS5cclxuICAgKi9cclxuICBkZWxldGVSZWNvcmQocmVjb3JkOiBSZWNvcmQpIHtcclxuICAgIHRoaXMub25EZWxldGVSZWNvcmQuZW1pdChyZWNvcmQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciByaWNhcmljYXJlIGkgZGF0aSBkZWxsYSBlcXAtdGFibGUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWxvYWRUYWJsZXMoKSB7XHJcbiAgICBpZiAodGhpcy50YWJsZVJlY29yZHMpIHtcclxuICAgICAgdGhpcy50YWJsZVJlY29yZHMucmVsb2FkRGF0YXRhYmxlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyNyZWdpb24gb25TZWxlY3Rpb25DaGFuZ2VcclxuICAvKipcclxuICAgKiBGdW56aW9uZSBjaGUgdmllbmUgY2hpYW1hdGEgYWwgY2FtYmlvIGRpIHNlbGV6aW9uZSBkZWkgcGFyYW1ldHJpIGRhIG1vc3RyYXJlXHJcbiAgICogYWdnaW9ybmEgbGEgbGlzdGEgZGVsbGUgcHJvcHJpZXTDoCBzZWxlemlvbmF0ZSBjaGUgZ2VzdGlzY2UgbGUgcmlnaGUgbW9zdHJhdGUgcGVyIG9nbmkgcmlzcG9zdGFcclxuICAgKiBAcGFyYW0gc2VsZWN0ZWRQcm9wZXJ0aWVzIFxyXG4gICAqL1xyXG4gIG9uU2VsZWN0aW9uQ2hhbmdlKHNlbGVjdGVkUHJvcGVydGllcykge1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIm9uU2VsZWN0aW9uQ2hhbmdlIHNlbGVjdGVkUHJvcGVydGllcy52YWx1ZVwiLHNlbGVjdGVkUHJvcGVydGllcy52YWx1ZSk7XHJcbiAgICBpZiAoc2VsZWN0ZWRQcm9wZXJ0aWVzLnZhbHVlLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFByb3BlcnRpZXMgPSBzZWxlY3RlZFByb3BlcnRpZXMudmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUHJvcGVydGllcyA9IHRoaXMucHJvcGVydGllcztcclxuICAgIH1cclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJ0aGlzLnNlbGVjdGVkUHJvcGVydGllcyBhc3NlZ25hdGFcIix0aGlzLnNlbGVjdGVkUHJvcGVydGllcyk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBvblNlbGVjdGlvbkNoYW5nZVxyXG5cclxuICAvLyNyZWdpb24gZmlsdGVyRGF0YUFuc3dlcnNcclxuICAvKipcclxuICAgKiBmdW56aW9uZSBjaGUgZmlsdHJhIGxlIHJpc3Bvc3RlIGluIGJhc2UgYWwgcmFuZ2UgZGkgZGF0ZSBiYXNhbmRvc2kgc3VsIGNhbXBvIGZpc3NvIEFuc3dlckRhdGUgcGVyIGlsIHBhcmFnb25lXHJcbiAgICovXHJcbiAgZmlsdGVyRGF0YUFuc3dlcnMoKSB7XHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5maWx0ZXJlZEFuc3dlcnMgPSBbXTtcclxuXHJcbiAgICAgIGlmKCF0aGlzLm1pbkRhdGUpe1xyXG4gICAgICAgIC8vIENvbnZlcnRvIGxlIGRhdGUgZGkgQW5zd2VyRGF0ZSBpbiBvZ2dldHRpIERhdGUgZSBvcmRpbm9cclxuICAgICAgICBjb25zdCBkYXRlcyA9IHRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzLm1hcCh2YWx1ZSA9PiBuZXcgRGF0ZSh2YWx1ZS5BbnN3ZXJEYXRlKSk7ICAgIFxyXG4gICAgICAgIC8vIFRyb3ZvIGxhIGRhdGEgcGnDuSByZWNlbnRlIChtYXgpIGUgbGEgcGnDuSB2ZWNjaGlhIChtaW4pXHJcbiAgICAgICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoTWF0aC5taW4oLi4uZGF0ZXMubWFwKGRhdGUgPT4gZGF0ZS5nZXRUaW1lKCkpKSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmKCF0aGlzLm1heERhdGUpe1xyXG4gICAgICAgIC8vIENvbnZlcnRvIGxlIGRhdGUgZGkgQW5zd2VyRGF0ZSBpbiBvZ2dldHRpIERhdGUgZSBvcmRpbm9cclxuICAgICAgICBjb25zdCBkYXRlcyA9IHRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzLm1hcCh2YWx1ZSA9PiBuZXcgRGF0ZSh2YWx1ZS5BbnN3ZXJEYXRlKSk7ICAgIFxyXG4gICAgICAgIC8vIFRyb3ZvIGxhIGRhdGEgcGnDuSByZWNlbnRlIChtYXgpIGUgbGEgcGnDuSB2ZWNjaGlhIChtaW4pXHJcbiAgICAgICAgdGhpcy5tYXhEYXRlID0gbmV3IERhdGUoTWF0aC5tYXgoLi4uZGF0ZXMubWFwKGRhdGUgPT4gZGF0ZS5nZXRUaW1lKCkpKSk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tYXhEYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDU5KTtcclxuXHJcbiAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzID0gdGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXMuZmlsdGVyKCB2YWx1ZSA9PiBuZXcgRGF0ZSh2YWx1ZS5BbnN3ZXJEYXRlKSA+PSB0aGlzLm1pbkRhdGUgJiYgbmV3IERhdGUodmFsdWUuQW5zd2VyRGF0ZSkgPD0gdGhpcy5tYXhEYXRlKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLmV4aXN0aW5nQWdncmVnYXRpb25zICE9IG51bGwgJiYgdGhpcy5leGlzdGluZ0FnZ3JlZ2F0aW9ucy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgICAgdGhpcy5leGlzdGluZ0FnZ3JlZ2F0aW9ucy5mb3JFYWNoKChhZ2dyZWdhdGlvbikgPT4ge1xyXG4gICAgICAgICAgICAgIHZhciByZWNvcmQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZmlsdGVyZWRBbnN3ZXJzWzBdKSk7XHJcbiAgICAgICAgICAgICAgcmVjb3JkLklEID0gXCIwXCI7XHJcbiAgICAgICAgICAgICAgcmVjb3JkLkFuc3dlckRhdGUgPSBOdW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bVthZ2dyZWdhdGlvbl0udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpO1xyXG4gICAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzLnB1c2gocmVjb3JkKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmZpbGxBZ2dyZWdhdGlvbkNvbHVtbnMoKTtcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IFtcInByb3BlcnR5XCIsIC4uLnRoaXMuZmlsdGVyZWRBbnN3ZXJzLm1hcCgoXywgaSkgPT4gYGNvbCR7aX1gKV07XHJcblxyXG4gICAgfSwgMTAwKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGZpbHRlckRhdGFBbnN3ZXJzXHJcblxyXG4gIC8vI3JlZ2lvbiBzZXRNaW5NYXhEYXRlc1xyXG4gIC8vIEZ1bnppb25lIHBlciBvdHRlbmVyZSBsYSBkYXRhIHBpw7kgcmVjZW50ZSBlIHF1ZWxsYSBwacO5IHZlY2NoaWFcclxuICBzZXRNaW5NYXhEYXRlcygpIHtcclxuICAgIC8vIENvbnZlcnRvIGxlIGRhdGUgZGkgQW5zd2VyRGF0ZSBpbiBvZ2dldHRpIERhdGUgZSBvcmRpbm9cclxuICAgIGNvbnN0IGRhdGVzID0gdGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXMubWFwKHZhbHVlID0+IG5ldyBEYXRlKHZhbHVlLkFuc3dlckRhdGUpKTtcclxuXHJcbiAgICAvLyBUcm92byBsYSBkYXRhIHBpw7kgcmVjZW50ZSAobWF4KSBlIGxhIHBpw7kgdmVjY2hpYSAobWluKVxyXG4gICAgdGhpcy5taW5EYXRlID0gbmV3IERhdGUoTWF0aC5taW4oLi4uZGF0ZXMubWFwKGRhdGUgPT4gZGF0ZS5nZXRUaW1lKCkpKSk7XHJcbiAgICB0aGlzLm1heERhdGUgPSBuZXcgRGF0ZShNYXRoLm1heCguLi5kYXRlcy5tYXAoZGF0ZSA9PiBkYXRlLmdldFRpbWUoKSkpKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHNldE1pbk1heERhdGVzXHJcblxyXG4gIC8vI3JlZ2lvbiBmaWxsQWdncmVnYXRpb25Db2x1bW5zXHJcbiAgZmlsbEFnZ3JlZ2F0aW9uQ29sdW1ucygpe1xyXG4gICAgdGhpcy5maWx0ZXJlZEFuc3dlcnMuZmlsdGVyKHggPT4geC5JRCA9PSAnMCcpLmZvckVhY2goKGFnZ3JDb2wpID0+IHtcclxuICAgICAgT2JqZWN0LmtleXMoYWdnckNvbCkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcblxyXG4gICAgICAgIC8vaWYgKGtleSAhPSBcIkFuc3dlckRhdGVcIil7IGFnZ3JDb2xba2V5XSA9IFwiXCI7IH1cclxuXHJcbiAgICAgICAgdmFyIGZpZWxkID0gdGhpcy5mb3JtLkZpZWxkcy5maW5kKHggPT4geC5MYWJlbCA9PSBrZXkpO1xyXG4gICAgICAgIGlmIChmaWVsZCA9PSBudWxsKXsgcmV0dXJuOyB9XHJcbiAgICAgICAgdmFyIGFnZ3JlZ2F0aW9uczogYW55ID0gZmllbGQuQWdncmVnYXRpb25zO1xyXG5cclxuICAgICAgICBpZiAoYWdncmVnYXRpb25zICE9IG51bGwpe1xyXG4gICAgICAgICAgaWYgKGFnZ3JDb2wuQW5zd2VyRGF0ZSA9PSBcIkNPVU5UXCIgJiYgYWdncmVnYXRpb25zLmluZGV4T2YoTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bXCJDT1VOVFwiXSkgIT0gLTEpeyBcclxuICAgICAgICAgICAgYWdnckNvbFtrZXldID0gdGhpcy5maWx0ZXJlZEFuc3dlcnMuZmlsdGVyKHggPT4geC5JRCAhPSAnMCcpLmxlbmd0aDsgICAgICAgICAgXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIGlmIChhZ2dyQ29sLkFuc3dlckRhdGUgPT0gXCJTVU1cIiAmJiBhZ2dyZWdhdGlvbnMuaW5kZXhPZihOdW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bVtcIlNVTVwiXSkgIT0gLTEpeyBcclxuICAgICAgICAgICAgdmFyIHN1bSA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcih4ID0+IHguSUQgIT0gJzAnICYmICFpc05hTih4W2tleV0pKS5mb3JFYWNoKGVsID0+IHsgc3VtICs9IHBhcnNlSW50KGVsW2tleV0pOyB9KTtcclxuICAgICAgICAgICAgYWdnckNvbFtrZXldID0gc3VtOyAgICAgICAgICBcclxuICAgICAgICAgIH0gXHJcbiAgICAgICAgICBlbHNlIGlmIChhZ2dyQ29sLkFuc3dlckRhdGUgPT0gXCJBVkdcIiAmJiBhZ2dyZWdhdGlvbnMuaW5kZXhPZihOdW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bVtcIkFWR1wiXSkgIT0gLTEpeyBcclxuICAgICAgICAgICAgdmFyIGF2ZyA9IDA7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcih4ID0+IHguSUQgIT0gJzAnICYmICFpc05hTih4W2tleV0pKS5mb3JFYWNoKGVsID0+IHsgYXZnICs9IHBhcnNlSW50KGVsW2tleV0pOyB9KTtcclxuICAgICAgICAgICAgYWdnckNvbFtrZXldID0gYXZnIC8gdGhpcy5maWx0ZXJlZEFuc3dlcnMuZmlsdGVyKHggPT4geC5JRCAhPSAnMCcgJiYgIWlzTmFOKHhba2V5XSkpLmxlbmd0aDsgICAgICAgICAgXHJcbiAgICAgICAgICB9ICAgXHJcbiAgICAgICAgICBlbHNlIGlmIChhZ2dyQ29sLkFuc3dlckRhdGUgPT0gXCJNSU5cIiAmJiBhZ2dyZWdhdGlvbnMuaW5kZXhPZihOdW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bVtcIk1JTlwiXSkgIT0gLTEpeyBcclxuICAgICAgICAgICAgdmFyIG1pbiA9IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcih4ID0+IHguSUQgIT0gJzAnICYmICFpc05hTih4W2tleV0pKS5mb3JFYWNoKGVsID0+IHsgaWYgKG1pbiA9PSBudWxsIHx8IGVsW2tleV0gPCBtaW4pIHsgbWluID0gZWxba2V5XTsgfSB9KTtcclxuICAgICAgICAgICAgYWdnckNvbFtrZXldID0gbWluOyAgICAgICAgICBcclxuICAgICAgICAgIH0gICAgIFxyXG4gICAgICAgICAgZWxzZSBpZiAoYWdnckNvbC5BbnN3ZXJEYXRlID09IFwiTUFYXCIgJiYgYWdncmVnYXRpb25zLmluZGV4T2YoTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bXCJNQVhcIl0pICE9IC0xKXsgXHJcbiAgICAgICAgICAgIHZhciBtYXggPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkQW5zd2Vycy5maWx0ZXIoeCA9PiB4LklEICE9ICcwJyAmJiAhaXNOYU4oeFtrZXldKSkuZm9yRWFjaChlbCA9PiB7IGlmIChtaW4gPT0gbnVsbCB8fCBlbFtrZXldID4gbWF4KSB7IG1heCA9IGVsW2tleV07IH0gfSk7XHJcbiAgICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IG1heDsgICAgICAgICAgXHJcbiAgICAgICAgICB9ICAgICBcclxuICAgICAgICAgIGVsc2UgaWYgKGFnZ3JDb2wuQW5zd2VyRGF0ZSA9PSBcIlNUREVWXCIgJiYgYWdncmVnYXRpb25zLmluZGV4T2YoTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bXCJTVERFVlwiXSkgIT0gLTEpeyBcclxuICAgICAgICAgICAgdmFyIHZhbHVlcyA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkQW5zd2Vycy5maWx0ZXIoeCA9PiB4LklEICE9ICcwJyAmJiAhaXNOYU4oeFtrZXldKSkuZm9yRWFjaChlbCA9PiB7IHZhbHVlcy5wdXNoKHBhcnNlSW50KGVsW2tleV0pKTsgfSk7XHJcbiAgICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IHRoaXMuc3RhbmRhcmREZXZpYXRpb24odmFsdWVzKTsgICAgICAgICAgXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhZ2dyQ29sW2tleV0gPSBcIlwiO1xyXG4gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICB9IGVsc2UgaWYgKGFnZ3JlZ2F0aW9ucyA9PSBudWxsIHx8IGFnZ3JlZ2F0aW9ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgYWdnckNvbFtrZXldID0gXCJcIjtcclxuICAgICAgICB9XHJcblxyXG5cclxuXHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybjtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGZpbGxBZ2dyZWdhdGlvbkNvbHVtbnNcclxuXHJcbiAgc3RhbmRhcmREZXZpYXRpb24oYXJyLCB1c2VQb3B1bGF0aW9uID0gZmFsc2UpIHtcclxuICAgIGNvbnN0IG1lYW4gPSBhcnIucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKSAvIGFyci5sZW5ndGg7XHJcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFxyXG4gICAgICBhcnJcclxuICAgICAgICAucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjLmNvbmNhdCgodmFsIC0gbWVhbikgKiogMiksIFtdKVxyXG4gICAgICAgIC5yZWR1Y2UoKGFjYywgdmFsKSA9PiBhY2MgKyB2YWwsIDApIC9cclxuICAgICAgICAoYXJyLmxlbmd0aCAtICh1c2VQb3B1bGF0aW9uID8gMCA6IDEpKVxyXG4gICAgKTtcclxuICB9OyAgIFxyXG5cclxuICAvLyNyZWdpb24gcHJpbnRWYWx1ZVxyXG4gIHByaW50VmFsdWUoZmllbGRUeXBlLCB2YWx1ZSwgZmllbGRjb25maWcsIHJlY29yZCkge1xyXG4gICAgc3dpdGNoIChmaWVsZFR5cGUpIHtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiRWxlbmNvIGdlbmVyaWNvXCJdOiB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpeyByZXR1cm4gdmFsdWU7IH1cclxuICAgICAgICBpZighdmFsdWUpe1xyXG4gICAgICAgICAgcmV0dXJuIFwiTi9BXCI7XHJcbiAgICAgICAgfSBcclxuICAgICAgICBsZXQgb3V0cHV0O1xyXG4gICAgICAgIGxldCBWYWx1ZVBhaXJzOiB7W2tleTpzdHJpbmddOiBhbnk7fSA9IFtdO1xyXG4gICAgICAgIC8vIFBSRVBBUk8vTEVHR08gSSBWQUxVRVBBSVJTXHJcbiAgICAgICAgaWYgKGZpZWxkY29uZmlnLkZvcm11bGEgIT0gbnVsbCAmJiBmaWVsZGNvbmZpZy5Gb3JtdWxhKSB7XHJcbiAgICAgICAgICB2YXIgdGVtcCA9IFV0aWxpdHlIZWxwZXJTZXJ2aWNlLkV2YWx1YXRlRmllbGRGb3JtdWxhKFxyXG4gICAgICAgICAgICBmaWVsZGNvbmZpZy5Gb3JtdWxhLFxyXG4gICAgICAgICAgICByZWNvcmQsXHJcbiAgICAgICAgICAgIHRoaXMuZm9ybXVsYU9iamVjdFxyXG4gICAgICAgICAgKTtcclxuICAgICAgICBpZih0eXBlb2YgdGVtcCA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgICAgIGxldCB0ZW1wMiA9IHRlbXAuc3BsaXQoXCI7XCIpO1xyXG4gICAgICAgICAgdGVtcCA9IFtdXHJcbiAgICAgICAgICB0ZW1wMi5mb3JFYWNoKGl0ZW0gPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBhcnJJdGVtID0gaXRlbS5zcGxpdChcInxcIik7XHJcbiAgICAgICAgICAgIGlmKGFyckl0ZW0ubGVuZ3RoID4gMSl7XHJcbiAgICAgICAgICAgICAgdGVtcFthcnJJdGVtWzFdLnRyaW0oKV0gPSBhcnJJdGVtWzBdLnRyaW0oKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICB0ZW1wW2Fyckl0ZW1bMF0udHJpbSgpXSA9IGFyckl0ZW1bMF0udHJpbSgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQga2V5MiBpbiB0ZW1wKSB7XHJcbiAgICAgICAgICBWYWx1ZVBhaXJzW3RlbXBba2V5Ml1dID0ga2V5MjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKCg8TGlzdFZhbHVlRmllbGQ+ZmllbGRjb25maWcpLlZhbHVlUGFpcnMgIT0gbnVsbCAmJiAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkY29uZmlnKS5WYWx1ZVBhaXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIC8vIHZhIGJlbmUgY29zw6xcclxuICAgICAgICAgIFZhbHVlUGFpcnMgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KCg8TGlzdFZhbHVlRmllbGQ+ZmllbGRjb25maWcpLlZhbHVlUGFpcnMpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKCg8TGlzdFZhbHVlRmllbGQ+ZmllbGRjb25maWcpLlZhbHVlU3RyaW5nICE9IG51bGwgJiYgKDxMaXN0VmFsdWVGaWVsZD5maWVsZGNvbmZpZykuVmFsdWVTdHJpbmcgIT0gXCJcIikge1xyXG4gICAgICAgICAgLy8gdmEgcHJlc2EgbGEgc3RyaWduYSBlIHJpbWFwcGF0YSBuZWwgZGlhcmlvXHJcbiAgICAgICAgICBWYWx1ZVBhaXJzID0gR2xvYmFsU2VydmljZS5zdHJpbmdUb1ZhbHVlUGFpcnMoKDxMaXN0VmFsdWVGaWVsZD5maWVsZGNvbmZpZykuVmFsdWVTdHJpbmcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSU5WRVJUTyBJIFZBTFVFUEFJUlMgQ0hJQVZFL1ZBTE9SRSBJTiBWQUxST0UvQ0hJQVZFXHJcbiAgICAgICAgbGV0IGludmVydGVkID0ge307XHJcbiAgICAgICAgLy9HbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiKDxMaXN0VmFsdWVGaWVsZD5mb3VuZE9iamVjdCkuVmFsdWVQYWlyc1wiLCAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkKS5WYWx1ZVBhaXJzKTtcclxuICAgICAgICAvLyBWYWx1ZVBhaXJzOiB7U2k6ICdTaScsIE5vOiAnTm8nfVxyXG4gICAgICAgIGZvciAobGV0IGtleSBpbiBWYWx1ZVBhaXJzKSB7XHJcbiAgICAgICAgICBpbnZlcnRlZFtWYWx1ZVBhaXJzW2tleV1dID0ga2V5O1xyXG4gICAgICAgIH1cclxuICAgICAgICBWYWx1ZVBhaXJzID0gaW52ZXJ0ZWQ7XHJcblxyXG4gICAgICAgIC8vIExFR0dPIEkgVkFMT1JJIENIRSBWT0dMSU8gU1RBTVBBUkUgXHJcbiAgICAgICAgaWYgKHJlY29yZFtmaWVsZGNvbmZpZy5OYW1lXSAhPSBudWxsICYmICg8TGlzdFZhbHVlRmllbGQ+ZmllbGRjb25maWcpLklzTXVsdGlDaG9pY2hlKSB7XHJcbiAgICAgICAgICAvLyBjYXNvIE1VTFRJU0NFTFRBXHJcbiAgICAgICAgICBsZXQgb3V0VmFsdWUgPSBcIlwiO1xyXG4gICAgICAgICAgcmVjb3JkW2ZpZWxkY29uZmlnLk5hbWVdLmZvckVhY2goKGVsZW1lbnQsIGkpID0+IHtcclxuICAgICAgICAgICAgb3V0VmFsdWUgKz0gVmFsdWVQYWlyc1tlbGVtZW50XTtcclxuICAgICAgICAgICAgb3V0VmFsdWUgKz0gaSA9PSByZWNvcmRbZmllbGRjb25maWcuTmFtZV0ubGVuZ3RoIC0gMSA/IFwiXCIgOiBcIiwgXCJcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgb3V0cHV0ID0gb3V0VmFsdWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIC8vIGNhc28gU0NFTFRBIFNJTkdPTEFcclxuICAgICAgICAgIG91dHB1dCA9IFZhbHVlUGFpcnNbcmVjb3JkW2ZpZWxkY29uZmlnLk5hbWVdXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG91dHB1dDtcclxuICAgICAgfTtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQ2FtcG8gbnVtZXJpY29cIl06IHtcclxuICAgICAgICBpZiAodmFsdWUgPT0gXCJcIil7IHJldHVybiB2YWx1ZTsgfVxyXG4gICAgICAgIGlmICgoPE51bWVyaWNGaWVsZD5maWVsZGNvbmZpZykuSXNJbnRlZ2VyKSB7XHJcbiAgICAgICAgICBpZiAoKDxOdW1lcmljRmllbGQ+ZmllbGRjb25maWcpLkRlY2ltYWxTZXBhcmF0b3IgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih2YWx1ZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zdCBkZWNpbWFscyA9IGZpZWxkY29uZmlnLkRlY2ltYWxQcmVjaXNpb24gKiAxMDtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBkZWNpbWFscykgLyBkZWNpbWFscztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc3QgZGVjaW1hbHMgPSBmaWVsZGNvbmZpZy5EZWNpbWFsUHJlY2lzaW9uICogMTA7XHJcbiAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSAqIGRlY2ltYWxzKSAvIGRlY2ltYWxzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnSW1tYWdpbmUnXToge1xyXG4gICAgICAgIHJldHVybiBcImltbWFnaW5lXCI7XHJcbiAgICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImltbWFnaW5lIFwiICsgZmllbGRjb25maWcuTmFtZSArIFwiIDogXCIgKyB2YWx1ZSlcclxuICAgICAgICAvLyAvLyBSZWN1cGVybyBpbCBCQVNFNjQgZGVsbCdpbW1hZ2luZSBSZXNpemVkIHZpYSBwcm9taXNlIGNsaWVudFxyXG4gICAgICAgIC8vIHZhciByZXNpemVkQmFzZTY0ID0gYXdhaXQgdGhpcy5yZXNpemVCYXNlNjRJbWFnZShcImRhdGE6aW1hZ2UvXCIgKyB2YWx1ZS5GaWxlRXh0ZW5zaW9uICsgXCI7YmFzZTY0LFwiICsgdmFsdWUuRmlsZURhdGFCYXNlNjQpO1xyXG5cclxuICAgICAgICAvLyAvLyBBZ2dpdW5nbyBsJ0hUTUwgY29uIGlsIG51b3ZvIEJBU0U2NFxyXG4gICAgICAgIC8vIHJldHVybiBcIjxpbWcgc3JjPSdcIiArIHJlc2l6ZWRCYXNlNjQgKyBcIicgc3R5bGU9J2hlaWdodDogXCIgKyB2YWx1ZS5SZXNpemVkSW1hZ2VIZWlnaHRQeCArIFwicHgnPlwiO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgfTtcclxuXHJcblxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0FsbGVnYXRvJ106IHtcclxuICAgICAgICByZXR1cm4gXCJBbGxlZ2F0b1wiO1xyXG4gICAgICAgIC8vIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJBbGxlZ2F0byBcIiArIGZpZWxkLk5hbWUgKyBcIiA6IFwiICsgdmFsdWUsIHJlY29yZClcclxuXHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCByZXNpemVkQmFzZTY0O1xyXG4gICAgICAgICAgLy8gaWYgKHZhbHVlWzBdLklzSW1hZ2UpIHtcclxuICAgICAgICAgIC8vICAgLy8gUmVjdXBlcm8gaWwgQkFTRTY0IGRlbGwnaW1tYWdpbmUgUmVzaXplZCB2aWEgcHJvbWlzZSBjbGllbnRcclxuICAgICAgICAgIC8vICAgcmVzaXplZEJhc2U2NCA9IGF3YWl0IHRoaXMucmVzaXplQmFzZTY0SW1hZ2UoXCJkYXRhOmltYWdlL1wiICsgdmFsdWVbMF0uRmlsZUV4dGVuc2lvbiArIFwiO2Jhc2U2NCxcIiArIHZhbHVlWzBdLkZpbGVEYXRhQmFzZTY0KTtcclxuICAgICAgICAgIC8vICAgLy8gR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkFsbGVnYXRvIHJlc2l6ZWRCYXNlNjRcIiwgcmVzaXplZEJhc2U2NClcclxuICAgICAgICAgIC8vICAgLy8gQWdnaXVuZ28gbCdIVE1MIGNvbiBpbCBudW92byBCQVNFNjRcclxuICAgICAgICAgIC8vICAgcmV0dXJuICc8aW1nIGNsYXNzPVwiaW1hZ2UtcHJldmlld1wiIHNyYz1cIicgKyByZXNpemVkQmFzZTY0ICsgJ1wiIHN0eWxlPVwiaGVpZ2h0OiAnICsgdmFsdWVbMF0uUmVzaXplZEltYWdlSGVpZ2h0UHggKyAncHhcIj4nO1xyXG4gICAgICAgICAgLy8gfSBlbHNlIGlmICh2YWx1ZVswXS5GaWxlQ29udGVudFR5cGUgPT0gXCJhcHBsaWNhdGlvbi9wZGZcIikge1xyXG4gICAgICAgICAgLy8gICByZXR1cm4gJzxpZnJhbWUgc3JjPVwiZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCcgKyB2YWx1ZVswXS5GaWxlRGF0YUJhc2U2NCArICdcInN0eWxlPVwibWluLWhlaWdodDogMzAwcHg7IGhlaWdodDogMTAwJTtcIj48L2lmcmFtZT4nO1xyXG4gICAgICAgICAgLy8gfSBlbHNlIHtcclxuICAgICAgICAgIC8vICAgcmV0dXJuICc8aWZyYW1lIHNyYz1cImRhdGE6XCInICsgdmFsdWVbMF0uRmlsZUV4dGVuc2lvbiArICdcIjtiYXNlNjQsJyArIHZhbHVlWzBdLkZpbGVEYXRhQmFzZTY0ICsgJ1wic3R5bGU9XCJtaW4taGVpZ2h0OiAzMDBweDsgaGVpZ2h0OiAxMDAlO1wiPjwvaWZyYW1lPic7XHJcbiAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgLy8gQWdnaXVuZ28gbCdIVE1MIGNvbiBpbCBudW92byBCQVNFNjRcclxuICAgICAgICAgIC8vIHJldHVybiAgXCI8aW1nIHNyYz0nXCIgKyByZXNpemVkQmFzZTY0ICsgXCInIHN0eWxlPSdoZWlnaHQ6IFwiICsgdmFsdWVbMF0uUmVzaXplZEltYWdlSGVpZ2h0UHggKyBcInB4Jz5cIjtcclxuICAgICAgICAgIC8vIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJBbGxlZ2F0byBvdXRwdXRWYWx1ZXNBcnJheVwiLCBvdXRwdXRWYWx1ZXNBcnJheVtmaWVsZC5OYW1lXSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydJbW1hZ2luZSBjb24gbWFya2VycyddOiB7XHJcbiAgICAgICAgcmV0dXJuIFwiSW1tYWdpbmUgY29uIG1hcmtlcnNcIjtcclxuXHJcbiAgICAgICAgLy8gUmVjdXBlcm8gaWwgQkFTRTY0IGRlbGwnaW1tYWdpbmUgUmVzaXplZCB2aWEgcHJvbWlzZSBjbGllbnRcclxuICAgICAgICAvLyB2YXIgcmVzaXplZEJhc2U2NCA9IGF3YWl0IHRoaXMucmVzaXplQmFzZTY0SW1hZ2UoXCJkYXRhOmltYWdlL1wiICsgdmFsdWUuRmlsZUV4dGVuc2lvbiArIFwiO2Jhc2U2NCxcIiArIHZhbHVlLkZpbGVEYXRhQmFzZTY0KTtcclxuXHJcbiAgICAgICAgLy8gQWdnaXVuZ28gbCdIVE1MIGNvbiBpbCBudW92byBCQVNFNjRcclxuICAgICAgICAvLyByZXR1cm4gXCI8aW1nIHNyYz0nXCIgKyByZXNpemVkQmFzZTY0ICsgXCInIHN0eWxlPSdoZWlnaHQ6IFwiICsgdmFsdWUuUmVzaXplZEltYWdlSGVpZ2h0UHggKyBcInB4Jz5cIjtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0VsZW5jbyBpbW1hZ2luaSddOiB7XHJcbiAgICAgICAgcmV0dXJuIFwiRWxlbmNvIGltbWFnaW5pXCI7XHJcbiAgICAgICAgbGV0IG91dHB1dFZhbHVlc0FycmF5ID0gXCJcIjtcclxuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAoPEltYWdlU2VsZWN0b3JGaWVsZD5maWVsZGNvbmZpZykuSXNNdWx0aUNob2ljaGUpIHtcclxuICAgICAgICAgIHZhbHVlLmZvckVhY2goKGltYWdlb2JqOiBudW1iZXIpID0+IHtcclxuICAgICAgICAgICAgdmFyIGF0dGFjaG1lbnRJbkZvcm06IER5bkF0dGFjaG1lbnQgPSAoPEltYWdlU2VsZWN0b3JGaWVsZD5maWVsZGNvbmZpZykuQXR0YWNobWVudExpc3QuZmluZCh4ID0+IHguSUQgPT0gaW1hZ2VvYmopO1xyXG4gICAgICAgICAgICBpZiAoYXR0YWNobWVudEluRm9ybSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgb3V0cHV0VmFsdWVzQXJyYXkgKz0gYXR0YWNobWVudEluRm9ybS5CdXR0b25LZXkgKyBcIiwgXCI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgdmFyIHBhcnRzID0gb3V0cHV0VmFsdWVzQXJyYXkuc3BsaXQoXCIsIFwiKTtcclxuICAgICAgICAgIHJldHVybiBwYXJ0cy5zbGljZSgwLCBwYXJ0cy5sZW5ndGggLSAxKS5qb2luKFwiLCBcIik7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdmFyIGF0dGFjaG1lbnRJbkZvcm06IER5bkF0dGFjaG1lbnQgPSAoPEltYWdlU2VsZWN0b3JGaWVsZD5maWVsZGNvbmZpZykuQXR0YWNobWVudExpc3QuZmluZCh4ID0+IHguSUQgPT0gdmFsdWUpO1xyXG4gICAgICAgICAgaWYgKGF0dGFjaG1lbnRJbkZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm4gYXR0YWNobWVudEluRm9ybS5CdXR0b25LZXk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgfTtcclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydEYXRhIGUvbyBvcmEnXToge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKXsgcmV0dXJuIHZhbHVlOyB9XHJcbiAgICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIkRhdGEgZS9vIG9yYVwiLCBmaWVsZGNvbmZpZyk7XHJcbiAgICAgICAgaWYgKCg8RGF0ZUZpZWxkPmZpZWxkY29uZmlnKS5EYXRlRm9ybWF0ICE9IG51bGwpIHtcclxuICAgICAgICAgIGxldCBmaXhEYXRlRm9ybWF0ID0gKDxEYXRlRmllbGQ+ZmllbGRjb25maWcpLkRhdGVGb3JtYXQucmVwbGFjZShcIkREXCIsIFwiZGRcIik7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0odmFsdWUsIGZpeERhdGVGb3JtYXQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGlmICgoPERhdGVGaWVsZD5maWVsZGNvbmZpZykuSXNPbmx5RGF0ZSA9PSBEYXRlVGltZVR5cGVFbnVtWydTb2xvIGRhdGEnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0odmFsdWUsIFwiZGQvTU0veXl5eVwiKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoKDxEYXRlRmllbGQ+ZmllbGRjb25maWcpLklzT25seURhdGUgPT0gRGF0ZVRpbWVUeXBlRW51bVsnRGF0YSBlIG9yYSddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybSh2YWx1ZSwgXCJkZC9NTS95eXl5IEhIOm1tXCIpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmICgoPERhdGVGaWVsZD5maWVsZGNvbmZpZykuSXNPbmx5RGF0ZSA9PSBEYXRlVGltZVR5cGVFbnVtWydTb2xvIG9yYXJpbyddKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVwaXBlLnRyYW5zZm9ybSh2YWx1ZSwgXCJISDptbVwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGRlZmF1bHQ6IHtcclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBwcmludFZhbHVlXHJcblxyXG4gIC8vI3JlZ2lvbiByZXNpemVCYXNlNjRJbWFnZVxyXG4gIHByaXZhdGUgYXN5bmMgcmVzaXplQmFzZTY0SW1hZ2UoYmFzZTY0SW1hZ2U6IHN0cmluZykge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgaW1hZ2V0eXBlID0gL2RhdGE6aW1hZ2VcXC8oW1xcd10rKTsvO1xyXG4gICAgICBjb25zdCBtYXRjaCA9IGJhc2U2NEltYWdlLm1hdGNoKGltYWdldHlwZSk7XHJcbiAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpO1xyXG4gICAgICBpbWcuc3JjID0gYmFzZTY0SW1hZ2U7XHJcbiAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XHJcbiAgICAgICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKTtcclxuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBjb25zdCB3aWR0aCA9IGltZy53aWR0aDtcclxuICAgICAgICBjb25zdCBoZWlnaHQgPSBpbWcuaGVpZ2h0O1xyXG4gICAgICAgIGNvbnN0IGFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XHJcblxyXG4gICAgICAgIGNvbnN0IG5ld0hlaWdodCA9IDEyODtcclxuICAgICAgICBjb25zdCBuZXdXaWR0aCA9IG5ld0hlaWdodCAqIGFzcGVjdFJhdGlvO1xyXG5cclxuICAgICAgICBjYW52YXMud2lkdGggPSBuZXdXaWR0aDtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gbmV3SGVpZ2h0O1xyXG4gICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwLCBuZXdXaWR0aCwgbmV3SGVpZ2h0KTtcclxuICAgICAgICBsZXQgcXVhbGl0eSA9IDAuODtcclxuICAgICAgICBsZXQgZGF0YVVSTCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlLycgKyBtYXRjaFsxXSwgcXVhbGl0eSk7XHJcbiAgICAgICAgcmVzb2x2ZShkYXRhVVJMKTtcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gcmVzaXplQmFzZTY0SW1hZ2VcclxufVxyXG4iLCI8bWF0LWNhcmQgY2xhc3M9XCJsaXN0LWZvcm0tcmVjb3JkXCI+XHJcbiAgPG1hdC1jYXJkLWhlYWRlciBjbGFzcz1cImFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxyXG4gICAgPG1hdC1jYXJkLXRpdGxlICpuZ0lmPVwibG9hZGVkRmlsdGVycyAmJiBzaG93VGl0bGVcIlxyXG4gICAgICA+RWxlbmNvIHt7IGZvcm0uTmFtZSB9fTwvbWF0LWNhcmQtdGl0bGVcclxuICAgID5cclxuICAgIDwhLS0gPG1hdC1jYXJkLWFjdGlvbnM+XHJcbiAgICAgIDxidXR0b25cclxuICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXHJcbiAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgIChjbGljayk9XCJvbkFkZFZpZXdFZGl0UmVjb3JkLmVtaXQobnVsbClcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkFnZ2l1bmdpPC9zcGFuPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvbWF0LWNhcmQtYWN0aW9ucz4gLS0+XHJcbiAgPC9tYXQtY2FyZC1oZWFkZXI+XHJcbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgICA8IS0tI3JlZ2lvbiBGSUxURVJTIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCIgKm5nSWY9XCJsb2FkZWRGaWx0ZXJzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgY29sLW1kLTMgYWxpZ24tY29udGVudC1lbmRcIj5cclxuICAgICAgICA8dG13LWRhdGV0aW1lcGlja2VyXHJcbiAgICAgICAgICBjbGFzcz1cImRhdGVcIlxyXG4gICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidQZXJpb2RvIGluaXppbydcIlxyXG4gICAgICAgICAgW2xhYmVsXT1cIidQZXJpb2RvIGluaXppbydcIlxyXG4gICAgICAgICAgWyhuZ01vZGVsSW5wdXQpXT1cIm1pbkRhdGVcIlxyXG4gICAgICAgICAgKG5nTW9kZWxJbnB1dENoYW5nZSk9XCJmaWx0ZXJEYXRhQW5zd2VycygpXCJcclxuICAgICAgICAgIFtwaWNrZXJNb2RlXT1cIm1vZGVzLkRBVEVQSUNLRVJcIlxyXG4gICAgICAgICAgW291dHB1dEZvcm1hdF09XCInREQvTU0vWVlZWSdcIlxyXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC90bXctZGF0ZXRpbWVwaWNrZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0zIGFsaWduLWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgPHRtdy1kYXRldGltZXBpY2tlclxyXG4gICAgICAgICAgY2xhc3M9XCJkYXRlXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGVyaW9kbyBmaW5lJ1wiXHJcbiAgICAgICAgICBbbGFiZWxdPVwiJ1BlcmlvZG8gZmluZSdcIlxyXG4gICAgICAgICAgWyhuZ01vZGVsSW5wdXQpXT1cIm1heERhdGVcIlxyXG4gICAgICAgICAgKG5nTW9kZWxJbnB1dENoYW5nZSk9XCJmaWx0ZXJEYXRhQW5zd2VycygpXCJcclxuICAgICAgICAgIFtwaWNrZXJNb2RlXT1cIm1vZGVzLkRBVEVQSUNLRVJcIlxyXG4gICAgICAgICAgW291dHB1dEZvcm1hdF09XCInREQvTU0vWVlZWSdcIlxyXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC90bXctZGF0ZXRpbWVwaWNrZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0zXCI+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPlNlbGV6aW9uZSBkZWkgY2FtcGk8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxtYXQtc2VsZWN0IChzZWxlY3Rpb25DaGFuZ2UpPVwib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiIG11bHRpcGxlPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiAqbmdGb3I9XCJsZXQgcHJvcGVydHkgb2YgcHJvcGVydGllc1wiIFt2YWx1ZV09XCJwcm9wZXJ0eVwiPlxyXG4gICAgICAgICAgICAgIHt7IHByb3BlcnRpZXNMYWJlbFtwcm9wZXJ0eS5sYWJlbF0gfX1cclxuICAgICAgICAgICAgPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8IS0tIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgY29sLW1kLTMgbXQtMlwiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIFtkaXNhYmxlZF09XCJcclxuICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzID09IG51bGwgfHwgc2VsZWN0ZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwXHJcbiAgICAgICAgICBcIlxyXG4gICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWdyYXBoLWdlbmVyYXRlIGJ1dHRvbi1uZXh0IG1lLTJcIlxyXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwiZmlsdGVyRGF0YUFuc3dlcnMoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgR2VuZXJhXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PiAtLT5cclxuICAgIDwvZGl2PlxyXG4gICAgPCEtLSNlbmRyZWdpb24gRklMVEVSUyAtLT5cclxuXHJcbiAgICA8IS0tI3JlZ2lvbiBUQUJMRSAtLT5cclxuICAgIDxkaXZcclxuICAgICpuZ0lmPVwiZmlsdGVyZWRBbnN3ZXJzICYmIGZpbHRlcmVkQW5zd2Vycy5sZW5ndGggPiAwOyBlbHNlIG5vX2Fuc3dlcnNcIlxyXG4gICAgICBjbGFzcz1cInRhYmxlLWNvbnRhaW5lciBtdC0zIG1iLTJcIlxyXG4gICAgPlxyXG4gICAgICA8dGFibGVcclxuICAgICAgICBtYXQtdGFibGVcclxuICAgICAgICBbZGF0YVNvdXJjZV09XCJzZWxlY3RlZFByb3BlcnRpZXNcIlxyXG4gICAgICAgIGNsYXNzPVwibWF0LWVsZXZhdGlvbi16OCBtYXQtdGFibGUtZml4ZWRcIlxyXG4gICAgICA+XHJcbiAgICAgICAgPCEtLSBDb2xvbm5hIGZpc3NhIHBlciBsZSBwcm9wcmlldMOgIC0tPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwicHJvcGVydHlcIiBzdGlja3k+XHJcbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIGNsYXNzPVwic3RpY2t5LWNvbHVtblwiPlxyXG4gICAgICAgICAgICBEYXRhIEluc2VyaW1lbnRvXHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPHRkXHJcbiAgICAgICAgICAgIG1hdC1jZWxsXHJcbiAgICAgICAgICAgICptYXRDZWxsRGVmPVwibGV0IHNlbGVjdGVkUHJvcGVydGllc1wiXHJcbiAgICAgICAgICAgIGNsYXNzPVwic3RpY2t5LWNvbHVtblwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIHt7IHByb3BlcnRpZXNMYWJlbFtzZWxlY3RlZFByb3BlcnRpZXMubGFiZWxdIH19XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEdlbmVyYSBkaW5hbWljYW1lbnRlIGxlIGNvbG9ubmUgcGVyIG9nbmkgcmlzcG9zdGEgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lclxyXG4gICAgICAgICAgKm5nRm9yPVwibGV0IHZhbHVlIG9mIGZpbHRlcmVkQW5zd2VyczsgbGV0IGkgPSBpbmRleFwiXHJcbiAgICAgICAgICBbbWF0Q29sdW1uRGVmXT1cIidjb2wnICsgaVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPHRoIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJ2YWx1ZS5JRCAhPSAnMCdcIj57eyB2YWx1ZS5BbnN3ZXJEYXRlIHwgZGF0ZSA6IFwiZGQvTU0veXl5eSBISDptbVwiIH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInZhbHVlLklEID09ICcwJ1wiPnt7IHZhbHVlLkFuc3dlckRhdGUgfX08L3NwYW4+XHJcbiAgICAgICAgICA8L3RoPlxyXG4gICAgICAgICAgPCEtLSA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPiB7eyB2YWx1ZS5BbnN3ZXJEYXRlIHwgZGF0ZTonZGQvTU0veXl5eSBISDptbScgfX0gPC90aD4gLS0+XHJcbiAgICAgICAgICA8dGQgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgc2VsZWN0ZWRQcm9wZXJ0aWVzXCI+XHJcbiAgICAgICAgICAgIHt7XHJcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzLmxhYmVsID09PSBcIkFuc3dlckRhdGVcIlxyXG4gICAgICAgICAgICAgICAgPyAodmFsdWUuQW5zd2VyRGF0ZSB8IGRhdGUgOiBcImRkL01NL3l5eXkgSEg6bW1cIilcclxuICAgICAgICAgICAgICAgIDogcHJpbnRWYWx1ZShcclxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXMudHlwZSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVtzZWxlY3RlZFByb3BlcnRpZXMubGFiZWxdLFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllcy5jb25maWcsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVcclxuICAgICAgICAgICAgICAgICAgKSA/PyBcIk4vQVwiXHJcbiAgICAgICAgICAgIH19XHJcbiAgICAgICAgICAgIDwhLS0gLSBcclxuICAgICAgICAgICAge3tzZWxlY3RlZFByb3BlcnRpZXMudHlwZX19XHJcbiAgICAgICAgICAgIHt7c2VsZWN0ZWRQcm9wZXJ0aWVzLmxhYmVsfX0gLS0+XHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8IS0tIEhlYWRlciBkZWxsYSB0YWJlbGxhIC0tPlxyXG4gICAgICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XHJcblxyXG4gICAgICAgIDwhLS0gUmlnaGUgZGVsbGEgdGFiZWxsYSAtLT5cclxuICAgICAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogZGlzcGxheWVkQ29sdW1uc1wiPjwvdHI+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgI25vX2Fuc3dlcnM+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtdC0zIG1iLTIgdGV4dC1jZW50ZXJcIj5cclxuICAgICAgICA8c3Bhbj4gTm9uIGNpIHNvbm8gcmlzcG9zdGUgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8IS0tI3JlZ2lvbiBUQUJMRSAtLT5cclxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XHJcbiAgPG1hdC1jYXJkLWZvb3Rlcj5cclxuICAgIDwhLS0gPG1hdC1wcm9ncmVzcy1iYXIgbW9kZT1cImluZGV0ZXJtaW5hdGVcIj48L21hdC1wcm9ncmVzcy1iYXI+IC0tPlxyXG4gIDwvbWF0LWNhcmQtZm9vdGVyPlxyXG48L21hdC1jYXJkPlxyXG5cclxuPCEtLSA8ZGl2IGNsYXNzPVwicm93IGVxcC1keW5hbWljLW1vZHVsZS10aXRsZSBsaXN0LWZvcm0tcmVjb3JkLWhlYWRlclwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPlxyXG4gICAgPGg0ICpuZ0lmPVwic2hvd1RpdGxlXCI+XHJcbiAgICAgIDxiPkVsZW5jbyB7eyBmb3JtLk5hbWUgfX08L2I+XHJcbiAgICA8L2g0PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiB0ZXh0LXJpZ2h0XCIgKm5nSWY9XCJkZWZhdWx0TGlzdEFjdGlvbnMuYWRkXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIChjbGljayk9XCJvbkFkZFZpZXdFZGl0UmVjb3JkLmVtaXQobnVsbClcIj5cclxuICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5BZ2dpdW5naTwvc3Bhbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcbjxlcXAtdGFibGUgY2xhc3M9XCJsaXN0LWZvcm0tcmVjb3JkLXRhYmxlXCIgI3RhYmxlUmVjb3JkcyAqbmdJZj1cImxvYWRlciAmJiBjb25maWd1cmF0aW9ucy52YWx1ZXNcIlxyXG4gIFtkYXRhXT1cImNvbmZpZ3VyYXRpb25zLnZhbHVlc1wiIFtjb2x1bW5zXT1cImNvbHVtbnNcIj48L2VxcC10YWJsZT4gLS0+XHJcbiJdfQ==
816
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGxpc3QtZm9ybS1yZWNvcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXFwLWR5bmFtaWMtbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy9wcml2YXRlL2Zvcm0tcmVjb3Jkcy9obGlzdC1mb3JtLXJlY29yZC9obGlzdC1mb3JtLXJlY29yZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcXAtZHluYW1pYy1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3ByaXZhdGUvZm9ybS1yZWNvcmRzL2hsaXN0LWZvcm0tcmVjb3JkL2hsaXN0LWZvcm0tcmVjb3JkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsS0FBSyxFQUNMLFNBQVMsRUFDVCxNQUFNLEVBQ04sWUFBWSxHQUliLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFHTCxVQUFVLEdBQ1gsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQWEsYUFBYSxFQUFlLE1BQU0sb0NBQW9DLENBQUM7QUFDM0YsT0FBTyxFQUFhLE1BQU0sRUFBZ0IsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRixPQUFPLEVBRUwsZ0JBQWdCLEdBQ2pCLE1BQU0sMkNBQTJDLENBQUM7QUFHbkQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDbkYsT0FBTyxFQUFFLHlDQUF5QyxFQUFFLE1BQU0sOERBQThELENBQUM7QUFFekgsT0FBTyxFQUdMLGFBQWEsR0FDZCxNQUFNLGdEQUFnRCxDQUFDO0FBQ3hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBS3RDLE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLG9D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QUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzlDLElBQUksT0FBTyxHQUFHLEdBQUcsQ0FBQztnQkFDbEIsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUM3RCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbkIsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztzSEEvMEJVLHdCQUF3QjswR0FBeEIsd0JBQXdCLGlsQkMvQ3JDLG8vTEFpS0E7NEZEbEhhLHdCQUF3QjtrQkFMcEMsU0FBUzsrQkFDRSxtQkFBbUI7a0tBS3BCLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csYUFBYTtzQkFBckIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBS3VDLFlBQVk7c0JBQXhELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNakMsWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU07Z0JBRUcsY0FBYztzQkFBdkIsTUFBTTtnQkFDRyxtQkFBbUI7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBPbkluaXQsXHJcbiAgSW5wdXQsXHJcbiAgVmlld0NoaWxkLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtcclxuICBDb25maWdDb2x1bW4sXHJcbiAgRXFwVGFibGVDb21wb25lbnQsXHJcbiAgVHlwZUNvbHVtbixcclxufSBmcm9tIFwiQGVxcHJvamVjdC9lcXAtdGFibGVcIjtcclxuaW1wb3J0IHsgRm9ybSB9IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvZm9ybS5tb2RlbFwiO1xyXG5pbXBvcnQgeyBCYXNlRmllbGQsIEZpZWxkVHlwZUVudW0sIEFuc3dlclN0eWxlIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL2Jhc2VGaWVsZC5tb2RlbCc7XHJcbmltcG9ydCB7IER5blJlY29yZCwgUmVjb3JkLCBSZWNvcmRCdXR0b24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vbW9kZWxzL3JlY29yZC5tb2RlbFwiO1xyXG5pbXBvcnQge1xyXG4gIERhdGVGaWVsZCxcclxuICBEYXRlVGltZVR5cGVFbnVtLFxyXG59IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2RhdGVGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBMaXN0VmFsdWVGaWVsZCB9IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2xpc3RWYWx1ZUZpZWxkLm1vZGVsXCI7XHJcbmltcG9ydCB7IE51bWVyaWNGaWVsZCB9IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL251bWVyaWNGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBVdGlsaXR5SGVscGVyU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy91dGlsaXR5SGVscGVyLnNlcnZpY2VzXCI7XHJcbmltcG9ydCB7IER5bmFtaWNNb2R1bGVMaXN0Rm9ybVJlY29yZEFjdGlvbnNEZWZhdWx0IH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9keW5hbWljTW9kdWxlTGlzdEZvcm1SZWNvcmRBY3Rpb25zRGVmYXVsdFwiO1xyXG5pbXBvcnQgeyBEeW5hbWljTW9kdWxlTGlzdENvbmZpZyB9IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvZHluYW1pY01vZHVsZUxpc3RDb25maWcubW9kZWxcIjtcclxuaW1wb3J0IHtcclxuICBFbmRQb2ludENvbmZpZ3VyYXRpb24sXHJcbiAgRW5kUG9pbnREYXRhUGFyYW1zLFxyXG4gIFBhcmFtVHlwZUVudW0sXHJcbn0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9lbmRQb2ludENvbmZpZ3VyYXRpb24ubW9kZWxcIjtcclxuaW1wb3J0IHsgR2xvYmFsU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlcy9nbG9iYWwuc2VydmljZVwiO1xyXG5pbXBvcnQgeyBNb2RlRW51bSB9IGZyb20gXCJ0bXctcGlja2VyXCI7XHJcbmltcG9ydCB7IEltYWdlU2VsZWN0b3JGaWVsZCB9IGZyb20gXCIuLi8uLi8uLi8uLi9tb2RlbHMvZmllbGRzL2ltYWdlU2VsZWN0b3JGaWVsZC5tb2RlbFwiO1xyXG5pbXBvcnQgeyBEeW5BdHRhY2htZW50IH0gZnJvbSBcIi4uLy4uLy4uLy4uL21vZGVscy9keW5BdHRhY2htZW50XCI7XHJcbmltcG9ydCB7IERhdGVQaXBlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vblwiO1xyXG5pbXBvcnQgeyBBY3Rpb25CdXR0b24gfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvdHJpZ2dlci5tb2RlbCc7XHJcbmltcG9ydCB7IE51bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtIH0gZnJvbSAnLi4vLi4vLi4vLi4vbW9kZWxzL3N0YXRpc3RpYy5tb2RlbCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiaGxpc3QtZm9ybS1yZWNvcmRcIixcclxuICB0ZW1wbGF0ZVVybDogXCJobGlzdC1mb3JtLXJlY29yZC5jb21wb25lbnQuaHRtbFwiLFxyXG4gIHN0eWxlVXJsczogW1wiLi9obGlzdC1mb3JtLXJlY29yZC5jb21wb25lbnQuc2Nzc1wiXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIEhMaXN0Rm9ybVJlY29yZENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBjb25maWd1cmF0aW9uczogRHluYW1pY01vZHVsZUxpc3RDb25maWc7XHJcbiAgQElucHV0KCkgZW5kUG9pbnRDb25maWd1cmF0aW9uOiBFbmRQb2ludENvbmZpZ3VyYXRpb247XHJcblxyXG4gIC8vIGwndW5hIG8gbCdhbHRyYSBwZXIgZHVlIG1vZGFsaXTDoCBkJ3Vzb1xyXG4gIEBJbnB1dCgpIGZvcm1JRDogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIGZvcm06IEZvcm0gPSBudWxsOyAvLyBib2ggbWEgYydlcmEgcHJpbWFcclxuICBASW5wdXQoKSBmb3JtdWxhT2JqZWN0OiBhbnkgPSB7fTtcclxuICBASW5wdXQoKSBleHRlcm5hbEJ1dHRvbnM6IEFycmF5PFJlY29yZEJ1dHRvbj4gPSBuZXcgQXJyYXk8UmVjb3JkQnV0dG9uPigpO1xyXG4gIEBJbnB1dCgpIGFjdGlvbkJ1dHRvbnM6IEFycmF5PEFjdGlvbkJ1dHRvbj4gPSBuZXcgQXJyYXk8QWN0aW9uQnV0dG9uPigpO1xyXG5cclxuICBkZWZhdWx0TGlzdEFjdGlvbnM6IER5bmFtaWNNb2R1bGVMaXN0Rm9ybVJlY29yZEFjdGlvbnNEZWZhdWx0ID1cclxuICAgIG5ldyBEeW5hbWljTW9kdWxlTGlzdEZvcm1SZWNvcmRBY3Rpb25zRGVmYXVsdCgpO1xyXG4gIHNob3dUaXRsZSA9IHRydWU7XHJcbiAgQFZpZXdDaGlsZChcInRhYmxlUmVjb3Jkc1wiLCB7IHN0YXRpYzogdHJ1ZSB9KSB0YWJsZVJlY29yZHM6IEVxcFRhYmxlQ29tcG9uZW50O1xyXG5cclxuICBjb2x1bW5zID0gbmV3IEFycmF5PENvbmZpZ0NvbHVtbj4oKTtcclxuICBsb2FkZWRGaWx0ZXJzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgbG9hZGVkVGFibGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQE91dHB1dCgpIG9uVmlld1JlY29yZDogRXZlbnRFbWl0dGVyPFJlY29yZD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJlY29yZD4oKTtcclxuICBAT3V0cHV0KCkgb25BZGRWaWV3RWRpdFJlY29yZDogRXZlbnRFbWl0dGVyPHsgcmVjb3JkOiBSZWNvcmQ7IG9ubHlWaWV3OiBib29sZWFuOyB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyByZWNvcmQ6IFJlY29yZDsgb25seVZpZXc6IGJvb2xlYW4gfT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uRGVsZXRlUmVjb3JkOiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG4gIEBPdXRwdXQoKSBvbkFmdGVyRGVsZXRlUmVjb3JkOiBFdmVudEVtaXR0ZXI8UmVjb3JkPiA9IG5ldyBFdmVudEVtaXR0ZXI8UmVjb3JkPigpO1xyXG5cclxuICBtb2RlcyA9IE1vZGVFbnVtO1xyXG4gIG1pbkRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gIG1heERhdGUgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAvLyBsZSBwcm9wcmlldMOgIGRlbGxhIHJpc3Bvc3RhIGRhIHN0YW1wYXJlIG5lbGxlIHJpZ2hlXHJcbiAgcHJvcGVydGllcyA9IFtdO1xyXG4gIC8vIGxlIGxhYmVsIGFzc29jaWF0ZSBhbGxlIHByb3ByaWV0w6AgZGEgc3RhbXBhcmUgY2hlIGNvbmRpdmlkb25vIGxvIHN0ZXNzbyBpbmRpY2VcclxuICBwcm9wZXJ0aWVzTGFiZWwgPSBbXTtcclxuICBzZWxlY3RlZFByb3BlcnRpZXM6IHN0cmluZ1tdO1xyXG5cclxuICAvLyBpIGRhdGkgZGVsbGUgcmlzcG9zdGUgZGEgc3RhbXBhcmVcclxuICBmaWx0ZXJlZEFuc3dlcnMgLy9sZSByaXNwb3N0ZSBmaWx0cmF0ZSBcclxuXHJcbiAgLy8gQ29sb25uZSBkYSB2aXN1YWxpenphcmUgKGZpc3NhIGxhIHByaW1hIGNvbG9ubmEgZSBnZW5lcmEgZGluYW1pY2FtZW50ZSBsZSBhbHRyZSlcclxuICBkaXNwbGF5ZWRDb2x1bW5zID0gW107XHJcbiAgZXhpc3RpbmdBZ2dyZWdhdGlvbnM6IEFycmF5PE51bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtPiA9IG51bGw7XHJcbiAgbnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW0gPSBOdW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bTtcclxuXHJcbiAgLy8jcmVnaW9uIENvbnN0cnVjdG9yXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHV0aWxpdHlIZWxwZXJTZXJ2aWNlOiBVdGlsaXR5SGVscGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBkYXRlcGlwZTogRGF0ZVBpcGVcclxuICApIHtcclxuICAgIC8vIHRoaXMucHJvcGVydGllc0xhYmVsW1wiQW5zd2VyRGF0ZVwiXSA9IFwiRGF0YVwiO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gQ29uc3RydWN0b3JcclxuXHJcbiAgLy8jcmVnaW9uIG5nT25JbnRpdFxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5kZWZhdWx0TGlzdEFjdGlvbnMgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLmRlZmF1bHRMaXN0QWN0aW9ucztcclxuICAgIHRoaXMuc2hvd1RpdGxlID0gdGhpcy5jb25maWd1cmF0aW9ucy5zaG93VGl0bGU7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdsaXN0LWZvcm0tcmVjb3JkIC0gbmdPbkluaXQgLSBjb25maWd1cmF0aW9ucycsIHRoaXMuY29uZmlndXJhdGlvbnMpO1xyXG5cclxuICAgIHRoaXMuZ2V0Rm9ybUJ5SUQoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIG5nT25JbnRpdFxyXG5cclxuICAvLyNyZWdpb24gbmdPbkNoYW5nZXNcclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdsaXN0LWZvcm0tcmVjb3JkIC0gY2hhbmdlcycsIGNoYW5nZXMpO1xyXG4gICAgLy8gU2UgdmllbmUgbW9kaWZpY2F0byBpbCB2YWxvcmUgZGkgXCJuZ01vZGVsSW5wdXRcIiBhbGxvcmEgYWdnaW9ybmEgbCdpbnB1dFxyXG4gICAgLy8gaWYgKGNoYW5nZXNbJ2NvbmZpZ3VyYXRpb25zJ10gIT0gdW5kZWZpbmVkICYmIGNoYW5nZXNbJ2NvbmZpZ3VyYXRpb25zJ10uZmlyc3RDaGFuZ2UgPT0gZmFsc2UpIHtcclxuICAgIC8vICAgdGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXMgPSBjaGFuZ2VzWydjb25maWd1cmF0aW9ucyddLmN1cnJlbnRWYWx1ZTtcclxuICAgIC8vICAgdGhpcy5yZWxvYWRUYWJsZXMoKTtcclxuICAgIC8vIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIG5nT25DaGFuZ2VzXHJcblxyXG4gIC8vI3JlZ2lvbiBnZXRGb3JtQnlJRFxyXG4gIGFzeW5jIGdldEZvcm1CeUlEKGlkOiBzdHJpbmcgPSB0aGlzLmZvcm1JRCkge1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnbGlzdC1mb3JtLXJlY29yZCAtIGdldEZvcm1CeUlEJywgdGhpcy5mb3JtKTtcclxuXHJcbiAgICBpZiAodGhpcy5mb3JtID09IG51bGwpIHtcclxuICAgICAgY29uc3QgZHluYW1pY01vZHVsZVBhcmFtczogQXJyYXk8RW5kUG9pbnREYXRhUGFyYW1zPiA9XHJcbiAgICAgICAgbmV3IEFycmF5PEVuZFBvaW50RGF0YVBhcmFtcz4oKTtcclxuICAgICAgZHluYW1pY01vZHVsZVBhcmFtcy5wdXNoKHtcclxuICAgICAgICBQYXJhbU5hbWU6IFwiaWRcIixcclxuICAgICAgICBQYXJhbVZhbHVlOiBpZCxcclxuICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgfSk7XHJcbiAgICAgIGF3YWl0IHRoaXMudXRpbGl0eUhlbHBlclNlcnZpY2UuUnVuRW5kUG9pbnRDYWxsKFxyXG4gICAgICAgIHRoaXMuZW5kUG9pbnRDb25maWd1cmF0aW9uLkZvcm1zLkdldEJ5SURFbmRQb2ludCxcclxuICAgICAgICBkeW5hbWljTW9kdWxlUGFyYW1zLFxyXG4gICAgICAgIChyZXM6IEZvcm0pID0+IHtcclxuICAgICAgICAgIHRoaXMuZm9ybSA9IHJlcztcclxuICAgICAgICAgIHRoaXMuY29uZmlndXJlQ29sdW1ucygpO1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgKGVycikgPT4geyB9XHJcbiAgICAgICk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbmZpZ3VyZUNvbHVtbnMoKTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldEZvcm1CeUlEXHJcblxyXG4gIC8vI3JlZ2lvbiBnZXRSZWNvcmRzQnlGb3JtSURcclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIHJlY3VwZXJhcmUgdHV0dGkgaSByZWNvcmQgc2FsdmF0aSBwZXIgdW5hIHBhcnRpY29sYXJlIEZvcm0uXHJcbiAgICogTGEgY2hpYW1hdGEgdmllbmUgZWZmZXR0dWF0YSBzb2xvIHNlIMOoIHN0YXRvIGNvbmZpZ3VyYXRvIGwnZW5kUG9pbnQgZGEgdXNhcmUuXHJcbiAgICogTGEgcmlzcG9zdGEgZGVsbGEgY2hpYW1hdGEgZGV2ZSBlc3NlcmUgdW4gYXJyYXkgZGkgb2dnZXR0aSBkaSB0aXBvIFwiRHluUmVjb3JkXCJcclxuICAgKiBhIHBhcnRpcmUgZGFpIHF1YWxpIHZlbmdvbm8gcmljcmVhdGkgaSBSZWNvcmQgdXNhdGkgbmVsIGNsaWVudC5cclxuICAgKi9cclxuICBhc3luYyBnZXRSZWNvcmRzQnlGb3JtSUQoKSB7XHJcbiAgICAvKipcclxuICAgICAqIHByZW5kZSBsZSByaXNwb3N0ZSBlIGxlIHJlbmRlIHBpYXR0ZSwgYWRhdHRlIGEgZGl2ZW50YXJlIHVuYSByaWdhIGRhIHRhYmVsbGFcclxuICAgICAqIG1ldHRlIHR1dHRlIGxlIHJpc3Bvc3RlIG5lbGxlIHN0cnV0dHVyZSBuZWNlc3NhcmllIHBlciBpbCByZWN1cGVybyBlIGxhIHZpc3VhbGl6emF6aW9uZVxyXG4gICAgICogQHBhcmFtIGFuc3dlcnMgXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IHJlYXJyYW5nZUFuc3dlcnNBbmRQb3B1bGF0ZUxpc3RzID0gKGFuc3dlcnMpID0+IHtcclxuICAgICAgdGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXMgPSBuZXcgQXJyYXk8UmVjb3JkPigpO1xyXG4gICAgICBhbnN3ZXJzLmZvckVhY2goKGFuc3dlcikgPT4ge1xyXG4gICAgICAgIHZhciB0bXBSZWM6IFJlY29yZCA9IG5ldyBSZWNvcmQoKTtcclxuICAgICAgICB0bXBSZWMgPSBKU09OLnBhcnNlKGFuc3dlci5TZXJpYWxpemVkVmFsdWVzKTtcclxuICAgICAgICB0bXBSZWMuSUQgPSBhbnN3ZXIuSUQ7XHJcbiAgICAgICAgdG1wUmVjLkVudElEID0gYW5zd2VyLkVudElEO1xyXG4gICAgICAgIHRtcFJlYy5WZXJzaW9uID0gYW5zd2VyLlZlcnNpb247XHJcbiAgICAgICAgdG1wUmVjLnVzZXJJRCA9IGFuc3dlci51c2VySUQ7XHJcbiAgICAgICAgdG1wUmVjLkFuc3dlckRhdGUgPSBhbnN3ZXIuQW5zd2VyRGF0ZTtcclxuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb25zLnZhbHVlcy5wdXNoKHRtcFJlYyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogcHJlcGFyYSBsYSBsaXN0YSBkZWxsZSBjb2xvbm5lIGRhIG1vc3RyYXJlICh1bmEgcGVyIG9nbmkgcmlzcG9zdGEsIHBpw7kgbGEgY29sb25uYSBkZWxsZSBwcm9wcmlldMOgKVxyXG4gICAgICogaW1wb3N0YSBsYSBsaXN0YSBkZWxsZSByaXNwb3N0ZSBkYSB2aXN1YWxpenphcmVcclxuICAgICAqIGxpYmVyYSBsZSB2YXJpYWJpbGkgZGkgY2FyaWNhbWVudG8gcGVyIG1vc3RyYXJlIGkgY29udGVudXRpIGRlbGxhIHZpc3RhXHJcbiAgICAgKi9cclxuICAgIGNvbnN0IG5hbWVDb2x1bW5zQW5kU3RhcnRWaWV3ID0gKCkgPT4ge1xyXG4gICAgICAvL2Rlc3RydXR0dXJhIGwnYXJyYXkgcmlzcG9zdGUgZSBwZXIgb2duaSByaXNwb3N0YSBnZW5lcmEgdW4gZWxlbWVudG8gY29sW2ldXHJcbiAgICAgIHRoaXMuZGlzcGxheWVkQ29sdW1ucyA9IFtcInByb3BlcnR5XCIsIC4uLnRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzLm1hcCgoXywgaSkgPT4gYGNvbCR7aX1gKV07XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzID0gdGhpcy5jb25maWd1cmF0aW9ucy52YWx1ZXM7XHJcbiAgICAgIHRoaXMuc2V0TWluTWF4RGF0ZXMoKTtcclxuXHJcbiAgICAgIHRoaXMubG9hZGVkRmlsdGVycyA9IHRydWU7XHJcbiAgICAgIHRoaXMubG9hZGVkVGFibGUgPSB0cnVlO1xyXG4gICAgICBzZXRUaW1lb3V0KChfKSA9PiB7XHJcbiAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICAgIH0sIDApOyAvLyByZWZyZXNoIHVpXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzKSB7XHJcbiAgICAgIC8vIHZlbmdvIGRhIHVuJ2FsdHJhIHZpc3VhbGl6emF6aW9uZSBjaGUgaGEgZ2nDoCByZWN1cGVyYXRvIGxlIHJpc3Bvc3RlXHJcbiAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJoTGlzdCAtIGdldFJlY29yZHNCeUZvcm1JRCBBXCIsIHRoaXMuY29uZmlndXJhdGlvbnMpXHJcbiAgICAgIG5hbWVDb2x1bW5zQW5kU3RhcnRWaWV3KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAvLyBzb25vIGluIHVuYSBudW92YSBpc3RhbnphIGluIGN1aSBkZXZvIHJlY3VwZXJhcmUgbGUgcmlzcG9zdGVcclxuICAgICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcImhMaXN0IC0gZ2V0UmVjb3Jkc0J5Rm9ybUlEIEJcIiwgdGhpcy5jb25maWd1cmF0aW9ucylcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbiAmJlxyXG4gICAgICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3JkcyAmJlxyXG4gICAgICAgICAgdGhpcy5lbmRQb2ludENvbmZpZ3VyYXRpb24uUmVjb3Jkcy5HZXRCeUZvcm1JREVuZFBvaW50XHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICBsZXQgZHluYW1pY01vZHVsZVBhcmFtcyA9IFtcclxuICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgIFBhcmFtTmFtZTogXCJFbnRJRFwiLFxyXG4gICAgICAgICAgICAgIFBhcmFtVmFsdWU6IHRoaXMuZm9ybS5JRCxcclxuICAgICAgICAgICAgICBQYXJhbVR5cGU6IFBhcmFtVHlwZUVudW1bXCJRdWVyeSBwYXJhbVwiXSxcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgIF07XHJcbiAgICAgICAgICBpZiAodGhpcy5jb25maWd1cmF0aW9ucy51c2VySUQgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAvLyBub24gaG8gc3BlY2lmaWNhdG8gdW4gdXRlbnRlXHJcbiAgICAgICAgICAgIC8vIHZlZG8gdHV0dGUgbGUgcmlzcG9zdGUgZGVsIG1vZHVsb1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnV0aWxpdHlIZWxwZXJTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgICAgICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEJ5Rm9ybUlERW5kUG9pbnQsXHJcbiAgICAgICAgICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgICAgICAgICAocmVzOiBBcnJheTxEeW5SZWNvcmQ+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWFycmFuZ2VBbnN3ZXJzQW5kUG9wdWxhdGVMaXN0cyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgbmFtZUNvbHVtbnNBbmRTdGFydFZpZXcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBjb25vc2NvIGwndXRlbnRlXHJcbiAgICAgICAgICAgIC8vIHZvZ2xpbyBzb2xhbWVudGUgbGUgc3VlIHJpc3Bvc3RlXHJcbiAgICAgICAgICAgIGR5bmFtaWNNb2R1bGVQYXJhbXMucHVzaChcclxuICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBQYXJhbU5hbWU6IFwiVXNlcklEXCIsXHJcbiAgICAgICAgICAgICAgICBQYXJhbVZhbHVlOiB0aGlzLmNvbmZpZ3VyYXRpb25zLnVzZXJJRCxcclxuICAgICAgICAgICAgICAgIFBhcmFtVHlwZTogUGFyYW1UeXBlRW51bVtcIlF1ZXJ5IHBhcmFtXCJdLFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnV0aWxpdHlIZWxwZXJTZXJ2aWNlLlJ1bkVuZFBvaW50Q2FsbChcclxuICAgICAgICAgICAgICB0aGlzLmVuZFBvaW50Q29uZmlndXJhdGlvbi5SZWNvcmRzLkdldEFsbEJ5RW50QW5kVXNlcklERW5kUG9pbnQsXHJcbiAgICAgICAgICAgICAgZHluYW1pY01vZHVsZVBhcmFtcyxcclxuICAgICAgICAgICAgICAocmVzOiBBcnJheTxEeW5SZWNvcmQ+KSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZWFycmFuZ2VBbnN3ZXJzQW5kUG9wdWxhdGVMaXN0cyhyZXMpO1xyXG4gICAgICAgICAgICAgICAgbmFtZUNvbHVtbnNBbmRTdGFydFZpZXcoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ2V4Y2VwdGlvbicsIGUpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGdldFJlY29yZHNCeUZvcm1JRFxyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGNvbmZpZ3VyZUNvbHVtbnNcclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNvbmZpZ3VyYXJlIGxlIGNvbG9ubmUgZGVsbGEgZXFwLXRhYmxlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY29uZmlndXJlQ29sdW1ucygpIHtcclxuICAgIHRoaXMuY29sdW1ucyA9IFtcclxuICAgICAge1xyXG4gICAgICAgIGtleTogXCJhY3Rpb25cIixcclxuICAgICAgICBkaXNwbGF5OiBcIlwiLFxyXG4gICAgICAgIHR5cGU6IFR5cGVDb2x1bW4uTWVudUFjdGlvbixcclxuICAgICAgICBidXR0b25NZW51SWNvbjogXCJtb3JlX3ZlcnRcIixcclxuICAgICAgICBzdHlsZXM6IHsgZmxleDogXCIwIDAgNiVcIiB9LFxyXG4gICAgICAgIGFjdGlvbnM6IFtdLFxyXG4gICAgICB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBpZiAodGhpcy5kZWZhdWx0TGlzdEFjdGlvbnMudmlldyA9PSB0cnVlKSB7XHJcbiAgICAgIHRoaXMuY29sdW1uc1xyXG4gICAgICAgIC5maW5kKChjKSA9PiBjLmtleSA9PT0gXCJhY3Rpb25cIilcclxuICAgICAgICAuYWN0aW9ucy5wdXNoKHtcclxuICAgICAgICAgIG5hbWU6IFwiVmlzdWFsaXp6YVwiLFxyXG4gICAgICAgICAgaWNvbjogXCJpbmZvXCIsXHJcbiAgICAgICAgICBmbjogKGVsZW1lbnQsIGluZGV4LCBjb2wpID0+IHRoaXMudmlld1JlY29yZChlbGVtZW50KSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmRlZmF1bHRMaXN0QWN0aW9ucy5lZGl0ID09IHRydWUpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbmQoKGMpID0+IGMua2V5ID09PSBcImFjdGlvblwiKVxyXG4gICAgICAgIC5hY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgbmFtZTogXCJNb2RpZmljYVwiLFxyXG4gICAgICAgICAgaWNvbjogXCJlZGl0XCIsXHJcbiAgICAgICAgICBmbjogKGVsZW1lbnQsIGluZGV4LCBjb2wpID0+IHRoaXMudmlld09yRWRpdFJlY29yZChlbGVtZW50LCBmYWxzZSksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kZWZhdWx0TGlzdEFjdGlvbnMuZHVwbGljYXRlID09IHRydWUpIHtcclxuICAgICAgLyp0aGlzLmNvbHVtbnNcclxuICAgICAgICAuZmluZCgoYykgPT4gYy5rZXkgPT09IFwiYWN0aW9uXCIpXHJcbiAgICAgICAgLmFjdGlvbnMucHVzaCh7XHJcbiAgICAgICAgICBuYW1lOiBcIkR1cGxpY2FcIixcclxuICAgICAgICAgIGljb246IFwiZmlsZV9jb3B5XCIsXHJcbiAgICAgICAgICBmbjogKGVsZW1lbnQsIGluZGV4LCBjb2wpID0+IHRoaXMuZHVwbGljYXRlUmVjb3JkKGVsZW1lbnQpLFxyXG4gICAgICAgIH0pOyovXHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5kZWZhdWx0TGlzdEFjdGlvbnMuZGVsZXRlID09IHRydWUpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbmQoKGMpID0+IGMua2V5ID09PSBcImFjdGlvblwiKVxyXG4gICAgICAgIC5hY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgbmFtZTogXCJFbGltaW5hXCIsXHJcbiAgICAgICAgICBpY29uOiBcImRlbGV0ZVwiLFxyXG4gICAgICAgICAgZm46IChlbGVtZW50LCBpbmRleCwgY29sKSA9PiB0aGlzLmRlbGV0ZVJlY29yZChlbGVtZW50KSxcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmV4dGVybmFsQnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcclxuICAgICAgdGhpcy5jb2x1bW5zXHJcbiAgICAgICAgLmZpbmQoKGMpID0+IGMua2V5ID09PSBcImFjdGlvblwiKVxyXG4gICAgICAgIC5hY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgbmFtZTogYnV0dG9uLnRleHQsXHJcbiAgICAgICAgICBpY29uOiBidXR0b24uaWNvbixcclxuICAgICAgICAgIGZuOiAoZWxlbWVudCwgaW5kZXgsIGNvbCkgPT4gYnV0dG9uLmZuKCksXHJcbiAgICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNyZWF0ZUFkZGl0aW9uYWxBY3Rpb25zKCk7XHJcbiAgICB0aGlzLmNyZWF0ZUNvbHVtbnNGcm9tRm9ybUZpZWxkcygpO1xyXG4gICAgdGhpcy5nZXRSZWNvcmRzQnlGb3JtSUQoKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGNvbmZpZ3VyZUNvbHVtbnNcclxuXHJcbiAgLy8jcmVnaW9uIGNyZWF0ZUFkZGl0aW9uYWxBY3Rpb25zXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBhZ2dpdW5nZXJlIG5lbGxhIGNvbG9ubmEgXCJhY3Rpb25cIiBkZWxsYSBlcXAtdGFibGUgbGUgYXppb25pIHN1aSByZWNvcmRcclxuICAgKiBkZWZpbml0ZSBkYWxsJ3V0ZW50ZSBhbGwnaW50ZXJubyBkZWxsYSBGb3JtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlQWRkaXRpb25hbEFjdGlvbnMoKSB7XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKCdsaXN0LWZvcm0tcmVjb3JkIC0gY3JlYXRlQWRkaXRpb25hbEFjdGlvbnMnLCB0aGlzLmZvcm0pO1xyXG5cclxuICAgIGlmICh0aGlzLmZvcm0uQWN0aW9uc09uUmVjb3JkICYmIHRoaXMuZm9ybS5BY3Rpb25zT25SZWNvcmQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmZvcm0uQWN0aW9uc09uUmVjb3JkLnNvcnQoKGEsIGIpID0+XHJcbiAgICAgICAgYS5PcmRpbmFsUG9zaXRpb24gPiBiLk9yZGluYWxQb3NpdGlvblxyXG4gICAgICAgICAgPyAxXHJcbiAgICAgICAgICA6IGIuT3JkaW5hbFBvc2l0aW9uID4gYS5PcmRpbmFsUG9zaXRpb25cclxuICAgICAgICAgICAgPyAtMVxyXG4gICAgICAgICAgICA6IDBcclxuICAgICAgKS5mb3JFYWNoKChhY3Rpb24pID0+IHtcclxuICAgICAgICB0aGlzLmNvbHVtbnNcclxuICAgICAgICAgIC5maW5kKChjKSA9PiBjLmtleSA9PT0gXCJhY3Rpb25cIilcclxuICAgICAgICAgIC5hY3Rpb25zLnB1c2goe1xyXG4gICAgICAgICAgICBuYW1lOiBhY3Rpb24uTmFtZSxcclxuICAgICAgICAgICAgaWNvbjogYWN0aW9uLkljb24sXHJcbiAgICAgICAgICAgIGZuOiAoZWxlbWVudCwgaW5kZXgsIGNvbCkgPT4ge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHJlYyA9IGVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgY29uc3QgY3R4ID0gVXRpbGl0eUhlbHBlclNlcnZpY2UuY29udGV4dDtcclxuICAgICAgICAgICAgICBldmFsKGFjdGlvbi5BY3Rpb24pO1xyXG4gICAgICAgICAgICAgIC8vIFRPRE86IHNhbHZhcmUgbGUgbW9kaWZpY2hlXHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBjcmVhdGVBZGRpdGlvbmFsQWN0aW9uc1xyXG5cclxuXHJcbiAgLy8jcmVnaW9uIGNyZWF0ZUNvbHVtbnNGcm9tRm9ybUZpZWxkc1xyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgY3JlYXJlIGxhIGNvbmZpZ3VyYXppb25lIGRlbGxlIGNvbG9ubmUgcGVyIGxhIGVxcC10YWJsZS5cclxuICAgKiBJbmRpdmlkdWEgaSBCYXNlRmllbGQgZGEgbW9zdHJhcmUgZSBsaSB1c2EgcGVyIGNyZWFyZSBsZSBDb25maWdDb2x1bW4uXHJcbiAgICogTGUgY29sb25uZSB2ZW5nb25vIGNyZWF0ZSBwZXIgaSBCYXNlRmllbGQgY29uIGlsIGZsYWcgSW5MaXN0VmlldyBhIFRSVUVcclxuICAgKiBvcHB1cmUsIG5lbCBjYXNvIG5vbiBzaWFubyBzdGF0aSBzcGVjaWZpY2F0aSBpIGNhbXBpIGRhIHZpc3VhbGl6emFyZSxcclxuICAgKiBzZWxlemlvbmEgaSBwcmltaSA2LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3JlYXRlQ29sdW1uc0Zyb21Gb3JtRmllbGRzKCkge1xyXG4gICAgR2xvYmFsU2VydmljZS5kZWJ1Z0xvZygnbGlzdC1mb3JtLXJlY29yZCAtIGNyZWF0ZUNvbHVtbnNGcm9tRm9ybUZpZWxkcycsIHRoaXMuZm9ybSk7XHJcblxyXG4gICAgdmFyIGZpZWxkc0ZvckNvbHVtbnM6IEFycmF5PEJhc2VGaWVsZD47XHJcbiAgICBmaWVsZHNGb3JDb2x1bW5zID0gdGhpcy5mb3JtLkZpZWxkcy5maWx0ZXIoKGYpID0+IHtcclxuICAgICAgLy9uYXNjb25kZXJlIGNhbXBpIGV0aWNoZXR0YVxyXG4gICAgICBpZihmLkZpZWxkVHlwZSA9PSBGaWVsZFR5cGVFbnVtW1wiRXRpY2hldHRhXCJdKXtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGYuQW5zd2VyU3R5bGUpIHtcclxuICAgICAgICByZXR1cm4gZi5BbnN3ZXJTdHlsZS5Jbkxpc3RWaWV3O1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBmLkluTGlzdFZpZXc7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZXhpc3RpbmdBZ2dyZWdhdGlvbnMgPSBbXTtcclxuXHJcbiAgICBmaWVsZHNGb3JDb2x1bW5zXHJcbiAgICAgIC5zb3J0KChhLCBiKSA9PlxyXG4gICAgICAgIGEuT3JkaW5hbFBvc2l0aW9uID4gYi5PcmRpbmFsUG9zaXRpb25cclxuICAgICAgICAgID8gMVxyXG4gICAgICAgICAgOiBiLk9yZGluYWxQb3NpdGlvbiA+IGEuT3JkaW5hbFBvc2l0aW9uXHJcbiAgICAgICAgICAgID8gLTFcclxuICAgICAgICAgICAgOiAwXHJcbiAgICAgIClcclxuICAgICAgLmZvckVhY2goKGZpZWxkKSA9PiB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8gdGhpcy5jb2x1bW5zLnB1c2godGhpcy5jcmVhdGVGaWVsZENvbHVtbihmaWVsZCkpO1xyXG4gICAgICAgIHRoaXMucHJvcGVydGllcy5wdXNoKHsgbGFiZWw6IGZpZWxkLkxhYmVsLCB0eXBlOiBmaWVsZC5GaWVsZFR5cGUsIGNvbmZpZzogZmllbGQgfSk7XHJcbiAgICAgICAgdGhpcy5wcm9wZXJ0aWVzTGFiZWxbZmllbGQuTGFiZWxdID0gZmllbGQuRGVzY3JpcHRpb247XHJcblxyXG4gICAgICAgIGlmIChmaWVsZC5BZ2dyZWdhdGlvbnMgIT0gbnVsbCAmJiBmaWVsZC5BZ2dyZWdhdGlvbnMubGVuZ3RoID4gMCApe1xyXG4gICAgICAgICAgZmllbGQuQWdncmVnYXRpb25zLmZvckVhY2goKGFnZ3JlZ2F0aW9uKSA9PiB7ICBcclxuICAgICAgICAgICAgaWYgKHRoaXMuZXhpc3RpbmdBZ2dyZWdhdGlvbnMuaW5kZXhPZihhZ2dyZWdhdGlvbikgPT0gLTEpe1xyXG4gICAgICAgICAgICAgIHRoaXMuZXhpc3RpbmdBZ2dyZWdhdGlvbnMucHVzaChhZ2dyZWdhdGlvbik7XHJcbiAgICAgICAgICAgICAgLy90aGlzLnByb3BlcnRpZXNMYWJlbFtOdW1iZXJBZ2dyZWdhdGlvbkZ1bmN0aW9uRW51bVthZ2dyZWdhdGlvbl0udG9TdHJpbmcoKS50b1VwcGVyQ2FzZSgpXSA9IFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTsgXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBcclxuXHJcbiAgICAgIH0pO1xyXG4gICAgICBcclxuICAgIHRoaXMuc2VsZWN0ZWRQcm9wZXJ0aWVzID0gdGhpcy5wcm9wZXJ0aWVzO1xyXG5cclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIGNyZWF0ZUNvbHVtbnNGcm9tRm9ybUZpZWxkc1xyXG5cclxuICAvLyNyZWdpb24gY3JlYXRlRmllbGRDb2x1bW5cclxuICAvKipcclxuICAgKiBNZXRvZG8gcGVyIGNyZWFyZSBsJ29nZ2V0dG8gQ29uZmlndXJlQ29sdW1uIGNoZSByYXBwcmVzZW50YSBpbCBCYXNlRmllbGQgcGFzc2F0byBpbiBpbnB1dC5cclxuICAgKiBAcGFyYW0gZmllbGQgQmFzZUZpZWxkIHBlciBjdWkgY3JlYXJlIGxhIGNvbG9ubmEgbmVsbGEgZXFwLXRhYmxlXHJcbiAgICogQHJldHVybnMgUmVzdGl0dWlzY2UgdW5hIENvbmZpZ0NvbHVtbiBwZXIgbGEgZXFwLXRhYmxlXHJcbiAgICovXHJcbiAgLy8gcHJpdmF0ZSBjcmVhdGVGaWVsZENvbHVtbihmaWVsZDogQmFzZUZpZWxkKTogQ29uZmlnQ29sdW1uIHtcclxuICAvLyAgIHZhciBjb2x1bW46IENvbmZpZ0NvbHVtbiA9IHsga2V5OiBmaWVsZC5OYW1lLCBkaXNwbGF5OiBmaWVsZC5MYWJlbCB9O1xyXG4gIC8vICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpIHtcclxuICAvLyAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiQm9vbGVhbm9cIl06XHJcbiAgLy8gICAgICAgY29sdW1uLnR5cGUgPSBUeXBlQ29sdW1uLkJvb2xlYW47XHJcbiAgLy8gICAgICAgY29sdW1uLmJvb2xlYW5WYWx1ZXMgPSB7XHJcbiAgLy8gICAgICAgICBmYWxzZTogJzxpIGNsYXNzPVwiZmEgZmEtdGltZXMgZXJyb3ItY29sb3JcIj48L2k+JyxcclxuICAvLyAgICAgICAgIHRydWU6ICc8aSBjbGFzcz1cImZhIGZhLWNoZWNrIHN1Y2Nlc3MtY29sb3JcIj48L2k+JyxcclxuICAvLyAgICAgICB9O1xyXG4gIC8vICAgICAgIGNvbHVtbi5zdHlsZXMgPSB7XHJcbiAgLy8gICAgICAgICBmbGV4OiBcIjAgMCA3JVwiLFxyXG4gIC8vICAgICAgICAgY2VsbEFsaWdubWVudDogQ2VsbEFsaWdubWVudEVudW0uQ0VOVEVSLFxyXG4gIC8vICAgICAgIH07XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkRhdGEgZS9vIG9yYVwiXTpcclxuICAvLyAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAoZmllbGQgYXMgRGF0ZUZpZWxkKS5Jc09ubHlEYXRlICE9IERhdGVUaW1lVHlwZUVudW1bXCJTb2xvIG9yYXJpb1wiXVxyXG4gIC8vICAgICAgICkge1xyXG4gIC8vICAgICAgICAgY29sdW1uLnR5cGUgPSBUeXBlQ29sdW1uLkRhdGU7XHJcbiAgLy8gICAgICAgICBpZiAoXHJcbiAgLy8gICAgICAgICAgIChmaWVsZCBhcyBEYXRlRmllbGQpLklzT25seURhdGUgPT0gRGF0ZVRpbWVUeXBlRW51bVtcIkRhdGEgZSBvcmFcIl1cclxuICAvLyAgICAgICAgICkge1xyXG4gIC8vICAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gXCJkZC9NTS95eXl5IEhIOm1tXCI7XHJcbiAgLy8gICAgICAgICB9IGVsc2UgaWYgKFxyXG4gIC8vICAgICAgICAgICAoZmllbGQgYXMgRGF0ZUZpZWxkKS5Jc09ubHlEYXRlID09IERhdGVUaW1lVHlwZUVudW1bXCJTb2xvIGRhdGFcIl1cclxuICAvLyAgICAgICAgICkge1xyXG4gIC8vICAgICAgICAgICBjb2x1bW4uZm9ybWF0ID0gKGZpZWxkIGFzIERhdGVGaWVsZCkuRGF0ZUZvcm1hdFxyXG4gIC8vICAgICAgICAgICAgID8gKGZpZWxkIGFzIERhdGVGaWVsZCkuRGF0ZUZvcm1hdC5yZXBsYWNlKFwiRERcIiwgXCJkZFwiKVxyXG4gIC8vICAgICAgICAgICAgIDogXCJkZC9NTS95eXl5XCI7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfVxyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJDYW1wbyBudW1lcmljb1wiXTpcclxuICAvLyAgICAgICBpZiAoKGZpZWxkIGFzIE51bWVyaWNGaWVsZCkuQ3VycmVuY3lTeW1ib2wpIHtcclxuICAvLyAgICAgICAgIGNvbHVtbi5udW1iZXJQaXBlID0gTnVtYmVyQ29sdW1uUGlwZS5DVVJSRU5DWTtcclxuICAvLyAgICAgICAgIGNvbHVtbi5jdXJyZW5jeVBpcGVDb2RlID0gKGZpZWxkIGFzIE51bWVyaWNGaWVsZCkuQ3VycmVuY3lTeW1ib2w7XHJcbiAgLy8gICAgICAgfSBlbHNlIGlmICghKGZpZWxkIGFzIE51bWVyaWNGaWVsZCkuSXNJbnRlZ2VyKSB7XHJcbiAgLy8gICAgICAgICBjb2x1bW4ubnVtYmVyUGlwZSA9IE51bWJlckNvbHVtblBpcGUuREVDSU1BTDtcclxuICAvLyAgICAgICB9XHJcbiAgLy8gICAgICAgYnJlYWs7XHJcbiAgLy8gICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkFsbGVnYXRvXCJdOlxyXG4gIC8vICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJJbW1hZ2luZVwiXTpcclxuXHJcbiAgLy8gICAgICAgLypcclxuICAvLyAgICAgICAgIGNvbHVtbi52YWx1ZSA9IChlbGVtZW50OiBSZWNvcmQpID0+IHtcclxuICAvLyAgICAgICAgICAgaWYgKFxyXG4gIC8vICAgICAgICAgICAgIChmaWVsZCBhcyBBdHRhY2htZW50RmllbGQpLklzTXVsdGlBdHRhY2ggfHxcclxuICAvLyAgICAgICAgICAgICAoKGZpZWxkIGFzIEltYWdlRmllbGQpLkF0dGFjaERlZmluaXRpb24gJiZcclxuICAvLyAgICAgICAgICAgICAgIChmaWVsZCBhcyBJbWFnZUZpZWxkKS5BdHRhY2hEZWZpbml0aW9uLklzTXVsdGlBdHRhY2gpXHJcbiAgLy8gICAgICAgICAgICkge1xyXG4gIC8vICAgICAgICAgICAgIHJldHVybiBlbGVtZW50W2ZpZWxkLk5hbWVdICE9IG51bGwgJiYgZWxlbWVudFtmaWVsZC5OYW1lXS5sZW5ndGggPiAwXHJcbiAgLy8gICAgICAgICAgICAgICA/IChlbGVtZW50W2ZpZWxkLk5hbWVdIGFzIEFycmF5PElBdHRhY2htZW50RFRPPilcclxuICAvLyAgICAgICAgICAgICAgICAgICAubWFwKChhKSA9PiBhLkZpbGVOYW1lKVxyXG4gIC8vICAgICAgICAgICAgICAgICAgIC5qb2luKFwiLCBcIilcclxuICAvLyAgICAgICAgICAgICAgIDogbnVsbDtcclxuICAvLyAgICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gZWxlbWVudFtmaWVsZC5OYW1lXSAhPSBudWxsICYmIGVsZW1lbnRbZmllbGQuTmFtZV0ubGVuZ3RoID4gMFxyXG4gIC8vICAgICAgICAgICAgICAgPyAoZWxlbWVudFtmaWVsZC5OYW1lXSBhcyBBcnJheTxJQXR0YWNobWVudERUTz4pWzBdLkZpbGVOYW1lXHJcbiAgLy8gICAgICAgICAgICAgICA6IG51bGw7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH07XHJcbiAgLy8gICAgICAgICBjb2x1bW4uaXNTb3J0YWJsZSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICAgY29sdW1uLmlzU2VhcmNoYWJsZSA9IGZhbHNlO1xyXG4gIC8vICAgICAgICovXHJcblxyXG4gIC8vICAgICAgIGJyZWFrO1xyXG4gIC8vICAgICBjYXNlIEZpZWxkVHlwZUVudW1bXCJFbGVuY28gZ2VuZXJpY29cIl06XHJcbiAgLy8gICAgICAgY29sdW1uLnZhbHVlID0gKGVsZW1lbnQ6IFJlY29yZCkgPT4ge1xyXG4gIC8vICAgICAgICAgaWYgKChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuSXNNdWx0aUNob2ljaGUpIHtcclxuICAvLyAgICAgICAgICAgaWYgKCFlbGVtZW50W2ZpZWxkLk5hbWVdIHx8IGVsZW1lbnRbZmllbGQuTmFtZV0ubGVuZ3RoID09IDApIHtcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAvLyAgICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoKGZpZWxkIGFzIExpc3RWYWx1ZUZpZWxkKS5WYWx1ZVBhaXJzKVxyXG4gIC8vICAgICAgICAgICAgICAgLmZpbHRlcigoaykgPT5cclxuICAvLyAgICAgICAgICAgICAgICAgZWxlbWVudFtmaWVsZC5OYW1lXS5pbmNsdWRlcyhcclxuICAvLyAgICAgICAgICAgICAgICAgICAoZmllbGQgYXMgTGlzdFZhbHVlRmllbGQpLlZhbHVlUGFpcnNba11cclxuICAvLyAgICAgICAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgICAgICAgKVxyXG4gIC8vICAgICAgICAgICAgICAgLmpvaW4oXCIsIFwiKTtcclxuICAvLyAgICAgICAgICAgfVxyXG4gIC8vICAgICAgICAgfSBlbHNlIHtcclxuICAvLyAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuVmFsdWVQYWlycykuZmluZChcclxuICAvLyAgICAgICAgICAgICAoaykgPT5cclxuICAvLyAgICAgICAgICAgICAgIChmaWVsZCBhcyBMaXN0VmFsdWVGaWVsZCkuVmFsdWVQYWlyc1trXSA9PSBlbGVtZW50W2ZpZWxkLk5hbWVdXHJcbiAgLy8gICAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfTtcclxuICAvLyAgICAgICBjb2x1bW4uaXNTb3J0YWJsZSA9IGZhbHNlO1xyXG4gIC8vICAgICAgIGNvbHVtbi5pc1NlYXJjaGFibGUgPSBmYWxzZTtcclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgICAgY2FzZSBGaWVsZFR5cGVFbnVtW1wiTG9va3VwXCJdOlxyXG4gIC8vICAgICAgIC8vIFRPRE9cclxuICAvLyAgICAgICBicmVhaztcclxuICAvLyAgIH1cclxuICAvLyAgIHJldHVybiBjb2x1bW47XHJcbiAgLy8gfVxyXG4gIC8vI2VuZHJlZ2lvbiBjcmVhdGVGaWVsZENvbHVtblxyXG5cclxuICAvLyNyZWdpb24gdmlld1JlY29yZFxyXG4gIHZpZXdSZWNvcmQocmVjb3JkOiBSZWNvcmQpIHtcclxuICAgIHRoaXMub25WaWV3UmVjb3JkLmVtaXQocmVjb3JkKTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHZpZXdSZWNvcmRcclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIGNoZSBzY2F0ZW5hIGwnZXZlbnRvIGRpIE91dHB1dCBwZXIgbW9zdHJhcmUgbyBtb2RpZmljYXJlIGlsIHJlY29yZFxyXG4gICAqIHNlbGV6aW9uYXRvIHN1bGxhIGVxcC10YWJsZS5cclxuICAgKiBAcGFyYW0gcmVjb3JkIFJlY29yZCBkYSB2aXN1YWxpenphcmUgbyBtb2RpZmljYXJlIHNlbGV6aW9uYXRvIHN1bGxhIGVxcC10YWJsZS5cclxuICAgKiBAcGFyYW0gb25seVZpZXcgU2UgVFJVRSB2aWVuZSBtb3N0cmF0byBpbCBjb21wb25lbnRlIGFkZC1mb3JtLXJlY29yZCBpbiBzb2xhIGxldHR1cmEuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSB2aWV3T3JFZGl0UmVjb3JkKHJlY29yZDogUmVjb3JkLCBvbmx5VmlldzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5vbkFkZFZpZXdFZGl0UmVjb3JkLmVtaXQoeyByZWNvcmQsIG9ubHlWaWV3IH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTWV0b2RvIHBlciBlbGltaW5hcmUgdW4gcmVjb3JkIGRhbGxhIGxpc3RhLlxyXG4gICAqIEBwYXJhbSByZWNvcmQgUmVjb3JkIGRhIGVsaW1pbmFyZSBzZWxlemlvbmF0byBzdWxsYSBlcXAtdGFibGUuXHJcbiAgICovXHJcbiAgZGVsZXRlUmVjb3JkKHJlY29yZDogUmVjb3JkKSB7XHJcbiAgICB0aGlzLm9uRGVsZXRlUmVjb3JkLmVtaXQocmVjb3JkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE1ldG9kbyBwZXIgcmljYXJpY2FyZSBpIGRhdGkgZGVsbGEgZXFwLXRhYmxlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVsb2FkVGFibGVzKCkge1xyXG4gICAgaWYgKHRoaXMudGFibGVSZWNvcmRzKSB7XHJcbiAgICAgIHRoaXMudGFibGVSZWNvcmRzLnJlbG9hZERhdGF0YWJsZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIG9uU2VsZWN0aW9uQ2hhbmdlXHJcbiAgLyoqXHJcbiAgICogRnVuemlvbmUgY2hlIHZpZW5lIGNoaWFtYXRhIGFsIGNhbWJpbyBkaSBzZWxlemlvbmUgZGVpIHBhcmFtZXRyaSBkYSBtb3N0cmFyZVxyXG4gICAqIGFnZ2lvcm5hIGxhIGxpc3RhIGRlbGxlIHByb3ByaWV0w6Agc2VsZXppb25hdGUgY2hlIGdlc3Rpc2NlIGxlIHJpZ2hlIG1vc3RyYXRlIHBlciBvZ25pIHJpc3Bvc3RhXHJcbiAgICogQHBhcmFtIHNlbGVjdGVkUHJvcGVydGllcyBcclxuICAgKi9cclxuICBvblNlbGVjdGlvbkNoYW5nZShzZWxlY3RlZFByb3BlcnRpZXMpIHtcclxuICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJvblNlbGVjdGlvbkNoYW5nZSBzZWxlY3RlZFByb3BlcnRpZXMudmFsdWVcIixzZWxlY3RlZFByb3BlcnRpZXMudmFsdWUpO1xyXG4gICAgaWYgKHNlbGVjdGVkUHJvcGVydGllcy52YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRQcm9wZXJ0aWVzID0gc2VsZWN0ZWRQcm9wZXJ0aWVzLnZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZFByb3BlcnRpZXMgPSB0aGlzLnByb3BlcnRpZXM7XHJcbiAgICB9XHJcbiAgICBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwidGhpcy5zZWxlY3RlZFByb3BlcnRpZXMgYXNzZWduYXRhXCIsdGhpcy5zZWxlY3RlZFByb3BlcnRpZXMpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gb25TZWxlY3Rpb25DaGFuZ2VcclxuXHJcbiAgLy8jcmVnaW9uIGZpbHRlckRhdGFBbnN3ZXJzXHJcbiAgLyoqXHJcbiAgICogZnVuemlvbmUgY2hlIGZpbHRyYSBsZSByaXNwb3N0ZSBpbiBiYXNlIGFsIHJhbmdlIGRpIGRhdGUgYmFzYW5kb3NpIHN1bCBjYW1wbyBmaXNzbyBBbnN3ZXJEYXRlIHBlciBpbCBwYXJhZ29uZVxyXG4gICAqL1xyXG4gIGZpbHRlckRhdGFBbnN3ZXJzKCkge1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzID0gW107XHJcblxyXG4gICAgICBpZighdGhpcy5taW5EYXRlKXtcclxuICAgICAgICAvLyBDb252ZXJ0byBsZSBkYXRlIGRpIEFuc3dlckRhdGUgaW4gb2dnZXR0aSBEYXRlIGUgb3JkaW5vXHJcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLnZhbHVlcy5tYXAodmFsdWUgPT4gbmV3IERhdGUodmFsdWUuQW5zd2VyRGF0ZSkpOyAgICBcclxuICAgICAgICAvLyBUcm92byBsYSBkYXRhIHBpw7kgcmVjZW50ZSAobWF4KSBlIGxhIHBpw7kgdmVjY2hpYSAobWluKVxyXG4gICAgICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKE1hdGgubWluKC4uLmRhdGVzLm1hcChkYXRlID0+IGRhdGUuZ2V0VGltZSgpKSkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZighdGhpcy5tYXhEYXRlKXtcclxuICAgICAgICAvLyBDb252ZXJ0byBsZSBkYXRlIGRpIEFuc3dlckRhdGUgaW4gb2dnZXR0aSBEYXRlIGUgb3JkaW5vXHJcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmNvbmZpZ3VyYXRpb25zLnZhbHVlcy5tYXAodmFsdWUgPT4gbmV3IERhdGUodmFsdWUuQW5zd2VyRGF0ZSkpOyAgICBcclxuICAgICAgICAvLyBUcm92byBsYSBkYXRhIHBpw7kgcmVjZW50ZSAobWF4KSBlIGxhIHBpw7kgdmVjY2hpYSAobWluKVxyXG4gICAgICAgIHRoaXMubWF4RGF0ZSA9IG5ldyBEYXRlKE1hdGgubWF4KC4uLmRhdGVzLm1hcChkYXRlID0+IGRhdGUuZ2V0VGltZSgpKSkpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMubWF4RGF0ZS5zZXRIb3VycygyMywgNTksIDU5LCA1OSk7XHJcblxyXG4gICAgICB0aGlzLmZpbHRlcmVkQW5zd2VycyA9IHRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzLmZpbHRlciggdmFsdWUgPT4gbmV3IERhdGUodmFsdWUuQW5zd2VyRGF0ZSkgPj0gdGhpcy5taW5EYXRlICYmIG5ldyBEYXRlKHZhbHVlLkFuc3dlckRhdGUpIDw9IHRoaXMubWF4RGF0ZSk7XHJcblxyXG4gICAgICBpZiAodGhpcy5leGlzdGluZ0FnZ3JlZ2F0aW9ucyAhPSBudWxsICYmIHRoaXMuZXhpc3RpbmdBZ2dyZWdhdGlvbnMubGVuZ3RoID4gMCl7XHJcbiAgICAgICAgICAgIHRoaXMuZXhpc3RpbmdBZ2dyZWdhdGlvbnMuZm9yRWFjaCgoYWdncmVnYXRpb24pID0+IHtcclxuICAgICAgICAgICAgICB2YXIgcmVjb3JkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcmVkQW5zd2Vyc1swXSkpO1xyXG4gICAgICAgICAgICAgIHJlY29yZC5JRCA9IFwiMFwiO1xyXG4gICAgICAgICAgICAgIHJlY29yZC5BbnN3ZXJEYXRlID0gTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bYWdncmVnYXRpb25dLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKTtcclxuICAgICAgICAgICAgICB0aGlzLmZpbHRlcmVkQW5zd2Vycy5wdXNoKHJlY29yZCk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5maWxsQWdncmVnYXRpb25Db2x1bW5zKCk7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICB0aGlzLmRpc3BsYXllZENvbHVtbnMgPSBbXCJwcm9wZXJ0eVwiLCAuLi50aGlzLmZpbHRlcmVkQW5zd2Vycy5tYXAoKF8sIGkpID0+IGBjb2wke2l9YCldO1xyXG5cclxuICAgIH0sIDEwMCk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBmaWx0ZXJEYXRhQW5zd2Vyc1xyXG5cclxuICAvLyNyZWdpb24gc2V0TWluTWF4RGF0ZXNcclxuICAvLyBGdW56aW9uZSBwZXIgb3R0ZW5lcmUgbGEgZGF0YSBwacO5IHJlY2VudGUgZSBxdWVsbGEgcGnDuSB2ZWNjaGlhXHJcbiAgc2V0TWluTWF4RGF0ZXMoKSB7XHJcbiAgICAvLyBDb252ZXJ0byBsZSBkYXRlIGRpIEFuc3dlckRhdGUgaW4gb2dnZXR0aSBEYXRlIGUgb3JkaW5vXHJcbiAgICBjb25zdCBkYXRlcyA9IHRoaXMuY29uZmlndXJhdGlvbnMudmFsdWVzLm1hcCh2YWx1ZSA9PiBuZXcgRGF0ZSh2YWx1ZS5BbnN3ZXJEYXRlKSk7XHJcblxyXG4gICAgLy8gVHJvdm8gbGEgZGF0YSBwacO5IHJlY2VudGUgKG1heCkgZSBsYSBwacO5IHZlY2NoaWEgKG1pbilcclxuICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKE1hdGgubWluKC4uLmRhdGVzLm1hcChkYXRlID0+IGRhdGUuZ2V0VGltZSgpKSkpO1xyXG4gICAgdGhpcy5tYXhEYXRlID0gbmV3IERhdGUoTWF0aC5tYXgoLi4uZGF0ZXMubWFwKGRhdGUgPT4gZGF0ZS5nZXRUaW1lKCkpKSk7XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBzZXRNaW5NYXhEYXRlc1xyXG5cclxuICAvLyNyZWdpb24gZmlsbEFnZ3JlZ2F0aW9uQ29sdW1uc1xyXG4gIGZpbGxBZ2dyZWdhdGlvbkNvbHVtbnMoKXtcclxuICAgIHRoaXMuZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcih4ID0+IHguSUQgPT0gJzAnKS5mb3JFYWNoKChhZ2dyQ29sKSA9PiB7XHJcbiAgICAgIE9iamVjdC5rZXlzKGFnZ3JDb2wpLmZvckVhY2goKGtleSkgPT4ge1xyXG5cclxuICAgICAgICAvL2lmIChrZXkgIT0gXCJBbnN3ZXJEYXRlXCIpeyBhZ2dyQ29sW2tleV0gPSBcIlwiOyB9XHJcblxyXG4gICAgICAgIHZhciBmaWVsZCA9IHRoaXMuZm9ybS5GaWVsZHMuZmluZCh4ID0+IHguTGFiZWwgPT0ga2V5KTtcclxuICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCl7IHJldHVybjsgfVxyXG4gICAgICAgIHZhciBhZ2dyZWdhdGlvbnM6IGFueSA9IGZpZWxkLkFnZ3JlZ2F0aW9ucztcclxuXHJcbiAgICAgICAgaWYgKGFnZ3JlZ2F0aW9ucyAhPSBudWxsKXtcclxuICAgICAgICAgIGlmIChhZ2dyQ29sLkFuc3dlckRhdGUgPT0gXCJDT1VOVFwiICYmIGFnZ3JlZ2F0aW9ucy5pbmRleE9mKE51bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtW1wiQ09VTlRcIl0pICE9IC0xKXsgXHJcbiAgICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IHRoaXMuZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcih4ID0+IHguSUQgIT0gJzAnKS5sZW5ndGg7ICAgICAgICAgIFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSBpZiAoYWdnckNvbC5BbnN3ZXJEYXRlID09IFwiU1VNXCIgJiYgYWdncmVnYXRpb25zLmluZGV4T2YoTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bXCJTVU1cIl0pICE9IC0xKXsgXHJcbiAgICAgICAgICAgIHZhciBzdW0gPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkQW5zd2Vycy5maWx0ZXIoeCA9PiB4LklEICE9ICcwJyAmJiAhaXNOYU4oeFtrZXldKSkuZm9yRWFjaChlbCA9PiB7IHN1bSArPSBwYXJzZUludChlbFtrZXldKTsgfSk7XHJcbiAgICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IHN1bTsgICAgICAgICAgXHJcbiAgICAgICAgICB9IFxyXG4gICAgICAgICAgZWxzZSBpZiAoYWdnckNvbC5BbnN3ZXJEYXRlID09IFwiQVZHXCIgJiYgYWdncmVnYXRpb25zLmluZGV4T2YoTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bXCJBVkdcIl0pICE9IC0xKXsgXHJcbiAgICAgICAgICAgIHZhciBhdmcgPSAwO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkQW5zd2Vycy5maWx0ZXIoeCA9PiB4LklEICE9ICcwJyAmJiAhaXNOYU4oeFtrZXldKSkuZm9yRWFjaChlbCA9PiB7IGF2ZyArPSBwYXJzZUludChlbFtrZXldKTsgfSk7XHJcbiAgICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IGF2ZyAvIHRoaXMuZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcih4ID0+IHguSUQgIT0gJzAnICYmICFpc05hTih4W2tleV0pKS5sZW5ndGg7ICAgICAgICAgIFxyXG4gICAgICAgICAgfSAgIFxyXG4gICAgICAgICAgZWxzZSBpZiAoYWdnckNvbC5BbnN3ZXJEYXRlID09IFwiTUlOXCIgJiYgYWdncmVnYXRpb25zLmluZGV4T2YoTnVtYmVyQWdncmVnYXRpb25GdW5jdGlvbkVudW1bXCJNSU5cIl0pICE9IC0xKXsgXHJcbiAgICAgICAgICAgIHZhciBtaW4gPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLmZpbHRlcmVkQW5zd2Vycy5maWx0ZXIoeCA9PiB4LklEICE9ICcwJyAmJiAhaXNOYU4oeFtrZXldKSkuZm9yRWFjaChlbCA9PiB7IGlmIChtaW4gPT0gbnVsbCB8fCBlbFtrZXldIDwgbWluKSB7IG1pbiA9IGVsW2tleV07IH0gfSk7XHJcbiAgICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IG1pbjsgICAgICAgICAgXHJcbiAgICAgICAgICB9ICAgICBcclxuICAgICAgICAgIGVsc2UgaWYgKGFnZ3JDb2wuQW5zd2VyRGF0ZSA9PSBcIk1BWFwiICYmIGFnZ3JlZ2F0aW9ucy5pbmRleE9mKE51bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtW1wiTUFYXCJdKSAhPSAtMSl7IFxyXG4gICAgICAgICAgICB2YXIgbWF4ID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEFuc3dlcnMuZmlsdGVyKHggPT4geC5JRCAhPSAnMCcgJiYgIWlzTmFOKHhba2V5XSkpLmZvckVhY2goZWwgPT4geyBpZiAobWluID09IG51bGwgfHwgZWxba2V5XSA+IG1heCkgeyBtYXggPSBlbFtrZXldOyB9IH0pO1xyXG4gICAgICAgICAgICBhZ2dyQ29sW2tleV0gPSBtYXg7ICAgICAgICAgIFxyXG4gICAgICAgICAgfSAgICAgXHJcbiAgICAgICAgICBlbHNlIGlmIChhZ2dyQ29sLkFuc3dlckRhdGUgPT0gXCJTVERFVlwiICYmIGFnZ3JlZ2F0aW9ucy5pbmRleE9mKE51bWJlckFnZ3JlZ2F0aW9uRnVuY3Rpb25FbnVtW1wiU1RERVZcIl0pICE9IC0xKXsgXHJcbiAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEFuc3dlcnMuZmlsdGVyKHggPT4geC5JRCAhPSAnMCcgJiYgIWlzTmFOKHhba2V5XSkpLmZvckVhY2goZWwgPT4geyB2YWx1ZXMucHVzaChwYXJzZUludChlbFtrZXldKSk7IH0pO1xyXG4gICAgICAgICAgICBhZ2dyQ29sW2tleV0gPSB0aGlzLnN0YW5kYXJkRGV2aWF0aW9uKHZhbHVlcyk7ICAgICAgICAgIFxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYWdnckNvbFtrZXldID0gXCJcIjtcclxuICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfSBlbHNlIGlmIChhZ2dyZWdhdGlvbnMgPT0gbnVsbCB8fCBhZ2dyZWdhdGlvbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGFnZ3JDb2xba2V5XSA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm47XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvbiBmaWxsQWdncmVnYXRpb25Db2x1bW5zXHJcblxyXG4gIHN0YW5kYXJkRGV2aWF0aW9uKGFyciwgdXNlUG9wdWxhdGlvbiA9IGZhbHNlKSB7XHJcbiAgICBjb25zdCBtZWFuID0gYXJyLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYyArIHZhbCwgMCkgLyBhcnIubGVuZ3RoO1xyXG4gICAgcmV0dXJuIE1hdGguc3FydChcclxuICAgICAgYXJyXHJcbiAgICAgICAgLnJlZHVjZSgoYWNjLCB2YWwpID0+IGFjYy5jb25jYXQoKHZhbCAtIG1lYW4pICoqIDIpLCBbXSlcclxuICAgICAgICAucmVkdWNlKChhY2MsIHZhbCkgPT4gYWNjICsgdmFsLCAwKSAvXHJcbiAgICAgICAgKGFyci5sZW5ndGggLSAodXNlUG9wdWxhdGlvbiA/IDAgOiAxKSlcclxuICAgICk7XHJcbiAgfTsgICBcclxuXHJcbiAgLy8jcmVnaW9uIHByaW50VmFsdWVcclxuICBwcmludFZhbHVlKGZpZWxkVHlwZSwgdmFsdWUsIGZpZWxkY29uZmlnLCByZWNvcmQpIHtcclxuICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkVsZW5jbyBnZW5lcmljb1wiXToge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSBcIlwiKXsgcmV0dXJuIHZhbHVlOyB9XHJcbiAgICAgICAgaWYoIXZhbHVlKXtcclxuICAgICAgICAgIHJldHVybiBcIk4vQVwiO1xyXG4gICAgICAgIH0gXHJcbiAgICAgICAgbGV0IG91dHB1dDtcclxuICAgICAgICBsZXQgVmFsdWVQYWlyczoge1trZXk6c3RyaW5nXTogYW55O30gPSBbXTtcclxuICAgICAgICAvLyBQUkVQQVJPL0xFR0dPIEkgVkFMVUVQQUlSU1xyXG4gICAgICAgIGlmIChmaWVsZGNvbmZpZy5Gb3JtdWxhICE9IG51bGwgJiYgZmllbGRjb25maWcuRm9ybXVsYSkge1xyXG4gICAgICAgICAgdmFyIHRlbXAgPSBVdGlsaXR5SGVscGVyU2VydmljZS5FdmFsdWF0ZUZpZWxkRm9ybXVsYShcclxuICAgICAgICAgICAgZmllbGRjb25maWcuRm9ybXVsYSxcclxuICAgICAgICAgICAgcmVjb3JkLFxyXG4gICAgICAgICAgICB0aGlzLmZvcm11bGFPYmplY3RcclxuICAgICAgICAgICk7XHJcbiAgICAgICAgaWYodHlwZW9mIHRlbXAgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICBsZXQgdGVtcDIgPSB0ZW1wLnNwbGl0KFwiO1wiKTtcclxuICAgICAgICAgIHRlbXAgPSBbXVxyXG4gICAgICAgICAgdGVtcDIuZm9yRWFjaChpdGVtID0+IHtcclxuICAgICAgICAgICAgY29uc3QgYXJySXRlbSA9IGl0ZW0uc3BsaXQoXCJ8XCIpO1xyXG4gICAgICAgICAgICBpZihhcnJJdGVtLmxlbmd0aCA+IDEpe1xyXG4gICAgICAgICAgICAgIHRlbXBbYXJySXRlbVsxXS50cmltKCldID0gYXJySXRlbVswXS50cmltKCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgdGVtcFthcnJJdGVtWzBdLnRyaW0oKV0gPSBhcnJJdGVtWzBdLnRyaW0oKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGtleTIgaW4gdGVtcCkge1xyXG4gICAgICAgICAgVmFsdWVQYWlyc1t0ZW1wW2tleTJdXSA9IGtleTI7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICgoPExpc3RWYWx1ZUZpZWxkPmZpZWxkY29uZmlnKS5WYWx1ZVBhaXJzICE9IG51bGwgJiYgKDxMaXN0VmFsdWVGaWVsZD5maWVsZGNvbmZpZykuVmFsdWVQYWlycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAvLyB2YSBiZW5lIGNvc8OsXHJcbiAgICAgICAgICBWYWx1ZVBhaXJzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgoPExpc3RWYWx1ZUZpZWxkPmZpZWxkY29uZmlnKS5WYWx1ZVBhaXJzKSk7XHJcbiAgICAgICAgfSBlbHNlIGlmICgoPExpc3RWYWx1ZUZpZWxkPmZpZWxkY29uZmlnKS5WYWx1ZVN0cmluZyAhPSBudWxsICYmICg8TGlzdFZhbHVlRmllbGQ+ZmllbGRjb25maWcpLlZhbHVlU3RyaW5nICE9IFwiXCIpIHtcclxuICAgICAgICAgIC8vIHZhIHByZXNhIGxhIHN0cmlnbmEgZSByaW1hcHBhdGEgbmVsIGRpYXJpb1xyXG4gICAgICAgICAgVmFsdWVQYWlycyA9IEdsb2JhbFNlcnZpY2Uuc3RyaW5nVG9WYWx1ZVBhaXJzKCg8TGlzdFZhbHVlRmllbGQ+ZmllbGRjb25maWcpLlZhbHVlU3RyaW5nKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIElOVkVSVE8gSSBWQUxVRVBBSVJTIENISUFWRS9WQUxPUkUgSU4gVkFMUk9FL0NISUFWRVxyXG4gICAgICAgIGxldCBpbnZlcnRlZCA9IHt9O1xyXG4gICAgICAgIC8vR2xvYmFsU2VydmljZS5kZWJ1Z0xvZyhcIig8TGlzdFZhbHVlRmllbGQ+Zm91bmRPYmplY3QpLlZhbHVlUGFpcnNcIiwgKDxMaXN0VmFsdWVGaWVsZD5maWVsZCkuVmFsdWVQYWlycyk7XHJcbiAgICAgICAgLy8gVmFsdWVQYWlyczoge1NpOiAnU2knLCBObzogJ05vJ31cclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gVmFsdWVQYWlycykge1xyXG4gICAgICAgICAgaW52ZXJ0ZWRbVmFsdWVQYWlyc1trZXldXSA9IGtleTtcclxuICAgICAgICB9XHJcbiAgICAgICAgVmFsdWVQYWlycyA9IGludmVydGVkO1xyXG5cclxuICAgICAgICAvLyBMRUdHTyBJIFZBTE9SSSBDSEUgVk9HTElPIFNUQU1QQVJFIFxyXG4gICAgICAgIGlmIChyZWNvcmRbZmllbGRjb25maWcuTmFtZV0gIT0gbnVsbCAmJiAoPExpc3RWYWx1ZUZpZWxkPmZpZWxkY29uZmlnKS5Jc011bHRpQ2hvaWNoZSkge1xyXG4gICAgICAgICAgLy8gY2FzbyBNVUxUSVNDRUxUQVxyXG4gICAgICAgICAgbGV0IG91dFZhbHVlID0gXCJcIjtcclxuICAgICAgICAgIHJlY29yZFtmaWVsZGNvbmZpZy5OYW1lXS5mb3JFYWNoKChlbGVtZW50LCBpKSA9PiB7XHJcbiAgICAgICAgICAgIG91dFZhbHVlICs9IFZhbHVlUGFpcnNbZWxlbWVudF07XHJcbiAgICAgICAgICAgIG91dFZhbHVlICs9IGkgPT0gcmVjb3JkW2ZpZWxkY29uZmlnLk5hbWVdLmxlbmd0aCAtIDEgPyBcIlwiIDogXCIsIFwiXHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIG91dHB1dCA9IG91dFZhbHVlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyBjYXNvIFNDRUxUQSBTSU5HT0xBXHJcbiAgICAgICAgICBvdXRwdXQgPSBWYWx1ZVBhaXJzW3JlY29yZFtmaWVsZGNvbmZpZy5OYW1lXV07XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICAgIH07XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVtcIkNhbXBvIG51bWVyaWNvXCJdOiB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpeyByZXR1cm4gdmFsdWU7IH1cclxuICAgICAgICBpZiAoKDxOdW1lcmljRmllbGQ+ZmllbGRjb25maWcpLklzSW50ZWdlcikge1xyXG4gICAgICAgICAgaWYgKCg8TnVtZXJpY0ZpZWxkPmZpZWxkY29uZmlnKS5EZWNpbWFsU2VwYXJhdG9yID09IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc3QgZGVjaW1hbHMgPSBmaWVsZGNvbmZpZy5EZWNpbWFsUHJlY2lzaW9uICogMTA7XHJcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogZGVjaW1hbHMpIC8gZGVjaW1hbHM7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnN0IGRlY2ltYWxzID0gZmllbGRjb25maWcuRGVjaW1hbFByZWNpc2lvbiAqIDEwO1xyXG4gICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUgKiBkZWNpbWFscykgLyBkZWNpbWFscztcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjYXNlIEZpZWxkVHlwZUVudW1bJ0ltbWFnaW5lJ106IHtcclxuICAgICAgICByZXR1cm4gXCJpbW1hZ2luZVwiO1xyXG4gICAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJpbW1hZ2luZSBcIiArIGZpZWxkY29uZmlnLk5hbWUgKyBcIiA6IFwiICsgdmFsdWUpXHJcbiAgICAgICAgLy8gLy8gUmVjdXBlcm8gaWwgQkFTRTY0IGRlbGwnaW1tYWdpbmUgUmVzaXplZCB2aWEgcHJvbWlzZSBjbGllbnRcclxuICAgICAgICAvLyB2YXIgcmVzaXplZEJhc2U2NCA9IGF3YWl0IHRoaXMucmVzaXplQmFzZTY0SW1hZ2UoXCJkYXRhOmltYWdlL1wiICsgdmFsdWUuRmlsZUV4dGVuc2lvbiArIFwiO2Jhc2U2NCxcIiArIHZhbHVlLkZpbGVEYXRhQmFzZTY0KTtcclxuXHJcbiAgICAgICAgLy8gLy8gQWdnaXVuZ28gbCdIVE1MIGNvbiBpbCBudW92byBCQVNFNjRcclxuICAgICAgICAvLyByZXR1cm4gXCI8aW1nIHNyYz0nXCIgKyByZXNpemVkQmFzZTY0ICsgXCInIHN0eWxlPSdoZWlnaHQ6IFwiICsgdmFsdWUuUmVzaXplZEltYWdlSGVpZ2h0UHggKyBcInB4Jz5cIjtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH07XHJcblxyXG5cclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydBbGxlZ2F0byddOiB7XHJcbiAgICAgICAgcmV0dXJuIFwiQWxsZWdhdG9cIjtcclxuICAgICAgICAvLyBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiQWxsZWdhdG8gXCIgKyBmaWVsZC5OYW1lICsgXCIgOiBcIiArIHZhbHVlLCByZWNvcmQpXHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgcmVzaXplZEJhc2U2NDtcclxuICAgICAgICAgIC8vIGlmICh2YWx1ZVswXS5Jc0ltYWdlKSB7XHJcbiAgICAgICAgICAvLyAgIC8vIFJlY3VwZXJvIGlsIEJBU0U2NCBkZWxsJ2ltbWFnaW5lIFJlc2l6ZWQgdmlhIHByb21pc2UgY2xpZW50XHJcbiAgICAgICAgICAvLyAgIHJlc2l6ZWRCYXNlNjQgPSBhd2FpdCB0aGlzLnJlc2l6ZUJhc2U2NEltYWdlKFwiZGF0YTppbWFnZS9cIiArIHZhbHVlWzBdLkZpbGVFeHRlbnNpb24gKyBcIjtiYXNlNjQsXCIgKyB2YWx1ZVswXS5GaWxlRGF0YUJhc2U2NCk7XHJcbiAgICAgICAgICAvLyAgIC8vIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJBbGxlZ2F0byByZXNpemVkQmFzZTY0XCIsIHJlc2l6ZWRCYXNlNjQpXHJcbiAgICAgICAgICAvLyAgIC8vIEFnZ2l1bmdvIGwnSFRNTCBjb24gaWwgbnVvdm8gQkFTRTY0XHJcbiAgICAgICAgICAvLyAgIHJldHVybiAnPGltZyBjbGFzcz1cImltYWdlLXByZXZpZXdcIiBzcmM9XCInICsgcmVzaXplZEJhc2U2NCArICdcIiBzdHlsZT1cImhlaWdodDogJyArIHZhbHVlWzBdLlJlc2l6ZWRJbWFnZUhlaWdodFB4ICsgJ3B4XCI+JztcclxuICAgICAgICAgIC8vIH0gZWxzZSBpZiAodmFsdWVbMF0uRmlsZUNvbnRlbnRUeXBlID09IFwiYXBwbGljYXRpb24vcGRmXCIpIHtcclxuICAgICAgICAgIC8vICAgcmV0dXJuICc8aWZyYW1lIHNyYz1cImRhdGE6YXBwbGljYXRpb24vcGRmO2Jhc2U2NCwnICsgdmFsdWVbMF0uRmlsZURhdGFCYXNlNjQgKyAnXCJzdHlsZT1cIm1pbi1oZWlnaHQ6IDMwMHB4OyBoZWlnaHQ6IDEwMCU7XCI+PC9pZnJhbWU+JztcclxuICAgICAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgICAgICAvLyAgIHJldHVybiAnPGlmcmFtZSBzcmM9XCJkYXRhOlwiJyArIHZhbHVlWzBdLkZpbGVFeHRlbnNpb24gKyAnXCI7YmFzZTY0LCcgKyB2YWx1ZVswXS5GaWxlRGF0YUJhc2U2NCArICdcInN0eWxlPVwibWluLWhlaWdodDogMzAwcHg7IGhlaWdodDogMTAwJTtcIj48L2lmcmFtZT4nO1xyXG4gICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgIC8vIEFnZ2l1bmdvIGwnSFRNTCBjb24gaWwgbnVvdm8gQkFTRTY0XHJcbiAgICAgICAgICAvLyByZXR1cm4gIFwiPGltZyBzcmM9J1wiICsgcmVzaXplZEJhc2U2NCArIFwiJyBzdHlsZT0naGVpZ2h0OiBcIiArIHZhbHVlWzBdLlJlc2l6ZWRJbWFnZUhlaWdodFB4ICsgXCJweCc+XCI7XHJcbiAgICAgICAgICAvLyBHbG9iYWxTZXJ2aWNlLmRlYnVnTG9nKFwiQWxsZWdhdG8gb3V0cHV0VmFsdWVzQXJyYXlcIiwgb3V0cHV0VmFsdWVzQXJyYXlbZmllbGQuTmFtZV0pXHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnSW1tYWdpbmUgY29uIG1hcmtlcnMnXToge1xyXG4gICAgICAgIHJldHVybiBcIkltbWFnaW5lIGNvbiBtYXJrZXJzXCI7XHJcblxyXG4gICAgICAgIC8vIFJlY3VwZXJvIGlsIEJBU0U2NCBkZWxsJ2ltbWFnaW5lIFJlc2l6ZWQgdmlhIHByb21pc2UgY2xpZW50XHJcbiAgICAgICAgLy8gdmFyIHJlc2l6ZWRCYXNlNjQgPSBhd2FpdCB0aGlzLnJlc2l6ZUJhc2U2NEltYWdlKFwiZGF0YTppbWFnZS9cIiArIHZhbHVlLkZpbGVFeHRlbnNpb24gKyBcIjtiYXNlNjQsXCIgKyB2YWx1ZS5GaWxlRGF0YUJhc2U2NCk7XHJcblxyXG4gICAgICAgIC8vIEFnZ2l1bmdvIGwnSFRNTCBjb24gaWwgbnVvdm8gQkFTRTY0XHJcbiAgICAgICAgLy8gcmV0dXJuIFwiPGltZyBzcmM9J1wiICsgcmVzaXplZEJhc2U2NCArIFwiJyBzdHlsZT0naGVpZ2h0OiBcIiArIHZhbHVlLlJlc2l6ZWRJbWFnZUhlaWdodFB4ICsgXCJweCc+XCI7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgY2FzZSBGaWVsZFR5cGVFbnVtWydFbGVuY28gaW1tYWdpbmknXToge1xyXG4gICAgICAgIHJldHVybiBcIkVsZW5jbyBpbW1hZ2luaVwiO1xyXG4gICAgICAgIGxldCBvdXRwdXRWYWx1ZXNBcnJheSA9IFwiXCI7XHJcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgKDxJbWFnZVNlbGVjdG9yRmllbGQ+ZmllbGRjb25maWcpLklzTXVsdGlDaG9pY2hlKSB7XHJcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKChpbWFnZW9iajogbnVtYmVyKSA9PiB7XHJcbiAgICAgICAgICAgIHZhciBhdHRhY2htZW50SW5Gb3JtOiBEeW5BdHRhY2htZW50ID0gKDxJbWFnZVNlbGVjdG9yRmllbGQ+ZmllbGRjb25maWcpLkF0dGFjaG1lbnRMaXN0LmZpbmQoeCA9PiB4LklEID09IGltYWdlb2JqKTtcclxuICAgICAgICAgICAgaWYgKGF0dGFjaG1lbnRJbkZvcm0gIT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlc0FycmF5ICs9IGF0dGFjaG1lbnRJbkZvcm0uQnV0dG9uS2V5ICsgXCIsIFwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIHZhciBwYXJ0cyA9IG91dHB1dFZhbHVlc0FycmF5LnNwbGl0KFwiLCBcIik7XHJcbiAgICAgICAgICByZXR1cm4gcGFydHMuc2xpY2UoMCwgcGFydHMubGVuZ3RoIC0gMSkuam9pbihcIiwgXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHZhciBhdHRhY2htZW50SW5Gb3JtOiBEeW5BdHRhY2htZW50ID0gKDxJbWFnZVNlbGVjdG9yRmllbGQ+ZmllbGRjb25maWcpLkF0dGFjaG1lbnRMaXN0LmZpbmQoeCA9PiB4LklEID09IHZhbHVlKTtcclxuICAgICAgICAgIGlmIChhdHRhY2htZW50SW5Gb3JtICE9IG51bGwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnRJbkZvcm0uQnV0dG9uS2V5O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH07XHJcbiAgICAgIGNhc2UgRmllbGRUeXBlRW51bVsnRGF0YSBlL28gb3JhJ106IHtcclxuICAgICAgICBpZiAodmFsdWUgPT0gXCJcIil7IHJldHVybiB2YWx1ZTsgfVxyXG4gICAgICAgIEdsb2JhbFNlcnZpY2UuZGVidWdMb2coXCJEYXRhIGUvbyBvcmFcIiwgZmllbGRjb25maWcpO1xyXG4gICAgICAgIGlmICgoPERhdGVGaWVsZD5maWVsZGNvbmZpZykuRGF0ZUZvcm1hdCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBsZXQgZml4RGF0ZUZvcm1hdCA9ICg8RGF0ZUZpZWxkPmZpZWxkY29uZmlnKS5EYXRlRm9ybWF0LnJlcGxhY2UoXCJERFwiLCBcImRkXCIpO1xyXG4gICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKHZhbHVlLCBmaXhEYXRlRm9ybWF0KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAoKDxEYXRlRmllbGQ+ZmllbGRjb25maWcpLklzT25seURhdGUgPT0gRGF0ZVRpbWVUeXBlRW51bVsnU29sbyBkYXRhJ10pIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZXBpcGUudHJhbnNmb3JtKHZhbHVlLCBcImRkL01NL3l5eXlcIik7XHJcbiAgICAgICAgICB9IGVsc2UgaWYgKCg8RGF0ZUZpZWxkPmZpZWxkY29uZmlnKS5Jc09ubHlEYXRlID09IERhdGVUaW1lVHlwZUVudW1bJ0RhdGEgZSBvcmEnXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0odmFsdWUsIFwiZGQvTU0veXl5eSBISDptbVwiKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoKDxEYXRlRmllbGQ+ZmllbGRjb25maWcpLklzT25seURhdGUgPT0gRGF0ZVRpbWVUeXBlRW51bVsnU29sbyBvcmFyaW8nXSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlcGlwZS50cmFuc2Zvcm0odmFsdWUsIFwiSEg6bW1cIik7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBkZWZhdWx0OiB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIH1cclxuICAvLyNlbmRyZWdpb24gcHJpbnRWYWx1ZVxyXG5cclxuICAvLyNyZWdpb24gcmVzaXplQmFzZTY0SW1hZ2VcclxuICBwcml2YXRlIGFzeW5jIHJlc2l6ZUJhc2U2NEltYWdlKGJhc2U2NEltYWdlOiBzdHJpbmcpIHtcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XHJcbiAgICAgIGNvbnN0IGltYWdldHlwZSA9IC9kYXRhOmltYWdlXFwvKFtcXHddKyk7LztcclxuICAgICAgY29uc3QgbWF0Y2ggPSBiYXNlNjRJbWFnZS5tYXRjaChpbWFnZXR5cGUpO1xyXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1nLnNyYyA9IGJhc2U2NEltYWdlO1xyXG4gICAgICBpbWcub25sb2FkID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJjYW52YXNcIik7XHJcbiAgICAgICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBpbWcud2lkdGg7XHJcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gaW1nLmhlaWdodDtcclxuICAgICAgICBjb25zdCBhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xyXG5cclxuICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSAxMjg7XHJcbiAgICAgICAgY29uc3QgbmV3V2lkdGggPSBuZXdIZWlnaHQgKiBhc3BlY3RSYXRpbztcclxuXHJcbiAgICAgICAgY2FudmFzLndpZHRoID0gbmV3V2lkdGg7XHJcbiAgICAgICAgY2FudmFzLmhlaWdodCA9IG5ld0hlaWdodDtcclxuICAgICAgICBjdHguZHJhd0ltYWdlKGltZywgMCwgMCwgbmV3V2lkdGgsIG5ld0hlaWdodCk7XHJcbiAgICAgICAgbGV0IHF1YWxpdHkgPSAwLjg7XHJcbiAgICAgICAgbGV0IGRhdGFVUkwgPSBjYW52YXMudG9EYXRhVVJMKCdpbWFnZS8nICsgbWF0Y2hbMV0sIHF1YWxpdHkpO1xyXG4gICAgICAgIHJlc29sdmUoZGF0YVVSTCk7XHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICB9XHJcbiAgLy8jZW5kcmVnaW9uIHJlc2l6ZUJhc2U2NEltYWdlXHJcbn1cclxuIiwiPG1hdC1jYXJkIGNsYXNzPVwibGlzdC1mb3JtLXJlY29yZFwiPlxyXG4gIDxtYXQtY2FyZC1oZWFkZXIgY2xhc3M9XCJhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgIDxtYXQtY2FyZC10aXRsZSAqbmdJZj1cImxvYWRlZEZpbHRlcnMgJiYgc2hvd1RpdGxlXCJcclxuICAgICAgPkVsZW5jbyB7eyBmb3JtLk5hbWUgfX08L21hdC1jYXJkLXRpdGxlXHJcbiAgICA+XHJcbiAgICA8IS0tIDxtYXQtY2FyZC1hY3Rpb25zPlxyXG4gICAgICA8YnV0dG9uXHJcbiAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxyXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXHJcbiAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAoY2xpY2spPVwib25BZGRWaWV3RWRpdFJlY29yZC5lbWl0KG51bGwpXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtaWNvbj5hZGQ8L21hdC1pY29uPlxyXG4gICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDEwcHhcIj5BZ2dpdW5naTwvc3Bhbj5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L21hdC1jYXJkLWFjdGlvbnM+IC0tPlxyXG4gIDwvbWF0LWNhcmQtaGVhZGVyPlxyXG4gIDxtYXQtY2FyZC1jb250ZW50PlxyXG4gICAgPCEtLSNyZWdpb24gRklMVEVSUyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiICpuZ0lmPVwibG9hZGVkRmlsdGVyc1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0zIGFsaWduLWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgPHRtdy1kYXRldGltZXBpY2tlclxyXG4gICAgICAgICAgY2xhc3M9XCJkYXRlXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGVyaW9kbyBpbml6aW8nXCJcclxuICAgICAgICAgIFtsYWJlbF09XCInUGVyaW9kbyBpbml6aW8nXCJcclxuICAgICAgICAgIFsobmdNb2RlbCldPVwibWluRGF0ZVwiXHJcbiAgICAgICAgICAoZGF0ZUNoYW5nZSk9XCJmaWx0ZXJEYXRhQW5zd2VycygpXCJcclxuICAgICAgICAgIFtwaWNrZXJNb2RlXT1cIm1vZGVzLkRBVEVQSUNLRVJcIlxyXG4gICAgICAgICAgW291dHB1dEZvcm1hdF09XCInZGQvTU0veXl5eSdcIlxyXG4gICAgICAgICAgW3Nob3dTZWNvbmRzXT1cImZhbHNlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPC90bXctZGF0ZXRpbWVwaWNrZXI+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTEyIGNvbC1tZC0zIGFsaWduLWNvbnRlbnQtZW5kXCI+XHJcbiAgICAgICAgPHRtdy1kYXRldGltZXBpY2tlclxyXG4gICAgICAgICAgY2xhc3M9XCJkYXRlXCJcclxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCInUGVyaW9kbyBmaW5lJ1wiXHJcbiAgICAgICAgICBbbGFiZWxdPVwiJ1BlcmlvZG8gZmluZSdcIlxyXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJtYXhEYXRlXCJcclxuICAgICAgICAgIChkYXRlQ2hhbmdlKT1cImZpbHRlckRhdGFBbnN3ZXJzKClcIlxyXG4gICAgICAgICAgW3BpY2tlck1vZGVdPVwibW9kZXMuREFURVBJQ0tFUlwiXHJcbiAgICAgICAgICBbb3V0cHV0Rm9ybWF0XT1cIidkZC9NTS95eXl5J1wiXHJcbiAgICAgICAgICBbc2hvd1NlY29uZHNdPVwiZmFsc2VcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8L3Rtdy1kYXRldGltZXBpY2tlcj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMTIgY29sLW1kLTNcIj5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+U2VsZXppb25lIGRlaSBjYW1waTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgKHNlbGVjdGlvbkNoYW5nZSk9XCJvblNlbGVjdGlvbkNoYW5nZSgkZXZlbnQpXCIgbXVsdGlwbGU+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj1cImxldCBwcm9wZXJ0eSBvZiBwcm9wZXJ0aWVzXCIgW3ZhbHVlXT1cInByb3BlcnR5XCI+XHJcbiAgICAgICAgICAgICAge3sgcHJvcGVydGllc0xhYmVsW3Byb3BlcnR5LmxhYmVsXSB9fVxyXG4gICAgICAgICAgICA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC1zbS0xMiBjb2wtbWQtMyBtdC0yXCI+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIlxyXG4gICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXMgPT0gbnVsbCB8fCBzZWxlY3RlZFByb3BlcnRpZXMubGVuZ3RoID09IDBcclxuICAgICAgICAgIFwiXHJcbiAgICAgICAgICBjbGFzcz1cImJ0biBidG4tZ3JhcGgtZ2VuZXJhdGUgYnV0dG9uLW5leHQgbWUtMlwiXHJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgIChjbGljayk9XCJmaWx0ZXJEYXRhQW5zd2VycygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBHZW5lcmFcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8IS0tI2VuZHJlZ2lvbiBGSUxURVJTIC0tPlxyXG5cclxuICAgIDwhLS0jcmVnaW9uIFRBQkxFIC0tPlxyXG4gICAgPGRpdlxyXG4gICAgKm5nSWY9XCJmaWx0ZXJlZEFuc3dlcnMgJiYgZmlsdGVyZWRBbnN3ZXJzLmxlbmd0aCA+IDA7IGVsc2Ugbm9fYW5zd2Vyc1wiXHJcbiAgICAgIGNsYXNzPVwidGFibGUtY29udGFpbmVyIG10LTMgbWItMlwiXHJcbiAgICA+XHJcbiAgICAgIDx0YWJsZVxyXG4gICAgICAgIG1hdC10YWJsZVxyXG4gICAgICAgIFtkYXRhU291cmNlXT1cInNlbGVjdGVkUHJvcGVydGllc1wiXHJcbiAgICAgICAgY2xhc3M9XCJtYXQtZWxldmF0aW9uLXo4IG1hdC10YWJsZS1maXhlZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8IS0tIENvbG9ubmEgZmlzc2EgcGVyIGxlIHByb3ByaWV0w6AgLS0+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBtYXRDb2x1bW5EZWY9XCJwcm9wZXJ0eVwiIHN0aWNreT5cclxuICAgICAgICAgIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgY2xhc3M9XCJzdGlja3ktY29sdW1uXCI+XHJcbiAgICAgICAgICAgIERhdGEgSW5zZXJpbWVudG9cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgbWF0LWNlbGxcclxuICAgICAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgc2VsZWN0ZWRQcm9wZXJ0aWVzXCJcclxuICAgICAgICAgICAgY2xhc3M9XCJzdGlja3ktY29sdW1uXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAge3sgcHJvcGVydGllc0xhYmVsW3NlbGVjdGVkUHJvcGVydGllcy5sYWJlbF0gfX1cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gR2VuZXJhIGRpbmFtaWNhbWVudGUgbGUgY29sb25uZSBwZXIgb2duaSByaXNwb3N0YSAtLT5cclxuICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAqbmdGb3I9XCJsZXQgdmFsdWUgb2YgZmlsdGVyZWRBbnN3ZXJzOyBsZXQgaSA9IGluZGV4XCJcclxuICAgICAgICAgIFttYXRDb2x1bW5EZWZdPVwiJ2NvbCcgKyBpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8dGggbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInZhbHVlLklEICE9ICcwJ1wiPnt7IHZhbHVlLkFuc3dlckRhdGUgfCBkYXRlIDogXCJkZC9NTS95eXl5IEhIOm1tXCIgfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwidmFsdWUuSUQgPT0gJzAnXCI+e3sgdmFsdWUuQW5zd2VyRGF0ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICA8IS0tIDx0aCBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWY+IHt7IHZhbHVlLkFuc3dlckRhdGUgfCBkYXRlOidkZC9NTS95eXl5IEhIOm1tJyB9fSA8L3RoPiAtLT5cclxuICAgICAgICAgIDx0ZCBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCBzZWxlY3RlZFByb3BlcnRpZXNcIj5cclxuICAgICAgICAgICAge3tcclxuICAgICAgICAgICAgICBzZWxlY3RlZFByb3BlcnRpZXMubGFiZWwgPT09IFwiQW5zd2VyRGF0ZVwiXHJcbiAgICAgICAgICAgICAgICA/ICh2YWx1ZS5BbnN3ZXJEYXRlIHwgZGF0ZSA6IFwiZGQvTU0veXl5eSBISDptbVwiKVxyXG4gICAgICAgICAgICAgICAgOiBwcmludFZhbHVlKFxyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJvcGVydGllcy50eXBlLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlW3NlbGVjdGVkUHJvcGVydGllcy5sYWJlbF0sXHJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcm9wZXJ0aWVzLmNvbmZpZyxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZVxyXG4gICAgICAgICAgICAgICAgICApID8/IFwiTi9BXCJcclxuICAgICAgICAgICAgfX1cclxuICAgICAgICAgICAgPCEtLSAtIFxyXG4gICAgICAgICAgICB7e3NlbGVjdGVkUHJvcGVydGllcy50eXBlfX1cclxuICAgICAgICAgICAge3tzZWxlY3RlZFByb3BlcnRpZXMubGFiZWx9fSAtLT5cclxuICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgIDwhLS0gSGVhZGVyIGRlbGxhIHRhYmVsbGEgLS0+XHJcbiAgICAgICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuXHJcbiAgICAgICAgPCEtLSBSaWdoZSBkZWxsYSB0YWJlbGxhIC0tPlxyXG4gICAgICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBkaXNwbGF5ZWRDb2x1bW5zXCI+PC90cj5cclxuICAgICAgPC90YWJsZT5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjbm9fYW5zd2Vycz5cclxuICAgICAgPGRpdiBjbGFzcz1cIm10LTMgbWItMiB0ZXh0LWNlbnRlclwiPlxyXG4gICAgICAgIDxzcGFuPiBOb24gY2kgc29ubyByaXNwb3N0ZSA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgIDwhLS0jcmVnaW9uIFRBQkxFIC0tPlxyXG4gIDwvbWF0LWNhcmQtY29udGVudD5cclxuICA8bWF0LWNhcmQtZm9vdGVyPlxyXG4gICAgPCEtLSA8bWF0LXByb2dyZXNzLWJhciBtb2RlPVwiaW5kZXRlcm1pbmF0ZVwiPjwvbWF0LXByb2dyZXNzLWJhcj4gLS0+XHJcbiAgPC9tYXQtY2FyZC1mb290ZXI+XHJcbjwvbWF0LWNhcmQ+XHJcblxyXG48IS0tIDxkaXYgY2xhc3M9XCJyb3cgZXFwLWR5bmFtaWMtbW9kdWxlLXRpdGxlIGxpc3QtZm9ybS1yZWNvcmQtaGVhZGVyXCI+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XHJcbiAgICA8aDQgKm5nSWY9XCJzaG93VGl0bGVcIj5cclxuICAgICAgPGI+RWxlbmNvIHt7IGZvcm0uTmFtZSB9fTwvYj5cclxuICAgIDwvaDQ+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC1tZC02IHRleHQtcmlnaHRcIiAqbmdJZj1cImRlZmF1bHRMaXN0QWN0aW9ucy5hZGRcIj5cclxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgKGNsaWNrKT1cIm9uQWRkVmlld0VkaXRSZWNvcmQuZW1pdChudWxsKVwiPlxyXG4gICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cclxuICAgICAgPHNwYW4gc3R5bGU9XCJtYXJnaW4tbGVmdDogMTBweFwiPkFnZ2l1bmdpPC9zcGFuPlxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPGVxcC10YWJsZSBjbGFzcz1cImxpc3QtZm9ybS1yZWNvcmQtdGFibGVcIiAjdGFibGVSZWNvcmRzICpuZ0lmPVwibG9hZGVyICYmIGNvbmZpZ3VyYXRpb25zLnZhbHVlc1wiXHJcbiAgW2RhdGFdPVwiY29uZmlndXJhdGlvbnMudmFsdWVzXCIgW2NvbHVtbnNdPVwiY29sdW1uc1wiPjwvZXFwLXRhYmxlPiAtLT5cclxuIl19