@acorex/components 18.14.1-next.5 → 18.15.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. package/comment/lib/comment-container/comment-container.component.d.ts +1 -0
  2. package/common/lib/components/value-component.class.d.ts +1 -0
  3. package/common/lib/directives/auto-focus.directive.d.ts +1 -0
  4. package/common/lib/directives/ripple.directive.d.ts +1 -0
  5. package/data-table/lib/columns/data-table-column-resizable.directive.d.ts +1 -0
  6. package/data-table/lib/data-table/data-table.component.d.ts +61 -60
  7. package/data-table/lib/infinite-scroll-data-table/infinite-scroll-data-table.component.d.ts +7 -6
  8. package/drawer/lib/drawer/drawer-item/drawer.component.d.ts +2 -0
  9. package/esm2022/audio-wave/lib/audio-wave.component.mjs +79 -14
  10. package/esm2022/avatar/lib/avatar.component.mjs +2 -2
  11. package/esm2022/button/lib/button.component.mjs +2 -2
  12. package/esm2022/calendar/lib/calendar-range.component.mjs +2 -2
  13. package/esm2022/calendar/lib/calendar.component.mjs +3 -3
  14. package/esm2022/comment/lib/comment-container/comment-container.component.mjs +7 -3
  15. package/esm2022/common/lib/components/value-component.class.mjs +4 -2
  16. package/esm2022/common/lib/directives/auto-focus.directive.mjs +5 -3
  17. package/esm2022/common/lib/directives/inverted-color.directive.mjs +1 -1
  18. package/esm2022/common/lib/directives/ripple.directive.mjs +5 -3
  19. package/esm2022/conversation/lib/conversation-message/conversation-message.component.mjs +2 -2
  20. package/esm2022/conversation/lib/conversation-messages/conversation-message-voice/conversation-message-voice.component.mjs +2 -2
  21. package/esm2022/cron-job/index.mjs +1 -1
  22. package/esm2022/cron-job/lib/cron-job-container/cron-job-container.component.mjs +3 -3
  23. package/esm2022/cron-job/lib/day/day.component.mjs +3 -3
  24. package/esm2022/cron-job/lib/hours/hours.component.mjs +3 -3
  25. package/esm2022/cron-job/lib/minutes/minutes.component.mjs +3 -3
  26. package/esm2022/cron-job/lib/month/month.component.mjs +3 -3
  27. package/esm2022/cron-job/lib/seconds/seconds.component.mjs +3 -3
  28. package/esm2022/cron-job/lib/year/year.component.mjs +3 -3
  29. package/esm2022/data-table/lib/columns/data-table-column-resizable.directive.mjs +9 -7
  30. package/esm2022/data-table/lib/data-table/data-table.component.mjs +71 -67
  31. package/esm2022/data-table/lib/infinite-scroll-data-table/infinite-scroll-data-table.component.mjs +16 -11
  32. package/esm2022/drawer/lib/drawer/drawer-item/drawer.component.mjs +5 -2
  33. package/esm2022/list/lib/list.component.mjs +17 -5
  34. package/esm2022/loading/lib/loading-spinner.component.mjs +2 -2
  35. package/esm2022/loading-dialog/lib/loading-dialog.component.mjs +2 -2
  36. package/esm2022/menu/lib/context-menu.component.mjs +28 -21
  37. package/esm2022/password-box/lib/password-box.component.mjs +13 -5
  38. package/esm2022/password-box/lib/password-box.module.mjs +19 -3
  39. package/esm2022/password-box/lib/password-strength-validation/password-strength-validation.component.mjs +36 -14
  40. package/esm2022/popover/lib/popover.component.mjs +5 -3
  41. package/esm2022/popup/lib/popup.component.mjs +2 -2
  42. package/esm2022/uploader/lib/uploader-zone.directive.mjs +7 -5
  43. package/fesm2022/acorex-components-audio-wave.mjs +78 -13
  44. package/fesm2022/acorex-components-audio-wave.mjs.map +1 -1
  45. package/fesm2022/acorex-components-avatar.mjs +2 -2
  46. package/fesm2022/acorex-components-avatar.mjs.map +1 -1
  47. package/fesm2022/acorex-components-button.mjs +2 -2
  48. package/fesm2022/acorex-components-calendar.mjs +4 -4
  49. package/fesm2022/acorex-components-calendar.mjs.map +1 -1
  50. package/fesm2022/acorex-components-comment.mjs +7 -4
  51. package/fesm2022/acorex-components-comment.mjs.map +1 -1
  52. package/fesm2022/acorex-components-common.mjs +6 -3
  53. package/fesm2022/acorex-components-common.mjs.map +1 -1
  54. package/fesm2022/acorex-components-conversation.mjs +2 -2
  55. package/fesm2022/acorex-components-conversation.mjs.map +1 -1
  56. package/fesm2022/acorex-components-cron-job.mjs +14 -14
  57. package/fesm2022/acorex-components-cron-job.mjs.map +1 -1
  58. package/fesm2022/acorex-components-data-table.mjs +89 -81
  59. package/fesm2022/acorex-components-data-table.mjs.map +1 -1
  60. package/fesm2022/acorex-components-drawer.mjs +4 -2
  61. package/fesm2022/acorex-components-drawer.mjs.map +1 -1
  62. package/fesm2022/acorex-components-list.mjs +16 -4
  63. package/fesm2022/acorex-components-list.mjs.map +1 -1
  64. package/fesm2022/acorex-components-loading-dialog.mjs +2 -2
  65. package/fesm2022/acorex-components-loading.mjs +2 -2
  66. package/fesm2022/acorex-components-loading.mjs.map +1 -1
  67. package/fesm2022/acorex-components-menu.mjs +24 -18
  68. package/fesm2022/acorex-components-menu.mjs.map +1 -1
  69. package/fesm2022/acorex-components-password-box.mjs +65 -19
  70. package/fesm2022/acorex-components-password-box.mjs.map +1 -1
  71. package/fesm2022/acorex-components-popover.mjs +4 -3
  72. package/fesm2022/acorex-components-popover.mjs.map +1 -1
  73. package/fesm2022/acorex-components-popup.mjs +2 -2
  74. package/fesm2022/acorex-components-uploader.mjs +7 -6
  75. package/fesm2022/acorex-components-uploader.mjs.map +1 -1
  76. package/menu/lib/context-menu.component.d.ts +2 -1
  77. package/package.json +1 -1
  78. package/password-box/lib/password-box.component.d.ts +9 -1
  79. package/password-box/lib/password-box.module.d.ts +3 -1
  80. package/password-box/lib/password-strength-validation/password-strength-validation.component.d.ts +23 -1
  81. package/popover/lib/popover.component.d.ts +1 -0
  82. package/uploader/lib/uploader-zone.directive.d.ts +1 -0
@@ -1,8 +1,9 @@
1
1
  import { AXHtmlUtil, AXUnsubscriber } from '@acorex/core/utils';
2
2
  import { moveItemInArray } from '@angular/cdk/drag-drop';
3
+ import { DOCUMENT } from '@angular/common';
3
4
  import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, Input, NgZone, Output, QueryList, TemplateRef, ViewChild, ViewEncapsulation, computed, inject, signal, } from '@angular/core';
4
5
  import { Subject, buffer, debounceTime, filter } from 'rxjs';
5
- import { AXBaseDataTable } from '../base-data-table.class';
6
+ import { AXBaseDataTable, } from '../base-data-table.class';
6
7
  import { AXDataTableColumnComponent } from '../columns/data-table-column';
7
8
  import { AXDataTableTextColumnComponent } from '../columns/data-text-column.component';
8
9
  import * as i0 from "@angular/core";
@@ -23,6 +24,7 @@ export class AXDataTableComponent extends AXBaseDataTable {
23
24
  super(...arguments);
24
25
  this._unsubscriber = inject(AXUnsubscriber);
25
26
  this._zone = inject(NgZone);
27
+ this.document = inject(DOCUMENT);
26
28
  /**
27
29
  * @ignore
28
30
  */
@@ -104,73 +106,73 @@ export class AXDataTableComponent extends AXBaseDataTable {
104
106
  */
105
107
  this.fixedHeader = true;
106
108
  /**
107
- * Indicates if the table footer should be displayed.
108
- *
109
- * @defaultValue `false`
110
- */
109
+ * Indicates if the table footer should be displayed.
110
+ *
111
+ * @defaultValue `false`
112
+ */
111
113
  this.showFooter = false;
112
114
  /**
113
- * Indicates if the table footer should be fixed.
114
- *
115
- * @defaultValue `true`
116
- */
115
+ * Indicates if the table footer should be fixed.
116
+ *
117
+ * @defaultValue `true`
118
+ */
117
119
  this.fixedFooter = true;
118
120
  /**
119
- * Specifies the height of each item in the table.
120
- *
121
- * @defaultValue `40`
122
- */
121
+ * Specifies the height of each item in the table.
122
+ *
123
+ * @defaultValue `40`
124
+ */
123
125
  this.itemHeight = 40;
124
126
  /**
125
- * Enables or disables row reordering.
126
- *
127
- * @defaultValue `false`
128
- */
127
+ * Enables or disables row reordering.
128
+ *
129
+ * @defaultValue `false`
130
+ */
129
131
  this.allowReordering = false;
130
132
  /**
131
- * Enables or disables paging.
132
- *
133
- * @defaultValue `true`
134
- */
133
+ * Enables or disables paging.
134
+ *
135
+ * @defaultValue `true`
136
+ */
135
137
  this.paging = true;
136
138
  /**
137
- * Specifies how data should be fetched.
138
- *
139
- * @defaultValue `'auto'`
140
- */
139
+ * Specifies how data should be fetched.
140
+ *
141
+ * @defaultValue `'auto'`
142
+ */
141
143
  this.fetchDataMode = 'auto';
142
144
  /**
143
- * Configuration for loading state.
144
- *
145
- * @defaultValue `{ enabled: true, animation: true }`
146
- */
145
+ * Configuration for loading state.
146
+ *
147
+ * @defaultValue `{ enabled: true, animation: true }`
148
+ */
147
149
  this.loading = {
148
150
  enabled: true,
149
151
  animation: true,
150
152
  };
151
153
  /**
152
- * Emits when the focused row changes.
153
- *
154
- * @event
155
- */
154
+ * Emits when the focused row changes.
155
+ *
156
+ * @event
157
+ */
156
158
  this.focusedRowChange = new EventEmitter();
157
159
  /**
158
- * Emits when a row is clicked.
159
- *
160
- * @event onRowClick
161
- */
160
+ * Emits when a row is clicked.
161
+ *
162
+ * @event onRowClick
163
+ */
162
164
  this.onRowClick = new EventEmitter();
163
165
  /**
164
- * Emits when a row is double-clicked.
165
- *
166
- * @event onRowDbClick
167
- */
166
+ * Emits when a row is double-clicked.
167
+ *
168
+ * @event onRowDbClick
169
+ */
168
170
  this.onRowDbClick = new EventEmitter();
169
171
  /**
170
- * Emits when the order of columns changes.
171
- *
172
- * @event onColumnsOrderChanged
173
- */
172
+ * Emits when the order of columns changes.
173
+ *
174
+ * @event onColumnsOrderChanged
175
+ */
174
176
  this.onColumnsOrderChanged = new EventEmitter();
175
177
  /**
176
178
  * @ignore
@@ -181,7 +183,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
181
183
  */
182
184
  this.onResizeColumnMove = (event) => {
183
185
  const diffX = event.pageX - this.resizeColumnProp.startX;
184
- const newWidth = this.rtl ? this.resizeColumnProp.startWidth - diffX : this.resizeColumnProp.startWidth + diffX;
186
+ const newWidth = this.rtl
187
+ ? this.resizeColumnProp.startWidth - diffX
188
+ : this.resizeColumnProp.startWidth + diffX;
185
189
  this.resizeColumnProp.thElement.style.width = `${Math.max(100, newWidth)}px`;
186
190
  this.resizeColumnProp.thElement.setAttribute('new-width', `${newWidth}`);
187
191
  };
@@ -189,24 +193,24 @@ export class AXDataTableComponent extends AXBaseDataTable {
189
193
  * @ignore
190
194
  */
191
195
  this.onResizeColumnEnd = () => {
192
- document.removeEventListener('mousemove', this.onResizeColumnMove);
193
- document.removeEventListener('mouseup', this.onResizeColumnEnd);
196
+ this.document.removeEventListener('mousemove', this.onResizeColumnMove);
197
+ this.document.removeEventListener('mouseup', this.onResizeColumnEnd);
194
198
  const newWidth = parseInt(this.resizeColumnProp.thElement.attributes.getNamedItem('new-width').value);
195
199
  this.columns.get(this.resizeColumnProp.columnIndex).width = `${Math.max(100, newWidth)}px`;
196
200
  this.resetResizingProcess();
197
201
  };
198
202
  }
199
203
  /**
200
- * Gets the currently focused row.
201
- */
204
+ * Gets the currently focused row.
205
+ */
202
206
  get focusedRow() {
203
207
  return this._focusedRow;
204
208
  }
205
209
  /**
206
- * Sets the currently focused row and emits the change event.
207
- *
208
- * @param v - The row to be focused.
209
- */
210
+ * Sets the currently focused row and emits the change event.
211
+ *
212
+ * @param v - The row to be focused.
213
+ */
210
214
  set focusedRow(v) {
211
215
  this._focusedRow = v;
212
216
  this.focusedRowChange.emit(v);
@@ -320,13 +324,13 @@ export class AXDataTableComponent extends AXBaseDataTable {
320
324
  });
321
325
  }
322
326
  /**
323
- * Handles the click event on a column header.
324
- * Toggles the sorting direction or removes the sort if already sorted.
325
- *
326
- * @param e - The mouse event triggered by the click.
327
- * @param column - The column that was clicked.
328
- * @ignore
329
- */
327
+ * Handles the click event on a column header.
328
+ * Toggles the sorting direction or removes the sort if already sorted.
329
+ *
330
+ * @param e - The mouse event triggered by the click.
331
+ * @param column - The column that was clicked.
332
+ * @ignore
333
+ */
330
334
  handleColumnClick(e, column) {
331
335
  if (column instanceof AXDataTableTextColumnComponent) {
332
336
  const sort = this.dataSource.query.sort.find((c) => c.field == column.dataField);
@@ -358,9 +362,9 @@ export class AXDataTableComponent extends AXBaseDataTable {
358
362
  return undefined;
359
363
  }
360
364
  /**
361
- * Refreshes the data in the data source and resets the data pager to the first page.
362
- * @ignore
363
- */
365
+ * Refreshes the data in the data source and resets the data pager to the first page.
366
+ * @ignore
367
+ */
364
368
  refresh() {
365
369
  this.dataSource.refresh();
366
370
  if (this.dataPager) {
@@ -384,8 +388,8 @@ export class AXDataTableComponent extends AXBaseDataTable {
384
388
  this.resizeColumnProp.startWidth = parseInt(this.resizeColumnProp.thElement.style.width);
385
389
  this.resizeColumnProp.columnIndex = columnIndex;
386
390
  this._zone.runOutsideAngular(() => {
387
- document.addEventListener('mousemove', this.onResizeColumnMove);
388
- document.addEventListener('mouseup', this.onResizeColumnEnd);
391
+ this.document.addEventListener('mousemove', this.onResizeColumnMove);
392
+ this.document.addEventListener('mouseup', this.onResizeColumnEnd);
389
393
  });
390
394
  }
391
395
  /**
@@ -501,4 +505,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
501
505
  type: ContentChildren,
502
506
  args: [AXDataTableColumnComponent]
503
507
  }] } });
504
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBRUwsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxlQUFlLEVBQ2YsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsRUFFVCxXQUFXLEVBQ1gsU0FBUyxFQUNULGlCQUFpQixFQUVqQixRQUFRLEVBQ1IsTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQTBFLE1BQU0sMEJBQTBCLENBQUM7QUFDbkksT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUUsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sdUNBQXVDLENBQUM7Ozs7Ozs7OztBQUV2Rjs7OztHQUlHO0FBa0JILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSxlQUFlO0lBakJ6RDs7UUFrQlUsa0JBQWEsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsVUFBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENB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QkFTUCxZQUFZO3NCQURYLE1BQU07Z0JBU1AscUJBQXFCO3NCQURwQixNQUFNO2dCQVlHLE9BQU87c0JBRGhCLGVBQWU7dUJBQUMsMEJBQTBCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQVhEYXRhUGFnZXJDaGFuZ2VkRXZlbnQgfSBmcm9tICdAYWNvcmV4L2NvbXBvbmVudHMvZGF0YS1wYWdlcic7XG5pbXBvcnQgeyBBWEh0bWxVdGlsLCBBWFVuc3Vic2NyaWJlciB9IGZyb20gJ0BhY29yZXgvY29yZS91dGlscyc7XG5pbXBvcnQgeyBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsXG4gIE5nWm9uZSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFF1ZXJ5TGlzdCxcbiAgU2lnbmFsLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgV3JpdGFibGVTaWduYWwsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBidWZmZXIsIGRlYm91bmNlVGltZSwgZmlsdGVyIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBWEJhc2VEYXRhVGFibGUsIEFYQ29sdW1uc09yZGVyQ2hhbmdlZEV2ZW50LCBBWERhdGFUYWJsZVJvd0NsaWNrLCBBWERhdGFUYWJsZVJvd0RiQ2xpY2sgfSBmcm9tICcuLi9iYXNlLWRhdGEtdGFibGUuY2xhc3MnO1xuaW1wb3J0IHsgQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2RhdGEtdGFibGUtY29sdW1uJztcbmltcG9ydCB7IEFYRGF0YVRhYmxlVGV4dENvbHVtbkNvbXBvbmVudCB9IGZyb20gJy4uL2NvbHVtbnMvZGF0YS10ZXh0LWNvbHVtbi5jb21wb25lbnQnO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZGlzcGxheWluZyBhbmQgbWFuYWdpbmcgYSBkYXRhIHRhYmxlIHdpdGggYWR2YW5jZWQgZmVhdHVyZXMuXG4gKlxuICogQGNhdGVnb3J5IENvbXBvbmVudHNcbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYXgtZGF0YS10YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRhLXRhYmxlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGF0YS10YWJsZS5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgaG9zdDogeyBuZ1NraXBIeWRyYXRpb246ICd0cnVlJyB9LFxuICBpbnB1dHM6IFsnZGF0YVNvdXJjZSddLFxuICBvdXRwdXRzOiBbJ3NlbGVjdGVkUm93c0NoYW5nZSddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBBWEJhc2VEYXRhVGFibGUsXG4gICAgICB1c2VFeGlzdGluZzogQVhEYXRhVGFibGVDb21wb25lbnQsXG4gICAgfSxcbiAgICBBWFVuc3Vic2NyaWJlcixcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQVhEYXRhVGFibGVDb21wb25lbnQgZXh0ZW5kcyBBWEJhc2VEYXRhVGFibGUgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuICBwcml2YXRlIF91bnN1YnNjcmliZXIgPSBpbmplY3QoQVhVbnN1YnNjcmliZXIpO1xuICBwcml2YXRlIF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBAVmlld0NoaWxkKCdkYXRhUGFnZXInKSBkYXRhUGFnZXI7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcnRsITogYm9vbGVhbjtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBkaXNwbGF5ZWRSb3dzOiBXcml0YWJsZVNpZ25hbDxhbnlbXT4gPSBzaWduYWwoW10pO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHBhZ2U6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMCk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFnZVNpemU6IFdyaXRhYmxlU2lnbmFsPG51bWJlcj4gPSBzaWduYWwoMCk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nOiBXcml0YWJsZVNpZ25hbDxib29sZWFuPiA9IHNpZ25hbCh0cnVlKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBjb2x1bW5zTGlzdDogV3JpdGFibGVTaWduYWw8YW55W10+ID0gc2lnbmFsKFtdKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBlbmRGaXhlZENvbHVtbnNMaXN0OiBTaWduYWw8YW55W10+ID0gY29tcHV0ZWQoKCkgPT4gdGhpcy5jb2x1bW5zTGlzdCgpLmZpbHRlcigoYykgPT4gYy5maXhlZCA9PT0gJ2VuZCcpKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydEZpeGVkQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkID09PSAnc3RhcnQnKSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgbm9ybWFsQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PiB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkICE9PSAnZW5kJyAmJiBjLmZpeGVkICE9PSAnc3RhcnQnKSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzaXplQ29sdW1uUHJvcCA9IHtcbiAgICBzdGFydFg6IDAsXG4gICAgc3RhcnRXaWR0aDogMCxcbiAgICBjb2x1bW5JbmRleDogMCxcbiAgICBuZXdDb2x1bW5XaWR0aDogMCxcbiAgICB0aEVsZW1lbnQ6IG51bGwsXG4gIH07XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFzSXRlbXMgPSBmYWxzZTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCB0b3RhbFJvd3MgPSAwO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGN1cnJlbnRQYWdlID0gMDtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCB0b3RhbFBhZ2VzID0gMDtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydFJvd0luZGV4ID0gMDtcblxuICAvKipcbiAgICogVGVtcGxhdGUgZm9yIGN1c3RvbSByb3cgY29udGVudC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHJvd1RlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFRlbXBsYXRlIHRvIGRpc3BsYXkgd2hlbiB0aGUgdGFibGUgaXMgZW1wdHkuXG4gICAqL1xuICBASW5wdXQoKVxuICBlbXB0eVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbi8qKlxuICogRGVmaW5lcyBpZiBhbHRlcm5hdGl2ZSByb3cgc3R5bGluZyBzaG91bGQgYmUgYXBwbGllZC5cbiAqIFxuICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAqL1xuICBASW5wdXQoKVxuICBhbHRlcm5hdGl2ZSA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGFibGUgaGVhZGVyIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBzaG93SGVhZGVyID0gdHJ1ZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0YWJsZSBoZWFkZXIgc2hvdWxkIGJlIGZpeGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGB0cnVlYFxuICAgKi9cbiAgQElucHV0KClcbiAgZml4ZWRIZWFkZXIgPSB0cnVlO1xuXG4gICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0YWJsZSBmb290ZXIgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd0Zvb3RlciA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGFibGUgZm9vdGVyIHNob3VsZCBiZSBmaXhlZC5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBmaXhlZEZvb3RlciA9IHRydWU7XG5cbiAgICAvKipcbiAgICogU3BlY2lmaWVzIHRoZSBoZWlnaHQgb2YgZWFjaCBpdGVtIGluIHRoZSB0YWJsZS5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYDQwYFxuICAgKi9cbiAgQElucHV0KClcbiAgaXRlbUhlaWdodDogbnVtYmVyIHwgJ2F1dG8nID0gNDA7XG5cbiAgIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHJvdyByZW9yZGVyaW5nLlxuICAgKiBcbiAgICogQGRlZmF1bHRWYWx1ZSBgZmFsc2VgXG4gICAqL1xuICBASW5wdXQoKVxuICBhbGxvd1Jlb3JkZXJpbmcgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGVzIHBhZ2luZy5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBwYWdpbmcgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAqIFNwZWNpZmllcyBob3cgZGF0YSBzaG91bGQgYmUgZmV0Y2hlZC5cbiAgICogXG4gICAqIEBkZWZhdWx0VmFsdWUgYCdhdXRvJ2BcbiAgICovXG4gIEBJbnB1dCgpXG4gIGZldGNoRGF0YU1vZGU6ICdhdXRvJyB8ICdtYW51YWwnID0gJ2F1dG8nO1xuXG4gICAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIGxvYWRpbmcgc3RhdGUuXG4gICAqIFxuICAgKiBAZGVmYXVsdFZhbHVlIGB7IGVuYWJsZWQ6IHRydWUsIGFuaW1hdGlvbjogdHJ1ZSB9YFxuICAgKi9cbiAgQElucHV0KClcbiAgbG9hZGluZzoge1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgYW5pbWF0aW9uOiBib29sZWFuO1xuICAgIGxvYWRpbmdUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPHVua25vd24+O1xuICB9ID0ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICB9O1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBfZm9jdXNlZFJvdzogdW5rbm93bjtcblxuICAvKipcbiAqIEdldHMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIHJvdy5cbiAqL1xuICBASW5wdXQoKVxuICBwdWJsaWMgZ2V0IGZvY3VzZWRSb3coKTogdW5rbm93biB7XG4gICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWRSb3c7XG4gIH1cblxuICAvKipcbiAqIFNldHMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIHJvdyBhbmQgZW1pdHMgdGhlIGNoYW5nZSBldmVudC5cbiAqXG4gKiBAcGFyYW0gdiAtIFRoZSByb3cgdG8gYmUgZm9jdXNlZC5cbiAqL1xuICBwdWJsaWMgc2V0IGZvY3VzZWRSb3codjogdW5rbm93bikge1xuICAgIHRoaXMuX2ZvY3VzZWRSb3cgPSB2O1xuICAgIHRoaXMuZm9jdXNlZFJvd0NoYW5nZS5lbWl0KHYpO1xuICB9XG5cblxuICAvKipcbiAqIEVtaXRzIHdoZW4gdGhlIGZvY3VzZWQgcm93IGNoYW5nZXMuXG4gKiBcbiAqIEBldmVudCBcbiAqL1xuICBAT3V0cHV0KClcbiAgZm9jdXNlZFJvd0NoYW5nZTogRXZlbnRFbWl0dGVyPHVua25vd24+ID0gbmV3IEV2ZW50RW1pdHRlcjx1bmtub3duPigpO1xuXG4gIC8qKlxuICogRW1pdHMgd2hlbiBhIHJvdyBpcyBjbGlja2VkLlxuICogXG4gKiBAZXZlbnQgb25Sb3dDbGlja1xuICovXG4gIEBPdXRwdXQoKVxuICBvblJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYXRhVGFibGVSb3dDbGljaz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93Q2xpY2s+KCk7XG5cbiAgLyoqXG4gKiBFbWl0cyB3aGVuIGEgcm93IGlzIGRvdWJsZS1jbGlja2VkLlxuICogXG4gKiBAZXZlbnQgb25Sb3dEYkNsaWNrXG4gKi9cbiAgQE91dHB1dCgpXG4gIG9uUm93RGJDbGljazogRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93RGJDbGljaz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93RGJDbGljaz4oKTtcblxuICAvKipcbiAqIEVtaXRzIHdoZW4gdGhlIG9yZGVyIG9mIGNvbHVtbnMgY2hhbmdlcy5cbiAqIFxuICogQGV2ZW50IG9uQ29sdW1uc09yZGVyQ2hhbmdlZFxuICovXG4gIEBPdXRwdXQoKVxuICBvbkNvbHVtbnNPcmRlckNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxBWENvbHVtbnNPcmRlckNoYW5nZWRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYQ29sdW1uc09yZGVyQ2hhbmdlZEV2ZW50PigpO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBjbGlja1N1YmplY3QgPSBuZXcgU3ViamVjdDx7IGV2ZW50OiBNb3VzZUV2ZW50OyBpdGVtOiBhbnkgfT4oKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIEBDb250ZW50Q2hpbGRyZW4oQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQpXG4gIHByb3RlY3RlZCBjb2x1bW5zOiBRdWVyeUxpc3Q8QVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ+O1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgb3ZlcnJpZGUgbmdPbkluaXQoKSB7XG4gICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICB0aGlzLnJ0bCA9IEFYSHRtbFV0aWwuaXNSdGwodGhpcy5nZXRIb3N0RWxlbWVudCgpKTtcbiAgICB0aGlzLmRhdGFTb3VyY2UudXNlQ2FjaGUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5mZXRjaERhdGFNb2RlID09ICdhdXRvJykge1xuICAgICAgdGhpcy5kYXRhU291cmNlLnNldFBhZ2UoMCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcGxheWVkUm93cy5zZXQobmV3IEFycmF5KHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSkpO1xuICAgIHRoaXMudG90YWxSb3dzID0gdGhpcy5kYXRhU291cmNlLml0ZW1zLmxlbmd0aDtcbiAgICB0aGlzLmRhdGFTb3VyY2Uub25Mb2FkaW5nQ2hhbmdlZC5waXBlKHRoaXMuX3Vuc3Vic2NyaWJlci50YWtlVW50aWxEZXN0cm95KS5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuaXNMb2FkaW5nLnNldChkYXRhKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZGF0YVNvdXJjZS5vbkNoYW5nZWQucGlwZSh0aGlzLl91bnN1YnNjcmliZXIudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmRpc3BsYXllZFJvd3Muc2V0KGRhdGEuaXRlbXMpO1xuICAgICAgdGhpcy50b3RhbFJvd3MgPSBkYXRhLnRvdGFsQ291bnQ7XG4gICAgICB0aGlzLmhhc0l0ZW1zID0gZGF0YS50b3RhbENvdW50ID4gMDtcbiAgICB9KTtcblxuICAgIHRoaXMucGFnZVNpemUuc2V0KHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSk7XG5cbiAgICAvL1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0XG4gICAgICAucGlwZShcbiAgICAgICAgYnVmZmVyKHRoaXMuY2xpY2tTdWJqZWN0LnBpcGUoZGVib3VuY2VUaW1lKDI1MCkpKSxcbiAgICAgICAgZmlsdGVyKChjbGlja0FycmF5KSA9PiBjbGlja0FycmF5Lmxlbmd0aCA9PT0gMiksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChjbGlja0FycmF5KSA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUm93RG91YmxlQ2xpY2soY2xpY2tBcnJheVswXS5ldmVudCwgY2xpY2tBcnJheVswXS5pdGVtKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jYWxjdWxhdGVTdGlja3lDb2x1bW5zUG9zaXRpb25zKCk7XG4gICAgdGhpcy5jb2x1bW5zTGlzdC5zZXQodGhpcy5jb2x1bW5zLnRvQXJyYXkoKSk7XG4gICAgdGhpcy5jb2x1bW5zLmNoYW5nZXMucGlwZSh0aGlzLl91bnN1YnNjcmliZXIudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKChjb2xzKSA9PiB7XG4gICAgICB0aGlzLmNvbHVtbnNMaXN0LnNldChjb2xzLnRvQXJyYXkoKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxhbnksIGFueSwgYW55Pikge1xuICAgIGNvbnN0IGNsb25lZENvbHVtbnMgPSBbLi4udGhpcy5jb2x1bW5zTGlzdCgpXTtcbiAgICBtb3ZlSXRlbUluQXJyYXkoY2xvbmVkQ29sdW1ucywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB0aGlzLmNvbHVtbnNMaXN0LnNldChjbG9uZWRDb2x1bW5zKTtcblxuICAgIHRoaXMub25Db2x1bW5zT3JkZXJDaGFuZ2VkLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgZGF0YTogeyBldmVudCB9LFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBoYW5kbGVSb3dDbGljayhldmVudDogTW91c2VFdmVudCwgaXRlbTogdW5rbm93bikge1xuICAgIHRoaXMuaGFuZGxlUm93U2luZ2xlQ2xpY2soZXZlbnQsIGl0ZW0pO1xuICAgIHRoaXMuY2xpY2tTdWJqZWN0Lm5leHQoeyBldmVudCwgaXRlbSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVSb3dTaW5nbGVDbGljayhldmVudDogRXZlbnQsIGl0ZW06IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmZvY3VzZWRSb3cgPT0gaXRlbSkge1xuICAgICAgdGhpcy5mb2N1c2VkUm93ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mb2N1c2VkUm93ID0gaXRlbTtcbiAgICB9XG4gICAgLy9cbiAgICB0aGlzLm9uUm93Q2xpY2suZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBkYXRhOiBpdGVtLFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBvblBhZ2VDaGFuZ2VkKGV2ZW50OiBBWERhdGFQYWdlckNoYW5nZWRFdmVudCkge1xuICAgIGlmIChldmVudC5pc1VzZXJJbnRlcmFjdGlvbikge1xuICAgICAgY29uc3QgcGFnZUNoYW5nZWQgPSBldmVudC5wYWdlIC0gMSAhPSB0aGlzLnBhZ2UoKTtcbiAgICAgIGNvbnN0IHBhZ2VTaXplQ2hhbmdlZCA9IGV2ZW50LnRha2UgIT0gdGhpcy5wYWdlU2l6ZSgpO1xuXG4gICAgICBpZiAocGFnZUNoYW5nZWQgfHwgcGFnZVNpemVDaGFuZ2VkKSB7XG4gICAgICAgIGlmIChwYWdlQ2hhbmdlZCkge1xuICAgICAgICAgIHRoaXMucGFnZS5zZXQoZXZlbnQucGFnZSAtIDEpO1xuICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5zZXRQYWdlKHRoaXMucGFnZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWdlU2l6ZUNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2VTaXplLnNldChldmVudC50YWtlKTtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc2V0UGFnZVNpemUodGhpcy5wYWdlU2l6ZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBkaXNwbGF5ZWQgcm93cyBhbmQgZGF0YSBzb3VyY2VcbiAgICAgICAgdGhpcy5kaXNwbGF5ZWRSb3dzLnNldChuZXcgQXJyYXkodGhpcy5wYWdlU2l6ZSgpKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlUm93RG91YmxlQ2xpY2soZTogTW91c2VFdmVudCwgaXRlbTogdW5rbm93bikge1xuICAgIHRoaXMuZm9jdXNlZFJvdyA9IGl0ZW07XG4gICAgLy9cbiAgICB0aGlzLm9uUm93RGJDbGljay5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIGRhdGE6IGl0ZW0sXG4gICAgICBpc1VzZXJJbnRlcmFjdGlvbjogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICogSGFuZGxlcyB0aGUgY2xpY2sgZXZlbnQgb24gYSBjb2x1bW4gaGVhZGVyLlxuICogVG9nZ2xlcyB0aGUgc29ydGluZyBkaXJlY3Rpb24gb3IgcmVtb3ZlcyB0aGUgc29ydCBpZiBhbHJlYWR5IHNvcnRlZC5cbiAqIFxuICogQHBhcmFtIGUgLSBUaGUgbW91c2UgZXZlbnQgdHJpZ2dlcmVkIGJ5IHRoZSBjbGljay5cbiAqIEBwYXJhbSBjb2x1bW4gLSBUaGUgY29sdW1uIHRoYXQgd2FzIGNsaWNrZWQuXG4gKiBAaWdub3JlXG4gKi9cbiAgaGFuZGxlQ29sdW1uQ2xpY2soZTogTW91c2VFdmVudCwgY29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCkge1xuICAgIGlmIChjb2x1bW4gaW5zdGFuY2VvZiBBWERhdGFUYWJsZVRleHRDb2x1bW5Db21wb25lbnQpIHtcbiAgICAgIGNvbnN0IHNvcnQgPSB0aGlzLmRhdGFTb3VyY2UucXVlcnkuc29ydC5maW5kKChjKSA9PiBjLmZpZWxkID09IGNvbHVtbi5kYXRhRmllbGQpO1xuICAgICAgaWYgKCFzb3J0KSB7XG4gICAgICAgIHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0LnB1c2goe1xuICAgICAgICAgIGZpZWxkOiBjb2x1bW4uZGF0YUZpZWxkLFxuICAgICAgICAgIGRpcjogJ2FzYycsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHNvcnQuZGlyID09ICdhc2MnKSB7XG4gICAgICAgICAgc29ydC5kaXIgPSAnZGVzYyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQgPSB0aGlzLmRhdGFTb3VyY2UucXVlcnkuc29ydC5maWx0ZXIoKGMpID0+IGMgIT0gc29ydCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGdldFNvcnQoY29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGNvbHVtbiBpbnN0YW5jZW9mIEFYRGF0YVRhYmxlVGV4dENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0LmZpbmQoKGMpID0+IGMuZmllbGQgPT0gY29sdW1uLmRhdGFGaWVsZCk7XG4gICAgICByZXR1cm4gc29ydCA/IChzb3J0LmRpciA9PSAnYXNjJyA/ICdheC1pY29uLWFycm93LWxvbmctZG93bicgOiAnYXgtaWNvbi1hcnJvdy1sb25nLXVwJykgOiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAqIFJlZnJlc2hlcyB0aGUgZGF0YSBpbiB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlc2V0cyB0aGUgZGF0YSBwYWdlciB0byB0aGUgZmlyc3QgcGFnZS5cbiAqIEBpZ25vcmVcbiAqL1xuICBwdWJsaWMgcmVmcmVzaCgpIHtcbiAgICB0aGlzLmRhdGFTb3VyY2UucmVmcmVzaCgpO1xuICAgIGlmICh0aGlzLmRhdGFQYWdlcikge1xuICAgICAgdGhpcy5kYXRhUGFnZXIuZ29GaXJzdFBhZ2UoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBjYWxjdWxhdGVSb3dJbmRleChpbmRleDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5wYWdlU2l6ZSAqIHRoaXMucGFnZSgpICsgaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBvblJlc2l6ZUNvbHVtblN0YXJ0KGV2ZW50OiBNb3VzZUV2ZW50LCBjb2x1bW5JbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC5zdGFydFggPSBldmVudC5wYWdlWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AudGhFbGVtZW50ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkucGFyZW50RWxlbWVudDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRXaWR0aCA9IHBhcnNlSW50KHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQuc3R5bGUud2lkdGgpO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC5jb2x1bW5JbmRleCA9IGNvbHVtbkluZGV4O1xuICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZUNvbHVtbk1vdmUpO1xuICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVDb2x1bW5FbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIG9uUmVzaXplQ29sdW1uTW92ZSA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRYO1xuICAgIGNvbnN0IG5ld1dpZHRoID0gdGhpcy5ydGwgPyB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRXaWR0aCAtIGRpZmZYIDogdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnN0YXJ0V2lkdGggKyBkaWZmWDtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AudGhFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7TWF0aC5tYXgoMTAwLCBuZXdXaWR0aCl9cHhgO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQuc2V0QXR0cmlidXRlKCduZXctd2lkdGgnLCBgJHtuZXdXaWR0aH1gKTtcbiAgfTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgb25SZXNpemVDb2x1bW5FbmQgPSAoKTogdm9pZCA9PiB7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vblJlc2l6ZUNvbHVtbk1vdmUpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplQ29sdW1uRW5kKTtcblxuICAgIGNvbnN0IG5ld1dpZHRoID0gcGFyc2VJbnQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmV3LXdpZHRoJykudmFsdWUpO1xuICAgIHRoaXMuY29sdW1ucy5nZXQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLmNvbHVtbkluZGV4KS53aWR0aCA9IGAke01hdGgubWF4KDEwMCwgbmV3V2lkdGgpfXB4YDtcbiAgICB0aGlzLnJlc2V0UmVzaXppbmdQcm9jZXNzKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHJlc2V0UmVzaXppbmdQcm9jZXNzKCkge1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduZXctd2lkdGgnKTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AgPSB7XG4gICAgICBzdGFydFg6IDAsXG4gICAgICBzdGFydFdpZHRoOiAwLFxuICAgICAgY29sdW1uSW5kZXg6IDAsXG4gICAgICBuZXdDb2x1bW5XaWR0aDogMCxcbiAgICAgIHRoRWxlbWVudDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVN0aWNreUNvbHVtbnNQb3NpdGlvbnMoKSB7XG4gICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgIGxldCBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ID0gMDtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi53aWR0aCBhcyBzdHJpbmcpO1xuICAgICAgaWYgKCFpc05hTih3aWR0aCkpIHtcbiAgICAgICAgdG90YWxXaWR0aCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgbGFzdFN0YXJ0Q29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcblxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoY29sdW1uLndpZHRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGlmIChjb2x1bW4uZml4ZWQgPT09ICdzdGFydCcgJiYgIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBjb2x1bW5bJ3N0aWNreVN0YXJ0J10gPSBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ICsgJ3B4JztcbiAgICAgICAgbGFzdFN0YXJ0Q29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ICs9IHdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsYXN0U3RhcnRDb2x1bW4pIGxhc3RTdGFydENvbHVtblsnaXNMYXN0Rml4ZWRDb2x1bW4nXSA9IHRydWU7XG5cbiAgICBsZXQgYWNjdW11bGF0ZWRXaWR0aEZyb21FbmQgPSAwO1xuICAgIGxldCBmaXJzdEVuZENvbHVtbjogQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZ2V0KGkpO1xuXG4gICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi53aWR0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBpZiAoY29sdW1uLmZpeGVkID09PSAnZW5kJyAmJiAhaXNOYU4od2lkdGgpKSB7XG4gICAgICAgIGNvbHVtblsnc3RpY2t5RW5kJ10gPSBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCArICdweCc7XG4gICAgICAgIGZpcnN0RW5kQ29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpcnN0RW5kQ29sdW1uKSBmaXJzdEVuZENvbHVtblsnaXNGaXJzdEZpeGVkQ29sdW1uJ10gPSB0cnVlO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJheC1oZWFkZXJcIj4gPC9uZy1jb250ZW50PlxuQGlmICghZGlzcGxheWVkUm93cygpLmxlbmd0aCkge1xuICA8ZGl2IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1lbXB0eS1kYXRhXCI+XG4gICAgQGlmIChlbXB0eVRlbXBsYXRlKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHNwYW4+Tm8gUmVjb3JkIEZvdW5kITwvc3Bhbj5cbiAgICB9XG4gIDwvZGl2PlxufVxuPGRpdiBjbGFzcz1cImF4LWRhdGEtdGFibGUtd3JhcHBlclwiPlxuICA8dGFibGU+XG4gICAgQGlmIChzaG93SGVhZGVyKSB7XG4gICAgICA8dGhlYWQgW25nQ2xhc3NdPVwieyAnYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyJzogZml4ZWRIZWFkZXIgfVwiPlxuICAgICAgICA8dHJcbiAgICAgICAgICBbY2RrRHJvcExpc3REaXNhYmxlZF09XCIhYWxsb3dSZW9yZGVyaW5nXCJcbiAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgIGNka1Njcm9sbGFibGVcbiAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGZvciAoYyBvZiBzdGFydEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbCBzdGlja3ktc3RhcnRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1zdGFydF09XCJjWydzdGlja3lTdGFydCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVySGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1pbnRlcmFjdGl2ZV09XCJjLmFsbG93U29ydGluZ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjLmFsbG93U29ydGluZyA/IGhhbmRsZUNvbHVtbkNsaWNrKCRldmVudCwgYykgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWhlYWRlci1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVySGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChjLmFsbG93UmVzaXppbmcgJiYgIWMuZml4ZWQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtcmVzaXplLWhhbmRsZVwiIChtb3VzZWRvd24pPVwib25SZXNpemVDb2x1bW5TdGFydCgkZXZlbnQsIHRoaXMuc3RhcnRGaXhlZENvbHVtbnNMaXN0KCkubGVuZ3RoICsgJGluZGV4KVwiPjwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgICBAZm9yIChjIG9mIGVuZEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbCBzdGlja3ktZW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXNGaXJzdF09XCJjWydpc0ZpcnN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1lbmRdPVwiY1snc3RpY2t5RW5kJ11cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgIH1cbiAgICA8dGJvZHkgW25nQ2xhc3NdPVwieyAnYXgtZGF0YS10YWJsZS1yb3ctYWx0ZXJuYXRpdmUnOiBhbHRlcm5hdGl2ZSB9XCI+XG4gICAgICBAZm9yIChyb3cgb2YgZGlzcGxheWVkUm93cygpOyBsZXQgcm93SW5kZXggPSAkaW5kZXg7IHRyYWNrIHJvd0luZGV4KSB7XG4gICAgICAgIEBpZiAocm93VGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93VGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4IH0gfVwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBbY2xhc3MuYXgtc3RhdGUtZm9jdXNlZF09XCJmb2N1c2VkUm93ICYmIHJvdyA9PT0gZm9jdXNlZFJvd1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJzZWxlY3RlZFJvd3MuaW5jbHVkZXMocm93KVwiXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQ9XCJ7eyBpdGVtSGVpZ2h0IH19cHhcIlxuICAgICAgICAgICAgc3R5bGUubWF4LWhlaWdodD1cInt7IGl0ZW1IZWlnaHQgfX1weFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1ib2R5LWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5LXN0YXJ0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LXN0YXJ0XT1cImNbJ3N0aWNreVN0YXJ0J11cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiYy5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocm93ICYmICFpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyQ2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiByb3csIHJvd0luZGV4OiBjYWxjdWxhdGVSb3dJbmRleChyb3dJbmRleCkgfSB9XCJcbiAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYy5sb2FkaW5nRW5hYmxlZCAmJiBsb2FkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXgtc2tlbGV0b24gW2FuaW1hdGVkXT1cImxvYWRpbmcuYW5pbWF0aW9uXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktYm9keS1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJjLmNhcHRpb25cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImMuY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChyb3cgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IGNhbGN1bGF0ZVJvd0luZGV4KHJvd0luZGV4KSB9IH1cIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgQGlmIChjLmxvYWRpbmdFbmFibGVkICYmIGxvYWRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvYWRpbmcubG9hZGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmcubG9hZGluZ1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxheC1za2VsZXRvbiBbYW5pbWF0ZWRdPVwibG9hZGluZy5hbmltYXRpb25cIj48L2F4LXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICBAZm9yIChjIG9mIGVuZEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktYm9keS1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnN0aWNreS1lbmRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzRmlyc3RdPVwiY1snaXNGaXJzdEZpeGVkQ29sdW1uJ11cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1lbmRdPVwiY1snc3RpY2t5RW5kJ11cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiYy5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocm93ICYmICFpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyQ2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiByb3csIHJvd0luZGV4OiBjYWxjdWxhdGVSb3dJbmRleChyb3dJbmRleCkgfSB9XCJcbiAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYy5sb2FkaW5nRW5hYmxlZCAmJiBsb2FkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXgtc2tlbGV0b24gW2FuaW1hdGVkXT1cImxvYWRpbmcuYW5pbWF0aW9uXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIDx0ciBjbGFzcz1cImVtcHR5LXJvd1wiPjwvdHI+XG4gICAgPC90Ym9keT5cbiAgICBAaWYgKHNob3dGb290ZXIpIHtcbiAgICAgIDx0Zm9vdCBbbmdDbGFzc109XCJ7ICdheC1kYXRhLXRhYmxlLXN0aWNreS1mb290ZXInOiBmaXhlZEZvb3RlciB9XCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsIHN0aWNreS1zdGFydFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1mb290ZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1zdGFydF09XCJjWydzdGlja3lTdGFydCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyRm9vdGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJGb290ZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGMuYWxsb3dSZXNpemluZyAmJiAhYy5maXhlZCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1yZXNpemUtaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblJlc2l6ZUNvbHVtblN0YXJ0KCRldmVudCwgdGhpcy5zdGFydEZpeGVkQ29sdW1uc0xpc3QoKS5sZW5ndGggKyAkaW5kZXgpXCI+PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIEBmb3IgKGMgb2YgZW5kRml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsIHN0aWNreS1lbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0ZpcnN0XT1cImNbJ2lzRmlyc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LWVuZF09XCJjWydzdGlja3lFbmQnXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1jYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjLnJlbmRlckZvb3RlclRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiBjLCByb3dzOiBkaXNwbGF5ZWRSb3dzKCksIHJvd0luZGV4OiAkaW5kZXggfSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgQGlmIChnZXRTb3J0KGMpKSB7XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiB7eyBnZXRTb3J0KGMpIH19XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGZvb3Q+XG4gICAgfVxuICA8L3RhYmxlPlxuPC9kaXY+XG5cbkBpZiAocGFnaW5nKSB7XG4gIDxkaXYgY2xhc3M9XCJheC10YWJsZS1mb290ZXJcIiAjZm9vdGVyQ29udGFpbmVyPlxuICAgIDxheC1kYXRhLXBhZ2VyXG4gICAgICAjZGF0YVBhZ2VyXG4gICAgICBbZGlzcGxheU1vZGVdPVwiJ2N1c3RvbSdcIlxuICAgICAgKG9uQ2hhbmdlZCk9XCJvblBhZ2VDaGFuZ2VkKCRldmVudClcIlxuICAgICAgW3RvdGFsXT1cImRhdGFTb3VyY2UudG90YWxDb3VudFwiXG4gICAgICBbc2l6ZV09XCJkYXRhU291cmNlLnBhZ2VTaXplXCJcbiAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nKClcIlxuICAgID5cbiAgICAgIDxheC1wcmVmaXggY2xhc3M9XCJheC1kYXRhLXRhYmxlLW51bWVyaWMtcGFnaW5nXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLW51bWVyaWMtc2VsZWN0b3I+IDwvYXgtZGF0YS1wYWdlci1udW1lcmljLXNlbGVjdG9yPlxuICAgICAgICA8YXgtZGF0YS1wYWdlci1wYWdlLXNpemVzPiA8L2F4LWRhdGEtcGFnZXItcGFnZS1zaXplcz5cbiAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgPGF4LXByZWZpeCBjbGFzcz1cImF4LWRhdGEtdGFibGUtaW5wdXQtcGFnaW5nXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLXByZXYtYnV0dG9ucz4gPC9heC1kYXRhLXBhZ2VyLXByZXYtYnV0dG9ucz5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItaW5wdXQtc2VsZWN0b3I+IDwvYXgtZGF0YS1wYWdlci1pbnB1dC1zZWxlY3Rvcj5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItbmV4dC1idXR0b25zPiA8L2F4LWRhdGEtcGFnZXItbmV4dC1idXR0b25zPlxuICAgICAgPC9heC1wcmVmaXg+XG4gICAgICA8YXgtc3VmZml4IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1pbmZvXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLWluZm8+IDwvYXgtZGF0YS1wYWdlci1pbmZvPlxuICAgICAgICA8YXgtYnV0dG9uIGxvb2s9XCJibGFua1wiIGNsYXNzPVwiYXgtc21cIiAob25DbGljayk9XCJyZWZyZXNoKClcIj5cbiAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiBheC1pY29uLXJlZnJlc2hcIj48L2F4LWljb24+XG4gICAgICAgIDwvYXgtYnV0dG9uPlxuICAgICAgPC9heC1zdWZmaXg+XG4gICAgPC9heC1kYXRhLXBhZ2VyPlxuICA8L2Rpdj5cbn1cbjxuZy1jb250ZW50IHNlbGVjdD1cImF4LWZvb3RlclwiPiA8L25nLWNvbnRlbnQ+XG4iXX0=
508
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS10YWJsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL2NvbXBvbmVudHMvZGF0YS10YWJsZS9zcmMvbGliL2RhdGEtdGFibGUvZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ2hFLE9BQU8sRUFBZSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUNmLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLE1BQU0sRUFDTixTQUFTLEVBRVQsV0FBVyxFQUNYLFNBQVMsRUFDVCxpQkFBaUIsRUFFakIsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3RCxPQUFPLEVBQ0wsZUFBZSxHQUloQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSwwQkFBMEIsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBRSw4QkFBOEIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDOzs7Ozs7Ozs7QUFFdkY7Ozs7R0FJRztBQWtCSCxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsZUFBZTtJQWpCekQ7O1FBa0JVLGtCQUFhLEdBQUcsTUFBTSxDQUFDLGNBQWMs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QUFNO3NCQURMLEtBQUs7Z0JBU04sYUFBYTtzQkFEWixLQUFLO2dCQVNOLE9BQU87c0JBRE4sS0FBSztnQkFtQkssVUFBVTtzQkFEcEIsS0FBSztnQkFxQk4sZ0JBQWdCO3NCQURmLE1BQU07Z0JBU1AsVUFBVTtzQkFEVCxNQUFNO2dCQVNQLFlBQVk7c0JBRFgsTUFBTTtnQkFTUCxxQkFBcUI7c0JBRHBCLE1BQU07Z0JBYUcsT0FBTztzQkFEaEIsZUFBZTt1QkFBQywwQkFBMEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBWERhdGFQYWdlckNoYW5nZWRFdmVudCB9IGZyb20gJ0BhY29yZXgvY29tcG9uZW50cy9kYXRhLXBhZ2VyJztcbmltcG9ydCB7IEFYSHRtbFV0aWwsIEFYVW5zdWJzY3JpYmVyIH0gZnJvbSAnQGFjb3JleC9jb3JlL3V0aWxzJztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBtb3ZlSXRlbUluQXJyYXkgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgTmdab25lLFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBTaWduYWwsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBXcml0YWJsZVNpZ25hbCxcbiAgY29tcHV0ZWQsXG4gIGluamVjdCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YmplY3QsIGJ1ZmZlciwgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIEFYQmFzZURhdGFUYWJsZSxcbiAgQVhDb2x1bW5zT3JkZXJDaGFuZ2VkRXZlbnQsXG4gIEFYRGF0YVRhYmxlUm93Q2xpY2ssXG4gIEFYRGF0YVRhYmxlUm93RGJDbGljayxcbn0gZnJvbSAnLi4vYmFzZS1kYXRhLXRhYmxlLmNsYXNzJztcbmltcG9ydCB7IEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50IH0gZnJvbSAnLi4vY29sdW1ucy9kYXRhLXRhYmxlLWNvbHVtbic7XG5pbXBvcnQgeyBBWERhdGFUYWJsZVRleHRDb2x1bW5Db21wb25lbnQgfSBmcm9tICcuLi9jb2x1bW5zL2RhdGEtdGV4dC1jb2x1bW4uY29tcG9uZW50JztcblxuLyoqXG4gKiBDb21wb25lbnQgZm9yIGRpc3BsYXlpbmcgYW5kIG1hbmFnaW5nIGEgZGF0YSB0YWJsZSB3aXRoIGFkdmFuY2VkIGZlYXR1cmVzLlxuICpcbiAqIEBjYXRlZ29yeSBDb21wb25lbnRzXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2F4LWRhdGEtdGFibGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0YS10YWJsZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2RhdGEtdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGhvc3Q6IHsgbmdTa2lwSHlkcmF0aW9uOiAndHJ1ZScgfSxcbiAgaW5wdXRzOiBbJ2RhdGFTb3VyY2UnXSxcbiAgb3V0cHV0czogWydzZWxlY3RlZFJvd3NDaGFuZ2UnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogQVhCYXNlRGF0YVRhYmxlLFxuICAgICAgdXNlRXhpc3Rpbmc6IEFYRGF0YVRhYmxlQ29tcG9uZW50LFxuICAgIH0sXG4gICAgQVhVbnN1YnNjcmliZXIsXG4gIF0sXG59KVxuZXhwb3J0IGNsYXNzIEFYRGF0YVRhYmxlQ29tcG9uZW50IGV4dGVuZHMgQVhCYXNlRGF0YVRhYmxlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgcHJpdmF0ZSBfdW5zdWJzY3JpYmVyID0gaW5qZWN0KEFYVW5zdWJzY3JpYmVyKTtcbiAgcHJpdmF0ZSBfem9uZSA9IGluamVjdChOZ1pvbmUpO1xuICBwcml2YXRlIGRvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIEBWaWV3Q2hpbGQoJ2RhdGFQYWdlcicpIGRhdGFQYWdlcjtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBydGwhOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGRpc3BsYXllZFJvd3M6IFdyaXRhYmxlU2lnbmFsPGFueVtdPiA9IHNpZ25hbChbXSk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgcGFnZTogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgwKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBwYWdlU2l6ZTogV3JpdGFibGVTaWduYWw8bnVtYmVyPiA9IHNpZ25hbCgwKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBpc0xvYWRpbmc6IFdyaXRhYmxlU2lnbmFsPGJvb2xlYW4+ID0gc2lnbmFsKHRydWUpO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbHVtbnNMaXN0OiBXcml0YWJsZVNpZ25hbDxhbnlbXT4gPSBzaWduYWwoW10pO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGVuZEZpeGVkQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuY29sdW1uc0xpc3QoKS5maWx0ZXIoKGMpID0+IGMuZml4ZWQgPT09ICdlbmQnKSxcbiAgKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBzdGFydEZpeGVkQ29sdW1uc0xpc3Q6IFNpZ25hbDxhbnlbXT4gPSBjb21wdXRlZCgoKSA9PlxuICAgIHRoaXMuY29sdW1uc0xpc3QoKS5maWx0ZXIoKGMpID0+IGMuZml4ZWQgPT09ICdzdGFydCcpLFxuICApO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIG5vcm1hbENvbHVtbnNMaXN0OiBTaWduYWw8YW55W10+ID0gY29tcHV0ZWQoKCkgPT5cbiAgICB0aGlzLmNvbHVtbnNMaXN0KCkuZmlsdGVyKChjKSA9PiBjLmZpeGVkICE9PSAnZW5kJyAmJiBjLmZpeGVkICE9PSAnc3RhcnQnKSxcbiAgKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCByZXNpemVDb2x1bW5Qcm9wID0ge1xuICAgIHN0YXJ0WDogMCxcbiAgICBzdGFydFdpZHRoOiAwLFxuICAgIGNvbHVtbkluZGV4OiAwLFxuICAgIG5ld0NvbHVtbldpZHRoOiAwLFxuICAgIHRoRWxlbWVudDogbnVsbCxcbiAgfTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByb3RlY3RlZCBoYXNJdGVtcyA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHRvdGFsUm93cyA9IDA7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgY3VycmVudFBhZ2UgPSAwO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHRvdGFsUGFnZXMgPSAwO1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIHN0YXJ0Um93SW5kZXggPSAwO1xuXG4gIC8qKlxuICAgKiBUZW1wbGF0ZSBmb3IgY3VzdG9tIHJvdyBjb250ZW50LlxuICAgKi9cbiAgQElucHV0KClcbiAgcm93VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogVGVtcGxhdGUgdG8gZGlzcGxheSB3aGVuIHRoZSB0YWJsZSBpcyBlbXB0eS5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGVtcHR5VGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcblxuICAvKipcbiAgICogRGVmaW5lcyBpZiBhbHRlcm5hdGl2ZSByb3cgc3R5bGluZyBzaG91bGQgYmUgYXBwbGllZC5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICovXG4gIEBJbnB1dCgpXG4gIGFsdGVybmF0aXZlID0gdHJ1ZTtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIGlmIHRoZSB0YWJsZSBoZWFkZXIgc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgdHJ1ZWBcbiAgICovXG4gIEBJbnB1dCgpXG4gIHNob3dIZWFkZXIgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRhYmxlIGhlYWRlciBzaG91bGQgYmUgZml4ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBmaXhlZEhlYWRlciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyBpZiB0aGUgdGFibGUgZm9vdGVyIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KClcbiAgc2hvd0Zvb3RlciA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHRhYmxlIGZvb3RlciBzaG91bGQgYmUgZml4ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYHRydWVgXG4gICAqL1xuICBASW5wdXQoKVxuICBmaXhlZEZvb3RlciA9IHRydWU7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgaGVpZ2h0IG9mIGVhY2ggaXRlbSBpbiB0aGUgdGFibGUuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYDQwYFxuICAgKi9cbiAgQElucHV0KClcbiAgaXRlbUhlaWdodDogbnVtYmVyIHwgJ2F1dG8nID0gNDA7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcm93IHJlb3JkZXJpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0VmFsdWUgYGZhbHNlYFxuICAgKi9cbiAgQElucHV0KClcbiAgYWxsb3dSZW9yZGVyaW5nID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVuYWJsZXMgb3IgZGlzYWJsZXMgcGFnaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGB0cnVlYFxuICAgKi9cbiAgQElucHV0KClcbiAgcGFnaW5nID0gdHJ1ZTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGhvdyBkYXRhIHNob3VsZCBiZSBmZXRjaGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIGAnYXV0bydgXG4gICAqL1xuICBASW5wdXQoKVxuICBmZXRjaERhdGFNb2RlOiAnYXV0bycgfCAnbWFudWFsJyA9ICdhdXRvJztcblxuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgbG9hZGluZyBzdGF0ZS5cbiAgICpcbiAgICogQGRlZmF1bHRWYWx1ZSBgeyBlbmFibGVkOiB0cnVlLCBhbmltYXRpb246IHRydWUgfWBcbiAgICovXG4gIEBJbnB1dCgpXG4gIGxvYWRpbmc6IHtcbiAgICBlbmFibGVkOiBib29sZWFuO1xuICAgIGFuaW1hdGlvbjogYm9vbGVhbjtcbiAgICBsb2FkaW5nVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjx1bmtub3duPjtcbiAgfSA9IHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGFuaW1hdGlvbjogdHJ1ZSxcbiAgfTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgX2ZvY3VzZWRSb3c6IHVua25vd247XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIHJvdy5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBnZXQgZm9jdXNlZFJvdygpOiB1bmtub3duIHtcbiAgICByZXR1cm4gdGhpcy5fZm9jdXNlZFJvdztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgZm9jdXNlZCByb3cgYW5kIGVtaXRzIHRoZSBjaGFuZ2UgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSB2IC0gVGhlIHJvdyB0byBiZSBmb2N1c2VkLlxuICAgKi9cbiAgcHVibGljIHNldCBmb2N1c2VkUm93KHY6IHVua25vd24pIHtcbiAgICB0aGlzLl9mb2N1c2VkUm93ID0gdjtcbiAgICB0aGlzLmZvY3VzZWRSb3dDaGFuZ2UuZW1pdCh2KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbWl0cyB3aGVuIHRoZSBmb2N1c2VkIHJvdyBjaGFuZ2VzLlxuICAgKlxuICAgKiBAZXZlbnRcbiAgICovXG4gIEBPdXRwdXQoKVxuICBmb2N1c2VkUm93Q2hhbmdlOiBFdmVudEVtaXR0ZXI8dW5rbm93bj4gPSBuZXcgRXZlbnRFbWl0dGVyPHVua25vd24+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSByb3cgaXMgY2xpY2tlZC5cbiAgICpcbiAgICogQGV2ZW50IG9uUm93Q2xpY2tcbiAgICovXG4gIEBPdXRwdXQoKVxuICBvblJvd0NsaWNrOiBFdmVudEVtaXR0ZXI8QVhEYXRhVGFibGVSb3dDbGljaz4gPSBuZXcgRXZlbnRFbWl0dGVyPEFYRGF0YVRhYmxlUm93Q2xpY2s+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gYSByb3cgaXMgZG91YmxlLWNsaWNrZWQuXG4gICAqXG4gICAqIEBldmVudCBvblJvd0RiQ2xpY2tcbiAgICovXG4gIEBPdXRwdXQoKVxuICBvblJvd0RiQ2xpY2s6IEV2ZW50RW1pdHRlcjxBWERhdGFUYWJsZVJvd0RiQ2xpY2s+ID0gbmV3IEV2ZW50RW1pdHRlcjxBWERhdGFUYWJsZVJvd0RiQ2xpY2s+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHdoZW4gdGhlIG9yZGVyIG9mIGNvbHVtbnMgY2hhbmdlcy5cbiAgICpcbiAgICogQGV2ZW50IG9uQ29sdW1uc09yZGVyQ2hhbmdlZFxuICAgKi9cbiAgQE91dHB1dCgpXG4gIG9uQ29sdW1uc09yZGVyQ2hhbmdlZDogRXZlbnRFbWl0dGVyPEFYQ29sdW1uc09yZGVyQ2hhbmdlZEV2ZW50PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxBWENvbHVtbnNPcmRlckNoYW5nZWRFdmVudD4oKTtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgY2xpY2tTdWJqZWN0ID0gbmV3IFN1YmplY3Q8eyBldmVudDogTW91c2VFdmVudDsgaXRlbTogYW55IH0+KCk7XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBAQ29udGVudENoaWxkcmVuKEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KVxuICBwcm90ZWN0ZWQgY29sdW1uczogUXVlcnlMaXN0PEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIG92ZXJyaWRlIG5nT25Jbml0KCkge1xuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgdGhpcy5ydGwgPSBBWEh0bWxVdGlsLmlzUnRsKHRoaXMuZ2V0SG9zdEVsZW1lbnQoKSk7XG4gICAgdGhpcy5kYXRhU291cmNlLnVzZUNhY2hlID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuZmV0Y2hEYXRhTW9kZSA9PSAnYXV0bycpIHtcbiAgICAgIHRoaXMuZGF0YVNvdXJjZS5zZXRQYWdlKDApO1xuICAgIH1cbiAgICB0aGlzLmRpc3BsYXllZFJvd3Muc2V0KG5ldyBBcnJheSh0aGlzLmRhdGFTb3VyY2UucGFnZVNpemUpKTtcbiAgICB0aGlzLnRvdGFsUm93cyA9IHRoaXMuZGF0YVNvdXJjZS5pdGVtcy5sZW5ndGg7XG4gICAgdGhpcy5kYXRhU291cmNlLm9uTG9hZGluZ0NoYW5nZWQucGlwZSh0aGlzLl91bnN1YnNjcmliZXIudGFrZVVudGlsRGVzdHJveSkuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmlzTG9hZGluZy5zZXQoZGF0YSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmRhdGFTb3VyY2Uub25DaGFuZ2VkLnBpcGUodGhpcy5fdW5zdWJzY3JpYmVyLnRha2VVbnRpbERlc3Ryb3kpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgdGhpcy5kaXNwbGF5ZWRSb3dzLnNldChkYXRhLml0ZW1zKTtcbiAgICAgIHRoaXMudG90YWxSb3dzID0gZGF0YS50b3RhbENvdW50O1xuICAgICAgdGhpcy5oYXNJdGVtcyA9IGRhdGEudG90YWxDb3VudCA+IDA7XG4gICAgfSk7XG5cbiAgICB0aGlzLnBhZ2VTaXplLnNldCh0aGlzLmRhdGFTb3VyY2UucGFnZVNpemUpO1xuXG4gICAgLy9cbiAgICB0aGlzLmNsaWNrU3ViamVjdFxuICAgICAgLnBpcGUoXG4gICAgICAgIGJ1ZmZlcih0aGlzLmNsaWNrU3ViamVjdC5waXBlKGRlYm91bmNlVGltZSgyNTApKSksXG4gICAgICAgIGZpbHRlcigoY2xpY2tBcnJheSkgPT4gY2xpY2tBcnJheS5sZW5ndGggPT09IDIpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY2xpY2tBcnJheSkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVJvd0RvdWJsZUNsaWNrKGNsaWNrQXJyYXlbMF0uZXZlbnQsIGNsaWNrQXJyYXlbMF0uaXRlbSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2FsY3VsYXRlU3RpY2t5Q29sdW1uc1Bvc2l0aW9ucygpO1xuICAgIHRoaXMuY29sdW1uc0xpc3Quc2V0KHRoaXMuY29sdW1ucy50b0FycmF5KCkpO1xuICAgIHRoaXMuY29sdW1ucy5jaGFuZ2VzLnBpcGUodGhpcy5fdW5zdWJzY3JpYmVyLnRha2VVbnRpbERlc3Ryb3kpLnN1YnNjcmliZSgoY29scykgPT4ge1xuICAgICAgdGhpcy5jb2x1bW5zTGlzdC5zZXQoY29scy50b0FycmF5KCkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgZHJvcChldmVudDogQ2RrRHJhZ0Ryb3A8YW55LCBhbnksIGFueT4pIHtcbiAgICBjb25zdCBjbG9uZWRDb2x1bW5zID0gWy4uLnRoaXMuY29sdW1uc0xpc3QoKV07XG4gICAgbW92ZUl0ZW1JbkFycmF5KGNsb25lZENvbHVtbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgdGhpcy5jb2x1bW5zTGlzdC5zZXQoY2xvbmVkQ29sdW1ucyk7XG5cbiAgICB0aGlzLm9uQ29sdW1uc09yZGVyQ2hhbmdlZC5lbWl0KHtcbiAgICAgIGNvbXBvbmVudDogdGhpcyxcbiAgICAgIGRhdGE6IHsgZXZlbnQgfSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgaGFuZGxlUm93Q2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIGl0ZW06IHVua25vd24pIHtcbiAgICB0aGlzLmhhbmRsZVJvd1NpbmdsZUNsaWNrKGV2ZW50LCBpdGVtKTtcbiAgICB0aGlzLmNsaWNrU3ViamVjdC5uZXh0KHsgZXZlbnQsIGl0ZW0gfSk7XG4gIH1cblxuICAvKipcbiAgICogIEBpZ25vcmVcbiAgICovXG4gIHByaXZhdGUgaGFuZGxlUm93U2luZ2xlQ2xpY2soZXZlbnQ6IEV2ZW50LCBpdGVtOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mb2N1c2VkUm93ID09IGl0ZW0pIHtcbiAgICAgIHRoaXMuZm9jdXNlZFJvdyA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZm9jdXNlZFJvdyA9IGl0ZW07XG4gICAgfVxuICAgIC8vXG4gICAgdGhpcy5vblJvd0NsaWNrLmVtaXQoe1xuICAgICAgY29tcG9uZW50OiB0aGlzLFxuICAgICAgZGF0YTogaXRlbSxcbiAgICAgIGlzVXNlckludGVyYWN0aW9uOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgb25QYWdlQ2hhbmdlZChldmVudDogQVhEYXRhUGFnZXJDaGFuZ2VkRXZlbnQpIHtcbiAgICBpZiAoZXZlbnQuaXNVc2VySW50ZXJhY3Rpb24pIHtcbiAgICAgIGNvbnN0IHBhZ2VDaGFuZ2VkID0gZXZlbnQucGFnZSAtIDEgIT0gdGhpcy5wYWdlKCk7XG4gICAgICBjb25zdCBwYWdlU2l6ZUNoYW5nZWQgPSBldmVudC50YWtlICE9IHRoaXMucGFnZVNpemUoKTtcblxuICAgICAgaWYgKHBhZ2VDaGFuZ2VkIHx8IHBhZ2VTaXplQ2hhbmdlZCkge1xuICAgICAgICBpZiAocGFnZUNoYW5nZWQpIHtcbiAgICAgICAgICB0aGlzLnBhZ2Uuc2V0KGV2ZW50LnBhZ2UgLSAxKTtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2Uuc2V0UGFnZSh0aGlzLnBhZ2UoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZVNpemVDaGFuZ2VkKSB7XG4gICAgICAgICAgdGhpcy5wYWdlU2l6ZS5zZXQoZXZlbnQudGFrZSk7XG4gICAgICAgICAgdGhpcy5kYXRhU291cmNlLnNldFBhZ2VTaXplKHRoaXMucGFnZVNpemUoKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgZGlzcGxheWVkIHJvd3MgYW5kIGRhdGEgc291cmNlXG4gICAgICAgIHRoaXMuZGlzcGxheWVkUm93cy5zZXQobmV3IEFycmF5KHRoaXMucGFnZVNpemUoKSkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGhhbmRsZVJvd0RvdWJsZUNsaWNrKGU6IE1vdXNlRXZlbnQsIGl0ZW06IHVua25vd24pIHtcbiAgICB0aGlzLmZvY3VzZWRSb3cgPSBpdGVtO1xuICAgIC8vXG4gICAgdGhpcy5vblJvd0RiQ2xpY2suZW1pdCh7XG4gICAgICBjb21wb25lbnQ6IHRoaXMsXG4gICAgICBkYXRhOiBpdGVtLFxuICAgICAgaXNVc2VySW50ZXJhY3Rpb246IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlcyB0aGUgY2xpY2sgZXZlbnQgb24gYSBjb2x1bW4gaGVhZGVyLlxuICAgKiBUb2dnbGVzIHRoZSBzb3J0aW5nIGRpcmVjdGlvbiBvciByZW1vdmVzIHRoZSBzb3J0IGlmIGFscmVhZHkgc29ydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gZSAtIFRoZSBtb3VzZSBldmVudCB0cmlnZ2VyZWQgYnkgdGhlIGNsaWNrLlxuICAgKiBAcGFyYW0gY29sdW1uIC0gVGhlIGNvbHVtbiB0aGF0IHdhcyBjbGlja2VkLlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBoYW5kbGVDb2x1bW5DbGljayhlOiBNb3VzZUV2ZW50LCBjb2x1bW46IEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KSB7XG4gICAgaWYgKGNvbHVtbiBpbnN0YW5jZW9mIEFYRGF0YVRhYmxlVGV4dENvbHVtbkNvbXBvbmVudCkge1xuICAgICAgY29uc3Qgc29ydCA9IHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0LmZpbmQoKGMpID0+IGMuZmllbGQgPT0gY29sdW1uLmRhdGFGaWVsZCk7XG4gICAgICBpZiAoIXNvcnQpIHtcbiAgICAgICAgdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQucHVzaCh7XG4gICAgICAgICAgZmllbGQ6IGNvbHVtbi5kYXRhRmllbGQsXG4gICAgICAgICAgZGlyOiAnYXNjJyxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoc29ydC5kaXIgPT0gJ2FzYycpIHtcbiAgICAgICAgICBzb3J0LmRpciA9ICdkZXNjJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UucXVlcnkuc29ydCA9IHRoaXMuZGF0YVNvdXJjZS5xdWVyeS5zb3J0LmZpbHRlcigoYykgPT4gYyAhPSBzb3J0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0U29ydChjb2x1bW46IEFYRGF0YVRhYmxlQ29sdW1uQ29tcG9uZW50KTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoY29sdW1uIGluc3RhbmNlb2YgQVhEYXRhVGFibGVUZXh0Q29sdW1uQ29tcG9uZW50KSB7XG4gICAgICBjb25zdCBzb3J0ID0gdGhpcy5kYXRhU291cmNlLnF1ZXJ5LnNvcnQuZmluZCgoYykgPT4gYy5maWVsZCA9PSBjb2x1bW4uZGF0YUZpZWxkKTtcbiAgICAgIHJldHVybiBzb3J0ID8gKHNvcnQuZGlyID09ICdhc2MnID8gJ2F4LWljb24tYXJyb3ctbG9uZy1kb3duJyA6ICdheC1pY29uLWFycm93LWxvbmctdXAnKSA6IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIGRhdGEgaW4gdGhlIGRhdGEgc291cmNlIGFuZCByZXNldHMgdGhlIGRhdGEgcGFnZXIgdG8gdGhlIGZpcnN0IHBhZ2UuXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCkge1xuICAgIHRoaXMuZGF0YVNvdXJjZS5yZWZyZXNoKCk7XG4gICAgaWYgKHRoaXMuZGF0YVBhZ2VyKSB7XG4gICAgICB0aGlzLmRhdGFQYWdlci5nb0ZpcnN0UGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIGNhbGN1bGF0ZVJvd0luZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLnBhZ2VTaXplICogdGhpcy5wYWdlKCkgKyBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJvdGVjdGVkIG9uUmVzaXplQ29sdW1uU3RhcnQoZXZlbnQ6IE1vdXNlRXZlbnQsIGNvbHVtbkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnN0YXJ0WCA9IGV2ZW50LnBhZ2VYO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5wYXJlbnRFbGVtZW50O1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC5zdGFydFdpZHRoID0gcGFyc2VJbnQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5zdHlsZS53aWR0aCk7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wLmNvbHVtbkluZGV4ID0gY29sdW1uSW5kZXg7XG4gICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICB0aGlzLmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVDb2x1bW5Nb3ZlKTtcbiAgICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMub25SZXNpemVDb2x1bW5FbmQpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIG9uUmVzaXplQ29sdW1uTW92ZSA9IChldmVudDogTW91c2VFdmVudCk6IHZvaWQgPT4ge1xuICAgIGNvbnN0IGRpZmZYID0gZXZlbnQucGFnZVggLSB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRYO1xuICAgIGNvbnN0IG5ld1dpZHRoID0gdGhpcy5ydGxcbiAgICAgID8gdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnN0YXJ0V2lkdGggLSBkaWZmWFxuICAgICAgOiB0aGlzLnJlc2l6ZUNvbHVtblByb3Auc3RhcnRXaWR0aCArIGRpZmZYO1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQuc3R5bGUud2lkdGggPSBgJHtNYXRoLm1heCgxMDAsIG5ld1dpZHRoKX1weGA7XG4gICAgdGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25ldy13aWR0aCcsIGAke25ld1dpZHRofWApO1xuICB9O1xuXG4gIC8qKlxuICAgKiAgQGlnbm9yZVxuICAgKi9cbiAgcHJpdmF0ZSBvblJlc2l6ZUNvbHVtbkVuZCA9ICgpOiB2b2lkID0+IHtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25SZXNpemVDb2x1bW5Nb3ZlKTtcbiAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uUmVzaXplQ29sdW1uRW5kKTtcblxuICAgIGNvbnN0IG5ld1dpZHRoID0gcGFyc2VJbnQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLnRoRWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgnbmV3LXdpZHRoJykudmFsdWUpO1xuICAgIHRoaXMuY29sdW1ucy5nZXQodGhpcy5yZXNpemVDb2x1bW5Qcm9wLmNvbHVtbkluZGV4KS53aWR0aCA9IGAke01hdGgubWF4KDEwMCwgbmV3V2lkdGgpfXB4YDtcbiAgICB0aGlzLnJlc2V0UmVzaXppbmdQcm9jZXNzKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIHJlc2V0UmVzaXppbmdQcm9jZXNzKCkge1xuICAgIHRoaXMucmVzaXplQ29sdW1uUHJvcC50aEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCduZXctd2lkdGgnKTtcbiAgICB0aGlzLnJlc2l6ZUNvbHVtblByb3AgPSB7XG4gICAgICBzdGFydFg6IDAsXG4gICAgICBzdGFydFdpZHRoOiAwLFxuICAgICAgY29sdW1uSW5kZXg6IDAsXG4gICAgICBuZXdDb2x1bW5XaWR0aDogMCxcbiAgICAgIHRoRWxlbWVudDogbnVsbCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqICBAaWdub3JlXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZVN0aWNreUNvbHVtbnNQb3NpdGlvbnMoKSB7XG4gICAgbGV0IHRvdGFsV2lkdGggPSAwO1xuICAgIGxldCBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ID0gMDtcbiAgICB0aGlzLmNvbHVtbnMuZm9yRWFjaCgoY29sdW1uKSA9PiB7XG4gICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi53aWR0aCBhcyBzdHJpbmcpO1xuICAgICAgaWYgKCFpc05hTih3aWR0aCkpIHtcbiAgICAgICAgdG90YWxXaWR0aCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBsZXQgbGFzdFN0YXJ0Q29sdW1uOiBBWERhdGFUYWJsZUNvbHVtbkNvbXBvbmVudDtcblxuICAgIHRoaXMuY29sdW1ucy5mb3JFYWNoKChjb2x1bW4pID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoY29sdW1uLndpZHRoIGFzIHN0cmluZyk7XG5cbiAgICAgIGlmIChjb2x1bW4uZml4ZWQgPT09ICdzdGFydCcgJiYgIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBjb2x1bW5bJ3N0aWNreVN0YXJ0J10gPSBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ICsgJ3B4JztcbiAgICAgICAgbGFzdFN0YXJ0Q29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFdpZHRoRnJvbVN0YXJ0ICs9IHdpZHRoO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmIChsYXN0U3RhcnRDb2x1bW4pIGxhc3RTdGFydENvbHVtblsnaXNMYXN0Rml4ZWRDb2x1bW4nXSA9IHRydWU7XG5cbiAgICBsZXQgYWNjdW11bGF0ZWRXaWR0aEZyb21FbmQgPSAwO1xuICAgIGxldCBmaXJzdEVuZENvbHVtbjogQVhEYXRhVGFibGVDb2x1bW5Db21wb25lbnQ7XG5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5jb2x1bW5zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnMuZ2V0KGkpO1xuXG4gICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KGNvbHVtbi53aWR0aCBhcyBzdHJpbmcpO1xuXG4gICAgICBpZiAoY29sdW1uLmZpeGVkID09PSAnZW5kJyAmJiAhaXNOYU4od2lkdGgpKSB7XG4gICAgICAgIGNvbHVtblsnc3RpY2t5RW5kJ10gPSBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCArICdweCc7XG4gICAgICAgIGZpcnN0RW5kQ29sdW1uID0gY29sdW1uO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWlzTmFOKHdpZHRoKSkge1xuICAgICAgICBhY2N1bXVsYXRlZFdpZHRoRnJvbUVuZCArPSB3aWR0aDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZpcnN0RW5kQ29sdW1uKSBmaXJzdEVuZENvbHVtblsnaXNGaXJzdEZpeGVkQ29sdW1uJ10gPSB0cnVlO1xuICB9XG59XG4iLCI8bmctY29udGVudCBzZWxlY3Q9XCJheC1oZWFkZXJcIj4gPC9uZy1jb250ZW50PlxuQGlmICghZGlzcGxheWVkUm93cygpLmxlbmd0aCkge1xuICA8ZGl2IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1lbXB0eS1kYXRhXCI+XG4gICAgQGlmIChlbXB0eVRlbXBsYXRlKSB7XG4gICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiZW1wdHlUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgIH0gQGVsc2Uge1xuICAgICAgPHNwYW4+Tm8gUmVjb3JkIEZvdW5kITwvc3Bhbj5cbiAgICB9XG4gIDwvZGl2PlxufVxuPGRpdiBjbGFzcz1cImF4LWRhdGEtdGFibGUtd3JhcHBlclwiPlxuICA8dGFibGU+XG4gICAgQGlmIChzaG93SGVhZGVyKSB7XG4gICAgICA8dGhlYWQgW25nQ2xhc3NdPVwieyAnYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyJzogZml4ZWRIZWFkZXIgfVwiPlxuICAgICAgICA8dHJcbiAgICAgICAgICBbY2RrRHJvcExpc3REaXNhYmxlZF09XCIhYWxsb3dSZW9yZGVyaW5nXCJcbiAgICAgICAgICBjZGtEcm9wTGlzdFxuICAgICAgICAgIGNka1Njcm9sbGFibGVcbiAgICAgICAgICBjZGtEcm9wTGlzdE9yaWVudGF0aW9uPVwiaG9yaXpvbnRhbFwiXG4gICAgICAgICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIlxuICAgICAgICA+XG4gICAgICAgICAgQGZvciAoYyBvZiBzdGFydEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbCBzdGlja3ktc3RhcnRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1zdGFydF09XCJjWydzdGlja3lTdGFydCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVySGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1pbnRlcmFjdGl2ZV09XCJjLmFsbG93U29ydGluZ1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJjLmFsbG93U29ydGluZyA/IGhhbmRsZUNvbHVtbkNsaWNrKCRldmVudCwgYykgOiBudWxsXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWRhdGEtdGFibGUtc3RpY2t5LWhlYWRlci1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVySGVhZGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgQGlmIChjLmFsbG93UmVzaXppbmcgJiYgIWMuZml4ZWQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtcmVzaXplLWhhbmRsZVwiIChtb3VzZWRvd24pPVwib25SZXNpemVDb2x1bW5TdGFydCgkZXZlbnQsIHRoaXMuc3RhcnRGaXhlZENvbHVtbnNMaXN0KCkubGVuZ3RoICsgJGluZGV4KVwiPjwvZGl2PlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgIH1cbiAgICAgICAgICA8dGg+PC90aD5cbiAgICAgICAgICBAZm9yIChjIG9mIGVuZEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGhcbiAgICAgICAgICAgICAgY2RrRHJhZ1xuICAgICAgICAgICAgICBbY2RrRHJhZ0Rpc2FibGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICBjZGtEcmFnTG9ja0F4aXM9XCJ4XCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJheC1kYXRhLXRhYmxlLWhlYWQtY2VsbCBzdGlja3ktZW5kXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICBbY2xhc3MuaXNGaXJzdF09XCJjWydpc0ZpcnN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1lbmRdPVwiY1snc3RpY2t5RW5kJ11cIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJIZWFkZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICB9XG4gICAgICAgIDwvdHI+XG4gICAgICA8L3RoZWFkPlxuICAgIH1cbiAgICA8dGJvZHkgW25nQ2xhc3NdPVwieyAnYXgtZGF0YS10YWJsZS1yb3ctYWx0ZXJuYXRpdmUnOiBhbHRlcm5hdGl2ZSB9XCI+XG4gICAgICBAZm9yIChyb3cgb2YgZGlzcGxheWVkUm93cygpOyBsZXQgcm93SW5kZXggPSAkaW5kZXg7IHRyYWNrIHJvd0luZGV4KSB7XG4gICAgICAgIEBpZiAocm93VGVtcGxhdGUpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicm93VGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IHJvd0luZGV4IH0gfVwiPiA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPHRyXG4gICAgICAgICAgICBbY2xhc3MuYXgtc3RhdGUtZm9jdXNlZF09XCJmb2N1c2VkUm93ICYmIHJvdyA9PT0gZm9jdXNlZFJvd1wiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLWluZGV4XT1cInJvd0luZGV4XCJcbiAgICAgICAgICAgIFtjbGFzcy5heC1zdGF0ZS1zZWxlY3RlZF09XCJzZWxlY3RlZFJvd3MuaW5jbHVkZXMocm93KVwiXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQ9XCJ7eyBpdGVtSGVpZ2h0IH19cHhcIlxuICAgICAgICAgICAgc3R5bGUubWF4LWhlaWdodD1cInt7IGl0ZW1IZWlnaHQgfX1weFwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlUm93Q2xpY2soJGV2ZW50LCByb3cpXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1ib2R5LWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3Muc3RpY2t5LXN0YXJ0XT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LXN0YXJ0XT1cImNbJ3N0aWNreVN0YXJ0J11cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiYy5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocm93ICYmICFpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyQ2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiByb3csIHJvd0luZGV4OiBjYWxjdWxhdGVSb3dJbmRleChyb3dJbmRleCkgfSB9XCJcbiAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYy5sb2FkaW5nRW5hYmxlZCAmJiBsb2FkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXgtc2tlbGV0b24gW2FuaW1hdGVkXT1cImxvYWRpbmcuYW5pbWF0aW9uXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktYm9keS1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1sYWJlbF09XCJjLmNhcHRpb25cIlxuICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzXT1cImMuY3NzQ2xhc3NcIlxuICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgQGlmIChyb3cgJiYgIWlzTG9hZGluZygpKSB7XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJDZWxsVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IHJvdywgcm93SW5kZXg6IGNhbGN1bGF0ZVJvd0luZGV4KHJvd0luZGV4KSB9IH1cIlxuICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgQGlmIChjLmxvYWRpbmdFbmFibGVkICYmIGxvYWRpbmcuZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICBAaWYgKGxvYWRpbmcubG9hZGluZ1RlbXBsYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmcubG9hZGluZ1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIDxheC1za2VsZXRvbiBbYW5pbWF0ZWRdPVwibG9hZGluZy5hbmltYXRpb25cIj48L2F4LXNrZWxldG9uPlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgPHRkPjwvdGQ+XG4gICAgICAgICAgICBAZm9yIChjIG9mIGVuZEZpeGVkQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCJjLndpZHRoXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktYm9keS1jZWxsXT1cImMuZml4ZWQgJiYgYy53aWR0aFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLnN0aWNreS1lbmRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmlzRmlyc3RdPVwiY1snaXNGaXJzdEZpeGVkQ29sdW1uJ11cIlxuICAgICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1lbmRdPVwiY1snc3RpY2t5RW5kJ11cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbGFiZWxdPVwiYy5jYXB0aW9uXCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgIFtjbGFzc109XCJjLmNzc0NsYXNzXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIEBpZiAocm93ICYmICFpc0xvYWRpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyQ2VsbFRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiByb3csIHJvd0luZGV4OiBjYWxjdWxhdGVSb3dJbmRleChyb3dJbmRleCkgfSB9XCJcbiAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIEBpZiAoYy5sb2FkaW5nRW5hYmxlZCAmJiBsb2FkaW5nLmVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQGlmIChsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nLmxvYWRpbmdUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICA8YXgtc2tlbGV0b24gW2FuaW1hdGVkXT1cImxvYWRpbmcuYW5pbWF0aW9uXCI+PC9heC1za2VsZXRvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L3RyPlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIDx0ciBjbGFzcz1cImVtcHR5LXJvd1wiPjwvdHI+XG4gICAgPC90Ym9keT5cbiAgICBAaWYgKHNob3dGb290ZXIpIHtcbiAgICAgIDx0Zm9vdCBbbmdDbGFzc109XCJ7ICdheC1kYXRhLXRhYmxlLXN0aWNreS1mb290ZXInOiBmaXhlZEZvb3RlciB9XCI+XG4gICAgICAgIDx0cj5cbiAgICAgICAgICBAZm9yIChjIG9mIHN0YXJ0Rml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsIHN0aWNreS1zdGFydFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1mb290ZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0xhc3RdPVwiY1snaXNMYXN0Rml4ZWRDb2x1bW4nXVwiXG4gICAgICAgICAgICAgIFtzdHlsZS4tLXN0aWNreS1zdGFydF09XCJjWydzdGlja3lTdGFydCddXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImF4LWNhcHRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cImMucmVuZGVyRm9vdGVyVGVtcGxhdGU7IGNvbnRleHQ6IHsgJGltcGxpY2l0OiB7IGRhdGE6IGMsIHJvd3M6IGRpc3BsYXllZFJvd3MoKSwgcm93SW5kZXg6ICRpbmRleCB9IH1cIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICBAaWYgKGdldFNvcnQoYykpIHtcbiAgICAgICAgICAgICAgICAgIDxheC1pY29uIGljb249XCJheC1pY29uIHt7IGdldFNvcnQoYykgfX1cIj48L2F4LWljb24+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIEBmb3IgKGMgb2Ygbm9ybWFsQ29sdW1uc0xpc3QoKTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICA8dGRcbiAgICAgICAgICAgICAgW2NsYXNzLmF4LWludGVyYWN0aXZlXT1cImMuYWxsb3dTb3J0aW5nXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImMuYWxsb3dTb3J0aW5nID8gaGFuZGxlQ29sdW1uQ2xpY2soJGV2ZW50LCBjKSA6IG51bGxcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtZGF0YS10YWJsZS1zdGlja3ktaGVhZGVyLWNlbGxdPVwiYy5maXhlZCAmJiBjLndpZHRoXCJcbiAgICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cImMud2lkdGhcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXgtY2FwdGlvblwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiYy5yZW5kZXJGb290ZXJUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IHsgZGF0YTogYywgcm93czogZGlzcGxheWVkUm93cygpLCByb3dJbmRleDogJGluZGV4IH0gfVwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIEBpZiAoZ2V0U29ydChjKSkge1xuICAgICAgICAgICAgICAgICAgPGF4LWljb24gaWNvbj1cImF4LWljb24ge3sgZ2V0U29ydChjKSB9fVwiPjwvYXgtaWNvbj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICBAaWYgKGMuYWxsb3dSZXNpemluZyAmJiAhYy5maXhlZCkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1yZXNpemUtaGFuZGxlXCIgKG1vdXNlZG93bik9XCJvblJlc2l6ZUNvbHVtblN0YXJ0KCRldmVudCwgdGhpcy5zdGFydEZpeGVkQ29sdW1uc0xpc3QoKS5sZW5ndGggKyAkaW5kZXgpXCI+PC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgfVxuICAgICAgICAgIDx0ZD48L3RkPlxuICAgICAgICAgIEBmb3IgKGMgb2YgZW5kRml4ZWRDb2x1bW5zTGlzdCgpOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICBjbGFzcz1cImF4LWRhdGEtdGFibGUtc3RpY2t5LWZvb3Rlci1jZWxsIHN0aWNreS1lbmRcIlxuICAgICAgICAgICAgICBbY2xhc3MuYXgtaW50ZXJhY3RpdmVdPVwiYy5hbGxvd1NvcnRpbmdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwiYy5hbGxvd1NvcnRpbmcgPyBoYW5kbGVDb2x1bW5DbGljaygkZXZlbnQsIGMpIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5heC1kYXRhLXRhYmxlLXN0aWNreS1oZWFkZXItY2VsbF09XCJjLmZpeGVkICYmIGMud2lkdGhcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwiYy53aWR0aFwiXG4gICAgICAgICAgICAgIFtjbGFzcy5pc0ZpcnN0XT1cImNbJ2lzRmlyc3RGaXhlZENvbHVtbiddXCJcbiAgICAgICAgICAgICAgW3N0eWxlLi0tc3RpY2t5LWVuZF09XCJjWydzdGlja3lFbmQnXVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJheC1jYXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjLnJlbmRlckZvb3RlclRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogeyBkYXRhOiBjLCByb3dzOiBkaXNwbGF5ZWRSb3dzKCksIHJvd0luZGV4OiAkaW5kZXggfSB9XCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgQGlmIChnZXRTb3J0KGMpKSB7XG4gICAgICAgICAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiB7eyBnZXRTb3J0KGMpIH19XCI+PC9heC1pY29uPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICAgIDwvdGZvb3Q+XG4gICAgfVxuICA8L3RhYmxlPlxuPC9kaXY+XG5cbkBpZiAocGFnaW5nKSB7XG4gIDxkaXYgY2xhc3M9XCJheC10YWJsZS1mb290ZXJcIiAjZm9vdGVyQ29udGFpbmVyPlxuICAgIDxheC1kYXRhLXBhZ2VyXG4gICAgICAjZGF0YVBhZ2VyXG4gICAgICBbZGlzcGxheU1vZGVdPVwiJ2N1c3RvbSdcIlxuICAgICAgKG9uQ2hhbmdlZCk9XCJvblBhZ2VDaGFuZ2VkKCRldmVudClcIlxuICAgICAgW3RvdGFsXT1cImRhdGFTb3VyY2UudG90YWxDb3VudFwiXG4gICAgICBbc2l6ZV09XCJkYXRhU291cmNlLnBhZ2VTaXplXCJcbiAgICAgIFtpc0xvYWRpbmddPVwiaXNMb2FkaW5nKClcIlxuICAgID5cbiAgICAgIDxheC1wcmVmaXggY2xhc3M9XCJheC1kYXRhLXRhYmxlLW51bWVyaWMtcGFnaW5nXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLW51bWVyaWMtc2VsZWN0b3I+IDwvYXgtZGF0YS1wYWdlci1udW1lcmljLXNlbGVjdG9yPlxuICAgICAgICA8YXgtZGF0YS1wYWdlci1wYWdlLXNpemVzPiA8L2F4LWRhdGEtcGFnZXItcGFnZS1zaXplcz5cbiAgICAgIDwvYXgtcHJlZml4PlxuICAgICAgPGF4LXByZWZpeCBjbGFzcz1cImF4LWRhdGEtdGFibGUtaW5wdXQtcGFnaW5nXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLXByZXYtYnV0dG9ucz4gPC9heC1kYXRhLXBhZ2VyLXByZXYtYnV0dG9ucz5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItaW5wdXQtc2VsZWN0b3I+IDwvYXgtZGF0YS1wYWdlci1pbnB1dC1zZWxlY3Rvcj5cbiAgICAgICAgPGF4LWRhdGEtcGFnZXItbmV4dC1idXR0b25zPiA8L2F4LWRhdGEtcGFnZXItbmV4dC1idXR0b25zPlxuICAgICAgPC9heC1wcmVmaXg+XG4gICAgICA8YXgtc3VmZml4IGNsYXNzPVwiYXgtZGF0YS10YWJsZS1pbmZvXCI+XG4gICAgICAgIDxheC1kYXRhLXBhZ2VyLWluZm8+IDwvYXgtZGF0YS1wYWdlci1pbmZvPlxuICAgICAgICA8YXgtYnV0dG9uIGxvb2s9XCJibGFua1wiIGNsYXNzPVwiYXgtc21cIiAob25DbGljayk9XCJyZWZyZXNoKClcIj5cbiAgICAgICAgICA8YXgtaWNvbiBpY29uPVwiYXgtaWNvbiBheC1pY29uLXJlZnJlc2hcIj48L2F4LWljb24+XG4gICAgICAgIDwvYXgtYnV0dG9uPlxuICAgICAgPC9heC1zdWZmaXg+XG4gICAgPC9heC1kYXRhLXBhZ2VyPlxuICA8L2Rpdj5cbn1cbjxuZy1jb250ZW50IHNlbGVjdD1cImF4LWZvb3RlclwiPiA8L25nLWNvbnRlbnQ+XG4iXX0=