@tsi-developpement/tsi-shared-ui 1.8.13 → 1.8.14

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.
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, inject, Input, Output, ViewChild } from '@angular/core';
1
+ import { Component, EventEmitter, HostListener, inject, Input, Output, ViewChild } from '@angular/core';
2
2
  import { rtlModeKeys } from '../../../consts/locals.const';
3
3
  import { ButtonType, GridSelectionMode, InputTypes, ModalSizeEnum, TooltipPosition } from '../../../enums';
4
4
  import { EntityValidationsService } from '../../../services/validation/entity-validations.service';
@@ -66,6 +66,9 @@ export class EditableGridComponent extends TsiInputBase {
66
66
  this.isAr = false;
67
67
  this._gridData = [];
68
68
  this._equalityCheckOn = false;
69
+ this._f6SourceRow = null;
70
+ this._pendingDuplicateEmitTimer = null;
71
+ this._pendingDuplicateResult = null;
69
72
  this.multipleGridSelectionMode = GridSelectionMode.Multiple;
70
73
  //#endregion
71
74
  this.inputTypes = InputTypes;
@@ -82,6 +85,7 @@ export class EditableGridComponent extends TsiInputBase {
82
85
  this.rowPerPage = [5, 10, 20];
83
86
  // @Input() isPaginator: boolean = true;
84
87
  this.pageSize = 5;
88
+ this.entityPrimaryKeyName = 'uid';
85
89
  /**
86
90
  *
87
91
  */
@@ -96,11 +100,12 @@ export class EditableGridComponent extends TsiInputBase {
96
100
  this.showRowSumary = false;
97
101
  /**selection */
98
102
  this.selectKeyOnly = true;
99
- this.selectionMode = GridSelectionMode.None;
103
+ this.selectionMode = GridSelectionMode.Single;
100
104
  this.showConsultButton = false;
101
105
  this._editableGridBusinessClass = "";
102
106
  /**order */
103
107
  this.orderColumn = 'uid';
108
+ this.showDuplicateButton = true;
104
109
  //#endregion
105
110
  //#region Outputs
106
111
  this.itemsSave = new EventEmitter();
@@ -120,6 +125,7 @@ export class EditableGridComponent extends TsiInputBase {
120
125
  this.onRowSelect = new EventEmitter();
121
126
  this.focusOutRow = new EventEmitter();
122
127
  this.onConsultClicked = new EventEmitter();
128
+ this.rowDuplicatedEventEmitter = new EventEmitter();
123
129
  this._entityValidationsService = inject(EntityValidationsService);
124
130
  }
125
131
  ngOnInit() {
@@ -208,6 +214,7 @@ export class EditableGridComponent extends TsiInputBase {
208
214
  ngOnDestroy() {
209
215
  super.ngOnDestroy();
210
216
  this.saveEventSubscription?.unsubscribe();
217
+ this._cancelPendingDuplicateEmit();
211
218
  }
212
219
  inputChanged(col) {
213
220
  if (col.watchForChanges === true) {
@@ -235,6 +242,36 @@ export class EditableGridComponent extends TsiInputBase {
235
242
  this.refreshSort();
236
243
  this.addedRowEventEmitter.emit(rowAddedResult);
237
244
  }
245
+ duplicateRow(item, updateSelection = true, skipEmit = false) {
246
+ if (!item)
247
+ return null;
248
+ const duplicatedRow = JSON.parse(JSON.stringify(item));
249
+ duplicatedRow[this.entityPrimaryKeyName] = undefined;
250
+ if (this._isAutoRowNumber) {
251
+ duplicatedRow[this._autoRowNumberField] = this._nextRowNumber();
252
+ }
253
+ this.gridData.push(duplicatedRow);
254
+ this.isDirty = true;
255
+ if (this.editableTable?.sortField && this.editableTable.sortOrder) {
256
+ this.editableTable?.value.push(duplicatedRow);
257
+ }
258
+ this.refreshSort();
259
+ if (updateSelection) {
260
+ this.selectedItem = duplicatedRow;
261
+ this.selectedItems = this.selectionMode == GridSelectionMode.Multiple
262
+ ? [duplicatedRow]
263
+ : duplicatedRow;
264
+ }
265
+ const result = {
266
+ rowNumber: this.gridData.length - 1,
267
+ data: duplicatedRow
268
+ };
269
+ if (!skipEmit) {
270
+ this.addedRowEventEmitter.emit(result);
271
+ this.rowDuplicatedEventEmitter.emit(result);
272
+ }
273
+ return result;
274
+ }
238
275
  refreshSort() {
239
276
  if (this.editableTable?.sortField) {
240
277
  const sortField = this.editableTable.sortField;
@@ -289,6 +326,8 @@ export class EditableGridComponent extends TsiInputBase {
289
326
  }
290
327
  onRowSelected(event) {
291
328
  this.selectedItem = event.data;
329
+ this._f6SourceRow = null;
330
+ this._cancelPendingDuplicateEmit();
292
331
  if (this.selectKeyOnly == true) {
293
332
  let selectionKey;
294
333
  selectionKey = this.selectedItem[this.key];
@@ -300,6 +339,8 @@ export class EditableGridComponent extends TsiInputBase {
300
339
  }
301
340
  onRowUnselect(event) {
302
341
  this.selectedItem = undefined;
342
+ this._f6SourceRow = null;
343
+ this._cancelPendingDuplicateEmit();
303
344
  }
304
345
  selectionChange(event) {
305
346
  let selection = [];
@@ -335,6 +376,31 @@ export class EditableGridComponent extends TsiInputBase {
335
376
  event.stopPropagation();
336
377
  }
337
378
  }
379
+ handleGridKeydown(event) {
380
+ if (event.key === 'F6') {
381
+ event.preventDefault();
382
+ const source = this._f6SourceRow ?? this.selectedItem;
383
+ if (!source)
384
+ return;
385
+ const isFirstDuplicate = !this._f6SourceRow;
386
+ this._f6SourceRow = source;
387
+ const result = this.duplicateRow(source, isFirstDuplicate, true);
388
+ if (result && !this._pendingDuplicateResult) {
389
+ this._pendingDuplicateResult = result;
390
+ }
391
+ if (this._pendingDuplicateEmitTimer) {
392
+ clearTimeout(this._pendingDuplicateEmitTimer);
393
+ }
394
+ this._pendingDuplicateEmitTimer = setTimeout(() => {
395
+ this._pendingDuplicateEmitTimer = null;
396
+ if (this._pendingDuplicateResult) {
397
+ this.addedRowEventEmitter.emit(this._pendingDuplicateResult);
398
+ this.rowDuplicatedEventEmitter.emit(this._pendingDuplicateResult);
399
+ this._pendingDuplicateResult = null;
400
+ }
401
+ }, 300);
402
+ }
403
+ }
338
404
  onFocusOutRow(item) {
339
405
  this.focusOutRow.emit(item);
340
406
  }
@@ -497,12 +563,19 @@ export class EditableGridComponent extends TsiInputBase {
497
563
  row1[f] += row2[f];
498
564
  });
499
565
  }
566
+ _cancelPendingDuplicateEmit() {
567
+ this._pendingDuplicateResult = null;
568
+ if (this._pendingDuplicateEmitTimer) {
569
+ clearTimeout(this._pendingDuplicateEmitTimer);
570
+ this._pendingDuplicateEmitTimer = null;
571
+ }
572
+ }
500
573
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableGridComponent, deps: [{ token: i1.LocalizePipe }], target: i0.ɵɵFactoryTarget.Component }); }
501
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditableGridComponent, selector: "Tsi-Generic-Editable-Grid", inputs: { selectedItems: "selectedItems", configuration: "configuration", key: "key", items: "items", saveEvent: ["events", "saveEvent"], showAddButton: "showAddButton", showDeleteButton: "showDeleteButton", showEditButton: "showEditButton", showRowSummary: "showRowSummary", scrollHeight: "scrollHeight", rowPerPage: "rowPerPage", pageSize: "pageSize", columns: "columns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", events: "events", showSaveButton: "showSaveButton", showActionColumn: "showActionColumn", enableRowDisabling: "enableRowDisabling", rowSummaryConfig: "rowSummaryConfig", showHaveSumary: "showHaveSumary", showRowSumary: "showRowSumary", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", showConsultButton: "showConsultButton", editableGridBusinessClass: "editableGridBusinessClass", orderColumn: "orderColumn", deleteLineButtonDisabled: "deleteLineButtonDisabled", id: "id" }, outputs: { itemsSave: "itemsSave", refreshEventEmitter: "refreshEventEmitter", saveDataEventEmitter: "saveDataEventEmitter", rowChangedEventEmitter: "rowChangedEventEmitter", selectedRowEventEmitter: "selectedRowEventEmitter", addedRowEventEmitter: "addedRowEventEmitter", focusOutEventEmitter: "focusOutEventEmitter", cellChanged: "cellChanged", rowDeletedEventEmitter: "rowDeletedEventEmitter", selectedItemsChange: "selectedItemsChange", onRowSelect: "onRowSelect", focusOutRow: "focusOutRow", onConsultClicked: "onConsultClicked" }, providers: [GenericValidationStateService], viewQueries: [{ propertyName: "editableTable", first: true, predicate: ["editableTable"], descendants: true }, { propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" styleClass=\"p-datatable-sm\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" styleClass=\"p-datatable-gridlines\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\">\r\n <!-- [tableStyle]=\"{'min-width': '50rem','width': 'inherit'}\" -->\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" \r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [ngStyle]=\"isAr ? {'text-align': 'start'} : {}\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc> \r\n \r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [numOfDecimal]=\"col.numOfDecimal\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"inputChanged(col)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i5.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i5.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i5.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i5.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i5.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i5.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i5.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i5.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i8.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i9.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i10.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["numOfDecimal", "currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i11.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i12.TsiDatePickerComponent, selector: "Tsi-Date-Picker", inputs: ["required", "showTime", "showButtonBar"], outputs: ["inputFieldChange"] }, { kind: "component", type: i13.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i14.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i15.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i16.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i17.TsiFormulaBoxComponent, selector: "Tsi-Formula-Box", inputs: ["value", "endPoint"], outputs: ["valueChange"] }, { kind: "component", type: i18.TsiTimePickerComponent, selector: "tsi-time-picker", outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i20.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i21.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i22.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i23.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i24.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i25.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i26.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i27.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i28.TsiTimeDisplayComponent, selector: "tsi-time-display", inputs: ["inputData"] }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }] }); }
574
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: EditableGridComponent, selector: "Tsi-Generic-Editable-Grid", inputs: { selectedItems: "selectedItems", configuration: "configuration", key: "key", items: "items", saveEvent: ["events", "saveEvent"], showAddButton: "showAddButton", showDeleteButton: "showDeleteButton", showEditButton: "showEditButton", showRowSummary: "showRowSummary", scrollHeight: "scrollHeight", rowPerPage: "rowPerPage", pageSize: "pageSize", entityPrimaryKeyName: "entityPrimaryKeyName", columns: "columns", gridData: "gridData", isTableLoading: "isTableLoading", parent: "parent", events: "events", showSaveButton: "showSaveButton", showActionColumn: "showActionColumn", enableRowDisabling: "enableRowDisabling", rowSummaryConfig: "rowSummaryConfig", showHaveSumary: "showHaveSumary", showRowSumary: "showRowSumary", selectKeyOnly: "selectKeyOnly", selectionMode: "selectionMode", showConsultButton: "showConsultButton", editableGridBusinessClass: "editableGridBusinessClass", orderColumn: "orderColumn", deleteLineButtonDisabled: "deleteLineButtonDisabled", showDuplicateButton: "showDuplicateButton", id: "id" }, outputs: { itemsSave: "itemsSave", refreshEventEmitter: "refreshEventEmitter", saveDataEventEmitter: "saveDataEventEmitter", rowChangedEventEmitter: "rowChangedEventEmitter", selectedRowEventEmitter: "selectedRowEventEmitter", addedRowEventEmitter: "addedRowEventEmitter", focusOutEventEmitter: "focusOutEventEmitter", cellChanged: "cellChanged", rowDeletedEventEmitter: "rowDeletedEventEmitter", selectedItemsChange: "selectedItemsChange", onRowSelect: "onRowSelect", focusOutRow: "focusOutRow", onConsultClicked: "onConsultClicked", rowDuplicatedEventEmitter: "rowDuplicatedEventEmitter" }, host: { listeners: { "document:keydown": "handleGridKeydown($event)" } }, providers: [GenericValidationStateService], viewQueries: [{ propertyName: "editableTable", first: true, predicate: ["editableTable"], descendants: true }, { propertyName: "dt", first: true, predicate: ["dt"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" styleClass=\"p-datatable-sm\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" styleClass=\"p-datatable-gridlines\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\">\r\n <!-- [tableStyle]=\"{'min-width': '50rem','width': 'inherit'}\" -->\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDuplicateButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [ngStyle]=\"isAr ? {'text-align': 'start'} : {}\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc> \r\n \r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [numOfDecimal]=\"col.numOfDecimal\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDuplicateButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"inputChanged(col)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i5.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i5.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "directive", type: i5.FrozenColumn, selector: "[pFrozenColumn]", inputs: ["frozen", "alignFrozen"] }, { kind: "directive", type: i5.SelectableRow, selector: "[pSelectableRow]", inputs: ["pSelectableRow", "pSelectableRowIndex", "pSelectableRowDisabled"] }, { kind: "directive", type: i5.ResizableColumn, selector: "[pResizableColumn]", inputs: ["pResizableColumnDisabled"] }, { kind: "directive", type: i5.ReorderableColumn, selector: "[pReorderableColumn]", inputs: ["pReorderableColumnDisabled"] }, { kind: "component", type: i5.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i5.TableCheckbox, selector: "p-tableCheckbox", inputs: ["disabled", "value", "index", "inputId", "name", "required", "ariaLabel"] }, { kind: "component", type: i5.TableHeaderCheckbox, selector: "p-tableHeaderCheckbox", inputs: ["disabled", "inputId", "name", "ariaLabel"] }, { kind: "directive", type: i5.EditableRow, selector: "[pEditableRow]", inputs: ["pEditableRow", "pEditableRowDisabled"] }, { kind: "directive", type: i6.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: i7.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "component", type: i8.TsiSearchComboComponent, selector: "Tsi-Search-Combo", inputs: ["elementSourceUrl", "listSourceUrl", "listSourceParams", "id-field", "label-field", "multiple", "sort", "showClear", "reloadDataSource", "isFiltered", "selectedLabel", "maxWidth", "businessClass", "comboType", "statusMetadata", "currentRowItem", "datasource", "bind", "maxSelectedLabels", "tooltipMaxDisplayedItems", "bindMode", "showSearchButton", "showAddButton", "showConsultButton", "showUpdateButton"], outputs: ["bindChange", "datasource-loaded", "init", "isLoaded", "selectedLabelChange", "onClick", "onSearchButtonClick", "selectionChange"] }, { kind: "component", type: i9.TsiCheckboxComponent, selector: "Tsi-CheckBox", inputs: ["class", "isBinary", "checked", "tooltipText", "tooltipPosition"], outputs: ["inputFieldChange", "checkedChange"] }, { kind: "component", type: i10.TsiCurrencyOtherInputComponent, selector: "Tsi-Currency-Other-Input", inputs: ["numOfDecimal", "currency", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i11.TsiCurrencySocieteInputComponent, selector: "Tsi-Currency-Societe-Input", inputs: ["class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i12.TsiDatePickerComponent, selector: "Tsi-Date-Picker", inputs: ["required", "showTime", "showButtonBar"], outputs: ["inputFieldChange"] }, { kind: "component", type: i13.TsiDecimalInputComponent, selector: "Tsi-Decimal-Input", inputs: ["numOfDecimal", "class"], outputs: ["inputFieldChange"] }, { kind: "component", type: i14.TsiIntegerComponent, selector: "Tsi-Integer", inputs: ["class", "minValue", "maxValue", "delayChangeTime"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i15.TsiRateInputComponent, selector: "Tsi-Rate-Input", inputs: ["required", "isFraction", "numOfDecimal"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i16.TsiTextBoxComponent, selector: "Tsi-Text-Box", inputs: ["textBoxType", "autocomplete"], outputs: ["newItemEvent", "inputFieldChange"] }, { kind: "component", type: i17.TsiFormulaBoxComponent, selector: "Tsi-Formula-Box", inputs: ["value", "endPoint"], outputs: ["valueChange"] }, { kind: "component", type: i18.TsiTimePickerComponent, selector: "tsi-time-picker", outputs: ["inputFieldChange"] }, { kind: "component", type: i19.TsiCheckboxDisplayComponent, selector: "Tsi-Checkbox-Display", inputs: ["inputData"] }, { kind: "component", type: i20.TsiCurrencyOtherDisplayComponent, selector: "Tsi-Currency-Other-Display", inputs: ["inputData", "currency"] }, { kind: "component", type: i21.TsiCurrencySocieteDisplayComponent, selector: "Tsi-Currency-Societe-Display", inputs: ["inputData"] }, { kind: "component", type: i22.TsiDateDisplayComponent, selector: "Tsi-Date-Display", inputs: ["inputData", "showTime"] }, { kind: "component", type: i23.TsiDecimalDisplayComponent, selector: "Tsi-Decimal-Display", inputs: ["inputData", "formatDecimal", "numOfDecimal"] }, { kind: "component", type: i24.TsiIntegerDisplayComponent, selector: "Tsi-Integer-Display", inputs: ["inputData"] }, { kind: "component", type: i25.TsiRateDisplayComponent, selector: "Tsi-Rate-Display", inputs: ["isFraction", "inputData", "numOfDecimal"] }, { kind: "component", type: i26.TsiBubbleInfoComponent, selector: "Tsi-Bubble-Info", inputs: ["infoText"] }, { kind: "component", type: i27.TsiButtonComponent, selector: "Tsi-Button", inputs: ["disabled", "text", "style", "tooltipText", "tooltipPosition", "buttonType", "icon", "styleClass", "iconSrc", "id", "iconWidth", "iconClass"], outputs: ["onClick", "rightClick"] }, { kind: "component", type: i28.TsiTimeDisplayComponent, selector: "tsi-time-display", inputs: ["inputData"] }, { kind: "pipe", type: i1.LocalizePipe, name: "localize" }] }); }
502
575
  }
503
576
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EditableGridComponent, decorators: [{
504
577
  type: Component,
505
- args: [{ selector: 'Tsi-Generic-Editable-Grid', providers: [GenericValidationStateService], template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" styleClass=\"p-datatable-sm\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" styleClass=\"p-datatable-gridlines\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\">\r\n <!-- [tableStyle]=\"{'min-width': '50rem','width': 'inherit'}\" -->\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" \r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [ngStyle]=\"isAr ? {'text-align': 'start'} : {}\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc> \r\n \r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [numOfDecimal]=\"col.numOfDecimal\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"inputChanged(col)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"] }]
578
+ args: [{ selector: 'Tsi-Generic-Editable-Grid', providers: [GenericValidationStateService], template: "<div class=\"card\">\r\n <p-table #dt [selectionMode]=\"selectionMode\" [(selection)]=\"selectedItems\" editMode=\"row\"\r\n [paginator]=\"gridData.length > pageSize\" [rowsPerPageOptions]=\"rowPerPage\" [rows]=\"pageSize\"\r\n (onRowSelect)=\"onRowSelected($event)\" (onRowUnselect)=\"onRowUnselect($event)\" [scrollable]=\"true\"\r\n [resizableColumns]=\"true\" columnResizeMode=\"expand\" appendTo=\"body\" styleClass=\"p-datatable-sm\" [value]=\"gridData\"\r\n [columns]=\"selectedColumns\" [dataKey]=\"key\" [scrollHeight]=\"scrollHeight\" styleClass=\"p-datatable-gridlines\"\r\n (selectionChange)=\"selectionChange($event)\" #editableTable [totalRecords]=\"gridData.length\">\r\n <!-- [tableStyle]=\"{'min-width': '50rem','width': 'inherit'}\" -->\r\n\r\n <ng-template pTemplate=\"caption\">\r\n <p-multiSelect [options]=\"columns\" [(ngModel)]=\"selectedColumns\"\r\n selectedItemsLabel=\"{0} {{ 'columns_selected' | localize }}\" optionLabel=\"translatedHeader\"\r\n [style]=\"{'min-width': '180px'}\" placeholder=\"{{ 'choose_columns' | localize }}\">\r\n <ng-template let-option pTemplate=\"item\">\r\n <div class=\"flex items-center gap-2\">\r\n <span>{{ option.header | localize }}</span>\r\n </div>\r\n </ng-template>\r\n </p-multiSelect>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"header\" let-columns>\r\n\r\n <tr>\r\n <ng-container *ngIf=\"selectionMode != multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\"></th>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectionMode == multipleGridSelectionMode\">\r\n <th pResizableColumn pFrozenColumn style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </th>\r\n </ng-container>\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <!-- <th pResizableColumn pFrozenColumn *ngIf=\"showEditButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th> -->\r\n \r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDuplicateButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showConsultButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n <th pResizableColumn pFrozenColumn *ngIf=\"showDeleteButton\" scope=\"col\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"></th>\r\n\r\n <th pResizableColumn pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\"\r\n style=\"min-width:3rem;\" pSortableColumn=\"{{col.field}}\" *ngFor=\"let col of columns\"\r\n pTooltip=\"{{col.toolTipText | localize }}\" tooltipPosition=\"top\" pReorderableColumn>{{ col.header | localize\r\n }}\r\n <p-sortIcon field=\"{{col.field}}\"></p-sortIcon>\r\n <Tsi-Bubble-Info [infoText]=\"col.infoText | localize\"></Tsi-Bubble-Info>\r\n </th>\r\n <th style=\"min-width:3rem\" *ngIf=\"showRowSummary\" scope=\"col\">{{'RowSummary' | localize}}</th>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"body\" let-item let-editing=\"editing\" let-columns=\"columns\" let-rowIndex=\"rowIndex\">\r\n \r\n <tr [pEditableRow]=\"item\"\r\n *ngIf=\"selectionMode == multipleGridSelectionMode || selectionMode == undefined; else selectionModeBlock\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n \r\n <td style=\"text-align: center;\">\r\n <p-tableCheckbox [value]=\"item\" ></p-tableCheckbox>\r\n </td>\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n\r\n <!-- <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showConsultButton\" style=\"left: -1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [disabled]=\"isDeleteButtonDisabled(item)\" type=\"button\" icon=\"p-button-icon pi pi-trash\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n\r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\"\r\n [ngStyle]=\"isAr ? {'text-align': 'start'} : {}\">\r\n \r\n \r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n\r\n <ng-template #ordinaryBloc> \r\n \r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [businessClass]=\"col.businessClass\" [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\"\r\n [currentRowItem]=\"item\" (bindChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [datasource]=\"col.datasource\" [showSearchButton]=\"col.showSearchButton ?? true\"\r\n [showAddButton]=\"col.showAddButton ?? true\" [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [disabled]=\"col.disabled\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [numOfDecimal]=\"col.numOfDecimal\" [disabled]=\"col.disabled\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [showTime]=\"col.showTime\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [numOfDecimal]=\"col.numOfDecimal\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-picker bloc -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <!--<Tsi-Bubble-Info\r\n [infoText]=\"['formula_explication',\r\n ]\"></Tsi-Bubble-Info> -->\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [inputName]=\"col.inputName\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n \r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n\r\n <ng-template #selectionModeBlock>\r\n <ng-container>\r\n <tr [pEditableRow]=\"item\" [pSelectableRow]=\"item\" [pSelectableRowIndex]=\"rowIndex\"\r\n (focusOut)=\"onFocusOutRow(item)\">\r\n\r\n <!-- <td pFrozenColumn style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\"> -->\r\n\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n\r\n <!-- <td *ngIf=\"selectionMode == multipleGridSelectionMode\" style=\"width: 2rem;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td> -->\r\n\r\n <!-- <td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem;left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"flex align-items-center justify-content-center\">\r\n <button *ngIf=\"!editing\" pButton pRipple type=\"button\" pInitEditableRow icon=\"pi pi-pencil\"\r\n class=\"p-button-rounded p-button-text\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pSaveEditableRow icon=\"pi pi-check\"\r\n class=\"p-button-rounded p-button-text p-button-success -ml-1\">\r\n </button>\r\n <button *ngIf=\"editing\" pButton pRipple type=\"button\" pCancelEditableRow icon=\"pi pi-times\"\r\n class=\"p-button-rounded p-button-text p-button-danger -ml-2\">\r\n </button>\r\n </div>\r\n </td> -->\r\n \r\n <td pFrozenColumn *ngIf=\"showHaveSumary\" scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\">\r\n </td>\r\n \r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDuplicateButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-copy\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_dupliquer\"\r\n styleClass=\"p-button-rounded p-button-text p-button-info\" (click)=\"duplicateRow(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showConsultButton\"\r\n style=\"left: 1rem !important; width:3rem !important;\" class=\"p-1 btn-consult-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button [buttonType]=\"buttonType.Button\" icon=\"p-button-icon pi pi-eye\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_consulter\"\r\n styleClass=\"p-button-rounded p-button-text p-button-secondary\" (click)=\"consult(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n\r\n <td pFrozenColumn pResizableColumn *ngIf=\"showDeleteButton\" style=\"left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1 btn-delete-style\">\r\n <div class=\"p-0\">\r\n <Tsi-Button type=\"button\" icon=\"p-button-icon pi pi-trash\" [tooltipPosition]=\"tooltipPosition.Top\"\r\n tooltipText=\"shared_edittable_supprimer\"\r\n styleClass=\"p-element p-button-rounded p-button-text p-button-danger p-button p-component p-button-icon-only\"\r\n (click)=\"delete(item)\"></Tsi-Button>\r\n </div>\r\n </td>\r\n \r\n <td class=\"ui-resizable-column\" pFrozenColumn [frozen]=\"col.isFrozen\" *ngFor=\"let col of columns\">\r\n\r\n <div *ngIf=\"col.displayOnly || disabled; else ordinaryBloc\">\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteOutputBlock\">\r\n <Tsi-Search-Combo [disabled]=\"true\" [elementSourceUrl]=\"col.elementSourceUrl\"\r\n [businessClass]=\"col.businessClass\" [currentRowItem]=\"item\" [(bind)]=\"item[col.field]\"\r\n id-field=\"{{col.idField}}\" [listSourceUrl]=\"col.listSourceUrl\" label-field=\"{{col.labelField}}\"\r\n [isFiltered]=\"col.isFiltered\" [datasource]=\"col.datasource\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <ng-template #currencySocieteOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Societe-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyOtherCode\" [inputData]=\"item[col.field]\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Display -->\r\n <ng-template #datePickerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxOutputBlock\">\r\n <Tsi-Date-Display [showTime]=\"col.showTime\" [inputData]=\"item[col.field]\">\r\n </Tsi-Date-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox-Display -->\r\n <ng-template #checkBoxOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalOutputBlock\">\r\n <Tsi-Checkbox-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Checkbox-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"item[col.field]\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"item[col.field]\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"item[col.field]\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Display -->\r\n <ng-template #timeOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME; else formulaOutputBlock\">\r\n <tsi-time-display [inputData]=\"item[col.field]\"></tsi-time-display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Formula-Display -->\r\n <ng-template #formulaOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextOutputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{item[col.field]}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n \r\n <ng-template #ordinaryBloc>\r\n <!-- Tsi-Search-Combo -->\r\n <div *ngIf=\"col.type == inputTypes.SEARCH_COMBO; else currencySocieteInputBlock\">\r\n <Tsi-Search-Combo [elementSourceUrl]=\"col.elementSourceUrl\" (bindChange)=\"inputChanged(col)\"\r\n [listSourceUrl]=\"col.listSourceUrl\" [(bind)]=\"item[col.field]\" id-field=\"{{col.idField}}\"\r\n label-field=\"{{col.labelField}}\" [isFiltered]=\"col.isFiltered\" [businessClass]=\"col.businessClass\"\r\n (bindChange)=\"onCellValueChanged(col, $event, item)\" [currentRowItem]=\"item\"\r\n [datasource]=\"col.datasource\" [disabled]=\"col.disabled\"\r\n [showSearchButton]=\"col.showSearchButton ?? true\" [showAddButton]=\"col.showAddButton ?? true\"\r\n [showUpdateButton]=\"col.showUpdateButton ?? undefined\"\r\n [showConsultButton]=\"col.showConsultButton ?? undefined\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n [inputName]=\"col.inputName\"></Tsi-Search-Combo>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Societe-Input -->\r\n <ng-template #currencySocieteInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherInputBlock\">\r\n <Tsi-Currency-Societe-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [(inputField)]=\"item[col.field]\" (inputFieldChange)=\"inputChanged(col)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Societe-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Currency-Other-Input -->\r\n <ng-template #currencyOtherInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else datePickerInputBlock\">\r\n <Tsi-Currency-Other-Input [disabled]=\"col.disabled\" [inputName]=\"col.inputName\"\r\n [inputId]=\"col.field\" (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [numOfDecimal]=\"col.numOfDecimal\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Currency-Other-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Date-Picker -->\r\n <ng-template #datePickerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DATE; else checkBoxInputBlock\">\r\n <Tsi-Date-Picker [showTime]=\"col.showTime\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Date-Picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-CheckBox -->\r\n <ng-template #checkBoxInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CHECKBOX; else decimalInputBlock\">\r\n <Tsi-CheckBox [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-CheckBox>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Input -->\r\n <ng-template #decimalInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerInputBlock\">\r\n <Tsi-Decimal-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" [numOfDecimal]=\"col.numOfDecimal\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Decimal-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer -->\r\n <ng-template #integerInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateInputBlock\">\r\n <Tsi-Integer [class]=\"'max-w-4rem'\" [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\">\r\n </Tsi-Integer>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Input -->\r\n <ng-template #rateInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else timeInputBloc\">\r\n <Tsi-Rate-Input [inputName]=\"col.inputName\" [inputId]=\"col.field\"\r\n (inputFieldChange)=\"inputChanged(col)\" [(inputField)]=\"item[col.field]\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [disabled]=\"col.disabled\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Rate-Input>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Time-Picker -->\r\n <ng-template #timeInputBloc>\r\n <ng-container *ngIf=\"col.type == inputTypes.TIME else formulaInputBlock\">\r\n <tsi-time-picker (inputFieldChange)=\"onCellValueChanged(col, $event, item)\"\r\n [inputName]=\"col.inputName\" [inputId]=\"col.field\" [(inputField)]=\"item[col.field]\"\r\n [disabled]=\"col.disabled\" [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </tsi-time-picker>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <ng-template #formulaInputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.FORMULA_TEXT_BOX; else defaultTextInputBlock\">\r\n <Tsi-Formula-Box [inputName]=\"col.inputName\" [(value)]=\"item[col.field]\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\"></Tsi-Formula-Box>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Text-Box -->\r\n <ng-template #defaultTextInputBlock>\r\n <ng-container>\r\n <Tsi-Text-Box [inputId]=\"col.field\" [disabled]=\"col.disabled\" (inputFieldChange)=\"inputChanged(col)\"\r\n [(inputField)]=\"item[col.field]\" (keydown)=\"handleKeydown($event)\"\r\n (inputFieldChange)=\"onCellValueChanged(col, $event, item)\" [inputName]=\"col.inputName\"\r\n [validationStatusCssClass]=\"col.validationStatusCssClass\">\r\n </Tsi-Text-Box>\r\n </ng-container>\r\n </ng-template>\r\n </ng-template>\r\n\r\n </td>\r\n <td *ngIf=\"showRowSummary\" class=\"font-bold\">\r\n {{rowSummary(item)}}\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </ng-template>\r\n\r\n </ng-template>\r\n\r\n <ng-template *ngIf=\"showHaveSumary\" pTemplate=\"footer\" let-columns>\r\n\r\n <tr class=\"tfooter\">\r\n <!-- <td pFrozenColumn scope=\"col\" style=\"left: 1rem !important; width:3rem !important;\"></td> -->\r\n <td *ngIf=\"selectionMode == multipleGridSelectionMode\"\r\n style=\"min-width:2rem; left: 1rem !important; width:2rem !important;\">\r\n <p-tableHeaderCheckbox #tableHeaderCheckbox></p-tableHeaderCheckbox>\r\n </td>\r\n <td pFrozenColumn scope=\"col\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\">Total</td>\r\n <td pFrozenColumn *ngIf=\"showDeleteButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\">\r\n <td pFrozenColumn style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n <!--<td pFrozenColumn *ngIf=\"showEditButton\" style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\"\r\n class=\"p-1\"> -->\r\n <td pFrozenColumn *ngIf=\"showDuplicateButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn *ngIf=\"showConsultButton\"\r\n style=\"min-width:3rem; left: 1rem !important; width:3rem !important;\" class=\"p-1\">\r\n </td>\r\n <td pFrozenColumn [frozen]=\"col.isFrozen\" [style]=\"col.style\" scope=\"col\" *ngFor=\"let col of columns\">\r\n <div *ngIf=\"col.haveSummary\">\r\n <!-- Tsi-Currency-Societe-Display -->\r\n <div *ngIf=\"col.type == inputTypes.CURRENCY_SOCIETE_INPUT; else currencyOtherOutputBlock\">\r\n <Tsi-Currency-Societe-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Societe-Display>\r\n </div>\r\n\r\n <!-- Tsi-Currency-Other-Display -->\r\n <ng-template #currencyOtherOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.CURRENCY_OTHER_INPUT; else decimalOutputBlock\">\r\n <Tsi-Currency-Other-Display [currency]=\"col.currencyCode\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Currency-Other-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Decimal-Display -->\r\n <ng-template #decimalOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.DECIMAL_INPUT; else integerOutputBlock\">\r\n <Tsi-Decimal-Display [formatDecimal]=\"col.formatDecimal\" [inputData]=\"getSummary(col)\"\r\n [numOfDecimal]=\"col.numOfDecimal\">\r\n </Tsi-Decimal-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Integer-Display -->\r\n <ng-template #integerOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.INTEGER; else rateOutputBlock\">\r\n <Tsi-Integer-Display [inputData]=\"getSummary(col)\">\r\n </Tsi-Integer-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Tsi-Rate-Display -->\r\n <ng-template #rateOutputBlock>\r\n <ng-container *ngIf=\"col.type == inputTypes.RATE_INPUT; else defaultTextOutputBlock\">\r\n <Tsi-Rate-Display [isFraction]=\"col.isFraction\" [inputData]=\"getSummary(col)\">\r\n </Tsi-Rate-Display>\r\n </ng-container>\r\n </ng-template>\r\n\r\n <!-- Default -->\r\n <ng-template #defaultTextOutputBlock>\r\n <ng-container>\r\n <span>\r\n {{getSummary(col)}}\r\n </span>\r\n </ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n </tr>\r\n </ng-template>\r\n\r\n <ng-template pTemplate=\"summary\">\r\n <tr>\r\n {{'TotalRecordsCount' | localize }} {{gridData.length}}\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n <div>\r\n <Tsi-Button *ngIf=\"showAddButton\" style=\"height: 20px;width: 20px;\" icon=\"p-button-icon pi pi-plus\" type=\"button\"\r\n [tooltipPosition]=\"tooltipPosition.Top\" tooltipText=\"shared_edittable_ajouter\"\r\n styleClass=\"p-element p-button-sm p-button-success p-button-text p-button p-component p-button-icon-only ng-star-inserted\"\r\n (click)=\"addRow()\"></Tsi-Button>\r\n </div>\r\n</div>", styles: [".tfooter{position:sticky;bottom:0;width:100%;z-index:10}::ng-deep .p-datatable .p-datatable-tfoot>tr>td{padding:1.8px!important}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%}:host ::ng-deep .p-multiselect{border-radius:13px}:host ::ng-deep .p-multiselect .p-multiselect-label{padding:.5rem .75rem!important}.grid-cell{overflow:visible!important}.p-datatable .p-cell-editing{overflow:visible!important;position:relative;z-index:1}td,.p-editable-column{overflow:visible!important}.p-editable-column input{width:100%}::ng-deep .p-tabview .p-tabview-panels{overflow:visible!important}\n"] }]
506
579
  }], ctorParameters: () => [{ type: i1.LocalizePipe }], propDecorators: { editableTable: [{
507
580
  type: ViewChild,
508
581
  args: ["editableTable"]
@@ -533,6 +606,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
533
606
  type: Input
534
607
  }], pageSize: [{
535
608
  type: Input
609
+ }], entityPrimaryKeyName: [{
610
+ type: Input
536
611
  }], columns: [{
537
612
  type: Input
538
613
  }], gridData: [{
@@ -567,6 +642,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
567
642
  type: Input
568
643
  }], deleteLineButtonDisabled: [{
569
644
  type: Input
645
+ }], showDuplicateButton: [{
646
+ type: Input
570
647
  }], itemsSave: [{
571
648
  type: Output
572
649
  }], refreshEventEmitter: [{
@@ -593,10 +670,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
593
670
  type: Output
594
671
  }], onConsultClicked: [{
595
672
  type: Output
673
+ }], rowDuplicatedEventEmitter: [{
674
+ type: Output
596
675
  }], dt: [{
597
676
  type: ViewChild,
598
677
  args: ["dt", { static: false }]
599
678
  }], id: [{
600
679
  type: Input
680
+ }], handleGridKeydown: [{
681
+ type: HostListener,
682
+ args: ['document:keydown', ['$event']]
601
683
  }] } });
602
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy9lZGl0YWJsZS1ncmlkL2VkaXRhYmxlLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvZWRpdGFibGUtZ3JpZC9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJN0csT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUczRyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5REFBeUQsQ0FBQztBQUNuRyxPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMkRBQTJELENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVF6RixNQUFNLE9BQU8scUJBQXNCLFNBQVEsWUFBWTtJQWdEckQsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFhLE9BQU8sQ0FBQyxLQUF3QjtRQUMzQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMs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QkFBb0I7c0JBQTdCLE1BQU07Z0JBRUcsV0FBVztzQkFBcEIsTUFBTTtnQkFFRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBRUcsbUJBQW1CO3NCQUE1QixNQUFNO2dCQUVHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBR29DLEVBQUU7c0JBQTVDLFNBQVM7dUJBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtnQkFFekIsRUFBRTtzQkFBVixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIGluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBTb3J0RXZlbnQsIFRhYmxlU3RhdGUgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IFRhYmxlLCBUYWJsZVJvd1NlbGVjdEV2ZW50LCBUYWJsZVJvd1VuU2VsZWN0RXZlbnQgfSBmcm9tICdwcmltZW5nL3RhYmxlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHJ0bE1vZGVLZXlzIH0gZnJvbSAnLi4vLi4vLi4vY29uc3RzL2xvY2Fscy5jb25zdCc7XHJcbmltcG9ydCB7IEJ1dHRvblR5cGUsIEdyaWRTZWxlY3Rpb25Nb2RlLCBJbnB1dFR5cGVzLCBNb2RhbFNpemVFbnVtLCBUb29sdGlwUG9zaXRpb24gfSBmcm9tICcuLi8uLi8uLi9lbnVtcyc7XHJcbmltcG9ydCB7IENlbGxDaGFuZ2VkUmVzdWx0LCBHcmlkQ29sdW1uLCBJR3JpZENvbmZpZ3VyYXRpb24sIFJvd0FkZGVkUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7IExvY2FsaXplUGlwZSB9IGZyb20gJy4uLy4uLy4uL3BpcGVzL2xvY2FsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlWYWxpZGF0aW9uc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy92YWxpZGF0aW9uL2VudGl0eS12YWxpZGF0aW9ucy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgR2VuZXJpY1ZhbGlkYXRpb25TdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IEZvcm1TdGF0ZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscy9mb3JtL2Zvcm0tc3RhdGUnO1xyXG5pbXBvcnQgeyBUc2lJbnB1dEJhc2UgfSBmcm9tICcuLi8uLi8uLi90c2ktYmFzZS90c2ktaW5wdXQtYmFzZS90c2ktaW5wdXQtYmFzZS5jb21wb25lbnQnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdUc2ktR2VuZXJpYy1FZGl0YWJsZS1HcmlkJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW0dlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRWRpdGFibGVHcmlkQ29tcG9uZW50IGV4dGVuZHMgVHNpSW5wdXRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cclxuICAvLyNyZWdpb24gbG9jYWwgdmFyc1xyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIGxvY2FsIHZhcnNcclxuICBwcml2YXRlIHNhdmVFdmVudFN1YnNjcmlwdGlvbj86IFN1YnNjcmlwdGlvbjtcclxuICBwcml2YXRlIF9pc0F1dG9Sb3dOdW1iZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9hdXRvUm93TnVtYmVyRmllbGQ6IHN0cmluZyA9ICcnO1xyXG4gIHByaXZhdGUgX2N1cnJlbnRSb3dOdW1iZXI6IG51bWJlciA9IDA7XHJcbiAgdG9vbHRpcFBvc2l0aW9uID0gVG9vbHRpcFBvc2l0aW9uO1xyXG4gIGlzQXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9ncmlkRGF0YTogQXJyYXk8YW55PiA9IFtdO1xyXG4gIHByaXZhdGUgX2VxdWF0YWJsZUZpZWxkczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9zdW1BdEZ1c2lvbkZpZWxkczogQXJyYXk8c3RyaW5nPiB8IHVuZGVmaW5lZDtcclxuICBwcml2YXRlIF9lcXVhbGl0eUNoZWNrT246IGJvb2xlYW4gPSBmYWxzZTtcclxuICBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGU7XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgaW5wdXRUeXBlcyA9IElucHV0VHlwZXM7XHJcbiAgbW9kYWxTaXplID0gTW9kYWxTaXplRW51bS5FeHRyYUxhcmdlO1xyXG4gIEBWaWV3Q2hpbGQoXCJlZGl0YWJsZVRhYmxlXCIpIGVkaXRhYmxlVGFibGU/OiBUYWJsZVxyXG5cclxuICBidXR0b25UeXBlID0gQnV0dG9uVHlwZTtcclxuXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogYW55ID0gW107XHJcbiAgc2VsZWN0ZWRJdGVtOiBhbnk7XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KCdjb25maWd1cmF0aW9uJykgY29uZmlndXJhdGlvbj86IElHcmlkQ29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoJ2tleScpIGtleTogc3RyaW5nID0gJ3VpZCc7XHJcbiAgQElucHV0KCkgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBASW5wdXQoJ2V2ZW50cycpIHNhdmVFdmVudD86IE9ic2VydmFibGU8dm9pZD47XHJcbiAgQElucHV0KCkgc2hvd0FkZEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93RGVsZXRlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG4gIEBJbnB1dCgpIHNob3dFZGl0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG4gIEBJbnB1dCgpIHNob3dSb3dTdW1tYXJ5OiBib29sZWFuID0gZmFsc2U7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuXHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnNTAwcHgnO1xyXG4gIEBJbnB1dCgpIHJvd1BlclBhZ2U6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XHJcbiAgLy8gQElucHV0KCkgaXNQYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSA1XHJcblxyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcbiAgc2VsZWN0ZWRDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIHByaXZhdGUgX2NvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgcHJpdmF0ZSBfdGVtcENvbHVtbnM6IEFycmF5PEdyaWRDb2x1bW4+ID0gW107XHJcbiAgZ2V0IGNvbHVtbnMoKTogQXJyYXk8R3JpZENvbHVtbj4ge1xyXG4gICAgcmV0dXJuIHRoaXMuX2NvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgY29sdW1ucyh2YWx1ZTogQXJyYXk8R3JpZENvbHVtbj4pIHtcclxuICAgIHZhbHVlLmZvckVhY2goZWwgPT4gZWwudHJhbnNsYXRlZEhlYWRlciA9IHRoaXMuX2xvY2FsaXplUGlwZS50cmFuc2Zvcm0oZWwuaGVhZGVyID8/IFwiXCIpKTtcclxuICAgIHRoaXMuX2NvbHVtbnMgPSB2YWx1ZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRDb2x1bW5zID0gdGhpcy5fY29sdW1ucztcclxuXHJcbiAgICB0aGlzLl92ZXJpZnlHcmlkUmVxdWlyZW1lbnRzKCk7XHJcbiAgICB0aGlzLl9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTtcclxuICB9XHJcbiAgQElucHV0KCkgc2V0IGdyaWREYXRhKGRhdGE6IEFycmF5PGFueT4pIHtcclxuICAgIHRoaXMuX2dyaWREYXRhID0gZGF0YTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gIH1cclxuICBnZXQgZ3JpZERhdGEoKSB7IHJldHVybiB0aGlzLl9ncmlkRGF0YTsgfVxyXG5cclxuICBASW5wdXQoKSBpc1RhYmxlTG9hZGluZz86IGJvb2xlYW47XHJcblxyXG5cclxuICBASW5wdXQoKSBwYXJlbnQ6IGFueTtcclxuICBASW5wdXQoKSBldmVudHM/OiBPYnNlcnZhYmxlPHZvaWQ+Oy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcblxyXG4gIEBJbnB1dCgpIHNob3dTYXZlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG4gIEBJbnB1dCgpIHNob3dBY3Rpb25Db2x1bW46IGJvb2xlYW4gPSB0cnVlOy8vVE8gRE8gU2F2ZSBCdXR0b24gT3B0aW9uXHJcblxyXG5cclxuICBASW5wdXQoKSBlbmFibGVSb3dEaXNhYmxpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KCkgcm93U3VtbWFyeUNvbmZpZzogQXJyYXk8c3RyaW5nPiA9IFtdO1xyXG4gIEBJbnB1dCgpIHNob3dIYXZlU3VtYXJ5PzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNob3dSb3dTdW1hcnk/OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qKnNlbGVjdGlvbiAqL1xyXG4gIEBJbnB1dCgpIHNlbGVjdEtleU9ubHk6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHNlbGVjdGlvbk1vZGU6IEdyaWRTZWxlY3Rpb25Nb2RlIHwgYW55ID0gR3JpZFNlbGVjdGlvbk1vZGUuTm9uZTtcclxuICBASW5wdXQoKSBzaG93Q29uc3VsdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGdldCBlZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlR3JpZEJ1c2luZXNzQ2xhc3M7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBlZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzID0gY2xhc3NOYW1lO1xyXG4gICAgdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZT8ubG9hZEVudGl0eVZhbGlkYXRpb25JbmZvcyh0aGlzLl9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKTtcclxuICB9XHJcblxyXG5cclxuICAvKipvcmRlciAqL1xyXG4gIEBJbnB1dCgpIG9yZGVyQ29sdW1uOiBzdHJpbmcgPSAndWlkJztcclxuXHJcbiAgQElucHV0KCkgZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkITogKGl0ZW06IGFueSkgPT4gYW55XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gT3V0cHV0c1xyXG4gIEBPdXRwdXQoKSBpdGVtc1NhdmU6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xyXG4gIC8qKlxyXG4gICAqXHJcbiAgICovXHJcblxyXG5cclxuICBAT3V0cHV0KCkgcmVmcmVzaEV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIC8vQE91dHB1dCgpIGFjdGlvbkV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPEdyaWRBY3Rpb25FbWl0UmVzdWx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8R3JpZEFjdGlvbkVtaXRSZXN1bHQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBzYXZlRGF0YUV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKSByb3dDaGFuZ2VkRXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkUm93RXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgQE91dHB1dCgpIGFkZGVkUm93RXZlbnRFbWl0dGVyOiBFdmVudEVtaXR0ZXI8Um93QWRkZWRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4oKVxyXG5cclxuICBAT3V0cHV0KCkgZm9jdXNPdXRFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcclxuXHJcbiAgQE91dHB1dCgpIGNlbGxDaGFuZ2VkOiBFdmVudEVtaXR0ZXI8Q2VsbENoYW5nZWRSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxDZWxsQ2hhbmdlZFJlc3VsdD4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHJvd0RlbGV0ZWRFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkSXRlbXNDaGFuZ2U6IEV2ZW50RW1pdHRlcjxBcnJheTxhbnk+PiA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4oKTtcclxuXHJcbiAgQE91dHB1dCgpIG9uUm93U2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBmb2N1c091dFJvdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgb25Db25zdWx0Q2xpY2tlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgQFZpZXdDaGlsZChcImR0XCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgZHQ6IFRhYmxlIHwgdW5kZWZpbmVkO1xyXG5cclxuICBASW5wdXQoKSBpZD86IHN0cmluZztcclxuXHJcbiAgcHJpdmF0ZSBfZW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlID0gaW5qZWN0KEVudGl0eVZhbGlkYXRpb25zU2VydmljZSk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2xvY2FsaXplUGlwZTogTG9jYWxpemVQaXBlKSB7XHJcbiAgICBzdXBlcigpXHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ09uSW5pdCgpIHtcclxuICAgIHN1cGVyLm5nT25Jbml0KClcclxuICAgIHRoaXMuX2luaXRTYXZlRXZlbnRTdWJzY3JpcHRpb24oKTtcclxuICAgIHRoaXMuX3ZlcmlmeUdyaWRSZXF1aXJlbWVudHMoKTtcclxuICAgIHRoaXMuX2luaXRDdXJyZW50Um93TnVtYmVyQW5kT3JkZXJCeVJvd051bWJlcigpO1xyXG4gICAgdGhpcy5faW5pdEVxdWF0YWJsZUZpZWxkcygpO1xyXG4gICAgdGhpcy5faW5pdFN1bUF0RnVzaW9uRmllbGRzKCk7XHJcbiAgICBcclxuICAgIGxldCBsYW5ndWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShydGxNb2RlS2V5cy5ydGxNb2RlRW5hYmxlZCk7XHJcbiAgICBcclxuICAgIGlmIChsYW5ndWUgJiYgSlNPTi5wYXJzZShsYW5ndWUpKSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IHRydWVcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLmlzQXIgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5zZWxlY3RlZENvbHVtbnMgfHwgdGhpcy5zZWxlY3RlZENvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSB0aGlzLmNvbHVtbnNcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5fdGVtcENvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XHJcbiAgfVxyXG5cclxuICBmaW5kQ29sdW1uQnlLZXkoa2V5OiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMpIHtcclxuICAgICAgZm9yIChsZXQgY29sIG9mIHRoaXMuY29sdW1ucykge1xyXG4gICAgICAgIGlmIChjb2wuaGVhZGVyID09PSBrZXkgfHwgY29sLmZpZWxkID09PSBrZXkpIHJldHVybiBjb2w7XHJcbiAgICAgICAgZWxzZSBjb250aW51ZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGxcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgcmVzdG9yZVN0YXRlKGNvbmZpZ3VyYXRpb246IHN0cmluZykge1xyXG4gICAgbGV0IHN0YXRlOiBUYWJsZVN0YXRlID0gSlNPTi5wYXJzZShjb25maWd1cmF0aW9uKVxyXG4gICAgaWYgKHRoaXMuZHQpIHtcclxuICAgICAgaWYgKHRoaXMuZHQpIHtcclxuXHJcbiAgICAgICAgdGhpcy5kdC5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcclxuICAgICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5PcmRlciA9IHN0YXRlLmNvbHVtbk9yZGVyO1xyXG5cclxuICAgICAgICBpZiAoY29sdW1uT3JkZXIpIHtcclxuICAgICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyOiBzdHJpbmdbXSk6IGFueVtdIHtcclxuICAgIGxldCByZW9yZGVyZWRDb2x1bW5zOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGNvbHVtbk9yZGVyLm1hcCgoa2V5KSA9PiB7XHJcbiAgICAgIGxldCBjb2wgPSB0aGlzLmZpbmRDb2x1bW5CeUtleShrZXkpO1xyXG4gICAgICBpZiAoY29sKSB7XHJcbiAgICAgICAgcmVvcmRlcmVkQ29sdW1ucy5wdXNoKGNvbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHJldHVybiByZW9yZGVyZWRDb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRTZWxlY3RlZENvbHVtbnMoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgdGhpcy5kdC5jb2x1bW5XaWR0aHNTdGF0ZSA9IHN0YXRlLmNvbHVtbldpZHRocztcclxuICAgICAgdGhpcy5kdC50YWJsZVdpZHRoU3RhdGUgPSBzdGF0ZS50YWJsZVdpZHRoO1xyXG5cclxuICAgICAgbGV0IGNvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXI7XHJcblxyXG4gICAgICBpZiAoY29sdW1uT3JkZXIpIHtcclxuICAgICAgICB0aGlzLmNvbHVtbnMgPSB0aGlzLl90ZW1wQ29sdW1ucztcclxuICAgICAgICBcclxuICAgICAgICBsZXQgcmVvcmRlcmVkQ29sdW1ucyA9IHRoaXMuZ2V0UmVvcmRlcmVkQ29sdW1ucyhjb2x1bW5PcmRlcik7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZENvbHVtbnMgPSByZW9yZGVyZWRDb2x1bW5zO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRTdGF0ZSgpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IHt9O1xyXG5cclxuICAgIGlmICghdGhpcy5kdCkge1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5kdC5yZXNpemFibGVDb2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuZHQuc2F2ZUNvbHVtbldpZHRocyhzdGF0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kdC5zYXZlQ29sdW1uT3JkZXIoc3RhdGUpO1xyXG5cclxuICAgIHJldHVybiBzdGF0ZVxyXG4gIH1cclxuXHJcbiAgaXNEZWxldGVCdXR0b25EaXNhYmxlZChpdGVtOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmRlbGV0ZUxpbmVCdXR0b25EaXNhYmxlZCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkKGl0ZW0pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHN1cGVyLm5nT25EZXN0cm95KClcclxuICAgIHRoaXMuc2F2ZUV2ZW50U3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRDaGFuZ2VkKGNvbDogR3JpZENvbHVtbikge1xyXG4gICAgaWYgKGNvbC53YXRjaEZvckNoYW5nZXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5zYXZlRGF0YUV2ZW50RW1pdHRlci5lbWl0KHRoaXMuZ3JpZERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5pdGVtc1NhdmUuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICAgIHRoaXMuc2F2ZURhdGFFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICB9XHJcblxyXG4gIGFkZFJvdygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ncmlkRGF0YSkge1xyXG4gICAgICB0aGlzLmdyaWREYXRhID0gW107XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3Um93ID0gdGhpcy5faW5pdFJvdygpXHJcbiAgICB0aGlzLmdyaWREYXRhLnB1c2gobmV3Um93KVxyXG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxyXG4gICAgbGV0IHJvd0FkZGVkUmVzdWx0OiBSb3dBZGRlZFJlc3VsdCA9IHtcclxuICAgICAgcm93TnVtYmVyOiB0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDEsXHJcbiAgICAgIGRhdGE6IG5ld1Jvd1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmVkaXRhYmxlVGFibGU/LnNvcnRGaWVsZCAmJiB0aGlzLmVkaXRhYmxlVGFibGUuc29ydE9yZGVyKSB7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVUYWJsZT8udmFsdWUucHVzaChuZXdSb3cpXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hTb3J0KClcclxuICAgIHRoaXMuYWRkZWRSb3dFdmVudEVtaXR0ZXIuZW1pdChyb3dBZGRlZFJlc3VsdClcclxuICB9XHJcblxyXG4gIHJlZnJlc2hTb3J0KCkge1xyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkKSB7XHJcbiAgICAgIGNvbnN0IHNvcnRGaWVsZCA9IHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0RmllbGQ7XHJcbiAgICAgIGNvbnN0IHNvcnRPcmRlciA9IHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0T3JkZXI7XHJcblxyXG4gICAgICB0aGlzLmdyaWREYXRhLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZUEgPSBhW3NvcnRGaWVsZF07XHJcbiAgICAgICAgY29uc3QgdmFsdWVCID0gYltzb3J0RmllbGRdO1xyXG4gICAgICAgIGxldCByZXN1bHQgPSAwO1xyXG5cclxuICAgICAgICBpZiAodmFsdWVBIDwgdmFsdWVCKSByZXN1bHQgPSAtMTtcclxuICAgICAgICBlbHNlIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHJlc3VsdCA9IDE7XHJcblxyXG4gICAgICAgIHJldHVybiByZXN1bHQgKiBzb3J0T3JkZXI7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdGhpcy5ncmlkRGF0YSA9IFsuLi50aGlzLmdyaWREYXRhXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGRlbGV0ZShpdGVtOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLmVkaXRhYmxlVGFibGU/LnNvcnRGaWVsZCAmJiB0aGlzLmVkaXRhYmxlVGFibGUuc29ydE1vZGUpIHtcclxuICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmVkaXRhYmxlVGFibGUudmFsdWUuaW5kZXhPZihpdGVtLCAwKTtcclxuICAgICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgICB0aGlzLmVkaXRhYmxlVGFibGUudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuZ3JpZERhdGEuaW5kZXhPZihpdGVtLCAwKTtcclxuICAgIGlmIChpbmRleCA+IC0xKSB7XHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxyXG4gICAgICB0aGlzLl9vbkRlbGV0ZVJvdyhpdGVtKTtcclxuICAgICAgdGhpcy5yb3dEZWxldGVkRXZlbnRFbWl0dGVyLmVtaXQodGhpcy5ncmlkRGF0YSlcclxuICAgIH1cclxuICAgIHRoaXMucmVmcmVzaFNvcnQoKVxyXG4gIH1cclxuXHJcbiAgZ2V0U3VtbWFyeShjb2w6IEdyaWRDb2x1bW4pOiBudW1iZXIge1xyXG4gICAgaWYgKGNvbC5oYXZlU3VtbWFyeSA9PSB0cnVlKSB7XHJcblxyXG4gICAgICBsZXQgc3VtID0gMDtcclxuICAgICAgdGhpcy5ncmlkRGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICAgIHN1bSArPSByb3dbY29sLmZpZWxkXTtcclxuICAgICAgfSlcclxuICAgICAgcmV0dXJuIHN1bTtcclxuICAgIH1cclxuICAgIHJldHVybiAwO1xyXG4gIH1cclxuXHJcbiAgcm93U3VtbWFyeShyb3c6IGFueSk6IG51bWJlciB7XHJcbiAgICBsZXQgc3VtID0gMDtcclxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKGNvbCA9PiB7XHJcbiAgICAgIGlmIChjb2wucm93U3VtbWFyeSA9PSB0cnVlKSB7XHJcbiAgICAgICAgc3VtICs9IHJvd1tjb2wuZmllbGRdO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBzdW07XHJcblxyXG4gIH1cclxuXHJcbiAgb25Sb3dTZWxlY3RlZChldmVudDogVGFibGVSb3dTZWxlY3RFdmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSBldmVudC5kYXRhXHJcbiAgICBpZiAodGhpcy5zZWxlY3RLZXlPbmx5ID09IHRydWUpIHtcclxuICAgICAgbGV0IHNlbGVjdGlvbktleTogYW55O1xyXG4gICAgICBzZWxlY3Rpb25LZXkgPSB0aGlzLnNlbGVjdGVkSXRlbVt0aGlzLmtleV07XHJcbiAgICAgIHRoaXMub25Sb3dTZWxlY3QuZW1pdChzZWxlY3Rpb25LZXkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMub25Sb3dTZWxlY3QuZW1pdCh0aGlzLnNlbGVjdGVkSXRlbXMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Sb3dVbnNlbGVjdChldmVudDogVGFibGVSb3dVblNlbGVjdEV2ZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IHVuZGVmaW5lZFxyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuXHJcbiAgICBsZXQgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCgodjogYW55KSA9PiB7IGtleXMucHVzaCh2W3RoaXMua2V5XSkgfSk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSBrZXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0S2V5T25seSkge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcyA/IFt0aGlzLnNlbGVjdGVkSXRlbXNbdGhpcy5rZXldXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcyA/IFt0aGlzLnNlbGVjdGVkSXRlbXNdIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk5vbmUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzT3V0Um93KGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5mb2N1c091dFJvdy5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgY3VzdG9tU29ydChldmVudDogU29ydEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuZGF0YSAhPSBudWxsICYmIGV2ZW50LmRhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGV2ZW50LmRhdGEuc29ydCgoZGF0YTEsIGRhdGEyKSA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmZpZWxkICE9IG51bGwgJiYgZXZlbnQuZmllbGQgIT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yZGVyKSB7XHJcbiAgICAgICAgICBsZXQgdmFsdWUxID0gZGF0YTFbZXZlbnQuZmllbGRdO1xyXG4gICAgICAgICAgbGV0IHZhbHVlMiA9IGRhdGEyW2V2ZW50LmZpZWxkXTtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbClcclxuICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICh2YWx1ZTEgPCB2YWx1ZTIpID8gLTEgOiAodmFsdWUxID4gdmFsdWUyKSA/IDEgOiAwO1xyXG5cclxuICAgICAgICAgIHJldHVybiAoZXZlbnQub3JkZXIgKiByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdWx0KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ29uc3VsdENsaWNrZWQuZW1pdChrZXkpO1xyXG4gIH1cclxuXHJcbiAgb25DZWxsVmFsdWVDaGFuZ2VkKGNvbDogR3JpZENvbHVtbiwgbmV3VmFsdWU6IGFueSwgaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICAvLyBzZW5kIGV2ZW50c1xyXG4gICAgaWYgKGNvbC53YXRjaEZvckNoYW5nZXMgPT09IHRydWUpIHtcclxuXHJcbiAgICAgIGxldCBjZWxsQ2hhbmdlZFJlc3VsdDogQ2VsbENoYW5nZWRSZXN1bHQgPSB7XHJcbiAgICAgICAga2V5OiBpdGVtW3RoaXMua2V5XSxcclxuICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2VsbENoYW5nZWQuZW1pdChjZWxsQ2hhbmdlZFJlc3VsdCk7XHJcblxyXG4gICAgICB0aGlzLnNhdmVEYXRhRXZlbnRFbWl0dGVyLmVtaXQodGhpcy5ncmlkRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVjYWxjdWxhdGUgY3VycmVudFJvd051bWJlclxyXG4gICAgaWYgKGNvbC5maWVsZCA9PT0gdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkKSB7XHJcbiAgICAgIHRoaXMuX29yZGVyQnlSb3dOdW1iZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCByb3dzXHJcbiAgICAvLyBpZih0aGlzLl9lcXVhbGl0eUNoZWNrT24gJiYgY29sLmlzRXF1YXRhYmxlQ3JpdGVyaWEpe1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygnZm91bmQgZXF1YXRhYmxlIDogY29sOicsIGNvbCwgJ3JvdyA6ICcsIGl0ZW0pO1xyXG4gICAgLy8gICB0aGlzLl90cnlGaW5kRXF1YXRhYmxlKGl0ZW0pO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUZvcm1TdGF0ZShmb3JtU3RhdGU6IEZvcm1TdGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlKVxyXG4gICAge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZS51cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFJvdygpIHtcclxuICAgIGxldCBuZXdSb3c6IGFueSA9IHt9O1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBJbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVRcclxuICAgICAgICAgIHx8IGNvbC50eXBlID09IElucHV0VHlwZXMuUkFURV9JTlBVVFxyXG4gICAgICAgICAgfHwgY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5JTlRFR0VSXHJcbiAgICAgICAgICB8fCBjb2wudHlwZSA9PSBJbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVRcclxuICAgICAgICAgIHx8IGNvbC50eXBlID09IElucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQpIHtcclxuICAgICAgICAgIG5ld1Jvd1tjb2wuZmllbGRdID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgbmV3Um93W2NvbC5maWVsZF0gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBuZXdSb3dbY29sLmZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIG5ld1Jvd1t0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdID0gdGhpcy5fbmV4dFJvd051bWJlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXdSb3dcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdSb3c7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0U2F2ZUV2ZW50U3Vic2NyaXB0aW9uKCkge1xyXG4gICAgdGhpcy5zYXZlRXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50cz8uc3Vic2NyaWJlKFxyXG4gICAgICAoKSA9PiB0aGlzLnNhdmVJdGVtcygpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmVyaWZ5R3JpZFJlcXVpcmVtZW50cygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbFxyXG4gICAgICB8fCB0aGlzLmNvbHVtbnMgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgYmUgbnVsbCcpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGxldCByb3dOdW1iZXJDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaXNBdXRvUm93TnVtYmVyQ29sdW1uID09PSB0cnVlKTtcclxuXHJcbiAgICBpZiAocm93TnVtYmVyQ29sdW1ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIFJvd051bWJlckNvbHVtbicpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChyb3dOdW1iZXJDb2x1bW5zLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgIHRoaXMuX2lzQXV0b1Jvd051bWJlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCA9IHJvd051bWJlckNvbHVtbnNbMF0uZmllbGQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRvUm93TnVtYmVyID09PSB0cnVlXHJcbiAgICAgICYmIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCAhPSB1bmRlZmluZWRcclxuICAgICAgJiYgdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5ncmlkRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuX29yZGVyQnlSb3dOdW1iZXIoKTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIgPSB0aGlzLmdyaWREYXRhW3RoaXMuZ3JpZERhdGEubGVuZ3RoIC0gMV1bdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25leHRSb3dOdW1iZXIoKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIgPSB0aGlzLmdyaWREYXRhLmxlbmd0aCArIDE7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFJvd051bWJlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uRGVsZXRlUm93KHJvdzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAocm93W3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF0gPT09IHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIpIHtcclxuICAgICAgdGhpcy5fY3VycmVudFJvd051bWJlci0tO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb3JkZXJCeVJvd051bWJlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZERhdGEuc29ydCgoYSwgYikgPT4geyByZXR1cm4gYVt0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdIC0gYlt0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdOyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRFcXVhdGFibGVGaWVsZHMoKTogdm9pZCB7XHJcbiAgICBsZXQgZXF1YXRhYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzRXF1YXRhYmxlQ3JpdGVyaWEgPT0gdHJ1ZSk7XHJcbiAgICBpZiAoZXF1YXRhYmxlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLl9lcXVhbGl0eUNoZWNrT24gPSB0cnVlO1xyXG4gICAgICB0aGlzLl9lcXVhdGFibGVGaWVsZHMgPSBlcXVhdGFibGVDb2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFN1bUF0RnVzaW9uRmllbGRzKCk6IHZvaWQge1xyXG4gICAgbGV0IHN1bUF0RnVzaW9uQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzU3VtQXRGdXNpb24gPT0gdHJ1ZSk7XHJcbiAgICBpZiAoc3VtQXRGdXNpb25Db2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuX2VxdWFsaXR5Q2hlY2tPbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuX3N1bUF0RnVzaW9uRmllbGRzID0gc3VtQXRGdXNpb25Db2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdHJ5RmluZEVxdWF0YWJsZShyb3c6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGZvdW5kRXF1YWxSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmdyaWREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdwcm9jIHJvdyA6ICcsIHRoaXMuZ3JpZERhdGFbaV0pO1xyXG4gICAgICBsZXQgaXNDdXJyZW50Um93RXF1YWw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLl9lcXVhdGFibGVGaWVsZHM/LmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Byb2MgZmllbGQgOiAnLCBmKTtcclxuICAgICAgICBpZiAodGhpcy5ncmlkRGF0YVtpXVtmXSAhPSByb3dbZl0pIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdub3QgZXF1YWwgJywgcm93LCB0aGlzLmdyaWREYXRhW2ldKTtcclxuICAgICAgICAgIGlzQ3VycmVudFJvd0VxdWFsID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGlzQ3VycmVudFJvd0VxdWFsKSB7XHJcbiAgICAgICAgdGhpcy5fZnVzaW9uUm93cyh0aGlzLmdyaWREYXRhW2ldLCByb3cpO1xyXG4gICAgICAgIGZvdW5kRXF1YWxSb3cgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZm91bmRFcXVhbFJvdykge1xyXG4gICAgICBjb25zb2xlLmxvZygnZGVsZXRpbmcgOiAnLCByb3cpO1xyXG4gICAgICB0aGlzLmRlbGV0ZShyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZnVzaW9uUm93cyhyb3cxOiBhbnksIHJvdzI6IGFueSkge1xyXG4gICAgdGhpcy5fc3VtQXRGdXNpb25GaWVsZHM/LmZvckVhY2goZiA9PiB7XHJcbiAgICAgIHJvdzFbZl0gKz0gcm93MltmXTtcclxuICAgIH0pO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2FyZFwiPlxyXG4gIDxwLXRhYmxlICNkdCBbc2VsZWN0aW9uTW9kZV09XCJzZWxlY3Rpb25Nb2RlXCIgWyhzZWxlY3Rpb24pXT1cInNlbGVjdGVkSXRlbXNcIiBlZGl0TW9kZT1cInJvd1wiXHJcbiAgICBbcGFnaW5hdG9yXT1cImdyaWREYXRhLmxlbmd0aCA+IHBhZ2VTaXplXCIgW3Jvd3NQZXJQYWdlT3B0aW9uc109XCJyb3dQZXJQYWdlXCIgW3Jvd3NdPVwicGFnZVNpemVcIlxyXG4gICAgKG9uUm93U2VsZWN0KT1cIm9uUm93U2VsZWN0ZWQoJGV2ZW50KVwiIChvblJvd1Vuc2VsZWN0KT1cIm9uUm93VW5zZWxlY3QoJGV2ZW50KVwiIFtzY3JvbGxhYmxlXT1cInRydWVcIlxyXG4gICAgW3Jlc2l6YWJsZUNvbHVtbnNdPVwidHJ1ZVwiIGNvbHVtblJlc2l6ZU1vZGU9XCJleHBhbmRcIiBhcHBlbmRUbz1cImJvZHlcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtc21cIiBbdmFsdWVdPVwiZ3JpZERhdGFcIlxyXG4gICAgW2NvbHVtbnNdPVwic2VsZWN0ZWRDb2x1bW5zXCIgW2RhdGFLZXldPVwia2V5XCIgW3Njcm9sbEhlaWdodF09XCJzY3JvbGxIZWlnaHRcIiBzdHlsZUNsYXNzPVwicC1kYXRhdGFibGUtZ3JpZGxpbmVzXCJcclxuICAgIChzZWxlY3Rpb25DaGFuZ2UpPVwic2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIiAjZWRpdGFibGVUYWJsZSBbdG90YWxSZWNvcmRzXT1cImdyaWREYXRhLmxlbmd0aFwiPlxyXG4gICAgPCEtLSBbdGFibGVTdHlsZV09XCJ7J21pbi13aWR0aCc6ICc1MHJlbScsJ3dpZHRoJzogJ2luaGVyaXQnfVwiIC0tPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjYXB0aW9uXCI+XHJcbiAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImNvbHVtbnNcIiBbKG5nTW9kZWwpXT1cInNlbGVjdGVkQ29sdW1uc1wiXHJcbiAgICAgICAgc2VsZWN0ZWRJdGVtc0xhYmVsPVwiezB9IHt7ICdjb2x1bW5zX3NlbGVjdGVkJyB8IGxvY2FsaXplIH19XCIgb3B0aW9uTGFiZWw9XCJ0cmFuc2xhdGVkSGVhZGVyXCJcclxuICAgICAgICBbc3R5bGVdPVwieydtaW4td2lkdGgnOiAnMTgwcHgnfVwiIHBsYWNlaG9sZGVyPVwie3sgJ2Nob29zZV9jb2x1bW5zJyB8IGxvY2FsaXplIH19XCI+XHJcbiAgICAgICAgPG5nLXRlbXBsYXRlIGxldC1vcHRpb24gcFRlbXBsYXRlPVwiaXRlbVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuPnt7IG9wdGlvbi5oZWFkZXIgfCBsb2NhbGl6ZSB9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDwvcC1tdWx0aVNlbGVjdD5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImhlYWRlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlICE9IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIj5cclxuICAgICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6MnJlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDoycmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiPlxyXG4gICAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDoycmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjJyZW0gIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgICAgPHAtdGFibGVIZWFkZXJDaGVja2JveCAjdGFibGVIZWFkZXJDaGVja2JveD48L3AtdGFibGVIZWFkZXJDaGVja2JveD5cclxuICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dIYXZlU3VtYXJ5XCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuXHJcbiAgICAgICAgPCEtLSA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPiAtLT5cclxuICAgICAgICBcclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0NvbnN1bHRCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuXHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtO1wiIHBTb3J0YWJsZUNvbHVtbj1cInt7Y29sLmZpZWxkfX1cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgcFRvb2x0aXA9XCJ7e2NvbC50b29sVGlwVGV4dCB8IGxvY2FsaXplIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgcFJlb3JkZXJhYmxlQ29sdW1uPnt7IGNvbC5oZWFkZXIgfCBsb2NhbGl6ZVxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwie3tjb2wuZmllbGR9fVwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgIDxUc2ktQnViYmxlLUluZm8gW2luZm9UZXh0XT1cImNvbC5pbmZvVGV4dCB8IGxvY2FsaXplXCI+PC9Uc2ktQnViYmxlLUluZm8+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6M3JlbVwiICpuZ0lmPVwic2hvd1Jvd1N1bW1hcnlcIiBzY29wZT1cImNvbFwiPnt7J1Jvd1N1bW1hcnknIHwgbG9jYWxpemV9fTwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgXHJcbiAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cIml0ZW1cIlxyXG4gICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlIHx8IHNlbGVjdGlvbk1vZGUgPT0gdW5kZWZpbmVkOyBlbHNlIHNlbGVjdGlvbk1vZGVCbG9ja1wiXHJcbiAgICAgICAgKGZvY3VzT3V0KT1cIm9uRm9jdXNPdXRSb3coaXRlbSlcIj5cclxuICAgICAgICBcclxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCIgPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPiAtLT5cclxuXHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICA8L3RkPiAtLT5cclxuXHJcbiAgICAgICAgPCEtLSA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLWNoZWNrXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93IGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RkPlxyXG5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAtMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1jb25zdWx0LXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuQnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktZXllXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfY29uc3VsdGVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJjb25zdWx0KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgXHJcbiAgICAgICAgICBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICBjbGFzcz1cInAtMSBidG4tZGVsZXRlLXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtkaXNhYmxlZF09XCJpc0RlbGV0ZUJ1dHRvbkRpc2FibGVkKGl0ZW0pXCIgdHlwZT1cImJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXRyYXNoXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfc3VwcHJpbWVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5XCJcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlKGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcblxyXG4gICAgICAgIDx0ZCBjbGFzcz1cInVpLXJlc2l6YWJsZS1jb2x1bW5cIiBwRnJvemVuQ29sdW1uIFtmcm96ZW5dPVwiY29sLmlzRnJvemVuXCIgKm5nRm9yPVwibGV0IGNvbCBvZiBjb2x1bW5zXCJcclxuICAgICAgICAgIFtuZ1N0eWxlXT1cImlzQXIgPyB7J3RleHQtYWxpZ24nOiAnc3RhcnQnfSA6IHt9XCI+XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5kaXNwbGF5T25seSB8fCBkaXNhYmxlZDsgZWxzZSBvcmRpbmFyeUJsb2NcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5TRUFSQ0hfQ09NQk87IGVsc2UgY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2Rpc2FibGVkXT1cInRydWVcIiBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiIFsoYmluZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICBpZC1maWVsZD1cInt7Y29sLmlkRmllbGR9fVwiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgbGFiZWwtZmllbGQ9XCJ7e2NvbC5sYWJlbEZpZWxkfX1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93U2VhcmNoQnV0dG9uXT1cImNvbC5zaG93U2VhcmNoQnV0dG9uID8/IHRydWVcIiBbc2hvd0FkZEJ1dHRvbl09XCJjb2wuc2hvd0FkZEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93Q29uc3VsdEJ1dHRvbl09XCJjb2wuc2hvd0NvbnN1bHRCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lTb2NpZXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSBbY3VycmVuY3ldPVwiY29sLmN1cnJlbmN5T3RoZXJDb2RlXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRBVEU7IGVsc2UgY2hlY2tCb3hPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1EaXNwbGF5IFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94LURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ2hlY2tib3gtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrYm94LURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREVDSU1BTF9JTlBVVDsgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5JTlRFR0VSOyBlbHNlIHJhdGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgdGltZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdGltZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FOyBlbHNlIGZvcm11bGFPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0c2ktdGltZS1kaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+PC90c2ktdGltZS1kaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRm9ybXVsYS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkZPUk1VTEFfVEVYVF9CT1g7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRm9ybXVsYS1Cb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgWyh2YWx1ZSldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPjwvVHNpLUZvcm11bGEtQm94PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktVGV4dC1Cb3ggLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW1bY29sLmZpZWxkXX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICA8bmctdGVtcGxhdGUgI29yZGluYXJ5QmxvYz4gXHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8IS0tIFRzaS1TZWFyY2gtQ29tYm8gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlNFQVJDSF9DT01CTzsgZWxzZSBjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIiAoYmluZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJjb2wuYnVzaW5lc3NDbGFzc1wiIFtsaXN0U291cmNlVXJsXT1cImNvbC5saXN0U291cmNlVXJsXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgaWQtZmllbGQ9XCJ7e2NvbC5pZEZpZWxkfX1cIiBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCJcclxuICAgICAgICAgICAgICAgIFtjdXJyZW50Um93SXRlbV09XCJpdGVtXCIgKGJpbmRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCJcclxuICAgICAgICAgICAgICAgIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIiBbc2hvd1VwZGF0ZUJ1dHRvbl09XCJjb2wuc2hvd1VwZGF0ZUJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiPjwvVHNpLVNlYXJjaC1Db21ibz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9JTlBVVDsgZWxzZSBjdXJyZW5jeU90aGVySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1JbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRBVEU7IGVsc2UgY2hlY2tCb3hJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURhdGUtUGlja2VyIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLVBpY2tlcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2NoZWNrQm94SW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DSEVDS0JPWDsgZWxzZSBkZWNpbWFsSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREVDSU1BTF9JTlBVVDsgZWxzZSBpbnRlZ2VySW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNyYXRlSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVJbnB1dEJsb2NcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1JbnB1dCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktVGltZS1waWNrZXIgYmxvYyAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lSW5wdXRCbG9jPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlRJTUU7IGVsc2UgZm9ybXVsYUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDx0c2ktdGltZS1waWNrZXIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC90c2ktdGltZS1waWNrZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Zvcm11bGFJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkZPUk1VTEFfVEVYVF9CT1g7IGVsc2UgZGVmYXVsdFRleHRJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tPFRzaS1CdWJibGUtSW5mb1xyXG4gICAgICAgICAgICAgICAgICBbaW5mb1RleHRdPVwiWydmb3JtdWxhX2V4cGxpY2F0aW9uJyxcclxuICAgICAgICAgICAgICAgICAgXVwiPjwvVHNpLUJ1YmJsZS1JbmZvPiAtLT5cclxuICAgICAgICAgICAgICAgIDxUc2ktRm9ybXVsYS1Cb3ggW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgWyh2YWx1ZSldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+PC9Uc2ktRm9ybXVsYS1Cb3g+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxUc2ktVGV4dC1Cb3ggW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktVGV4dC1Cb3g+XHJcbiAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8dGQgKm5nSWY9XCJzaG93Um93U3VtbWFyeVwiIGNsYXNzPVwiZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICB7e3Jvd1N1bW1hcnkoaXRlbSl9fVxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgIDwvdHI+XHJcblxyXG4gICAgICA8bmctdGVtcGxhdGUgI3NlbGVjdGlvbk1vZGVCbG9jaz5cclxuICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPHRyIFtwRWRpdGFibGVSb3ddPVwiaXRlbVwiIFtwU2VsZWN0YWJsZVJvd109XCJpdGVtXCIgW3BTZWxlY3RhYmxlUm93SW5kZXhdPVwicm93SW5kZXhcIlxyXG4gICAgICAgICAgICAoZm9jdXNPdXQpPVwib25Gb2N1c091dFJvdyhpdGVtKVwiPlxyXG5cclxuICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPiAtLT5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPHRkICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCIgc3R5bGU9XCJ3aWR0aDogMnJlbTtcIj5cclxuICAgICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgICA8L3RkPiAtLT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07bGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cIiFlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwSW5pdEVkaXRhYmxlUm93IGljb249XCJwaSBwaS1wZW5jaWxcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcFNhdmVFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktY2hlY2tcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwQ2FuY2VsRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXRpbWVzXCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dIYXZlU3VtYXJ5XCIgc2NvcGU9XCJjb2xcIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xIGJ0bi1jb25zdWx0LXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW2J1dHRvblR5cGVdPVwiYnV0dG9uVHlwZS5CdXR0b25cIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1leWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfY29uc3VsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiY29uc3VsdChpdGVtKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uIHBSZXNpemFibGVDb2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1kZWxldGUtc3R5bGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktdHJhc2hcIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfc3VwcHJpbWVyXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ1aS1yZXNpemFibGUtY29sdW1uXCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmRpc3BsYXlPbmx5IHx8IGRpc2FibGVkOyBlbHNlIG9yZGluYXJ5QmxvY1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktU2VhcmNoLUNvbWJvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIFtkaXNhYmxlZF09XCJ0cnVlXCIgW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtidXNpbmVzc0NsYXNzXT1cImNvbC5idXNpbmVzc0NsYXNzXCIgW2N1cnJlbnRSb3dJdGVtXT1cIml0ZW1cIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQtZmllbGQ9XCJ7e2NvbC5pZEZpZWxkfX1cIiBbbGlzdFNvdXJjZVVybF09XCJjb2wubGlzdFNvdXJjZVVybFwiIGxhYmVsLWZpZWxkPVwie3tjb2wubGFiZWxGaWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbaXNGaWx0ZXJlZF09XCJjb2wuaXNGaWx0ZXJlZFwiIFtkYXRhc291cmNlXT1cImNvbC5kYXRhc291cmNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DSEVDS0JPWDsgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UaW1lLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtZGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdHNpLXRpbWUtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUZvcm11bGEtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3JkaW5hcnlCbG9jPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktU2VhcmNoLUNvbWJvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIiAoYmluZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChiaW5kQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtUGlja2VyIFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLVBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbY2xhc3NdPVwiJ21heC13LTRyZW0nXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVJbnB1dEJsb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lSW5wdXRCbG9jPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FIGVsc2UgZm9ybXVsYUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtcGlja2VyIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHNpLXRpbWUtcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1UZXh0LUJveCBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJzaG93Um93U3VtbWFyeVwiIGNsYXNzPVwiZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICAgICAge3tyb3dTdW1tYXJ5KGl0ZW0pfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgPHRyIGNsYXNzPVwidGZvb3RlclwiPlxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc2NvcGU9XCJjb2xcIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGQ+IC0tPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDoycmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjJyZW0gIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzY29wZT1cImNvbFwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPlRvdGFsPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgPCEtLTx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93Q29uc3VsdEJ1dHRvblwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgIDwvdGQ+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiBbc3R5bGVdPVwiY29sLnN0eWxlXCIgc2NvcGU9XCJjb2xcIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIj5cclxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wuaGF2ZVN1bW1hcnlcIj5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCI+XHJcbiAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRlY2ltYWxPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lDb2RlXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1EZWNpbWFsLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtRGlzcGxheSBbZm9ybWF0RGVjaW1hbF09XCJjb2wuZm9ybWF0RGVjaW1hbFwiIFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlci1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktUmF0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gRGVmYXVsdCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAge3tnZXRTdW1tYXJ5KGNvbCl9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cInN1bW1hcnlcIj5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIHt7J1RvdGFsUmVjb3Jkc0NvdW50JyB8IGxvY2FsaXplIH19IHt7Z3JpZERhdGEubGVuZ3RofX1cclxuICAgICAgPC90cj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgPC9wLXRhYmxlPlxyXG4gIDxkaXY+XHJcbiAgICA8VHNpLUJ1dHRvbiAqbmdJZj1cInNob3dBZGRCdXR0b25cIiBzdHlsZT1cImhlaWdodDogMjBweDt3aWR0aDogMjBweDtcIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1wbHVzXCIgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9ham91dGVyXCJcclxuICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1zdWNjZXNzIHAtYnV0dG9uLXRleHQgcC1idXR0b24gcC1jb21wb25lbnQgcC1idXR0b24taWNvbi1vbmx5IG5nLXN0YXItaW5zZXJ0ZWRcIlxyXG4gICAgICAoY2xpY2spPVwiYWRkUm93KClcIj48L1RzaS1CdXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
684
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUtZ3JpZC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90c2ktc2hhcmVkLXVpL3NyYy9saWIvdHNpLWNvbXBvbmVudHMvaW5wdXQtY29tcG9uZW50cy9lZGl0YWJsZS1ncmlkL2VkaXRhYmxlLWdyaWQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHNpLXNoYXJlZC11aS9zcmMvbGliL3RzaS1jb21wb25lbnRzL2lucHV0LWNvbXBvbmVudHMvZWRpdGFibGUtZ3JpZC9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSTNILE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0csT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0seURBQXlELENBQUM7QUFDbkcsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFbEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFRekYsTUFBTSxPQUFPLHFCQUFzQixTQUFRLFlBQVk7SUFvRHJELElBQUksT0FBTztRQUNULE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN2QixDQUFDO0lBRUQsSUFBYSxPQUFPLENBQUMsS0FBd0I7UUFDM0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMs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QXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxnQkFBZ0I7c0JBQXpCLE1BQU07Z0JBQ0cseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUdvQyxFQUFFO3NCQUE1QyxTQUFTO3VCQUFDLElBQUksRUFBRSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUU7Z0JBRXpCLEVBQUU7c0JBQVYsS0FBSztnQkFxVE4saUJBQWlCO3NCQURoQixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgaW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNvcnRFdmVudCwgVGFibGVTdGF0ZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgVGFibGUsIFRhYmxlUm93U2VsZWN0RXZlbnQsIFRhYmxlUm93VW5TZWxlY3RFdmVudCB9IGZyb20gJ3ByaW1lbmcvdGFibGUnO1xyXG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgcnRsTW9kZUtleXMgfSBmcm9tICcuLi8uLi8uLi9jb25zdHMvbG9jYWxzLmNvbnN0JztcclxuaW1wb3J0IHsgQnV0dG9uVHlwZSwgR3JpZFNlbGVjdGlvbk1vZGUsIElucHV0VHlwZXMsIE1vZGFsU2l6ZUVudW0sIFRvb2x0aXBQb3NpdGlvbiB9IGZyb20gJy4uLy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgQ2VsbENoYW5nZWRSZXN1bHQsIEdyaWRDb2x1bW4sIElHcmlkQ29uZmlndXJhdGlvbiwgUm93QWRkZWRSZXN1bHQgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgTG9jYWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vLi4vcGlwZXMvbG9jYWxpemUucGlwZSc7XHJcbmltcG9ydCB7IEVudGl0eVZhbGlkYXRpb25zU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3ZhbGlkYXRpb24vZW50aXR5LXZhbGlkYXRpb25zLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBHZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzJztcclxuaW1wb3J0IHsgRm9ybVN0YXRlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Zvcm0vZm9ybS1zdGF0ZSc7XHJcbmltcG9ydCB7IFRzaUlucHV0QmFzZSB9IGZyb20gJy4uLy4uLy4uL3RzaS1iYXNlL3RzaS1pbnB1dC1iYXNlL3RzaS1pbnB1dC1iYXNlLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ1RzaS1HZW5lcmljLUVkaXRhYmxlLUdyaWQnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9lZGl0YWJsZS1ncmlkLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgcHJvdmlkZXJzOiBbR2VuZXJpY1ZhbGlkYXRpb25TdGF0ZVNlcnZpY2VdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUdyaWRDb21wb25lbnQgZXh0ZW5kcyBUc2lJbnB1dEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcblxyXG4gIC8vI3JlZ2lvbiBsb2NhbCB2YXJzXHJcbiAgLy8jcmVnaW9uIHByaXZhdGUgbG9jYWwgdmFyc1xyXG4gIHByaXZhdGUgc2F2ZUV2ZW50U3Vic2NyaXB0aW9uPzogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgX2lzQXV0b1Jvd051bWJlcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2F1dG9Sb3dOdW1iZXJGaWVsZDogc3RyaW5nID0gJyc7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFJvd051bWJlcjogbnVtYmVyID0gMDtcclxuICB0b29sdGlwUG9zaXRpb24gPSBUb29sdGlwUG9zaXRpb247XHJcbiAgaXNBcjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2dyaWREYXRhOiBBcnJheTxhbnk+ID0gW107XHJcbiAgcHJpdmF0ZSBfZXF1YXRhYmxlRmllbGRzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX3N1bUF0RnVzaW9uRmllbGRzOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VxdWFsaXR5Q2hlY2tPbjogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2Y2U291cmNlUm93OiBhbnkgPSBudWxsO1xyXG4gIHByaXZhdGUgX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdDogUm93QWRkZWRSZXN1bHQgfCBudWxsID0gbnVsbDtcclxuICBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlID0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGU7XHJcbiAgLy8jZW5kcmVnaW9uXHJcbiAgaW5wdXRUeXBlcyA9IElucHV0VHlwZXM7XHJcbiAgbW9kYWxTaXplID0gTW9kYWxTaXplRW51bS5FeHRyYUxhcmdlO1xyXG4gIEBWaWV3Q2hpbGQoXCJlZGl0YWJsZVRhYmxlXCIpIGVkaXRhYmxlVGFibGU/OiBUYWJsZVxyXG5cclxuICBidXR0b25UeXBlID0gQnV0dG9uVHlwZTtcclxuXHJcbiAgQElucHV0KCkgc2VsZWN0ZWRJdGVtczogYW55ID0gW107XHJcbiAgc2VsZWN0ZWRJdGVtOiBhbnk7XHJcblxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICAvLyNyZWdpb24gSW5wdXRzXHJcbiAgQElucHV0KCdjb25maWd1cmF0aW9uJykgY29uZmlndXJhdGlvbj86IElHcmlkQ29uZmlndXJhdGlvbjtcclxuICBASW5wdXQoJ2tleScpIGtleTogc3RyaW5nID0gJ3VpZCc7XHJcbiAgQElucHV0KCkgaXRlbXM6IEFycmF5PGFueT4gPSBbXTtcclxuICBASW5wdXQoJ2V2ZW50cycpIHNhdmVFdmVudD86IE9ic2VydmFibGU8dm9pZD47XHJcbiAgQElucHV0KCkgc2hvd0FkZEJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93RGVsZXRlQnV0dG9uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG4gIEBJbnB1dCgpIHNob3dFZGl0QnV0dG9uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG4gIEBJbnB1dCgpIHNob3dSb3dTdW1tYXJ5OiBib29sZWFuID0gZmFsc2U7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuXHJcbiAgQElucHV0KCkgc2Nyb2xsSGVpZ2h0OiBzdHJpbmcgPSAnNTAwcHgnO1xyXG4gIEBJbnB1dCgpIHJvd1BlclBhZ2U6IG51bWJlcltdID0gWzUsIDEwLCAyMF07XHJcbiAgLy8gQElucHV0KCkgaXNQYWdpbmF0b3I6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIEBJbnB1dCgpIHBhZ2VTaXplOiBudW1iZXIgPSA1XHJcbiAgQElucHV0KCkgZW50aXR5UHJpbWFyeUtleU5hbWUgOiBzdHJpbmcgPSAndWlkJ1xyXG5cclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG4gIHNlbGVjdGVkQ29sdW1uczogQXJyYXk8R3JpZENvbHVtbj4gPSBbXTtcclxuICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIHByaXZhdGUgX3RlbXBDb2x1bW5zOiBBcnJheTxHcmlkQ29sdW1uPiA9IFtdO1xyXG4gIGdldCBjb2x1bW5zKCk6IEFycmF5PEdyaWRDb2x1bW4+IHtcclxuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IGNvbHVtbnModmFsdWU6IEFycmF5PEdyaWRDb2x1bW4+KSB7XHJcbiAgICB2YWx1ZS5mb3JFYWNoKGVsID0+IGVsLnRyYW5zbGF0ZWRIZWFkZXIgPSB0aGlzLl9sb2NhbGl6ZVBpcGUudHJhbnNmb3JtKGVsLmhlYWRlciA/PyBcIlwiKSk7XHJcbiAgICB0aGlzLl9jb2x1bW5zID0gdmFsdWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuX2NvbHVtbnM7XHJcblxyXG4gICAgdGhpcy5fdmVyaWZ5R3JpZFJlcXVpcmVtZW50cygpO1xyXG4gICAgdGhpcy5faW5pdEN1cnJlbnRSb3dOdW1iZXJBbmRPcmRlckJ5Um93TnVtYmVyKCk7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBncmlkRGF0YShkYXRhOiBBcnJheTxhbnk+KSB7XHJcbiAgICB0aGlzLl9ncmlkRGF0YSA9IGRhdGE7XHJcbiAgICB0aGlzLl9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTtcclxuICB9XHJcbiAgZ2V0IGdyaWREYXRhKCkgeyByZXR1cm4gdGhpcy5fZ3JpZERhdGE7IH1cclxuXHJcbiAgQElucHV0KCkgaXNUYWJsZUxvYWRpbmc/OiBib29sZWFuO1xyXG5cclxuXHJcbiAgQElucHV0KCkgcGFyZW50OiBhbnk7XHJcbiAgQElucHV0KCkgZXZlbnRzPzogT2JzZXJ2YWJsZTx2b2lkPjsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG5cclxuICBASW5wdXQoKSBzaG93U2F2ZUJ1dHRvbjogYm9vbGVhbiA9IHRydWU7Ly9UTyBETyBTYXZlIEJ1dHRvbiBPcHRpb25cclxuICBASW5wdXQoKSBzaG93QWN0aW9uQ29sdW1uOiBib29sZWFuID0gdHJ1ZTsvL1RPIERPIFNhdmUgQnV0dG9uIE9wdGlvblxyXG5cclxuXHJcbiAgQElucHV0KCkgZW5hYmxlUm93RGlzYWJsaW5nOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIEBJbnB1dCgpIHJvd1N1bW1hcnlDb25maWc6IEFycmF5PHN0cmluZz4gPSBbXTtcclxuICBASW5wdXQoKSBzaG93SGF2ZVN1bWFyeT86IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBzaG93Um93U3VtYXJ5PzogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvKipzZWxlY3Rpb24gKi9cclxuICBASW5wdXQoKSBzZWxlY3RLZXlPbmx5OiBib29sZWFuID0gdHJ1ZTtcclxuICBASW5wdXQoKSBzZWxlY3Rpb25Nb2RlOiBHcmlkU2VsZWN0aW9uTW9kZSB8IGFueSA9IEdyaWRTZWxlY3Rpb25Nb2RlLlNpbmdsZTtcclxuICBASW5wdXQoKSBzaG93Q29uc3VsdEJ1dHRvbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzOiBzdHJpbmcgPSBcIlwiO1xyXG4gIGdldCBlZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2VkaXRhYmxlR3JpZEJ1c2luZXNzQ2xhc3M7XHJcbiAgfVxyXG4gIEBJbnB1dCgpIHNldCBlZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKGNsYXNzTmFtZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzID0gY2xhc3NOYW1lO1xyXG4gICAgdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZT8ubG9hZEVudGl0eVZhbGlkYXRpb25JbmZvcyh0aGlzLl9lZGl0YWJsZUdyaWRCdXNpbmVzc0NsYXNzKTtcclxuICB9XHJcblxyXG5cclxuICAvKipvcmRlciAqL1xyXG4gIEBJbnB1dCgpIG9yZGVyQ29sdW1uOiBzdHJpbmcgPSAndWlkJztcclxuXHJcbiAgQElucHV0KCkgZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkITogKGl0ZW06IGFueSkgPT4gYW55XHJcblxyXG4gIEBJbnB1dCgpIHNob3dEdXBsaWNhdGVCdXR0b246IGJvb2xlYW4gPSB0cnVlO1xyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIE91dHB1dHNcclxuICBAT3V0cHV0KCkgaXRlbXNTYXZlOiBFdmVudEVtaXR0ZXI8YW55W10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXT4oKTtcclxuICAvKipcclxuICAgKlxyXG4gICAqL1xyXG5cclxuXHJcbiAgQE91dHB1dCgpIHJlZnJlc2hFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICAvL0BPdXRwdXQoKSBhY3Rpb25FdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxHcmlkQWN0aW9uRW1pdFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEdyaWRBY3Rpb25FbWl0UmVzdWx0PigpO1xyXG5cclxuICBAT3V0cHV0KCkgc2F2ZURhdGFFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG5cclxuICBAT3V0cHV0KCkgcm93Q2hhbmdlZEV2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFJvd0V2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIEBPdXRwdXQoKSBhZGRlZFJvd0V2ZW50RW1pdHRlcjogRXZlbnRFbWl0dGVyPFJvd0FkZGVkUmVzdWx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Um93QWRkZWRSZXN1bHQ+KClcclxuXHJcbiAgQE91dHB1dCgpIGZvY3VzT3V0RXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBjZWxsQ2hhbmdlZDogRXZlbnRFbWl0dGVyPENlbGxDaGFuZ2VkUmVzdWx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2VsbENoYW5nZWRSZXN1bHQ+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSByb3dEZWxldGVkRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZEl0ZW1zQ2hhbmdlOiBFdmVudEVtaXR0ZXI8QXJyYXk8YW55Pj4gPSBuZXcgRXZlbnRFbWl0dGVyPEFycmF5PGFueT4+KCk7XHJcblxyXG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgZm9jdXNPdXRSb3c6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIG9uQ29uc3VsdENsaWNrZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQE91dHB1dCgpIHJvd0R1cGxpY2F0ZWRFdmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxSb3dBZGRlZFJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPFJvd0FkZGVkUmVzdWx0PigpO1xyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxuICBAVmlld0NoaWxkKFwiZHRcIiwgeyBzdGF0aWM6IGZhbHNlIH0pIHB1YmxpYyBkdDogVGFibGUgfCB1bmRlZmluZWQ7XHJcblxyXG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nO1xyXG5cclxuICBwcml2YXRlIF9lbnRpdHlWYWxpZGF0aW9uc1NlcnZpY2UgPSBpbmplY3QoRW50aXR5VmFsaWRhdGlvbnNTZXJ2aWNlKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9jYWxpemVQaXBlOiBMb2NhbGl6ZVBpcGUpIHtcclxuICAgIHN1cGVyKClcclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xyXG4gICAgc3VwZXIubmdPbkluaXQoKVxyXG4gICAgdGhpcy5faW5pdFNhdmVFdmVudFN1YnNjcmlwdGlvbigpO1xyXG4gICAgdGhpcy5fdmVyaWZ5R3JpZFJlcXVpcmVtZW50cygpO1xyXG4gICAgdGhpcy5faW5pdEN1cnJlbnRSb3dOdW1iZXJBbmRPcmRlckJ5Um93TnVtYmVyKCk7XHJcbiAgICB0aGlzLl9pbml0RXF1YXRhYmxlRmllbGRzKCk7XHJcbiAgICB0aGlzLl9pbml0U3VtQXRGdXNpb25GaWVsZHMoKTtcclxuICAgIFxyXG4gICAgbGV0IGxhbmd1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHJ0bE1vZGVLZXlzLnJ0bE1vZGVFbmFibGVkKTtcclxuICAgIFxyXG4gICAgaWYgKGxhbmd1ZSAmJiBKU09OLnBhcnNlKGxhbmd1ZSkpIHtcclxuICAgICAgdGhpcy5pc0FyID0gdHJ1ZVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuaXNBciA9IGZhbHNlXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ29sdW1ucyB8fCB0aGlzLnNlbGVjdGVkQ29sdW1ucy5sZW5ndGggPT0gMCkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHRoaXMuY29sdW1uc1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICB0aGlzLl90ZW1wQ29sdW1ucyA9IHRoaXMuY29sdW1ucztcclxuICB9XHJcblxyXG4gIGZpbmRDb2x1bW5CeUtleShrZXk6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICBmb3IgKGxldCBjb2wgb2YgdGhpcy5jb2x1bW5zKSB7XHJcbiAgICAgICAgaWYgKGNvbC5oZWFkZXIgPT09IGtleSB8fCBjb2wuZmllbGQgPT09IGtleSkgcmV0dXJuIGNvbDtcclxuICAgICAgICBlbHNlIGNvbnRpbnVlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbFxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyByZXN0b3JlU3RhdGUoY29uZmlndXJhdGlvbjogc3RyaW5nKSB7XHJcbiAgICBsZXQgc3RhdGU6IFRhYmxlU3RhdGUgPSBKU09OLnBhcnNlKGNvbmZpZ3VyYXRpb24pXHJcbiAgICBpZiAodGhpcy5kdCkge1xyXG4gICAgICBpZiAodGhpcy5kdCkge1xyXG5cclxuICAgICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICAgIHRoaXMuZHQudGFibGVXaWR0aFN0YXRlID0gc3RhdGUudGFibGVXaWR0aDtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbk9yZGVyID0gc3RhdGUuY29sdW1uT3JkZXI7XHJcblxyXG4gICAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgICAgbGV0IHJlb3JkZXJlZENvbHVtbnMgPSB0aGlzLmdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXIpO1xyXG4gICAgICAgICAgdGhpcy5jb2x1bW5zID0gcmVvcmRlcmVkQ29sdW1ucztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFJlb3JkZXJlZENvbHVtbnMoY29sdW1uT3JkZXI6IHN0cmluZ1tdKTogYW55W10ge1xyXG4gICAgbGV0IHJlb3JkZXJlZENvbHVtbnM6IGFueVtdID0gW107XHJcblxyXG4gICAgY29sdW1uT3JkZXIubWFwKChrZXkpID0+IHtcclxuICAgICAgbGV0IGNvbCA9IHRoaXMuZmluZENvbHVtbkJ5S2V5KGtleSk7XHJcbiAgICAgIGlmIChjb2wpIHtcclxuICAgICAgICByZW9yZGVyZWRDb2x1bW5zLnB1c2goY29sKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgfVxyXG5cclxuICByZXNldFNlbGVjdGVkQ29sdW1ucyhjb25maWd1cmF0aW9uOiBzdHJpbmcpIHtcclxuICAgIGxldCBzdGF0ZTogVGFibGVTdGF0ZSA9IEpTT04ucGFyc2UoY29uZmlndXJhdGlvbilcclxuICAgIGlmICh0aGlzLmR0KSB7XHJcblxyXG4gICAgICB0aGlzLmR0LmNvbHVtbldpZHRoc1N0YXRlID0gc3RhdGUuY29sdW1uV2lkdGhzO1xyXG4gICAgICB0aGlzLmR0LnRhYmxlV2lkdGhTdGF0ZSA9IHN0YXRlLnRhYmxlV2lkdGg7XHJcblxyXG4gICAgICBsZXQgY29sdW1uT3JkZXIgPSBzdGF0ZS5jb2x1bW5PcmRlcjtcclxuXHJcbiAgICAgIGlmIChjb2x1bW5PcmRlcikge1xyXG4gICAgICAgIHRoaXMuY29sdW1ucyA9IHRoaXMuX3RlbXBDb2x1bW5zO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCByZW9yZGVyZWRDb2x1bW5zID0gdGhpcy5nZXRSZW9yZGVyZWRDb2x1bW5zKGNvbHVtbk9yZGVyKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkQ29sdW1ucyA9IHJlb3JkZXJlZENvbHVtbnM7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFN0YXRlKCkge1xyXG4gICAgbGV0IHN0YXRlOiBUYWJsZVN0YXRlID0ge307XHJcblxyXG4gICAgaWYgKCF0aGlzLmR0KSB7XHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmR0LnJlc2l6YWJsZUNvbHVtbnMpIHtcclxuICAgICAgdGhpcy5kdC5zYXZlQ29sdW1uV2lkdGhzKHN0YXRlKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmR0LnNhdmVDb2x1bW5PcmRlcihzdGF0ZSk7XHJcblxyXG4gICAgcmV0dXJuIHN0YXRlXHJcbiAgfVxyXG5cclxuICBpc0RlbGV0ZUJ1dHRvbkRpc2FibGVkKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZGVsZXRlTGluZUJ1dHRvbkRpc2FibGVkICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5kZWxldGVMaW5lQnV0dG9uRGlzYWJsZWQoaXRlbSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKVxyXG4gICAgdGhpcy5zYXZlRXZlbnRTdWJzY3JpcHRpb24/LnVuc3Vic2NyaWJlKCk7XHJcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nRHVwbGljYXRlRW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgaW5wdXRDaGFuZ2VkKGNvbDogR3JpZENvbHVtbikge1xyXG4gICAgaWYgKGNvbC53YXRjaEZvckNoYW5nZXMgPT09IHRydWUpIHtcclxuICAgICAgdGhpcy5zYXZlRGF0YUV2ZW50RW1pdHRlci5lbWl0KHRoaXMuZ3JpZERhdGEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2F2ZUl0ZW1zKCkge1xyXG4gICAgdGhpcy5pdGVtc1NhdmUuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICAgIHRoaXMuc2F2ZURhdGFFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLmdyaWREYXRhKTtcclxuICB9XHJcblxyXG4gIGFkZFJvdygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5ncmlkRGF0YSkge1xyXG4gICAgICB0aGlzLmdyaWREYXRhID0gW107XHJcbiAgICB9XHJcbiAgICBsZXQgbmV3Um93ID0gdGhpcy5faW5pdFJvdygpXHJcbiAgICB0aGlzLmdyaWREYXRhLnB1c2gobmV3Um93KVxyXG4gICAgdGhpcy5pc0RpcnR5ID0gdHJ1ZVxyXG4gICAgbGV0IHJvd0FkZGVkUmVzdWx0OiBSb3dBZGRlZFJlc3VsdCA9IHtcclxuICAgICAgcm93TnVtYmVyOiB0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDEsXHJcbiAgICAgIGRhdGE6IG5ld1Jvd1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmVkaXRhYmxlVGFibGU/LnNvcnRGaWVsZCAmJiB0aGlzLmVkaXRhYmxlVGFibGUuc29ydE9yZGVyKSB7XHJcbiAgICAgIHRoaXMuZWRpdGFibGVUYWJsZT8udmFsdWUucHVzaChuZXdSb3cpXHJcbiAgICB9XHJcbiAgICB0aGlzLnJlZnJlc2hTb3J0KClcclxuICAgIHRoaXMuYWRkZWRSb3dFdmVudEVtaXR0ZXIuZW1pdChyb3dBZGRlZFJlc3VsdClcclxuICB9XHJcblxyXG4gIGR1cGxpY2F0ZVJvdyhpdGVtOiBhbnksIHVwZGF0ZVNlbGVjdGlvbjogYm9vbGVhbiA9IHRydWUsIHNraXBFbWl0OiBib29sZWFuID0gZmFsc2UpOiBSb3dBZGRlZFJlc3VsdCB8IG51bGwge1xyXG4gICAgaWYgKCFpdGVtKSByZXR1cm4gbnVsbDtcclxuXHJcbiAgICBjb25zdCBkdXBsaWNhdGVkUm93ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpdGVtKSk7XHJcbiAgICBkdXBsaWNhdGVkUm93W3RoaXMuZW50aXR5UHJpbWFyeUtleU5hbWVdID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIGlmICh0aGlzLl9pc0F1dG9Sb3dOdW1iZXIpIHtcclxuICAgICAgZHVwbGljYXRlZFJvd1t0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdID0gdGhpcy5fbmV4dFJvd051bWJlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZ3JpZERhdGEucHVzaChkdXBsaWNhdGVkUm93KTtcclxuICAgIHRoaXMuaXNEaXJ0eSA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0T3JkZXIpIHtcclxuICAgICAgdGhpcy5lZGl0YWJsZVRhYmxlPy52YWx1ZS5wdXNoKGR1cGxpY2F0ZWRSb3cpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVmcmVzaFNvcnQoKTtcclxuXHJcbiAgICBpZiAodXBkYXRlU2VsZWN0aW9uKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gZHVwbGljYXRlZFJvdztcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zID0gdGhpcy5zZWxlY3Rpb25Nb2RlID09IEdyaWRTZWxlY3Rpb25Nb2RlLk11bHRpcGxlXHJcbiAgICAgICAgPyBbZHVwbGljYXRlZFJvd11cclxuICAgICAgICA6IGR1cGxpY2F0ZWRSb3c7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzdWx0OiBSb3dBZGRlZFJlc3VsdCA9IHtcclxuICAgICAgcm93TnVtYmVyOiB0aGlzLmdyaWREYXRhLmxlbmd0aCAtIDEsXHJcbiAgICAgIGRhdGE6IGR1cGxpY2F0ZWRSb3dcclxuICAgIH07XHJcblxyXG4gICAgaWYgKCFza2lwRW1pdCkge1xyXG4gICAgICB0aGlzLmFkZGVkUm93RXZlbnRFbWl0dGVyLmVtaXQocmVzdWx0KTtcclxuICAgICAgdGhpcy5yb3dEdXBsaWNhdGVkRXZlbnRFbWl0dGVyLmVtaXQocmVzdWx0KTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcmVmcmVzaFNvcnQoKSB7XHJcbiAgICBpZiAodGhpcy5lZGl0YWJsZVRhYmxlPy5zb3J0RmllbGQpIHtcclxuICAgICAgY29uc3Qgc29ydEZpZWxkID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRGaWVsZDtcclxuICAgICAgY29uc3Qgc29ydE9yZGVyID0gdGhpcy5lZGl0YWJsZVRhYmxlLnNvcnRPcmRlcjtcclxuXHJcbiAgICAgIHRoaXMuZ3JpZERhdGEuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlQSA9IGFbc29ydEZpZWxkXTtcclxuICAgICAgICBjb25zdCB2YWx1ZUIgPSBiW3NvcnRGaWVsZF07XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IDA7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZUEgPCB2YWx1ZUIpIHJlc3VsdCA9IC0xO1xyXG4gICAgICAgIGVsc2UgaWYgKHZhbHVlQSA+IHZhbHVlQikgcmVzdWx0ID0gMTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAqIHNvcnRPcmRlcjtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICB0aGlzLmdyaWREYXRhID0gWy4uLnRoaXMuZ3JpZERhdGFdO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGVsZXRlKGl0ZW06IGFueSkge1xyXG4gICAgaWYgKHRoaXMuZWRpdGFibGVUYWJsZT8uc29ydEZpZWxkICYmIHRoaXMuZWRpdGFibGVUYWJsZS5zb3J0TW9kZSkge1xyXG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgIHRoaXMuZWRpdGFibGVUYWJsZS52YWx1ZS5zcGxpY2UoaW5kZXgsIDEpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IGluZGV4ID0gdGhpcy5ncmlkRGF0YS5pbmRleE9mKGl0ZW0sIDApO1xyXG4gICAgaWYgKGluZGV4ID4gLTEpIHtcclxuICAgICAgdGhpcy5ncmlkRGF0YS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICB0aGlzLmlzRGlydHkgPSB0cnVlXHJcbiAgICAgIHRoaXMuX29uRGVsZXRlUm93KGl0ZW0pO1xyXG4gICAgICB0aGlzLnJvd0RlbGV0ZWRFdmVudEVtaXR0ZXIuZW1pdCh0aGlzLmdyaWREYXRhKVxyXG4gICAgfVxyXG4gICAgdGhpcy5yZWZyZXNoU29ydCgpXHJcbiAgfVxyXG5cclxuICBnZXRTdW1tYXJ5KGNvbDogR3JpZENvbHVtbik6IG51bWJlciB7XHJcbiAgICBpZiAoY29sLmhhdmVTdW1tYXJ5ID09IHRydWUpIHtcclxuXHJcbiAgICAgIGxldCBzdW0gPSAwO1xyXG4gICAgICB0aGlzLmdyaWREYXRhLmZvckVhY2goKHJvdzogYW55KSA9PiB7XHJcbiAgICAgICAgc3VtICs9IHJvd1tjb2wuZmllbGRdO1xyXG4gICAgICB9KVxyXG4gICAgICByZXR1cm4gc3VtO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICByb3dTdW1tYXJ5KHJvdzogYW55KTogbnVtYmVyIHtcclxuICAgIGxldCBzdW0gPSAwO1xyXG4gICAgdGhpcy5jb2x1bW5zLmZvckVhY2goY29sID0+IHtcclxuICAgICAgaWYgKGNvbC5yb3dTdW1tYXJ5ID09IHRydWUpIHtcclxuICAgICAgICBzdW0gKz0gcm93W2NvbC5maWVsZF07XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHN1bTtcclxuXHJcbiAgfVxyXG5cclxuICBvblJvd1NlbGVjdGVkKGV2ZW50OiBUYWJsZVJvd1NlbGVjdEV2ZW50KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRlbSA9IGV2ZW50LmRhdGE7XHJcbiAgICB0aGlzLl9mNlNvdXJjZVJvdyA9IG51bGw7XHJcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nRHVwbGljYXRlRW1pdCgpO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0S2V5T25seSA9PSB0cnVlKSB7XHJcbiAgICAgIGxldCBzZWxlY3Rpb25LZXk6IGFueTtcclxuICAgICAgc2VsZWN0aW9uS2V5ID0gdGhpcy5zZWxlY3RlZEl0ZW1bdGhpcy5rZXldO1xyXG4gICAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQoc2VsZWN0aW9uS2V5KTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQodGhpcy5zZWxlY3RlZEl0ZW1zKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uUm93VW5zZWxlY3QoZXZlbnQ6IFRhYmxlUm93VW5TZWxlY3RFdmVudCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLl9mNlNvdXJjZVJvdyA9IG51bGw7XHJcbiAgICB0aGlzLl9jYW5jZWxQZW5kaW5nRHVwbGljYXRlRW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW9uQ2hhbmdlKGV2ZW50OiBhbnkpIHtcclxuXHJcbiAgICBsZXQgc2VsZWN0aW9uOiBhbnlbXSA9IFtdO1xyXG5cclxuICAgIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT0gR3JpZFNlbGVjdGlvbk1vZGUuTXVsdGlwbGUpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtcykge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdEtleU9ubHkpIHtcclxuICAgICAgICAgIGxldCBrZXlzOiBBcnJheTxhbnk+ID0gW107XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZm9yRWFjaCgodjogYW55KSA9PiB7IGtleXMucHVzaCh2W3RoaXMua2V5XSkgfSk7XHJcbiAgICAgICAgICBzZWxlY3Rpb24gPSBrZXlzO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgc2VsZWN0aW9uID0gW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PSBHcmlkU2VsZWN0aW9uTW9kZS5TaW5nbGUpIHtcclxuICAgICAgaWYgKHRoaXMuc2VsZWN0S2V5T25seSkge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcyA/IFt0aGlzLnNlbGVjdGVkSXRlbXNbdGhpcy5rZXldXSA6IFtdO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0ZWRJdGVtcyA/IFt0aGlzLnNlbGVjdGVkSXRlbXNdIDogW107XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlICE9IEdyaWRTZWxlY3Rpb25Nb2RlLk5vbmUpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zQ2hhbmdlLmVtaXQoc2VsZWN0aW9uKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaGFuZGxlS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50LmNvZGUgPT09ICdTcGFjZScpIHtcclxuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDprZXlkb3duJywgWyckZXZlbnQnXSlcclxuICBoYW5kbGVHcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKGV2ZW50LmtleSA9PT0gJ0Y2Jykge1xyXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG5cclxuICAgICAgY29uc3Qgc291cmNlID0gdGhpcy5fZjZTb3VyY2VSb3cgPz8gdGhpcy5zZWxlY3RlZEl0ZW07XHJcbiAgICAgIGlmICghc291cmNlKSByZXR1cm47XHJcblxyXG4gICAgICBjb25zdCBpc0ZpcnN0RHVwbGljYXRlID0gIXRoaXMuX2Y2U291cmNlUm93O1xyXG4gICAgICB0aGlzLl9mNlNvdXJjZVJvdyA9IHNvdXJjZTtcclxuXHJcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuZHVwbGljYXRlUm93KHNvdXJjZSwgaXNGaXJzdER1cGxpY2F0ZSwgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAocmVzdWx0ICYmICF0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCA9IHJlc3VsdDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXIpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcGVuZGluZ0R1cGxpY2F0ZUVtaXRUaW1lcik7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVFbWl0VGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCkge1xyXG4gICAgICAgICAgdGhpcy5hZGRlZFJvd0V2ZW50RW1pdHRlci5lbWl0KHRoaXMuX3BlbmRpbmdEdXBsaWNhdGVSZXN1bHQpO1xyXG4gICAgICAgICAgdGhpcy5yb3dEdXBsaWNhdGVkRXZlbnRFbWl0dGVyLmVtaXQodGhpcy5fcGVuZGluZ0R1cGxpY2F0ZVJlc3VsdCk7XHJcbiAgICAgICAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0ID0gbnVsbDtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIDMwMCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkZvY3VzT3V0Um93KGl0ZW06IGFueSkge1xyXG4gICAgdGhpcy5mb2N1c091dFJvdy5lbWl0KGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgY3VzdG9tU29ydChldmVudDogU29ydEV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuZGF0YSAhPSBudWxsICYmIGV2ZW50LmRhdGEgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGV2ZW50LmRhdGEuc29ydCgoZGF0YTEsIGRhdGEyKSA9PiB7XHJcbiAgICAgICAgaWYgKGV2ZW50LmZpZWxkICE9IG51bGwgJiYgZXZlbnQuZmllbGQgIT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yZGVyKSB7XHJcbiAgICAgICAgICBsZXQgdmFsdWUxID0gZGF0YTFbZXZlbnQuZmllbGRdO1xyXG4gICAgICAgICAgbGV0IHZhbHVlMiA9IGRhdGEyW2V2ZW50LmZpZWxkXTtcclxuICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsO1xyXG5cclxuICAgICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCAmJiB2YWx1ZTIgIT0gbnVsbClcclxuICAgICAgICAgICAgcmVzdWx0ID0gLTE7XHJcbiAgICAgICAgICBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCAmJiB2YWx1ZTIgPT0gbnVsbClcclxuICAgICAgICAgICAgcmVzdWx0ID0gMTtcclxuICAgICAgICAgIGVsc2UgaWYgKHZhbHVlMSA9PSBudWxsICYmIHZhbHVlMiA9PSBudWxsKVxyXG4gICAgICAgICAgICByZXN1bHQgPSAwO1xyXG4gICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlMSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlMiA9PT0gJ3N0cmluZycpXHJcbiAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlMS5sb2NhbGVDb21wYXJlKHZhbHVlMik7XHJcbiAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJlc3VsdCA9ICh2YWx1ZTEgPCB2YWx1ZTIpID8gLTEgOiAodmFsdWUxID4gdmFsdWUyKSA/IDEgOiAwO1xyXG5cclxuICAgICAgICAgIHJldHVybiAoZXZlbnQub3JkZXIgKiByZXN1bHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjb25zdWx0KGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ29uc3VsdENsaWNrZWQuZW1pdChrZXkpO1xyXG4gIH1cclxuXHJcbiAgb25DZWxsVmFsdWVDaGFuZ2VkKGNvbDogR3JpZENvbHVtbiwgbmV3VmFsdWU6IGFueSwgaXRlbTogYW55KTogdm9pZCB7XHJcbiAgICAvLyBzZW5kIGV2ZW50c1xyXG4gICAgaWYgKGNvbC53YXRjaEZvckNoYW5nZXMgPT09IHRydWUpIHtcclxuXHJcbiAgICAgIGxldCBjZWxsQ2hhbmdlZFJlc3VsdDogQ2VsbENoYW5nZWRSZXN1bHQgPSB7XHJcbiAgICAgICAga2V5OiBpdGVtW3RoaXMua2V5XSxcclxuICAgICAgICBmaWVsZDogY29sLmZpZWxkLFxyXG4gICAgICAgIG5ld1ZhbHVlOiBuZXdWYWx1ZVxyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuY2VsbENoYW5nZWQuZW1pdChjZWxsQ2hhbmdlZFJlc3VsdCk7XHJcblxyXG4gICAgICB0aGlzLnNhdmVEYXRhRXZlbnRFbWl0dGVyLmVtaXQodGhpcy5ncmlkRGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gcmVjYWxjdWxhdGUgY3VycmVudFJvd051bWJlclxyXG4gICAgaWYgKGNvbC5maWVsZCA9PT0gdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkKSB7XHJcbiAgICAgIHRoaXMuX29yZGVyQnlSb3dOdW1iZXIoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBjaGVjayBmb3IgZHVwbGljYXRlZCByb3dzXHJcbiAgICAvLyBpZih0aGlzLl9lcXVhbGl0eUNoZWNrT24gJiYgY29sLmlzRXF1YXRhYmxlQ3JpdGVyaWEpe1xyXG4gICAgLy8gICBjb25zb2xlLmxvZygnZm91bmQgZXF1YXRhYmxlIDogY29sOicsIGNvbCwgJ3JvdyA6ICcsIGl0ZW0pO1xyXG4gICAgLy8gICB0aGlzLl90cnlGaW5kRXF1YXRhYmxlKGl0ZW0pO1xyXG4gICAgLy8gfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHVwZGF0ZUZvcm1TdGF0ZShmb3JtU3RhdGU6IEZvcm1TdGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmdlbmVyaWNWYWxpZGF0aW9uU3RhdGVTZXJ2aWNlKVxyXG4gICAge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5nZW5lcmljVmFsaWRhdGlvblN0YXRlU2VydmljZS51cGRhdGVGb3JtU3RhdGUoZm9ybVN0YXRlKTtcclxuICB9XHJcblxyXG4gIC8vI3JlZ2lvbiBwcml2YXRlIG1ldGhvZHNcclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFJvdygpIHtcclxuICAgIGxldCBuZXdSb3c6IGFueSA9IHt9O1xyXG4gICAgaWYgKHRoaXMuY29sdW1ucykge1xyXG4gICAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaChjb2wgPT4ge1xyXG4gICAgICAgIGlmIChjb2wudHlwZSA9PSBJbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVRcclxuICAgICAgICAgIHx8IGNvbC50eXBlID09IElucHV0VHlwZXMuUkFURV9JTlBVVFxyXG4gICAgICAgICAgfHwgY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5JTlRFR0VSXHJcbiAgICAgICAgICB8fCBjb2wudHlwZSA9PSBJbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVRcclxuICAgICAgICAgIHx8IGNvbC50eXBlID09IElucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQpIHtcclxuICAgICAgICAgIG5ld1Jvd1tjb2wuZmllbGRdID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAoY29sLnR5cGUgPT0gSW5wdXRUeXBlcy5DSEVDS0JPWCkge1xyXG4gICAgICAgICAgbmV3Um93W2NvbC5maWVsZF0gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBuZXdSb3dbY29sLmZpZWxkXSA9IHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHRoaXMuX2lzQXV0b1Jvd051bWJlciA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIG5ld1Jvd1t0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdID0gdGhpcy5fbmV4dFJvd051bWJlcigpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBuZXdSb3dcclxuICAgIH1cclxuICAgIHJldHVybiBuZXdSb3c7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0U2F2ZUV2ZW50U3Vic2NyaXB0aW9uKCkge1xyXG4gICAgdGhpcy5zYXZlRXZlbnRTdWJzY3JpcHRpb24gPSB0aGlzLmV2ZW50cz8uc3Vic2NyaWJlKFxyXG4gICAgICAoKSA9PiB0aGlzLnNhdmVJdGVtcygpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdmVyaWZ5R3JpZFJlcXVpcmVtZW50cygpIHtcclxuICAgIGlmICh0aGlzLmNvbHVtbnMgPT0gbnVsbFxyXG4gICAgICB8fCB0aGlzLmNvbHVtbnMgPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgYmUgbnVsbCcpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGxldCByb3dOdW1iZXJDb2x1bW5zID0gdGhpcy5jb2x1bW5zLmZpbHRlcihjID0+IGMuaXNBdXRvUm93TnVtYmVyQ29sdW1uID09PSB0cnVlKTtcclxuXHJcbiAgICBpZiAocm93TnVtYmVyQ29sdW1ucy5sZW5ndGggPiAxKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignZ3JpZCBjb2x1bW5zIGNhblxcJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIFJvd051bWJlckNvbHVtbicpXHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmIChyb3dOdW1iZXJDb2x1bW5zLmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgIHRoaXMuX2lzQXV0b1Jvd051bWJlciA9IHRydWU7XHJcbiAgICAgIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCA9IHJvd051bWJlckNvbHVtbnNbMF0uZmllbGQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0Q3VycmVudFJvd051bWJlckFuZE9yZGVyQnlSb3dOdW1iZXIoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5faXNBdXRvUm93TnVtYmVyID09PSB0cnVlXHJcbiAgICAgICYmIHRoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZCAhPSB1bmRlZmluZWRcclxuICAgICAgJiYgdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkICE9IG51bGxcclxuICAgICAgJiYgdGhpcy5ncmlkRGF0YS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuX29yZGVyQnlSb3dOdW1iZXIoKTtcclxuXHJcbiAgICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIgPSB0aGlzLmdyaWREYXRhW3RoaXMuZ3JpZERhdGEubGVuZ3RoIC0gMV1bdGhpcy5fYXV0b1Jvd051bWJlckZpZWxkXTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX25leHRSb3dOdW1iZXIoKTogbnVtYmVyIHtcclxuICAgIHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIgPSB0aGlzLmdyaWREYXRhLmxlbmd0aCArIDE7XHJcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudFJvd051bWJlcjtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX29uRGVsZXRlUm93KHJvdzogYW55KTogdm9pZCB7XHJcbiAgICBpZiAocm93W3RoaXMuX2F1dG9Sb3dOdW1iZXJGaWVsZF0gPT09IHRoaXMuX2N1cnJlbnRSb3dOdW1iZXIpIHtcclxuICAgICAgdGhpcy5fY3VycmVudFJvd051bWJlci0tO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfb3JkZXJCeVJvd051bWJlcigpOiB2b2lkIHtcclxuICAgIHRoaXMuZ3JpZERhdGEuc29ydCgoYSwgYikgPT4geyByZXR1cm4gYVt0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdIC0gYlt0aGlzLl9hdXRvUm93TnVtYmVyRmllbGRdOyB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRFcXVhdGFibGVGaWVsZHMoKTogdm9pZCB7XHJcbiAgICBsZXQgZXF1YXRhYmxlQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzRXF1YXRhYmxlQ3JpdGVyaWEgPT0gdHJ1ZSk7XHJcbiAgICBpZiAoZXF1YXRhYmxlQ29sdW1ucykge1xyXG4gICAgICB0aGlzLl9lcXVhbGl0eUNoZWNrT24gPSB0cnVlO1xyXG4gICAgICB0aGlzLl9lcXVhdGFibGVGaWVsZHMgPSBlcXVhdGFibGVDb2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfaW5pdFN1bUF0RnVzaW9uRmllbGRzKCk6IHZvaWQge1xyXG4gICAgbGV0IHN1bUF0RnVzaW9uQ29sdW1ucyA9IHRoaXMuY29sdW1ucy5maWx0ZXIoYyA9PiBjLmlzU3VtQXRGdXNpb24gPT0gdHJ1ZSk7XHJcbiAgICBpZiAoc3VtQXRGdXNpb25Db2x1bW5zKSB7XHJcbiAgICAgIHRoaXMuX2VxdWFsaXR5Q2hlY2tPbiA9IHRydWU7XHJcbiAgICAgIHRoaXMuX3N1bUF0RnVzaW9uRmllbGRzID0gc3VtQXRGdXNpb25Db2x1bW5zLm1hcChjID0+IGMuZmllbGQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdHJ5RmluZEVxdWF0YWJsZShyb3c6IGFueSk6IHZvaWQge1xyXG4gICAgbGV0IGZvdW5kRXF1YWxSb3c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAgIGZvciAobGV0IGk6IG51bWJlciA9IDA7IGkgPCB0aGlzLmdyaWREYXRhLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdwcm9jIHJvdyA6ICcsIHRoaXMuZ3JpZERhdGFbaV0pO1xyXG4gICAgICBsZXQgaXNDdXJyZW50Um93RXF1YWw6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLl9lcXVhdGFibGVGaWVsZHM/LmZvckVhY2goZiA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Byb2MgZmllbGQgOiAnLCBmKTtcclxuICAgICAgICBpZiAodGhpcy5ncmlkRGF0YVtpXVtmXSAhPSByb3dbZl0pIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKCdub3QgZXF1YWwgJywgcm93LCB0aGlzLmdyaWREYXRhW2ldKTtcclxuICAgICAgICAgIGlzQ3VycmVudFJvd0VxdWFsID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYgKGlzQ3VycmVudFJvd0VxdWFsKSB7XHJcbiAgICAgICAgdGhpcy5fZnVzaW9uUm93cyh0aGlzLmdyaWREYXRhW2ldLCByb3cpO1xyXG4gICAgICAgIGZvdW5kRXF1YWxSb3cgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBpZiAoZm91bmRFcXVhbFJvdykge1xyXG4gICAgICBjb25zb2xlLmxvZygnZGVsZXRpbmcgOiAnLCByb3cpO1xyXG4gICAgICB0aGlzLmRlbGV0ZShyb3cpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZnVzaW9uUm93cyhyb3cxOiBhbnksIHJvdzI6IGFueSkge1xyXG4gICAgdGhpcy5fc3VtQXRGdXNpb25GaWVsZHM/LmZvckVhY2goZiA9PiB7XHJcbiAgICAgIHJvdzFbZl0gKz0gcm93MltmXTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FuY2VsUGVuZGluZ0R1cGxpY2F0ZUVtaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9wZW5kaW5nRHVwbGljYXRlUmVzdWx0ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wZW5kaW5nRHVwbGljYXRlRW1pdFRpbWVyKTtcclxuICAgICAgdGhpcy5fcGVuZGluZ0R1cGxpY2F0ZUVtaXRUaW1lciA9IG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjYXJkXCI+XHJcbiAgPHAtdGFibGUgI2R0IFtzZWxlY3Rpb25Nb2RlXT1cInNlbGVjdGlvbk1vZGVcIiBbKHNlbGVjdGlvbildPVwic2VsZWN0ZWRJdGVtc1wiIGVkaXRNb2RlPVwicm93XCJcclxuICAgIFtwYWdpbmF0b3JdPVwiZ3JpZERhdGEubGVuZ3RoID4gcGFnZVNpemVcIiBbcm93c1BlclBhZ2VPcHRpb25zXT1cInJvd1BlclBhZ2VcIiBbcm93c109XCJwYWdlU2l6ZVwiXHJcbiAgICAob25Sb3dTZWxlY3QpPVwib25Sb3dTZWxlY3RlZCgkZXZlbnQpXCIgKG9uUm93VW5zZWxlY3QpPVwib25Sb3dVbnNlbGVjdCgkZXZlbnQpXCIgW3Njcm9sbGFibGVdPVwidHJ1ZVwiXHJcbiAgICBbcmVzaXphYmxlQ29sdW1uc109XCJ0cnVlXCIgY29sdW1uUmVzaXplTW9kZT1cImV4cGFuZFwiIGFwcGVuZFRvPVwiYm9keVwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1zbVwiIFt2YWx1ZV09XCJncmlkRGF0YVwiXHJcbiAgICBbY29sdW1uc109XCJzZWxlY3RlZENvbHVtbnNcIiBbZGF0YUtleV09XCJrZXlcIiBbc2Nyb2xsSGVpZ2h0XT1cInNjcm9sbEhlaWdodFwiIHN0eWxlQ2xhc3M9XCJwLWRhdGF0YWJsZS1ncmlkbGluZXNcIlxyXG4gICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJzZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KVwiICNlZGl0YWJsZVRhYmxlIFt0b3RhbFJlY29yZHNdPVwiZ3JpZERhdGEubGVuZ3RoXCI+XHJcbiAgICA8IS0tIFt0YWJsZVN0eWxlXT1cInsnbWluLXdpZHRoJzogJzUwcmVtJywnd2lkdGgnOiAnaW5oZXJpdCd9XCIgLS0+XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlIHBUZW1wbGF0ZT1cImNhcHRpb25cIj5cclxuICAgICAgPHAtbXVsdGlTZWxlY3QgW29wdGlvbnNdPVwiY29sdW1uc1wiIFsobmdNb2RlbCldPVwic2VsZWN0ZWRDb2x1bW5zXCJcclxuICAgICAgICBzZWxlY3RlZEl0ZW1zTGFiZWw9XCJ7MH0ge3sgJ2NvbHVtbnNfc2VsZWN0ZWQnIHwgbG9jYWxpemUgfX1cIiBvcHRpb25MYWJlbD1cInRyYW5zbGF0ZWRIZWFkZXJcIlxyXG4gICAgICAgIFtzdHlsZV09XCJ7J21pbi13aWR0aCc6ICcxODBweCd9XCIgcGxhY2Vob2xkZXI9XCJ7eyAnY2hvb3NlX2NvbHVtbnMnIHwgbG9jYWxpemUgfX1cIj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgbGV0LW9wdGlvbiBwVGVtcGxhdGU9XCJpdGVtXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgZ2FwLTJcIj5cclxuICAgICAgICAgICAgPHNwYW4+e3sgb3B0aW9uLmhlYWRlciB8IGxvY2FsaXplIH19PC9zcGFuPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9wLW11bHRpU2VsZWN0PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCIgbGV0LWNvbHVtbnM+XHJcblxyXG4gICAgICA8dHI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGlvbk1vZGUgIT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiPlxyXG4gICAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDoycmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjJyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlXCI+XHJcbiAgICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uIHN0eWxlPVwibWluLXdpZHRoOjJyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6MnJlbSAhaW1wb3J0YW50O1wiPlxyXG4gICAgICAgICAgICA8cC10YWJsZUhlYWRlckNoZWNrYm94ICN0YWJsZUhlYWRlckNoZWNrYm94PjwvcC10YWJsZUhlYWRlckNoZWNrYm94PlxyXG4gICAgICAgICAgPC90aD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICBcclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0hhdmVTdW1hcnlcIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG5cclxuICAgICAgICA8IS0tIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RWRpdEJ1dHRvblwiIHNjb3BlPVwiY29sXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGg+IC0tPlxyXG4gICAgICAgIFxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RHVwbGljYXRlQnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuICAgICAgICA8dGggcFJlc2l6YWJsZUNvbHVtbiBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0NvbnN1bHRCdXR0b25cIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RoPlxyXG4gICAgICAgIDx0aCBwUmVzaXphYmxlQ29sdW1uIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgc2NvcGU9XCJjb2xcIlxyXG4gICAgICAgICAgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+PC90aD5cclxuXHJcbiAgICAgICAgPHRoIHBSZXNpemFibGVDb2x1bW4gcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBzY29wZT1cImNvbFwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDozcmVtO1wiIHBTb3J0YWJsZUNvbHVtbj1cInt7Y29sLmZpZWxkfX1cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgcFRvb2x0aXA9XCJ7e2NvbC50b29sVGlwVGV4dCB8IGxvY2FsaXplIH19XCIgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCIgcFJlb3JkZXJhYmxlQ29sdW1uPnt7IGNvbC5oZWFkZXIgfCBsb2NhbGl6ZVxyXG4gICAgICAgICAgfX1cclxuICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwie3tjb2wuZmllbGR9fVwiPjwvcC1zb3J0SWNvbj5cclxuICAgICAgICAgIDxUc2ktQnViYmxlLUluZm8gW2luZm9UZXh0XT1cImNvbC5pbmZvVGV4dCB8IGxvY2FsaXplXCI+PC9Uc2ktQnViYmxlLUluZm8+XHJcbiAgICAgICAgPC90aD5cclxuICAgICAgICA8dGggc3R5bGU9XCJtaW4td2lkdGg6M3JlbVwiICpuZ0lmPVwic2hvd1Jvd1N1bW1hcnlcIiBzY29wZT1cImNvbFwiPnt7J1Jvd1N1bW1hcnknIHwgbG9jYWxpemV9fTwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCIgbGV0LWl0ZW0gbGV0LWVkaXRpbmc9XCJlZGl0aW5nXCIgbGV0LWNvbHVtbnM9XCJjb2x1bW5zXCIgbGV0LXJvd0luZGV4PVwicm93SW5kZXhcIj5cclxuICAgICAgXHJcbiAgICAgIDx0ciBbcEVkaXRhYmxlUm93XT1cIml0ZW1cIlxyXG4gICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PSBtdWx0aXBsZUdyaWRTZWxlY3Rpb25Nb2RlIHx8IHNlbGVjdGlvbk1vZGUgPT0gdW5kZWZpbmVkOyBlbHNlIHNlbGVjdGlvbk1vZGVCbG9ja1wiXHJcbiAgICAgICAgKGZvY3VzT3V0KT1cIm9uRm9jdXNPdXRSb3coaXRlbSlcIj5cclxuICAgICAgICBcclxuICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICA8cC10YWJsZUNoZWNrYm94IFt2YWx1ZV09XCJpdGVtXCIgPjwvcC10YWJsZUNoZWNrYm94PlxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPiAtLT5cclxuXHJcblxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICA8L3RkPiAtLT5cclxuXHJcbiAgICAgICAgPCEtLSA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCIhZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcEluaXRFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktcGVuY2lsXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dFwiPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBTYXZlRWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLWNoZWNrXCJcclxuICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zdWNjZXNzIC1tbC0xXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiZWRpdGluZ1wiIHBCdXR0b24gcFJpcHBsZSB0eXBlPVwiYnV0dG9uXCIgcENhbmNlbEVkaXRhYmxlUm93IGljb249XCJwaSBwaS10aW1lc1wiXHJcbiAgICAgICAgICAgICAgY2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIC1tbC0yXCI+XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHNjb3BlPVwiY29sXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIj48L3RkPlxyXG5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEdXBsaWNhdGVCdXR0b25cIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiXHJcbiAgICAgICAgICBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICA8VHNpLUJ1dHRvbiBbYnV0dG9uVHlwZV09XCJidXR0b25UeXBlLkJ1dHRvblwiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLWNvcHlcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9kdXBsaXF1ZXJcIlxyXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24taW5mb1wiIChjbGljayk9XCJkdXBsaWNhdGVSb3coaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAtMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1jb25zdWx0LXN0eWxlXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuQnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktZXllXCJcclxuICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfY29uc3VsdGVyXCJcclxuICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiIChjbGljayk9XCJjb25zdWx0KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCJcclxuICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1kZWxldGUtc3R5bGVcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgPFRzaS1CdXR0b24gW2Rpc2FibGVkXT1cImlzRGVsZXRlQnV0dG9uRGlzYWJsZWQoaXRlbSlcIiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktdHJhc2hcIlxyXG4gICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9zdXBwcmltZXJcIlxyXG4gICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJwLWVsZW1lbnQgcC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHlcIlxyXG4gICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG5cclxuXHJcbiAgICAgICAgPHRkIGNsYXNzPVwidWktcmVzaXphYmxlLWNvbHVtblwiIHBGcm96ZW5Db2x1bW4gW2Zyb3plbl09XCJjb2wuaXNGcm96ZW5cIiAqbmdGb3I9XCJsZXQgY29sIG9mIGNvbHVtbnNcIlxyXG4gICAgICAgICAgW25nU3R5bGVdPVwiaXNBciA/IHsndGV4dC1hbGlnbic6ICdzdGFydCd9IDoge31cIj5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmRpc3BsYXlPbmx5IHx8IGRpc2FibGVkOyBlbHNlIG9yZGluYXJ5QmxvY1wiPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVNlYXJjaC1Db21ibyAtLT5cclxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlNFQVJDSF9DT01CTzsgZWxzZSBjdXJyZW5jeVNvY2lldGVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbZGlzYWJsZWRdPVwidHJ1ZVwiIFtlbGVtZW50U291cmNlVXJsXT1cImNvbC5lbGVtZW50U291cmNlVXJsXCJcclxuICAgICAgICAgICAgICAgICAgICBbYnVzaW5lc3NDbGFzc109XCJjb2wuYnVzaW5lc3NDbGFzc1wiIFtjdXJyZW50Um93SXRlbV09XCJpdGVtXCIgWyhiaW5kKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCIgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lzRmlsdGVyZWRdPVwiY29sLmlzRmlsdGVyZWRcIiBbZGF0YXNvdXJjZV09XCJjb2wuZGF0YXNvdXJjZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dTZWFyY2hCdXR0b25dPVwiY29sLnNob3dTZWFyY2hCdXR0b24gPz8gdHJ1ZVwiIFtzaG93QWRkQnV0dG9uXT1cImNvbC5zaG93QWRkQnV0dG9uID8/IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93VXBkYXRlQnV0dG9uXT1cImNvbC5zaG93VXBkYXRlQnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dDb25zdWx0QnV0dG9uXT1cImNvbC5zaG93Q29uc3VsdEJ1dHRvbiA/PyB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCI+PC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVNvY2lldGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfU09DSUVURV9JTlBVVDsgZWxzZSBjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQ7IGVsc2UgZGF0ZVBpY2tlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1EaXNwbGF5IFtjdXJyZW5jeV09XCJjb2wuY3VycmVuY3lPdGhlckNvZGVcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1EYXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RhdGVQaWNrZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveE91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EYXRlLURpc3BsYXkgW3Nob3dUaW1lXT1cImNvbC5zaG93VGltZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3gtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ0hFQ0tCT1g7IGVsc2UgZGVjaW1hbE91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja2JveC1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ2hlY2tib3gtRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVjaW1hbE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktSW50ZWdlci1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLklOVEVHRVI7IGVsc2UgcmF0ZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyLURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1SYXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuUkFURV9JTlBVVDsgZWxzZSB0aW1lT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtRGlzcGxheSBbaXNGcmFjdGlvbl09XCJjb2wuaXNGcmFjdGlvblwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktVGltZS1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlRJTUU7IGVsc2UgZm9ybXVsYU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRzaS10aW1lLWRpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj48L3RzaS10aW1lLWRpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1Gb3JtdWxhLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2Zvcm11bGFPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dE91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1Gb3JtdWxhLUJveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbKHZhbHVlKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+PC9Uc2ktRm9ybXVsYS1Cb3g+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UZXh0LUJveCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRleHRPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbVtjb2wuZmllbGRdfX1cclxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3JkaW5hcnlCbG9jPiBcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVNlYXJjaC1Db21ibyAtLT5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICA8VHNpLVNlYXJjaC1Db21ibyBbZWxlbWVudFNvdXJjZVVybF09XCJjb2wuZWxlbWVudFNvdXJjZVVybFwiIChiaW5kQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCJcclxuICAgICAgICAgICAgICAgIFtidXNpbmVzc0NsYXNzXT1cImNvbC5idXNpbmVzc0NsYXNzXCIgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICBpZC1maWVsZD1cInt7Y29sLmlkRmllbGR9fVwiIGxhYmVsLWZpZWxkPVwie3tjb2wubGFiZWxGaWVsZH19XCIgW2lzRmlsdGVyZWRdPVwiY29sLmlzRmlsdGVyZWRcIlxyXG4gICAgICAgICAgICAgICAgW2N1cnJlbnRSb3dJdGVtXT1cIml0ZW1cIiAoYmluZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICBbZGF0YXNvdXJjZV09XCJjb2wuZGF0YXNvdXJjZVwiIFtzaG93U2VhcmNoQnV0dG9uXT1cImNvbC5zaG93U2VhcmNoQnV0dG9uID8/IHRydWVcIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiIFtzaG93VXBkYXRlQnV0dG9uXT1cImNvbC5zaG93VXBkYXRlQnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCI+PC9Uc2ktU2VhcmNoLUNvbWJvPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lTb2NpZXRlSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5T3RoZXJJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LU90aGVyLUlucHV0PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktRGF0ZS1QaWNrZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGF0ZS1QaWNrZXIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW3Nob3dUaW1lXT1cImNvbC5zaG93VGltZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURhdGUtUGlja2VyPlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ2hlY2tCb3ggLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY2hlY2tCb3hJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUNoZWNrQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUNoZWNrQm94PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1JbnB1dCAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLURlY2ltYWwtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW251bU9mRGVjaW1hbF09XCJjb2wubnVtT2ZEZWNpbWFsXCJcclxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktRGVjaW1hbC1JbnB1dD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXIgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjaW50ZWdlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1JbnRlZ2VyIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiXHJcbiAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCJcclxuICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXI+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1SYXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgdGltZUlucHV0QmxvY1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1SYXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgIFsoaW5wdXRGaWVsZCldPVwiaXRlbVtjb2wuZmllbGRdXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiXHJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIiBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLVJhdGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1UaW1lLXBpY2tlciBibG9jIC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVJbnB1dEJsb2M+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPHRzaS10aW1lLXBpY2tlciAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L3RzaS10aW1lLXBpY2tlcj5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYUlucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDwhLS08VHNpLUJ1YmJsZS1JbmZvXHJcbiAgICAgICAgICAgICAgICAgIFtpbmZvVGV4dF09XCJbJ2Zvcm11bGFfZXhwbGljYXRpb24nLFxyXG4gICAgICAgICAgICAgICAgICBdXCI+PC9Uc2ktQnViYmxlLUluZm8+IC0tPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1Gb3JtdWxhLUJveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbKHZhbHVlKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0SW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1UZXh0LUJveCBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChrZXlkb3duKT1cImhhbmRsZUtleWRvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNob3dSb3dTdW1tYXJ5XCIgY2xhc3M9XCJmb250LWJvbGRcIj5cclxuICAgICAgICAgIHt7cm93U3VtbWFyeShpdGVtKX19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuXHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjc2VsZWN0aW9uTW9kZUJsb2NrPlxyXG4gICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICA8dHIgW3BFZGl0YWJsZVJvd109XCJpdGVtXCIgW3BTZWxlY3RhYmxlUm93XT1cIml0ZW1cIiBbcFNlbGVjdGFibGVSb3dJbmRleF09XCJyb3dJbmRleFwiXHJcbiAgICAgICAgICAgIChmb2N1c091dCk9XCJvbkZvY3VzT3V0Um93KGl0ZW0pXCI+XHJcblxyXG4gICAgICAgPCEtLSA8dGQgcEZyb3plbkNvbHVtbiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+IC0tPlxyXG5cclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gc3R5bGU9XCJtaW4td2lkdGg6M3JlbTsgbGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCIgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPCEtLSA8dGQgKm5nSWY9XCJzZWxlY3Rpb25Nb2RlID09IG11bHRpcGxlR3JpZFNlbGVjdGlvbk1vZGVcIiBzdHlsZT1cIndpZHRoOiAycmVtO1wiPlxyXG4gICAgICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgICAgIDwvdGQ+IC0tPlxyXG5cclxuICAgICAgICAgICAgPCEtLSA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dFZGl0QnV0dG9uXCIgc3R5bGU9XCJtaW4td2lkdGg6M3JlbTtsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBJbml0RWRpdGFibGVSb3cgaWNvbj1cInBpIHBpLXBlbmNpbFwiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0XCI+XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gKm5nSWY9XCJlZGl0aW5nXCIgcEJ1dHRvbiBwUmlwcGxlIHR5cGU9XCJidXR0b25cIiBwU2F2ZUVkaXRhYmxlUm93IGljb249XCJwaSBwaS1jaGVja1wiXHJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXN1Y2Nlc3MgLW1sLTFcIj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImVkaXRpbmdcIiBwQnV0dG9uIHBSaXBwbGUgdHlwZT1cImJ1dHRvblwiIHBDYW5jZWxFZGl0YWJsZVJvdyBpY29uPVwicGkgcGktdGltZXNcIlxyXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1kYW5nZXIgLW1sLTJcIj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPiAtLT5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0hhdmVTdW1hcnlcIiBzY29wZT1cImNvbFwiIHN0eWxlPVwibGVmdDogMXJlbSAhaW1wb3J0YW50OyB3aWR0aDozcmVtICFpbXBvcnRhbnQ7XCI+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBwUmVzaXphYmxlQ29sdW1uICpuZ0lmPVwic2hvd0R1cGxpY2F0ZUJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLTBcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktQnV0dG9uIFtidXR0b25UeXBlXT1cImJ1dHRvblR5cGUuQnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktY29weVwiXHJcbiAgICAgICAgICAgICAgICAgIFt0b29sdGlwUG9zaXRpb25dPVwidG9vbHRpcFBvc2l0aW9uLlRvcFwiIHRvb2x0aXBUZXh0PVwic2hhcmVkX2VkaXR0YWJsZV9kdXBsaXF1ZXJcIlxyXG4gICAgICAgICAgICAgICAgICBzdHlsZUNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLWluZm9cIiAoY2xpY2spPVwiZHVwbGljYXRlUm93KGl0ZW0pXCI+PC9Uc2ktQnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L3RkPlxyXG5cclxuICAgICAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gcFJlc2l6YWJsZUNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCJcclxuICAgICAgICAgICAgICBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xIGJ0bi1jb25zdWx0LXN0eWxlXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtMFwiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1CdXR0b24gW2J1dHRvblR5cGVdPVwiYnV0dG9uVHlwZS5CdXR0b25cIiBpY29uPVwicC1idXR0b24taWNvbiBwaSBwaS1leWVcIlxyXG4gICAgICAgICAgICAgICAgICBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIiB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfY29uc3VsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiY29uc3VsdChpdGVtKVwiPjwvVHNpLUJ1dHRvbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC90ZD5cclxuXHJcbiAgICAgICAgICAgIDx0ZCBwRnJvemVuQ29sdW1uIHBSZXNpemFibGVDb2x1bW4gKm5nSWY9XCJzaG93RGVsZXRlQnV0dG9uXCIgc3R5bGU9XCJsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgICAgIGNsYXNzPVwicC0xIGJ0bi1kZWxldGUtc3R5bGVcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC0wXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgaWNvbj1cInAtYnV0dG9uLWljb24gcGkgcGktdHJhc2hcIiBbdG9vbHRpcFBvc2l0aW9uXT1cInRvb2x0aXBQb3NpdGlvbi5Ub3BcIlxyXG4gICAgICAgICAgICAgICAgICB0b29sdGlwVGV4dD1cInNoYXJlZF9lZGl0dGFibGVfc3VwcHJpbWVyXCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGVDbGFzcz1cInAtZWxlbWVudCBwLWJ1dHRvbi1yb3VuZGVkIHAtYnV0dG9uLXRleHQgcC1idXR0b24tZGFuZ2VyIHAtYnV0dG9uIHAtY29tcG9uZW50IHAtYnV0dG9uLWljb24tb25seVwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGUoaXRlbSlcIj48L1RzaS1CdXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJ1aS1yZXNpemFibGUtY29sdW1uXCIgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29sLmRpc3BsYXlPbmx5IHx8IGRpc2FibGVkOyBlbHNlIG9yZGluYXJ5QmxvY1wiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktU2VhcmNoLUNvbWJvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZU91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxUc2ktU2VhcmNoLUNvbWJvIFtkaXNhYmxlZF09XCJ0cnVlXCIgW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtidXNpbmVzc0NsYXNzXT1cImNvbC5idXNpbmVzc0NsYXNzXCIgW2N1cnJlbnRSb3dJdGVtXT1cIml0ZW1cIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgaWQtZmllbGQ9XCJ7e2NvbC5pZEZpZWxkfX1cIiBbbGlzdFNvdXJjZVVybF09XCJjb2wubGlzdFNvdXJjZVVybFwiIGxhYmVsLWZpZWxkPVwie3tjb2wubGFiZWxGaWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBbaXNGaWx0ZXJlZF09XCJjb2wuaXNGaWx0ZXJlZFwiIFtkYXRhc291cmNlXT1cImNvbC5kYXRhc291cmNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2N1cnJlbmN5U29jaWV0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5IFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktU29jaWV0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9PVEhFUl9JTlBVVDsgZWxzZSBkYXRlUGlja2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeU90aGVyQ29kZVwiIFtpbnB1dERhdGFdPVwiaXRlbVtjb2wuZmllbGRdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZGF0ZVBpY2tlck91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5EQVRFOyBlbHNlIGNoZWNrQm94T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtRGlzcGxheSBbc2hvd1RpbWVdPVwiY29sLnNob3dUaW1lXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DaGVja0JveC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DSEVDS0JPWDsgZWxzZSBkZWNpbWFsT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUNoZWNrYm94LURpc3BsYXkgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja2JveC1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktRGVjaW1hbC1EaXNwbGF5IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkRFQ0lNQUxfSU5QVVQ7IGVsc2UgaW50ZWdlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLURpc3BsYXkgW2Zvcm1hdERlY2ltYWxdPVwiY29sLmZvcm1hdERlY2ltYWxcIiBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EZWNpbWFsLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2ludGVnZXJPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUludGVnZXItRGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUludGVnZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktUmF0ZS1EaXNwbGF5IFtpc0ZyYWN0aW9uXT1cImNvbC5pc0ZyYWN0aW9uXCIgW2lucHV0RGF0YV09XCJpdGVtW2NvbC5maWVsZF1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1SYXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1UaW1lLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3RpbWVPdXRwdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuVElNRTsgZWxzZSBmb3JtdWxhT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtZGlzcGxheSBbaW5wdXREYXRhXT1cIml0ZW1bY29sLmZpZWxkXVwiPjwvdHNpLXRpbWUtZGlzcGxheT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUZvcm11bGEtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZm9ybXVsYU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5GT1JNVUxBX1RFWFRfQk9YOyBlbHNlIGRlZmF1bHRUZXh0T3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dE91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3tpdGVtW2NvbC5maWVsZF19fVxyXG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjb3JkaW5hcnlCbG9jPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBUc2ktU2VhcmNoLUNvbWJvIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuU0VBUkNIX0NPTUJPOyBlbHNlIGN1cnJlbmN5U29jaWV0ZUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgPFRzaS1TZWFyY2gtQ29tYm8gW2VsZW1lbnRTb3VyY2VVcmxdPVwiY29sLmVsZW1lbnRTb3VyY2VVcmxcIiAoYmluZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xpc3RTb3VyY2VVcmxdPVwiY29sLmxpc3RTb3VyY2VVcmxcIiBbKGJpbmQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIGlkLWZpZWxkPVwie3tjb2wuaWRGaWVsZH19XCJcclxuICAgICAgICAgICAgICAgICAgICBsYWJlbC1maWVsZD1cInt7Y29sLmxhYmVsRmllbGR9fVwiIFtpc0ZpbHRlcmVkXT1cImNvbC5pc0ZpbHRlcmVkXCIgW2J1c2luZXNzQ2xhc3NdPVwiY29sLmJ1c2luZXNzQ2xhc3NcIlxyXG4gICAgICAgICAgICAgICAgICAgIChiaW5kQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbY3VycmVudFJvd0l0ZW1dPVwiaXRlbVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2RhdGFzb3VyY2VdPVwiY29sLmRhdGFzb3VyY2VcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd1NlYXJjaEJ1dHRvbl09XCJjb2wuc2hvd1NlYXJjaEJ1dHRvbiA/PyB0cnVlXCIgW3Nob3dBZGRCdXR0b25dPVwiY29sLnNob3dBZGRCdXR0b24gPz8gdHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dVcGRhdGVCdXR0b25dPVwiY29sLnNob3dVcGRhdGVCdXR0b24gPz8gdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0NvbnN1bHRCdXR0b25dPVwiY29sLnNob3dDb25zdWx0QnV0dG9uID8/IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIj48L1RzaS1TZWFyY2gtQ29tYm8+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeVNvY2lldGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5DVVJSRU5DWV9TT0NJRVRFX0lOUFVUOyBlbHNlIGN1cnJlbmN5T3RoZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLUN1cnJlbmN5LVNvY2lldGUtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjY3VycmVuY3lPdGhlcklucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX09USEVSX0lOUFVUOyBlbHNlIGRhdGVQaWNrZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1PdGhlci1JbnB1dCBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtpbnB1dElkXT1cImNvbC5maWVsZFwiIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1PdGhlci1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURhdGUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkYXRlUGlja2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREFURTsgZWxzZSBjaGVja0JveElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLURhdGUtUGlja2VyIFtzaG93VGltZV09XCJjb2wuc2hvd1RpbWVcIiBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1EYXRlLVBpY2tlcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLUNoZWNrQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjaGVja0JveElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNIRUNLQk9YOyBlbHNlIGRlY2ltYWxJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1DaGVja0JveCBbaW5wdXROYW1lXT1cImNvbC5pbnB1dE5hbWVcIiBbaW5wdXRJZF09XCJjb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIiBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1DaGVja0JveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlY2ltYWxJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5ERUNJTUFMX0lOUFVUOyBlbHNlIGludGVnZXJJbnB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1EZWNpbWFsLUlucHV0IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFtpbnB1dElkXT1cImNvbC5maWVsZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIiAoaW5wdXRGaWVsZENoYW5nZSk9XCJpbnB1dENoYW5nZWQoY29sKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbKGlucHV0RmllbGQpXT1cIml0ZW1bY29sLmZpZWxkXVwiIFtudW1PZkRlY2ltYWxdPVwiY29sLm51bU9mRGVjaW1hbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRGaWVsZENoYW5nZSk9XCJvbkNlbGxWYWx1ZUNoYW5nZWQoY29sLCAkZXZlbnQsIGl0ZW0pXCIgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtSW5wdXQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIFRzaS1JbnRlZ2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VySW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlSW5wdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlciBbY2xhc3NdPVwiJ21heC13LTRyZW0nXCIgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktSW50ZWdlcj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVJhdGUtSW5wdXQgLS0+XHJcbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI3JhdGVJbnB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5SQVRFX0lOUFVUOyBlbHNlIHRpbWVJbnB1dEJsb2NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLVJhdGUtSW5wdXQgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCJcclxuICAgICAgICAgICAgICAgICAgICAgIChpbnB1dEZpZWxkQ2hhbmdlKT1cImlucHV0Q2hhbmdlZChjb2wpXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtkaXNhYmxlZF09XCJjb2wuZGlzYWJsZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc109XCJjb2wudmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1JbnB1dD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRpbWUtUGlja2VyIC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICN0aW1lSW5wdXRCbG9jPlxyXG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29sLnR5cGUgPT0gaW5wdXRUeXBlcy5USU1FIGVsc2UgZm9ybXVsYUlucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dHNpLXRpbWUtcGlja2VyIChpbnB1dEZpZWxkQ2hhbmdlKT1cIm9uQ2VsbFZhbHVlQ2hhbmdlZChjb2wsICRldmVudCwgaXRlbSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2lucHV0TmFtZV09XCJjb2wuaW5wdXROYW1lXCIgW2lucHV0SWRdPVwiY29sLmZpZWxkXCIgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbC5kaXNhYmxlZFwiIFt2YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NdPVwiY29sLnZhbGlkYXRpb25TdGF0dXNDc3NDbGFzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHNpLXRpbWUtcGlja2VyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNmb3JtdWxhSW5wdXRCbG9jaz5cclxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuRk9STVVMQV9URVhUX0JPWDsgZWxzZSBkZWZhdWx0VGV4dElucHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgICAgICA8VHNpLUZvcm11bGEtQm94IFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiIFsodmFsdWUpXT1cIml0ZW1bY29sLmZpZWxkXVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj48L1RzaS1Gb3JtdWxhLUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHNpLVRleHQtQm94IC0tPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWZhdWx0VGV4dElucHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPFRzaS1UZXh0LUJveCBbaW5wdXRJZF09XCJjb2wuZmllbGRcIiBbZGlzYWJsZWRdPVwiY29sLmRpc2FibGVkXCIgKGlucHV0RmllbGRDaGFuZ2UpPVwiaW5wdXRDaGFuZ2VkKGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgWyhpbnB1dEZpZWxkKV09XCJpdGVtW2NvbC5maWVsZF1cIiAoa2V5ZG93bik9XCJoYW5kbGVLZXlkb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGlucHV0RmllbGRDaGFuZ2UpPVwib25DZWxsVmFsdWVDaGFuZ2VkKGNvbCwgJGV2ZW50LCBpdGVtKVwiIFtpbnB1dE5hbWVdPVwiY29sLmlucHV0TmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblN0YXR1c0Nzc0NsYXNzXT1cImNvbC52YWxpZGF0aW9uU3RhdHVzQ3NzQ2xhc3NcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L1RzaS1UZXh0LUJveD5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICA8dGQgKm5nSWY9XCJzaG93Um93U3VtbWFyeVwiIGNsYXNzPVwiZm9udC1ib2xkXCI+XHJcbiAgICAgICAgICAgICAge3tyb3dTdW1tYXJ5KGl0ZW0pfX1cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgKm5nSWY9XCJzaG93SGF2ZVN1bWFyeVwiIHBUZW1wbGF0ZT1cImZvb3RlclwiIGxldC1jb2x1bW5zPlxyXG5cclxuICAgICAgPHRyIGNsYXNzPVwidGZvb3RlclwiPlxyXG4gICAgICAgIDwhLS0gPHRkIHBGcm96ZW5Db2x1bW4gc2NvcGU9XCJjb2xcIiBzdHlsZT1cImxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPjwvdGQ+IC0tPlxyXG4gICAgICAgIDx0ZCAqbmdJZj1cInNlbGVjdGlvbk1vZGUgPT0gbXVsdGlwbGVHcmlkU2VsZWN0aW9uTW9kZVwiXHJcbiAgICAgICAgICBzdHlsZT1cIm1pbi13aWR0aDoycmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjJyZW0gIWltcG9ydGFudDtcIj5cclxuICAgICAgICAgIDxwLXRhYmxlSGVhZGVyQ2hlY2tib3ggI3RhYmxlSGVhZGVyQ2hlY2tib3g+PC9wLXRhYmxlSGVhZGVyQ2hlY2tib3g+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzY29wZT1cImNvbFwiIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiPlRvdGFsPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dEZWxldGVCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIiBjbGFzcz1cInAtMVwiPlxyXG4gICAgICAgICAgPCEtLTx0ZCBwRnJvemVuQ29sdW1uICpuZ0lmPVwic2hvd0VkaXRCdXR0b25cIiBzdHlsZT1cIm1pbi13aWR0aDozcmVtOyBsZWZ0OiAxcmVtICFpbXBvcnRhbnQ7IHdpZHRoOjNyZW0gIWltcG9ydGFudDtcIlxyXG4gICAgICAgICAgY2xhc3M9XCJwLTFcIj4gLS0+XHJcbiAgICAgICAgPHRkIHBGcm96ZW5Db2x1bW4gKm5nSWY9XCJzaG93RHVwbGljYXRlQnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiAqbmdJZj1cInNob3dDb25zdWx0QnV0dG9uXCJcclxuICAgICAgICAgIHN0eWxlPVwibWluLXdpZHRoOjNyZW07IGxlZnQ6IDFyZW0gIWltcG9ydGFudDsgd2lkdGg6M3JlbSAhaW1wb3J0YW50O1wiIGNsYXNzPVwicC0xXCI+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQgcEZyb3plbkNvbHVtbiBbZnJvemVuXT1cImNvbC5pc0Zyb3plblwiIFtzdHlsZV09XCJjb2wuc3R5bGVcIiBzY29wZT1cImNvbFwiICpuZ0Zvcj1cImxldCBjb2wgb2YgY29sdW1uc1wiPlxyXG4gICAgICAgICAgPGRpdiAqbmdJZj1cImNvbC5oYXZlU3VtbWFyeVwiPlxyXG4gICAgICAgICAgICA8IS0tIFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLkNVUlJFTkNZX1NPQ0lFVEVfSU5QVVQ7IGVsc2UgY3VycmVuY3lPdGhlck91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgPFRzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXkgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIj5cclxuICAgICAgICAgICAgICA8L1RzaS1DdXJyZW5jeS1Tb2NpZXRlLURpc3BsYXk+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPCEtLSBUc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNjdXJyZW5jeU90aGVyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuQ1VSUkVOQ1lfT1RIRVJfSU5QVVQ7IGVsc2UgZGVjaW1hbE91dHB1dEJsb2NrXCI+XHJcbiAgICAgICAgICAgICAgICA8VHNpLUN1cnJlbmN5LU90aGVyLURpc3BsYXkgW2N1cnJlbmN5XT1cImNvbC5jdXJyZW5jeUNvZGVcIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktQ3VycmVuY3ktT3RoZXItRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLURlY2ltYWwtRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNkZWNpbWFsT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuREVDSU1BTF9JTlBVVDsgZWxzZSBpbnRlZ2VyT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktRGVjaW1hbC1EaXNwbGF5IFtmb3JtYXREZWNpbWFsXT1cImNvbC5mb3JtYXREZWNpbWFsXCIgW2lucHV0RGF0YV09XCJnZXRTdW1tYXJ5KGNvbClcIlxyXG4gICAgICAgICAgICAgICAgICBbbnVtT2ZEZWNpbWFsXT1cImNvbC5udW1PZkRlY2ltYWxcIj5cclxuICAgICAgICAgICAgICAgIDwvVHNpLURlY2ltYWwtRGlzcGxheT5cclxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gVHNpLUludGVnZXItRGlzcGxheSAtLT5cclxuICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNpbnRlZ2VyT3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbC50eXBlID09IGlucHV0VHlwZXMuSU5URUdFUjsgZWxzZSByYXRlT3V0cHV0QmxvY2tcIj5cclxuICAgICAgICAgICAgICAgIDxUc2ktSW50ZWdlci1EaXNwbGF5IFtpbnB1dERhdGFdPVwiZ2V0U3VtbWFyeShjb2wpXCI+XHJcbiAgICAgICAgICAgICAgICA8L1RzaS1JbnRlZ2VyLURpc3BsYXk+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFRzaS1SYXRlLURpc3BsYXkgLS0+XHJcbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjcmF0ZU91dHB1dEJsb2NrPlxyXG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb2wudHlwZSA9PSBpbnB1dFR5cGVzLlJBVEVfSU5QVVQ7IGVsc2UgZGVmYXVsdFRleHRPdXRwdXRCbG9ja1wiPlxyXG4gICAgICAgICAgICAgICAgPFRzaS1SYXRlLURpc3BsYXkgW2lzRnJhY3Rpb25dPVwiY29sLmlzRnJhY3Rpb25cIiBbaW5wdXREYXRhXT1cImdldFN1bW1hcnkoY29sKVwiPlxyXG4gICAgICAgICAgICAgICAgPC9Uc2ktUmF0ZS1EaXNwbGF5PlxyXG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG5cclxuICAgICAgICAgICAgPCEtLSBEZWZhdWx0IC0tPlxyXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZXh0T3V0cHV0QmxvY2s+XHJcbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7e2dldFN1bW1hcnkoY29sKX19XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwic3VtbWFyeVwiPlxyXG4gICAgICA8dHI+XHJcbiAgICAgICAge3snVG90YWxSZWNvcmRzQ291bnQnIHwgbG9jYWxpemUgfX0ge3tncmlkRGF0YS5sZW5ndGh9fVxyXG4gICAgICA8L3RyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L3AtdGFibGU+XHJcbiAgPGRpdj5cclxuICAgIDxUc2ktQnV0dG9uICpuZ0lmPVwic2hvd0FkZEJ1dHRvblwiIHN0eWxlPVwiaGVpZ2h0OiAyMHB4O3dpZHRoOiAyMHB4O1wiIGljb249XCJwLWJ1dHRvbi1pY29uIHBpIHBpLXBsdXNcIiB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJ0b29sdGlwUG9zaXRpb24uVG9wXCIgdG9vbHRpcFRleHQ9XCJzaGFyZWRfZWRpdHRhYmxlX2Fqb3V0ZXJcIlxyXG4gICAgICBzdHlsZUNsYXNzPVwicC1lbGVtZW50IHAtYnV0dG9uLXNtIHAtYnV0dG9uLXN1Y2Nlc3MgcC1idXR0b24tdGV4dCBwLWJ1dHRvbiBwLWNvbXBvbmVudCBwLWJ1dHRvbi1pY29uLW9ubHkgbmctc3Rhci1pbnNlcnRlZFwiXHJcbiAgICAgIChjbGljayk9XCJhZGRSb3coKVwiPjwvVHNpLUJ1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9kaXY+Il19