@gravitee/ui-policy-studio-angular 13.6.0 → 13.7.0-apim-7162-ps-native-api-d1de6d3

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.
Files changed (36) hide show
  1. package/esm2022/lib/components/flow-details/gio-ps-flow-details.component.mjs +49 -26
  2. package/esm2022/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.mjs +8 -5
  3. package/esm2022/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.mjs +89 -0
  4. package/esm2022/lib/components/flows-menu/gio-ps-flows-menu.component.mjs +97 -47
  5. package/esm2022/lib/components/policies-catalog-dialog/gio-ps-policies-catalog-dialog.component.mjs +10 -10
  6. package/esm2022/lib/models/ConnectorsInfo.mjs +1 -1
  7. package/esm2022/lib/models/flow/Flow.mjs +1 -1
  8. package/esm2022/lib/policy-group-studio/gio-policy-group-studio.component.mjs +2 -2
  9. package/esm2022/lib/policy-studio/gio-policy-studio.component.mjs +10 -8
  10. package/esm2022/lib/policy-studio/gio-policy-studio.model.mjs +1 -1
  11. package/esm2022/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.mjs +2 -1
  12. package/esm2022/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.mjs +50 -0
  13. package/esm2022/testing/lib/models/ConnectorsInfo.fixture.mjs +31 -1
  14. package/esm2022/testing/lib/models/ConnectorsInfo.mjs +1 -1
  15. package/esm2022/testing/lib/models/flow/Flow.fixture.mjs +17 -1
  16. package/esm2022/testing/lib/models/flow/Flow.mjs +1 -1
  17. package/esm2022/testing/lib/models/policy/Policy.fixture.mjs +2 -1
  18. package/esm2022/testing/lib/policy-studio/gio-policy-studio.harness.mjs +10 -1
  19. package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs +104 -1
  20. package/fesm2022/gravitee-ui-policy-studio-angular-testing.mjs.map +1 -1
  21. package/fesm2022/gravitee-ui-policy-studio-angular.mjs +238 -92
  22. package/fesm2022/gravitee-ui-policy-studio-angular.mjs.map +1 -1
  23. package/lib/components/flow-details/gio-ps-flow-details.component.d.ts +1 -1
  24. package/lib/components/flow-details-phase/gio-ps-flow-details-phase.component.d.ts +3 -2
  25. package/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component.d.ts +21 -0
  26. package/lib/components/flows-menu/gio-ps-flows-menu.component.d.ts +2 -1
  27. package/lib/models/ConnectorsInfo.d.ts +1 -1
  28. package/lib/models/flow/Flow.d.ts +2 -0
  29. package/lib/policy-studio/gio-policy-studio.model.d.ts +1 -0
  30. package/package.json +1 -1
  31. package/testing/lib/components/flow-details-phase/gio-ps-flow-details-phase.harness.d.ts +1 -1
  32. package/testing/lib/components/flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.harness.d.ts +17 -0
  33. package/testing/lib/models/ConnectorsInfo.d.ts +1 -1
  34. package/testing/lib/models/ConnectorsInfo.fixture.d.ts +2 -0
  35. package/testing/lib/models/flow/Flow.d.ts +2 -0
  36. package/testing/lib/models/flow/Flow.fixture.d.ts +1 -0
@@ -25,6 +25,7 @@ import { DragDropModule, moveItemInArray, transferArrayItem } from '@angular/cdk
25
25
  import { GioPolicyStudioFlowMessageFormDialogComponent, } from '../flow-form-dialog/flow-message-form-dialog/gio-ps-flow-message-form-dialog.component';
26
26
  import { GioPolicyStudioFlowProxyFormDialogComponent, } from '../flow-form-dialog/flow-proxy-form-dialog/gio-ps-flow-proxy-form-dialog.component';
27
27
  import { GioPolicyStudioFlowExecutionFormDialogComponent, } from '../flow-execution-form-dialog/gio-ps-flow-execution-form-dialog.component';
28
+ import { GioPolicyStudioFlowNativeFormDialogComponent, } from '../flow-form-dialog/flow-native-form-dialog/gio-ps-flow-native-form-dialog.component';
28
29
  import * as i0 from "@angular/core";
29
30
  import * as i1 from "@angular/material/dialog";
30
31
  import * as i2 from "@angular/material/icon";
@@ -48,6 +49,7 @@ export class GioPolicyStudioFlowsMenuComponent {
48
49
  this.flowExecutionChange = new EventEmitter();
49
50
  this.deleteFlow = new EventEmitter();
50
51
  this.flowGroupMenuItems = [];
52
+ this.enterPredicate = () => true;
51
53
  }
52
54
  ngOnChanges(changes) {
53
55
  if (changes.flowsGroups || changes.selectedFlowId) {
@@ -114,6 +116,12 @@ export class GioPolicyStudioFlowsMenuComponent {
114
116
  }),
115
117
  };
116
118
  });
119
+ this.enterPredicate = (_drag, drop) => {
120
+ if (this.apiType === 'NATIVE') {
121
+ return isEmpty(drop.data.flows);
122
+ }
123
+ return true;
124
+ };
117
125
  }
118
126
  }
119
127
  selectFlow(groupId, flowId) {
@@ -123,28 +131,49 @@ export class GioPolicyStudioFlowsMenuComponent {
123
131
  }
124
132
  }
125
133
  onAddFlow(flowGroup) {
126
- const dialogResult = this.apiType === 'MESSAGE'
127
- ? this.matDialog
128
- .open(GioPolicyStudioFlowMessageFormDialogComponent, {
129
- data: {
130
- flow: undefined,
131
- entrypoints: this.entrypoints,
132
- },
133
- role: 'alertdialog',
134
- id: 'gioPsFlowFormDialog',
135
- width: GIO_DIALOG_WIDTH.MEDIUM,
136
- })
137
- .afterClosed()
138
- : this.matDialog
139
- .open(GioPolicyStudioFlowProxyFormDialogComponent, {
140
- data: {
141
- flow: undefined,
142
- },
143
- role: 'alertdialog',
144
- id: 'gioPsFlowFormDialog',
145
- width: GIO_DIALOG_WIDTH.MEDIUM,
146
- })
147
- .afterClosed();
134
+ let dialogResult;
135
+ switch (this.apiType) {
136
+ case 'MESSAGE':
137
+ dialogResult = this.matDialog
138
+ .open(GioPolicyStudioFlowMessageFormDialogComponent, {
139
+ data: {
140
+ flow: undefined,
141
+ entrypoints: this.entrypoints,
142
+ },
143
+ role: 'alertdialog',
144
+ id: 'gioPsFlowFormDialog',
145
+ width: GIO_DIALOG_WIDTH.MEDIUM,
146
+ })
147
+ .afterClosed();
148
+ break;
149
+ case 'PROXY':
150
+ dialogResult = this.matDialog
151
+ .open(GioPolicyStudioFlowProxyFormDialogComponent, {
152
+ data: {
153
+ flow: undefined,
154
+ },
155
+ role: 'alertdialog',
156
+ id: 'gioPsFlowFormDialog',
157
+ width: GIO_DIALOG_WIDTH.MEDIUM,
158
+ })
159
+ .afterClosed();
160
+ break;
161
+ case 'NATIVE':
162
+ dialogResult = this.matDialog
163
+ .open(GioPolicyStudioFlowNativeFormDialogComponent, {
164
+ data: {
165
+ parentGroupName: flowGroup.name,
166
+ flow: undefined,
167
+ },
168
+ role: 'alertdialog',
169
+ id: 'gioPsFlowFormDialog',
170
+ width: GIO_DIALOG_WIDTH.MEDIUM,
171
+ })
172
+ .afterClosed();
173
+ break;
174
+ default:
175
+ throw new Error(`Unsupported API type ${this.apiType}`);
176
+ }
148
177
  dialogResult
149
178
  .pipe(tap(createdOrEdited => {
150
179
  if (!createdOrEdited) {
@@ -213,28 +242,49 @@ export class GioPolicyStudioFlowsMenuComponent {
213
242
  }
214
243
  onEditFlow(flowId) {
215
244
  const flowToEdit = flatten(this.flowsGroups.map(flowGroup => flowGroup.flows)).find(f => f._id === flowId);
216
- const dialogResult = this.apiType === 'MESSAGE'
217
- ? this.matDialog
218
- .open(GioPolicyStudioFlowMessageFormDialogComponent, {
219
- data: {
220
- flow: flowToEdit,
221
- entrypoints: this.entrypointsInfo ?? [],
222
- },
223
- role: 'alertdialog',
224
- id: 'gioPsFlowMessageFormDialog',
225
- width: GIO_DIALOG_WIDTH.MEDIUM,
226
- })
227
- .afterClosed()
228
- : this.matDialog
229
- .open(GioPolicyStudioFlowProxyFormDialogComponent, {
230
- data: {
231
- flow: flowToEdit,
232
- },
233
- role: 'alertdialog',
234
- id: 'gioPsFlowProxyFormDialog',
235
- width: GIO_DIALOG_WIDTH.MEDIUM,
236
- })
237
- .afterClosed();
245
+ let dialogResult;
246
+ switch (this.apiType) {
247
+ case 'MESSAGE':
248
+ dialogResult = this.matDialog
249
+ .open(GioPolicyStudioFlowMessageFormDialogComponent, {
250
+ data: {
251
+ flow: flowToEdit,
252
+ entrypoints: this.entrypointsInfo ?? [],
253
+ },
254
+ role: 'alertdialog',
255
+ id: 'gioPsFlowMessageFormDialog',
256
+ width: GIO_DIALOG_WIDTH.MEDIUM,
257
+ })
258
+ .afterClosed();
259
+ break;
260
+ case 'PROXY':
261
+ dialogResult = this.matDialog
262
+ .open(GioPolicyStudioFlowProxyFormDialogComponent, {
263
+ data: {
264
+ flow: flowToEdit,
265
+ },
266
+ role: 'alertdialog',
267
+ id: 'gioPsFlowProxyFormDialog',
268
+ width: GIO_DIALOG_WIDTH.MEDIUM,
269
+ })
270
+ .afterClosed();
271
+ break;
272
+ case 'NATIVE':
273
+ dialogResult = this.matDialog
274
+ .open(GioPolicyStudioFlowNativeFormDialogComponent, {
275
+ data: {
276
+ parentGroupName: flowToEdit._parentFlowGroupName,
277
+ flow: flowToEdit,
278
+ },
279
+ role: 'alertdialog',
280
+ id: 'gioPsFlowNativeFormDialog',
281
+ width: GIO_DIALOG_WIDTH.MEDIUM,
282
+ })
283
+ .afterClosed();
284
+ break;
285
+ default:
286
+ throw new Error(`Unsupported API type ${this.apiType}`);
287
+ }
238
288
  dialogResult
239
289
  .pipe(tap(editedFlow => {
240
290
  if (!editedFlow) {
@@ -270,11 +320,11 @@ export class GioPolicyStudioFlowsMenuComponent {
270
320
  this.selectedFlowIdChange.emit(duplicatedFlow._id);
271
321
  }
272
322
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, deps: [{ token: i1.MatDialog }], target: i0.ɵɵFactoryTarget.Component }); }
273
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: GioPolicyStudioFlowsMenuComponent, isStandalone: true, selector: "gio-ps-flows-menu", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flowExecution: "flowExecution", flowsGroups: "flowsGroups", selectedFlowId: "selectedFlowId", entrypoints: "entrypoints", entrypointsInfo: "entrypointsInfo" }, outputs: { selectedFlowIdChange: "selectedFlowIdChange", flowsGroupsChange: "flowsGroupsChange", flowExecutionChange: "flowExecutionChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of flowGroupMenuItems\"\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"list__flowsGroup__flows\">\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n </div>\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n </mat-menu>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #e7e2fb);color:var(--gio-oem-palette--active-contrast, #100c27)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:16px}.header__label{font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 8px 8px 10px;border-radius:8px;background-color:#cdc5f7}.list__flowsGroup__header__label{font-size:14px;font-weight:500;line-height:20px;font-family:Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #d3d5dc;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(211,213,220,0);background-color:#f7f8fdcc}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #876fec;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i6.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }] }); }
323
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: GioPolicyStudioFlowsMenuComponent, isStandalone: true, selector: "gio-ps-flows-menu", inputs: { readOnly: "readOnly", loading: "loading", apiType: "apiType", flowExecution: "flowExecution", flowsGroups: "flowsGroups", selectedFlowId: "selectedFlowId", entrypoints: "entrypoints", entrypointsInfo: "entrypointsInfo" }, outputs: { selectedFlowIdChange: "selectedFlowIdChange", flowsGroupsChange: "flowsGroupsChange", flowExecutionChange: "flowExecutionChange", deleteFlow: "deleteFlow" }, usesOnChanges: true, ngImport: i0, template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of flowGroupMenuItems\"\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n\n <div class=\"list__flowsGroup__flows\">\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #e7e2fb);color:var(--gio-oem-palette--active-contrast, #100c27)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:16px}.header__label{font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 8px 8px 10px;border-radius:8px;background-color:#cdc5f7}.list__flowsGroup__header__label{font-size:14px;font-weight:500;line-height:20px;font-family:Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #d3d5dc;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(211,213,220,0);background-color:#f7f8fdcc}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #876fec;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: GioIconsModule }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i3.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i4.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: GioLoaderModule }, { kind: "component", type: i6.GioLoaderComponent, selector: "gio-loader" }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i8.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i8.CdkDropListGroup, selector: "[cdkDropListGroup]", inputs: ["cdkDropListGroupDisabled"], exportAs: ["cdkDropListGroup"] }, { kind: "directive", type: i8.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }] }); }
274
324
  }
275
325
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: GioPolicyStudioFlowsMenuComponent, decorators: [{
276
326
  type: Component,
277
- args: [{ standalone: true, imports: [GioIconsModule, MatTooltipModule, MatButtonModule, CommonModule, GioLoaderModule, MatMenuModule, DragDropModule], selector: 'gio-ps-flows-menu', template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of flowGroupMenuItems\"\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </div>\n </div>\n\n <div class=\"list__flowsGroup__flows\">\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n </div>\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n </mat-menu>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #e7e2fb);color:var(--gio-oem-palette--active-contrast, #100c27)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:16px}.header__label{font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 8px 8px 10px;border-radius:8px;background-color:#cdc5f7}.list__flowsGroup__header__label{font-size:14px;font-weight:500;line-height:20px;font-family:Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #d3d5dc;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(211,213,220,0);background-color:#f7f8fdcc}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #876fec;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"] }]
327
+ args: [{ standalone: true, imports: [GioIconsModule, MatTooltipModule, MatButtonModule, CommonModule, GioLoaderModule, MatMenuModule, DragDropModule], selector: 'gio-ps-flows-menu', template: "<!--\n\n Copyright (C) 2023 The Gravitee team (http://gravitee.io)\n \n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the License at\n \n http://www.apache.org/licenses/LICENSE-2.0\n \n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n\n-->\n\n<div class=\"header\">\n <div class=\"header__label\">\n Flows <mat-icon svgIcon=\"gio:info\" matTooltip=\"Flows allow you to apply different policies on your API event phases\"></mat-icon>\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"header__configBtn\">\n <button class=\"header__configBtn_edit\" mat-stroked-button [disabled]=\"loading\" (click)=\"onConfigureExecution(flowExecution)\">\n <mat-icon [svgIcon]=\"readOnly ? 'gio:eye-empty' : 'gio:settings'\"></mat-icon>\n </button>\n </div>\n }\n</div>\n\n<div class=\"list\" *ngIf=\"!loading; else loadingList\" cdkDropListGroup>\n <div\n *ngFor=\"let flowsGroup of flowGroupMenuItems\"\n class=\"list__flowsGroup\"\n cdkDropList\n [cdkDropListData]=\"flowsGroup\"\n [cdkDropListEnterPredicate]=\"enterPredicate\"\n (cdkDropListDropped)=\"onDropFlow($event)\"\n >\n <div class=\"list__flowsGroup__header\">\n <div class=\"list__flowsGroup__header__label\">\n <mat-icon *ngIf=\"flowsGroup._icon\" [svgIcon]=\"flowsGroup._icon\"></mat-icon>\n <span>{{ flowsGroup.name }}</span>\n </div>\n <div class=\"list__flowsGroup__header__addBtn\">\n @if (apiType === 'NATIVE') {\n <span [matTooltipDisabled]=\"flowsGroup.flows.length < 1\" matTooltip=\"Only one flow is allowed for a native API\">\n <button mat-button [disabled]=\"readOnly || flowsGroup.flows.length > 0\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n </span>\n } @else {\n <button mat-button [disabled]=\"readOnly\" (click)=\"onAddFlow(flowsGroup)\">\n <mat-icon svgIcon=\"gio:plus\" matTooltip=\"New flow\"></mat-icon>\n </button>\n }\n </div>\n </div>\n\n <div class=\"list__flowsGroup__flows\">\n @for (flow of flowsGroup.flows; track flow._id) {\n <div\n class=\"list__flowsGroup__flows__flow\"\n [class.selected]=\"flow.selected\"\n [class.disabled]=\"!flow.enabled\"\n (click)=\"selectFlow(flowsGroup._id, flow._id)\"\n (mouseout)=\"flow.mouseOver = false\"\n (mouseover)=\"flow.mouseOver = true\"\n cdkDrag\n >\n <div class=\"list__flowsGroup__flows__flow__left\">\n <div *ngIf=\"flow.name\" class=\"list__flowsGroup__flows__flow__left__name\" [attr.title]=\"flow.name\">\n {{ flow.name }}\n </div>\n @if (apiType !== 'NATIVE') {\n <div class=\"list__flowsGroup__flows__flow__left__infos\">\n <div class=\"list__flowsGroup__flows__flow__left__infos__badges\">\n <span\n *ngFor=\"let badge of flow.badges\"\n class=\"list__flowsGroup__flows__flow__left__infos__badges__badge\"\n [ngClass]=\"badge.class\"\n >{{ badge.label }}</span\n >\n </div>\n <div class=\"list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel\">\n <span *ngIf=\"flow.pathOrChannelLabel; else emptyPathOrChannelLabel\" [attr.title]=\"flow.pathOrChannelLabel\">{{\n flow.pathOrChannelLabel\n }}</span>\n <ng-template #emptyPathOrChannelLabel>\n <em>Empty</em>\n </ng-template>\n </div>\n\n <span\n *ngIf=\"flow.hasCondition\"\n class=\"list__flowsGroup__flows__flow__left__infos__conditionBadge gio-badge-neutral\"\n matTooltip=\"Conditioned\"\n ><mat-icon svgIcon=\"gio:if\"></mat-icon\n ></span>\n </div>\n }\n </div>\n <div class=\"list__flowsGroup__flows__flow__right\">\n <button\n class=\"list__flowsGroup__flows__flow__right__name__menu\"\n mat-button\n [disabled]=\"readOnly\"\n [matMenuTriggerFor]=\"flowMenu\"\n (click)=\"$event.stopPropagation()\"\n >\n <mat-icon svgIcon=\"gio:more-vertical\"></mat-icon>\n </button>\n <mat-menu #flowMenu=\"matMenu\">\n <button [disabled]=\"readOnly\" mat-menu-item (click)=\"onDisableFlow(flow._id)\">\n <mat-icon [svgIcon]=\"flow.enabled ? 'gio:prohibition' : 'gio:check-circled-outline'\"></mat-icon>\n <span>{{ flow.enabled ? 'Disable' : 'Enable' }}</span>\n </button>\n <button mat-menu-item (click)=\"onEditFlow(flow._id)\"><mat-icon svgIcon=\"gio:edit-pencil\"></mat-icon> Edit</button>\n <button mat-menu-item (click)=\"onDeleteFlow(flow._id)\"><mat-icon svgIcon=\"gio:trash\"></mat-icon> Delete</button>\n @if (apiType !== 'NATIVE') {\n <button mat-menu-item (click)=\"onDuplicateFlow(flowsGroup._id, flow._id)\">\n <mat-icon svgIcon=\"gio:copy\"></mat-icon> Duplicate\n </button>\n }\n </mat-menu>\n </div>\n </div>\n }\n </div>\n </div>\n</div>\n\n<ng-template #loadingList>\n <div class=\"loadingList\">\n <gio-loader></gio-loader>\n </div>\n</ng-template>\n", styles: ["@charset \"UTF-8\";.gio-top-bar-menu .gio-badge-accent{background-color:var(--gio-oem-palette--active, #e7e2fb);color:var(--gio-oem-palette--active-contrast, #100c27)}:host{display:flex;height:100%;max-height:100%;flex-direction:column;padding-top:16px}.header{display:flex;align-items:center;padding:0 16px;margin-bottom:16px}.header__label{font-size:16px;font-weight:500;letter-spacing:.4px;line-height:24px;display:flex;flex:1 1 auto;align-items:center;margin-bottom:0;gap:8px}.header__configBtn{margin-left:8px}.list{padding:0 16px;overflow-y:overlay}.list__flowsGroup{display:flex;flex-direction:column;padding-bottom:8px;gap:8px}.list__flowsGroup__header{display:flex;align-items:center;padding:8px 8px 8px 10px;border-radius:8px;background-color:#cdc5f7}.list__flowsGroup__header__label{font-size:14px;font-weight:500;line-height:20px;font-family:Golos UI,Roboto,Helvetica Neue,sans-serif;letter-spacing:.4px;display:flex;overflow:hidden;flex:1 1 auto;align-items:center;gap:8px}.list__flowsGroup__header__label>mat-icon{width:22px;height:22px;flex:0 0 auto}.list__flowsGroup__header__label>span{display:-webkit-box;overflow:hidden;flex:1 1 auto;-webkit-box-orient:vertical;-webkit-line-clamp:2}.list__flowsGroup__header__addBtn{margin-left:8px}.list__flowsGroup__flows{display:flex;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow{display:flex;overflow:hidden;height:68px;flex-direction:row;align-items:center;justify-content:space-between;padding:7px;border:1px solid #d3d5dc;border-radius:8px;background-color:#fff}.list__flowsGroup__flows__flow.disabled{border:1px solid rgba(211,213,220,0);background-color:#f7f8fdcc}.list__flowsGroup__flows__flow:hover,.list__flowsGroup__flows__flow.selected{padding:6px;border:2px solid #876fec;cursor:pointer}.list__flowsGroup__flows__flow__left{display:flex;overflow:hidden;flex:1 1 auto;flex-direction:column;gap:8px}.list__flowsGroup__flows__flow__left__name{overflow:hidden;padding-left:4px;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos{display:flex;align-items:center}.list__flowsGroup__flows__flow__left__infos__badges{flex:0 0 auto}.list__flowsGroup__flows__flow__left__infos__badges__badge{width:auto}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel{overflow:hidden;flex:1 1 auto;direction:rtl;text-align:left;text-overflow:ellipsis;white-space:nowrap}.list__flowsGroup__flows__flow__left__infos__pathOrChannelLabel span{direction:ltr;unicode-bidi:bidi-override}.list__flowsGroup__flows__flow__left__infos__conditionBadge{flex:0 0 auto}.list__flowsGroup.cdk-drop-list-dragging{pointer-events:none}.list__flowsGroup .cdk-drag-preview{box-sizing:border-box;border-radius:4px;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.list__flowsGroup .cdk-drag-placeholder *{opacity:0}.list__flowsGroup .cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.list__flowsGroup.cdk-drop-list-dragging .list__flowsGroup__flows__flow:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.loadingList{display:flex;height:100%;flex-direction:column;align-items:center;justify-content:center}\n"] }]
278
328
  }], ctorParameters: () => [{ type: i1.MatDialog }], propDecorators: { readOnly: [{
279
329
  type: Input
280
330
  }], loading: [{
@@ -300,4 +350,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImpor
300
350
  }], deleteFlow: [{
301
351
  type: Output
302
352
  }] } });
303
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLXBzLWZsb3dzLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcG9saWN5LXN0dWRpby1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9mbG93cy1tZW51L2dpby1wcy1mbG93cy1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXBvbGljeS1zdHVkaW8tYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZmxvd3MtbWVudS9naW8tcHMtZmxvd3MtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRWpHLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFlLGNBQWMsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUV6RyxPQUFPLEVBQ0wsNkNBQTZDLEdBRTlDLE1BQU0sd0ZBQXdGLENBQUM7QUFHaEcs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RSxjQUFjOzsyRkFLOUcsaUNBQWlDO2tCQVA3QyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLFlBQ2hILG1CQUFtQjs4RUFNdEIsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsS0FBSztnQkFJQyxlQUFlO3NCQURyQixLQUFLO2dCQUlDLG9CQUFvQjtzQkFEMUIsTUFBTTtnQkFJQSxpQkFBaUI7c0JBRHZCLE1BQU07Z0JBSUEsbUJBQW1CO3NCQUR6QixNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZmxhdHRlbiwgaXNFbXB0eSwgdW5pcXVlSWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgR0lPX0RJQUxPR19XSURUSCwgR2lvSWNvbnNNb2R1bGUsIEdpb0xvYWRlck1vZHVsZSB9IGZyb20gJ0BncmF2aXRlZS91aS1wYXJ0aWNsZXMtYW5ndWxhcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IENka0RyYWdEcm9wLCBEcmFnRHJvcE1vZHVsZSwgbW92ZUl0ZW1JbkFycmF5LCB0cmFuc2ZlckFycmF5SXRlbSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuXG5pbXBvcnQge1xuICBHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0RhdGEsXG59IGZyb20gJy4uL2Zsb3ctZm9ybS1kaWFsb2cvZmxvdy1tZXNzYWdlLWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LW1lc3NhZ2UtZm9ybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEZsb3dHcm91cFZNLCBGbG93Vk0gfSBmcm9tICcuLi8uLi9wb2xpY3ktc3R1ZGlvL2dpby1wb2xpY3ktc3R1ZGlvLm1vZGVsJztcbmltcG9ydCB7IEFwaVR5cGUsIENoYW5uZWxTZWxlY3RvciwgQ29uZGl0aW9uU2VsZWN0b3IsIENvbm5lY3RvckluZm8sIEZsb3dFeGVjdXRpb24sIEh0dHBTZWxlY3RvciwgT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dDb21wb25lbnQsXG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dEYXRhLFxufSBmcm9tICcuLi9mbG93LWZvcm0tZGlhbG9nL2Zsb3ctcHJveHktZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctcHJveHktZm9ybS1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0IH0gZnJvbSAnLi4vZmxvdy1mb3JtLWRpYWxvZy9naW8tcHMtZmxvdy1mb3JtLWRpYWxvZy1yZXN1bHQubW9kZWwnO1xuaW1wb3J0IHtcbiAgR2lvUG9saWN5U3R1ZGlvRmxvd0V4ZWN1dGlvbkZvcm1EaWFsb2dDb21wb25lbnQsXG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1leGVjdXRpb24tZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctZXhlY3V0aW9uLWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5cbmludGVyZmFjZSBGbG93R3JvdXBNZW51Vk0gZXh0ZW5kcyBGbG93R3JvdXBWTSB7XG4gIGZsb3dzOiBGbG93TWVudVZNW107XG59XG5cbmludGVyZmFjZSBGbG93TWVudVZNIGV4dGVuZHMgRmxvd1ZNIHtcbiAgc2VsZWN0ZWQ6IGJvb2xlYW47XG4gIG1vdXNlT3ZlcjogYm9vbGVhbjtcbiAgYmFkZ2VzOiB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBjbGFzczogc3RyaW5nO1xuICB9W107XG4gIHBhdGhPckNoYW5uZWxMYWJlbDogc3RyaW5nO1xuICBoYXNDb25kaXRpb246IGJvb2xlYW47XG59XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbR2lvSWNvbnNNb2R1bGUsIE1hdFRvb2x0aXBNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgQ29tbW9uTW9kdWxlLCBHaW9Mb2FkZXJNb2R1bGUsIE1hdE1lbnVNb2R1bGUsIERyYWdEcm9wTW9kdWxlXSxcbiAgc2VsZWN0b3I6ICdnaW8tcHMtZmxvd3MtbWVudScsXG4gIHRlbXBsYXRlVXJsOiAnLi9naW8tcHMtZmxvd3MtbWVudS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2dpby1wcy1mbG93cy1tZW51LmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEdpb1BvbGljeVN0dWRpb0Zsb3dzTWVudUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByZWFkT25seSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsb2FkaW5nID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGFwaVR5cGUhOiBBcGlUeXBlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmbG93RXhlY3V0aW9uITogRmxvd0V4ZWN1dGlvbjtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZmxvd3NHcm91cHM6IEZsb3dHcm91cFZNW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2VsZWN0ZWRGbG93SWQ/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVudHJ5cG9pbnRzOiBDb25uZWN0b3JJbmZvW10gPSBbXTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZW50cnlwb2ludHNJbmZvOiBDb25uZWN0b3JJbmZvW10gPSBbXTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIHNlbGVjdGVkRmxvd0lkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBmbG93c0dyb3Vwc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rmxvd0dyb3VwVk1bXT4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGZsb3dFeGVjdXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEZsb3dFeGVjdXRpb24+KCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBkZWxldGVGbG93ID0gbmV3IEV2ZW50RW1pdHRlcjxGbG93Vk0+KCk7XG5cbiAgcHVibGljIGZsb3dHcm91cE1lbnVJdGVtczogRmxvd0dyb3VwTWVudVZNW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IG1hdERpYWxvZzogTWF0RGlhbG9nKSB7fVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuZmxvd3NHcm91cHMgfHwgY2hhbmdlcy5zZWxlY3RlZEZsb3dJZCkge1xuICAgICAgdGhpcy5mbG93R3JvdXBNZW51SXRlbXMgPSBjbG9uZURlZXAodGhpcy5mbG93c0dyb3VwcykubWFwKGZsb3dHcm91cCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uZmxvd0dyb3VwLFxuICAgICAgICAgIGZsb3dzOiBmbG93R3JvdXAuZmxvd3MubWFwKGZsb3cgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFkZ2VzOiBGbG93TWVudVZNWydiYWRnZXMnXSA9IFtdO1xuICAgICAgICAgICAgbGV0IHBhdGhPckNoYW5uZWxMYWJlbCA9ICcnO1xuICAgICAgICAgICAgbGV0IGhhc0NvbmRpdGlvbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAvLyBNRVNTQUdFIEFQSSAtIENIQU5ORUxcbiAgICAgICAgICAgIGNvbnN0IGNoYW5uZWxTZWxlY3RvciA9IGZsb3cuc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnQ0hBTk5FTCcpIGFzIENoYW5uZWxTZWxlY3RvcjtcbiAgICAgICAgICAgIGlmIChjaGFubmVsU2VsZWN0b3IpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uVG9CYWRnZTogUmVjb3JkPE9wZXJhdGlvbiwgc3RyaW5nPiA9IHtcbiAgICAgICAgICAgICAgICBQVUJMSVNIOiAnUFVCJyxcbiAgICAgICAgICAgICAgICBTVUJTQ1JJQkU6ICdTVUInLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAvLyBJZiBubyBvcGVyYXRpb25zIGFyZSBzZWxlY3RlZCwgYWxsIG9wZXJhdGlvbnMgYXJlIHZhbGlkXG4gICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbkJhZGdlcyA9IChcbiAgICAgICAgICAgICAgICAhY2hhbm5lbFNlbGVjdG9yLm9wZXJhdGlvbnMgfHwgaXNFbXB0eShjaGFubmVsU2VsZWN0b3Iub3BlcmF0aW9ucylcbiAgICAgICAgICAgICAgICAgID8gKFsnUFVCTElTSCcsICdTVUJTQ1JJQkUnXSBhcyBjb25zdClcbiAgICAgICAgICAgICAgICAgIDogY2hhbm5lbFNlbGVjdG9yLm9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIC5tYXAob3BlcmF0aW9uID0+ICh7XG4gICAgICAgICAgICAgICAgICBsYWJlbDogb3BlcmF0aW9uVG9CYWRnZVtvcGVyYXRpb25dLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6ICdnaW8tYmFkZ2UtbmV1dHJhbCcsXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEubGFiZWwubG9jYWxlQ29tcGFyZShiLmxhYmVsKSk7XG4gICAgICAgICAgICAgIG9wZXJhdGlvbkJhZGdlcyAmJiBiYWRnZXMucHVzaCguLi5vcGVyYXRpb25CYWRnZXMpO1xuICAgICAgICAgICAgICBwYXRoT3JDaGFubmVsTGFiZWwgPSBgJHtjaGFubmVsU2VsZWN0b3IuY2hhbm5lbH0ke2NoYW5uZWxTZWxlY3Rvci5jaGFubmVsT3BlcmF0b3IgPT09ICdTVEFSVFNfV0lUSCcgPyAnKionIDogJyd9YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSFRUUCBBUEkgLSBIVFRQXG4gICAgICAgICAgICBjb25zdCBodHRwU2VsZWN0b3IgPSBmbG93LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0hUVFAnKSBhcyBIdHRwU2VsZWN0b3I7XG4gICAgICAgICAgICBpZiAoaHR0cFNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgIC8vIEtlZXAgb25seSAyIGZpcnN0IGh0dHAgbWV0aG9kcyBhbmQgYWRkICtYIGJhZGdlIGlmIHRoZXJlIGFyZSBtb3JlXG4gICAgICAgICAgICAgIGNvbnN0IGh0dHBNZXRob2RzVG9LZWVwID0gaHR0cFNlbGVjdG9yLm1ldGhvZHM/LnNsaWNlKDAsIDIpO1xuICAgICAgICAgICAgICBjb25zdCBodHRwTWV0aG9kc0xlbmd0aCA9IGh0dHBTZWxlY3Rvci5tZXRob2RzPy5sZW5ndGggPz8gMDtcbiAgICAgICAgICAgICAgaHR0cE1ldGhvZHNUb0tlZXAgJiZcbiAgICAgICAgICAgICAgICBiYWRnZXMucHVzaCguLi5odHRwTWV0aG9kc1RvS2VlcC5tYXAobWV0aG9kID0+ICh7IGxhYmVsOiBtZXRob2QsIGNsYXNzOiBgZ2lvLW1ldGhvZC1iYWRnZS0ke21ldGhvZC50b0xvd2VyQ2FzZSgpfWAgfSkpKTtcbiAgICAgICAgICAgICAgaWYgKGh0dHBNZXRob2RzTGVuZ3RoICYmIGh0dHBNZXRob2RzTGVuZ3RoID4gMikge1xuICAgICAgICAgICAgICAgIGJhZGdlcz8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICBsYWJlbDogYCske2h0dHBNZXRob2RzTGVuZ3RoIC0gMn1gLFxuICAgICAgICAgICAgICAgICAgY2xhc3M6ICdnaW8tYmFkZ2UtbmV1dHJhbCcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGh0dHBNZXRob2RzTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgYmFkZ2VzPy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiAnQUxMJyxcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiAnZ2lvLWJhZGdlLW5ldXRyYWwnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcGF0aE9yQ2hhbm5lbExhYmVsID0gYCR7aHR0cFNlbGVjdG9yLnBhdGh9JHtodHRwU2VsZWN0b3IucGF0aE9wZXJhdG9yID09PSAnU1RBUlRTX1dJVEgnID8gJy8qKicgOiAnJ31gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjb25kaXRpb25TZWxlY3RvciA9IGZsb3cuc2VsZWN0b3JzPy5maW5kKHMgPT4gcy50eXBlID09PSAnQ09ORElUSU9OJykgYXMgQ29uZGl0aW9uU2VsZWN0b3I7XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uU2VsZWN0b3IgJiYgY29uZGl0aW9uU2VsZWN0b3IuY29uZGl0aW9uKSB7XG4gICAgICAgICAgICAgIGhhc0NvbmRpdGlvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLmZsb3csXG4gICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLnNlbGVjdGVkRmxvd0lkID09PSBmbG93Ll9pZCxcbiAgICAgICAgICAgICAgbW91c2VPdmVyOiBmYWxzZSxcbiAgICAgICAgICAgICAgYmFkZ2VzLFxuICAgICAgICAgICAgICBwYXRoT3JDaGFubmVsTGFiZWwsXG4gICAgICAgICAgICAgIGhhc0NvbmRpdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSksXG4gICAgICAgIH07XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Rmxvdyhncm91cElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmxvdyA9IHRoaXMuZmxvd3NHcm91cHMuZmluZChmZyA9PiBmZy5faWQgPT09IGdyb3VwSWQpPy5mbG93cy5maW5kKGYgPT4gZi5faWQgPT09IGZsb3dJZCk7XG4gICAgaWYgKGZsb3cpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRGbG93SWRDaGFuZ2UuZW1pdChmbG93Ll9pZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uQWRkRmxvdyhmbG93R3JvdXA6IEZsb3dHcm91cFZNKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVzdWx0ID1cbiAgICAgIHRoaXMuYXBpVHlwZSA9PT0gJ01FU1NBR0UnXG4gICAgICAgID8gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAgIC5vcGVuPFxuICAgICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0XG4gICAgICAgICAgICA+KEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmxvdzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGVudHJ5cG9pbnRzOiB0aGlzLmVudHJ5cG9pbnRzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd0Zvcm1EaWFsb2cnLFxuICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgOiB0aGlzLm1hdERpYWxvZ1xuICAgICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCwgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0RhdGEsIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0PihcbiAgICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGZsb3c6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dGb3JtRGlhbG9nJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChjcmVhdGVkT3JFZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghY3JlYXRlZE9yRWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVkaXRlZEZsb3dzR3JvdXBzID0gY2xvbmVEZWVwKHRoaXMuZmxvd3NHcm91cHMpO1xuXG4gICAgICAgICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IGVkaXRlZEZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBmbG93R3JvdXAuX2lkKTtcbiAgICAgICAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2Zsb3dHcm91cC5faWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbG93c0dyb3VwVG9FZGl0LmZsb3dzLnB1c2goY3JlYXRlZE9yRWRpdGVkKTtcblxuICAgICAgICAgIHRoaXMuZmxvd3NHcm91cHNDaGFuZ2UuZW1pdChlZGl0ZWRGbG93c0dyb3Vwcyk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb3dJZENoYW5nZS5lbWl0KGNyZWF0ZWRPckVkaXRlZC5faWQpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbmZpZ3VyZUV4ZWN1dGlvbihmbG93RXhlY3V0aW9uOiBGbG93RXhlY3V0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgIC5vcGVuPEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nQ29tcG9uZW50LCBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0RhdGEsIEZsb3dFeGVjdXRpb24gfCB1bmRlZmluZWQ+KFxuICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZsb3dFeGVjdXRpb24sXG4gICAgICAgICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nJyxcbiAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuYWZ0ZXJDbG9zZWQoKTtcblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChlZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghZWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmxvd0V4ZWN1dGlvbkNoYW5nZS5lbWl0KGVkaXRlZCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRGlzYWJsZUZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuICAgIGlmICghZmxvd1RvRWRpdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGbG93ICR7Zmxvd0lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgZmxvd1RvRWRpdC5lbmFibGVkID0gIWZsb3dUb0VkaXQuZW5hYmxlZDtcbiAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gIH1cblxuICBwdWJsaWMgb25Ecm9wRmxvdyhldmVudDogQ2RrRHJhZ0Ryb3A8Rmxvd0dyb3VwTWVudVZNPik6IHZvaWQge1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICAvLyBNb3ZlIGluc2lkZSB0aGUgc2FtZSBncm91cFxuICAgICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IHRoaXMuZmxvd3NHcm91cHMuZmluZChmZyA9PiBmZy5faWQgPT09IGV2ZW50LmNvbnRhaW5lci5kYXRhLl9pZCk7XG4gICAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGbG93IGdyb3VwICR7ZXZlbnQuY29udGFpbmVyLmRhdGEuX2lkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIG1vdmVJdGVtSW5BcnJheShmbG93c0dyb3VwVG9FZGl0LmZsb3dzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgdGhpcy5mbG93c0dyb3Vwc0NoYW5nZS5lbWl0KHRoaXMuZmxvd3NHcm91cHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb3ZlIGZyb20gYSBncm91cCB0byBhbm90aGVyXG4gICAgICBjb25zdCBwcmV2aW91c0Zsb3dzR3JvdXBUb0VkaXQgPSB0aGlzLmZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLl9pZCk7XG4gICAgICBjb25zdCBmbG93c0dyb3VwVG9FZGl0ID0gdGhpcy5mbG93c0dyb3Vwcy5maW5kKGZnID0+IGZnLl9pZCA9PT0gZXZlbnQuY29udGFpbmVyLmRhdGEuX2lkKTtcbiAgICAgIGlmICghcHJldmlvdXNGbG93c0dyb3VwVG9FZGl0IHx8ICFmbG93c0dyb3VwVG9FZGl0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2V2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEuX2lkfSBvciAke2V2ZW50LmNvbnRhaW5lci5kYXRhLl9pZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckFycmF5SXRlbShwcmV2aW91c0Zsb3dzR3JvdXBUb0VkaXQuZmxvd3MsIGZsb3dzR3JvdXBUb0VkaXQuZmxvd3MsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRWRpdEZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuXG4gICAgY29uc3QgZGlhbG9nUmVzdWx0ID1cbiAgICAgIHRoaXMuYXBpVHlwZSA9PT0gJ01FU1NBR0UnXG4gICAgICAgID8gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAgIC5vcGVuPFxuICAgICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0XG4gICAgICAgICAgICA+KEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZmxvdzogZmxvd1RvRWRpdCxcbiAgICAgICAgICAgICAgICBlbnRyeXBvaW50czogdGhpcy5lbnRyeXBvaW50c0luZm8gPz8gW10sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgICAgIGlkOiAnZ2lvUHNGbG93TWVzc2FnZUZvcm1EaWFsb2cnLFxuICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgICAgOiB0aGlzLm1hdERpYWxvZ1xuICAgICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCwgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0RhdGEsIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0PihcbiAgICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgIGZsb3c6IGZsb3dUb0VkaXQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICAgIGlkOiAnZ2lvUHNGbG93UHJveHlGb3JtRGlhbG9nJyxcbiAgICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChlZGl0ZWRGbG93ID0+IHtcbiAgICAgICAgICBpZiAoIWVkaXRlZEZsb3cpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5mbG93c0dyb3VwcyA9IHRoaXMuZmxvd3NHcm91cHMubWFwKGZnID0+ICh7XG4gICAgICAgICAgICAuLi5mZyxcbiAgICAgICAgICAgIGZsb3dzOiBmZy5mbG93cy5tYXAoZiA9PiAoZi5faWQgPT09IGVkaXRlZEZsb3cuX2lkID8gZWRpdGVkRmxvdyA6IGYpKSxcbiAgICAgICAgICB9KSk7XG4gICAgICAgICAgdGhpcy5mbG93c0dyb3Vwc0NoYW5nZS5lbWl0KHRoaXMuZmxvd3NHcm91cHMpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkRlbGV0ZUZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuICAgIHRoaXMuZGVsZXRlRmxvdy5lbWl0KGZsb3dUb0VkaXQpO1xuICB9XG5cbiAgcHVibGljIG9uRHVwbGljYXRlRmxvdyhmbG93R3JvdXBJZDogc3RyaW5nLCBmbG93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZsb3dzR3JvdXBUb0VkaXQgPSB0aGlzLmZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBmbG93R3JvdXBJZCk7XG4gICAgaWYgKCFmbG93c0dyb3VwVG9FZGl0KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZsb3cgZ3JvdXAgJHtmbG93R3JvdXBJZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dUb0R1cGxpY2F0ZSA9IGZsb3dzR3JvdXBUb0VkaXQuZmxvd3MuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuICAgIGlmICghZmxvd1RvRHVwbGljYXRlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZsb3cgJHtmbG93SWR9IG5vdCBmb3VuZGApO1xuICAgIH1cbiAgICBjb25zdCBkdXBsaWNhdGVkRmxvdyA9IGNsb25lRGVlcChmbG93VG9EdXBsaWNhdGUpO1xuICAgIGR1cGxpY2F0ZWRGbG93Ll9pZCA9IHVuaXF1ZUlkKCdmbG93XycpO1xuICAgIGR1cGxpY2F0ZWRGbG93Lm5hbWUgPSBgJHtkdXBsaWNhdGVkRmxvdy5uYW1lfSAtIENvcHlgO1xuICAgIGNvbnN0IGluZGV4ID0gZmxvd3NHcm91cFRvRWRpdC5mbG93cy5pbmRleE9mKGZsb3dUb0R1cGxpY2F0ZSk7XG4gICAgZmxvd3NHcm91cFRvRWRpdC5mbG93cy5zcGxpY2UoaW5kZXggKyAxLCAwLCBkdXBsaWNhdGVkRmxvdyk7XG4gICAgdGhpcy5mbG93c0dyb3Vwc0NoYW5nZS5lbWl0KHRoaXMuZmxvd3NHcm91cHMpO1xuICAgIHRoaXMuc2VsZWN0ZWRGbG93SWRDaGFuZ2UuZW1pdChkdXBsaWNhdGVkRmxvdy5faWQpO1xuICB9XG59XG4iLCI8IS0tXG5cbiAgICBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEdyYXZpdGVlIHRlYW0gKGh0dHA6Ly9ncmF2aXRlZS5pbylcbiAgICBcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBcbiAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuXG4tLT5cblxuPGRpdiBjbGFzcz1cImhlYWRlclwiPlxuICA8ZGl2IGNsYXNzPVwiaGVhZGVyX19sYWJlbFwiPlxuICAgIEZsb3dzIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOmluZm9cIiBtYXRUb29sdGlwPVwiRmxvd3MgYWxsb3cgeW91IHRvIGFwcGx5IGRpZmZlcmVudCBwb2xpY2llcyBvbiB5b3VyIEFQSSBldmVudCBwaGFzZXNcIj48L21hdC1pY29uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cImhlYWRlcl9fY29uZmlnQnRuXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImhlYWRlcl9fY29uZmlnQnRuX2VkaXRcIiBtYXQtc3Ryb2tlZC1idXR0b24gW2Rpc2FibGVkXT1cImxvYWRpbmdcIiAoY2xpY2spPVwib25Db25maWd1cmVFeGVjdXRpb24oZmxvd0V4ZWN1dGlvbilcIj5cbiAgICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCJyZWFkT25seSA/ICdnaW86ZXllLWVtcHR5JyA6ICdnaW86c2V0dGluZ3MnXCI+PC9tYXQtaWNvbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImxpc3RcIiAqbmdJZj1cIiFsb2FkaW5nOyBlbHNlIGxvYWRpbmdMaXN0XCIgY2RrRHJvcExpc3RHcm91cD5cbiAgPGRpdlxuICAgICpuZ0Zvcj1cImxldCBmbG93c0dyb3VwIG9mIGZsb3dHcm91cE1lbnVJdGVtc1wiXG4gICAgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwXCJcbiAgICBjZGtEcm9wTGlzdFxuICAgIFtjZGtEcm9wTGlzdERhdGFdPVwiZmxvd3NHcm91cFwiXG4gICAgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJvbkRyb3BGbG93KCRldmVudClcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2hlYWRlclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2hlYWRlcl9fbGFiZWxcIj5cbiAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwiZmxvd3NHcm91cC5faWNvblwiIFtzdmdJY29uXT1cImZsb3dzR3JvdXAuX2ljb25cIj48L21hdC1pY29uPlxuICAgICAgICA8c3Bhbj57eyBmbG93c0dyb3VwLm5hbWUgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19oZWFkZXJfX2FkZEJ0blwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW2Rpc2FibGVkXT1cInJlYWRPbmx5XCIgKGNsaWNrKT1cIm9uQWRkRmxvdyhmbG93c0dyb3VwKVwiPlxuICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnBsdXNcIiBtYXRUb29sdGlwPVwiTmV3IGZsb3dcIj48L21hdC1pY29uPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzXCI+XG4gICAgICBAZm9yIChmbG93IG9mIGZsb3dzR3JvdXAuZmxvd3M7IHRyYWNrIGZsb3cuX2lkKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93XCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZmxvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFmbG93LmVuYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGbG93KGZsb3dzR3JvdXAuX2lkLCBmbG93Ll9pZClcIlxuICAgICAgICAgIChtb3VzZW91dCk9XCJmbG93Lm1vdXNlT3ZlciA9IGZhbHNlXCJcbiAgICAgICAgICAobW91c2VvdmVyKT1cImZsb3cubW91c2VPdmVyID0gdHJ1ZVwiXG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmxvdy5uYW1lXCIgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9fbmFtZVwiIFthdHRyLnRpdGxlXT1cImZsb3cubmFtZVwiPlxuICAgICAgICAgICAgICB7eyBmbG93Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0X19pbmZvc1wiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9fZmxvd3NfX2Zsb3dfX2xlZnRfX2luZm9zX19iYWRnZXNcIj5cbiAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGJhZGdlIG9mIGZsb3cuYmFkZ2VzXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9fZmxvd3NfX2Zsb3dfX2xlZnRfX2luZm9zX19iYWRnZXNfX2JhZGdlXCJcbiAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImJhZGdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgID57eyBiYWRnZS5sYWJlbCB9fTwvc3BhblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9faW5mb3NfX3BhdGhPckNoYW5uZWxMYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiZmxvdy5wYXRoT3JDaGFubmVsTGFiZWw7IGVsc2UgZW1wdHlQYXRoT3JDaGFubmVsTGFiZWxcIiBbYXR0ci50aXRsZV09XCJmbG93LnBhdGhPckNoYW5uZWxMYWJlbFwiPnt7XG4gICAgICAgICAgICAgICAgICBmbG93LnBhdGhPckNoYW5uZWxMYWJlbFxuICAgICAgICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlQYXRoT3JDaGFubmVsTGFiZWw+XG4gICAgICAgICAgICAgICAgICA8ZW0+RW1wdHk8L2VtPlxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJmbG93Lmhhc0NvbmRpdGlvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9faW5mb3NfX2NvbmRpdGlvbkJhZGdlIGdpby1iYWRnZS1uZXV0cmFsXCJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29uZGl0aW9uZWRcIlxuICAgICAgICAgICAgICAgID48bWF0LWljb24gc3ZnSWNvbj1cImdpbzppZlwiPjwvbWF0LWljb25cbiAgICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fcmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fcmlnaHRfX25hbWVfX21lbnVcIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiXG4gICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJmbG93TWVudVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzptb3JlLXZlcnRpY2FsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNmbG93TWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkRpc2FibGVGbG93KGZsb3cuX2lkKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCJmbG93LmVuYWJsZWQgPyAnZ2lvOnByb2hpYml0aW9uJyA6ICdnaW86Y2hlY2stY2lyY2xlZC1vdXRsaW5lJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZmxvdy5lbmFibGVkID8gJ0Rpc2FibGUnIDogJ0VuYWJsZScgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uRWRpdEZsb3coZmxvdy5faWQpXCI+PG1hdC1pY29uIHN2Z0ljb249XCJnaW86ZWRpdC1wZW5jaWxcIj48L21hdC1pY29uPiBFZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25EZWxldGVGbG93KGZsb3cuX2lkKVwiPjxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnRyYXNoXCI+PC9tYXQtaWNvbj4gRGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25EdXBsaWNhdGVGbG93KGZsb3dzR3JvdXAuX2lkLCBmbG93Ll9pZClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzpjb3B5XCI+PC9tYXQtaWNvbj4gRHVwbGljYXRlXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC9tYXQtbWVudT5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbG9hZGluZ0xpc3Q+XG4gIDxkaXYgY2xhc3M9XCJsb2FkaW5nTGlzdFwiPlxuICAgIDxnaW8tbG9hZGVyPjwvZ2lvLWxvYWRlcj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
353
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2lvLXBzLWZsb3dzLW1lbnUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdWktcG9saWN5LXN0dWRpby1hbmd1bGFyL3NyYy9saWIvY29tcG9uZW50cy9mbG93cy1tZW51L2dpby1wcy1mbG93cy1tZW51LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3VpLXBvbGljeS1zdHVkaW8tYW5ndWxhci9zcmMvbGliL2NvbXBvbmVudHMvZmxvd3MtbWVudS9naW8tcHMtZmxvd3MtbWVudS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBYSxNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBRWpHLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkcsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFxQyxjQUFjLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFL0gsT0FBTyxFQUNMLDZDQUE2QyxHQUU5QyxNQUFNLHdGQUF3RixDQUFDO0FBR2hHLE9BQU8sRUFDTCwyQ0FBMkMsR0FFNUMsTUFBTSxvRkFBb0YsQ0FBQztBQUU1RixPQUFPLEVBQ0wsK0NBQStDLEdBRWhELE1BQU0sMkVBQTJFLENBQUM7QUFDbkYsT0FBTyxFQUNMLDRDQUE0QyxHQUU3QyxNQUFNLHNGQUFzRixDQUFDOzs7Ozs7Ozs7O0FBd0I5RixNQUFNLE9BQU8saUNBQWlDO0lBeUM1QyxZQUE2QixTQUFvQjtRQUFwQixjQUFTLEdBQVQsU0FBUyxDQUFXO1FBdkMxQyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2pCLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFTaEIsZ0JBQVcsR0FBa0IsRUFBRSxDQUFDO1FBR2hDLG1CQUFjLEdBQVksU0FBUyxDQUFDO1FBR3BDLGdCQUFXLEdBQW9CLEVBQUUsQ0FBQztRQUdsQyxvQkFBZSxHQUFvQixFQUFFLENBQUM7UUFHdEMseUJBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUdsRCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUd0RCx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBaUIsQ0FBQztRQUd4RCxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUV4Qyx1QkFBa0IsR0FBc0IsRUFBRSxDQUFDO1FBRTNDLG1CQUFjLEdBQW9GLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQztJQUVoRSxDQUFDO0lBRTlDLFdBQVcsQ0FBQyxPQUFzQjtRQUN2QyxJQUFJLE9BQU8sQ0FBQyxXQUFXLElBQUksT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQ2xELElBQUksQ0FBQyxrQkFBa0IsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDcEUsT0FBTztvQkFDTCxHQUFHLFNBQVM7b0JBQ1osS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO3dCQUNoQyxNQUFNLE1BQU0sR0FBeUIsRUFBRSxDQUFDO3dCQUN4QyxJQUFJLGtCQUFrQixHQUFHLEVBQUUsQ0FBQzt3QkFDNUIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO3dCQUV6Qix3QkFBd0I7d0JBQ3hCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQW9CLENBQUM7d0JBQzNGLElBQUksZUFBZSxFQUFFLENBQUM7NEJBQ3BCLE1BQU0sZ0JBQWdCLEdBQThCO2dDQUNsRCxPQUFPLEVBQUUsS0FBSztnQ0FDZCxTQUFTLEVBQUUsS0FBSzs2QkFDakIsQ0FBQzs0QkFDRiwwREFBMEQ7NEJBQzFELE1BQU0sZUFBZSxHQUFHLENBQ3RCLENBQUMsZUFBZSxDQUFDLFVBQVUsSUFBSSxPQUFPLENBQUMsZUFBZSxDQUFDLFVBQVUsQ0FBQztnQ0FDaEUsQ0FBQyxDQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBVztnQ0FDckMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQy9CO2lDQUNFLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7Z0NBQ2pCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxTQUFTLENBQUM7Z0NBQ2xDLEtBQUssRUFBRSxtQkFBbUI7NkJBQzNCLENBQUMsQ0FBQztpQ0FDRixJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQzs0QkFDbEQsZUFBZSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQzs0QkFDbkQsa0JBQWtCLEdBQUcsR0FBRyxlQUFlLENBQUMsT0FBTyxHQUFHLGVBQWUsQ0FBQyxlQUFlLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO3dCQUNwSCxDQUFDO3dCQUVELGtCQUFrQjt3QkFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBaUIsQ0FBQzt3QkFDbEYsSUFBSSxZQUFZLEVBQUUsQ0FBQzs0QkFDakIsb0VBQW9FOzRCQUNwRSxNQUFNLGlCQUFpQixHQUFHLFlBQVksQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDNUQsTUFBTSxpQkFBaUIsR0FBRyxZQUFZLENBQUMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDLENBQUM7NEJBQzVELGlCQUFpQjtnQ0FDZixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsaUJBQWlCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLG9CQUFvQixNQUFNLENBQUMsV0FBVyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMxSCxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixHQUFHLENBQUMsRUFBRSxDQUFDO2dDQUMvQyxNQUFNLEVBQUUsSUFBSSxDQUFDO29DQUNYLEtBQUssRUFBRSxJQUFJLGlCQUFpQixHQUFHLENBQUMsRUFBRTtvQ0FDbEMsS0FBSyxFQUFFLG1CQUFtQjtpQ0FDM0IsQ0FBQyxDQUFDOzRCQUNMLENBQUM7NEJBQ0QsSUFBSSxpQkFBaUIsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQ0FDNUIsTUFBTSxFQUFFLElBQUksQ0FBQztvQ0FDWCxLQUFLLEVBQUUsS0FBSztvQ0FDWixLQUFLLEVBQUUsbUJBQW1CO2lDQUMzQixDQUFDLENBQUM7NEJBQ0wsQ0FBQzs0QkFFRCxrQkFBa0IsR0FBRyxHQUFHLFlBQVksQ0FBQyxJQUFJLEdBQUcsWUFBWSxDQUFDLFlBQVksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7d0JBQ3pHLENBQUM7d0JBRUQsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssV0FBVyxDQUFzQixDQUFDO3dCQUNqRyxJQUFJLGlCQUFpQixJQUFJLGlCQUFpQixDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNyRCxZQUFZLEdBQUcsSUFBSSxDQUFDO3dCQUN0QixDQUFDO3dCQUVELE9BQU87NEJBQ0wsR0FBRyxJQUFJOzRCQUNQLFFBQVEsRUFBRSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksQ0FBQyxHQUFHOzRCQUMxQyxTQUFTLEVBQUUsS0FBSzs0QkFDaEIsTUFBTTs0QkFDTixrQkFBa0I7NEJBQ2xCLFlBQVk7eUJBQ2IsQ0FBQztvQkFDSixDQUFDLENBQUM7aUJBQ0gsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEtBQStCLEVBQUUsSUFBa0MsRUFBRSxFQUFFO2dCQUM1RixJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzlCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVNLFVBQVUsQ0FBQyxPQUFlLEVBQUUsTUFBYztRQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDaEcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLENBQUM7SUFDSCxDQUFDO0lBRU0sU0FBUyxDQUFDLFNBQXNCO1FBQ3JDLElBQUksWUFBWSxDQUFDO1FBRWpCLFFBQVEsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JCLEtBQUssU0FBUztnQkFDWixZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVM7cUJBQzFCLElBQUksQ0FJSCw2Q0FBNkMsRUFBRTtvQkFDL0MsSUFBSSxFQUFFO3dCQUNKLElBQUksRUFBRSxTQUFTO3dCQUNmLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztxQkFDOUI7b0JBQ0QsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEVBQUUsRUFBRSxxQkFBcUI7b0JBQ3pCLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO2lCQUMvQixDQUFDO3FCQUNELFdBQVcsRUFBRSxDQUFDO2dCQUNqQixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUztxQkFDMUIsSUFBSSxDQUNILDJDQUEyQyxFQUMzQztvQkFDRSxJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLFNBQVM7cUJBQ2hCO29CQUNELElBQUksRUFBRSxhQUFhO29CQUNuQixFQUFFLEVBQUUscUJBQXFCO29CQUN6QixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtpQkFDL0IsQ0FDRjtxQkFDQSxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVM7cUJBQzFCLElBQUksQ0FDSCw0Q0FBNEMsRUFDNUM7b0JBQ0UsSUFBSSxFQUFFO3dCQUNKLGVBQWUsRUFBRSxTQUFTLENBQUMsSUFBSTt3QkFDL0IsSUFBSSxFQUFFLFNBQVM7cUJBQ2hCO29CQUNELElBQUksRUFBRSxhQUFhO29CQUNuQixFQUFFLEVBQUUscUJBQXFCO29CQUN6QixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtpQkFDL0IsQ0FDRjtxQkFDQSxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTTtZQUNSO2dCQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxZQUFZO2FBQ1QsSUFBSSxDQUNILEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3JCLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBRXRELE1BQU0sZ0JBQWdCLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEYsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxTQUFTLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUMzRCxDQUFDO1lBQ0QsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUU3QyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQ0g7YUFDQSxTQUFTLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRU0sb0JBQW9CLENBQUMsYUFBNEI7UUFDdEQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVM7YUFDaEMsSUFBSSxDQUNILCtDQUErQyxFQUMvQztZQUNFLElBQUksRUFBRTtnQkFDSixhQUFhO2dCQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTthQUN4QjtZQUNELElBQUksRUFBRSxhQUFhO1lBQ25CLEVBQUUsRUFBRSw4QkFBOEI7WUFDbEMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLE1BQU07U0FDL0IsQ0FDRjthQUNBLFdBQVcsRUFBRSxDQUFDO1FBRWpCLFlBQVk7YUFDVCxJQUFJLENBQ0gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ1gsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO2dCQUNaLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxhQUFhLENBQUMsTUFBYztRQUNqQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzNHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLFFBQVEsTUFBTSxZQUFZLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsVUFBVSxDQUFDLE9BQU8sR0FBRyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDekMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVNLFVBQVUsQ0FBQyxLQUFtQztRQUNuRCxJQUFJLEtBQUssQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDaEQsNkJBQTZCO1lBQzdCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUN0RSxDQUFDO1lBQ0QsZUFBZSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNqRixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxDQUFDO2FBQU0sQ0FBQztZQUNOLCtCQUErQjtZQUMvQixNQUFNLHdCQUF3QixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFHLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEtBQUssQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFGLElBQUksQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxLQUFLLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEdBQUcsT0FBTyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQzdHLENBQUM7WUFDRCxpQkFBaUIsQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxhQUFhLEVBQUUsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ25ILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2hELENBQUM7SUFDSCxDQUFDO0lBRU0sVUFBVSxDQUFDLE1BQWM7UUFDOUIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUUzRyxJQUFJLFlBQVksQ0FBQztRQUVqQixRQUFRLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNyQixLQUFLLFNBQVM7Z0JBQ1osWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTO3FCQUMxQixJQUFJLENBSUgsNkNBQTZDLEVBQUU7b0JBQy9DLElBQUksRUFBRTt3QkFDSixJQUFJLEVBQUUsVUFBVTt3QkFDaEIsV0FBVyxFQUFFLElBQUksQ0FBQyxlQUFlLElBQUksRUFBRTtxQkFDeEM7b0JBQ0QsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEVBQUUsRUFBRSw0QkFBNEI7b0JBQ2hDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO2lCQUMvQixDQUFDO3FCQUNELFdBQVcsRUFBRSxDQUFDO2dCQUNqQixNQUFNO1lBQ1IsS0FBSyxPQUFPO2dCQUNWLFlBQVksR0FBRyxJQUFJLENBQUMsU0FBUztxQkFDMUIsSUFBSSxDQUNILDJDQUEyQyxFQUMzQztvQkFDRSxJQUFJLEVBQUU7d0JBQ0osSUFBSSxFQUFFLFVBQVU7cUJBQ2pCO29CQUNELElBQUksRUFBRSxhQUFhO29CQUNuQixFQUFFLEVBQUUsMEJBQTBCO29CQUM5QixLQUFLLEVBQUUsZ0JBQWdCLENBQUMsTUFBTTtpQkFDL0IsQ0FDRjtxQkFDQSxXQUFXLEVBQUUsQ0FBQztnQkFDakIsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxZQUFZLEdBQUcsSUFBSSxDQUFDLFNBQVM7cUJBQzFCLElBQUksQ0FDSCw0Q0FBNEMsRUFDNUM7b0JBQ0UsSUFBSSxFQUFFO3dCQUNKLGVBQWUsRUFBRSxVQUFXLENBQUMsb0JBQW9CO3dCQUNqRCxJQUFJLEVBQUUsVUFBVTtxQkFDakI7b0JBQ0QsSUFBSSxFQUFFLGFBQWE7b0JBQ25CLEVBQUUsRUFBRSwyQkFBMkI7b0JBQy9CLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxNQUFNO2lCQUMvQixDQUNGO3FCQUNBLFdBQVcsRUFBRSxDQUFDO2dCQUNqQixNQUFNO1lBQ1I7Z0JBQ0UsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDNUQsQ0FBQztRQUVELFlBQVk7YUFDVCxJQUFJLENBQ0gsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNoQixPQUFPO1lBQ1QsQ0FBQztZQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUM3QyxHQUFHLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEUsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FDSDthQUNBLFNBQVMsRUFBRSxDQUFDO0lBQ2pCLENBQUM7SUFFTSxZQUFZLENBQUMsTUFBYztRQUNoQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU0sQ0FBQyxDQUFDO1FBQzNHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFTSxlQUFlLENBQUMsV0FBbUIsRUFBRSxNQUFjO1FBQ3hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLFdBQVcsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxXQUFXLFlBQVksQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxNQUFNLGVBQWUsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxNQUFNLENBQUMsQ0FBQztRQUMzRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxRQUFRLE1BQU0sWUFBWSxDQUFDLENBQUM7UUFDOUMsQ0FBQztRQUNELE1BQU0sY0FBYyxHQUFHLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsRCxjQUFjLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxjQUFjLENBQUMsSUFBSSxHQUFHLEdBQUcsY0FBYyxDQUFDLElBQUksU0FBUyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDOUQsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNyRCxDQUFDOzhHQTFXVSxpQ0FBaUM7a0dBQWpDLGlDQUFpQyxtZkNwRTlDLCs1TEEwSUEsMnBHRDNFWSxjQUFjLG1MQUFFLGdCQUFnQiw0VEFBRSxlQUFlLDJOQUFFLFlBQVksNlZBQUUsZUFBZSwwR0FBRSxhQUFhLDZ2QkFBRSxjQUFjOzsyRkFLOUcsaUNBQWlDO2tCQVA3QyxTQUFTO2lDQUNJLElBQUksV0FDUCxDQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLFlBQ2hILG1CQUFtQjs4RUFNdEIsUUFBUTtzQkFEZCxLQUFLO2dCQUlDLE9BQU87c0JBRGIsS0FBSztnQkFJQyxPQUFPO3NCQURiLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxXQUFXO3NCQURqQixLQUFLO2dCQUlDLGNBQWM7c0JBRHBCLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsS0FBSztnQkFJQyxlQUFlO3NCQURyQixLQUFLO2dCQUlDLG9CQUFvQjtzQkFEMUIsTUFBTTtnQkFJQSxpQkFBaUI7c0JBRHZCLE1BQU07Z0JBSUEsbUJBQW1CO3NCQUR6QixNQUFNO2dCQUlBLFVBQVU7c0JBRGhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBHcmF2aXRlZSB0ZWFtIChodHRwOi8vZ3Jhdml0ZWUuaW8pXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqL1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IGNsb25lRGVlcCwgZmxhdHRlbiwgaXNFbXB0eSwgdW5pcXVlSWQgfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgR0lPX0RJQUxPR19XSURUSCwgR2lvSWNvbnNNb2R1bGUsIEdpb0xvYWRlck1vZHVsZSB9IGZyb20gJ0BncmF2aXRlZS91aS1wYXJ0aWNsZXMtYW5ndWxhcic7XG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBDZGtEcm9wTGlzdCwgRHJhZ0Ryb3BNb2R1bGUsIG1vdmVJdGVtSW5BcnJheSwgdHJhbnNmZXJBcnJheUl0ZW0gfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcblxuaW1wb3J0IHtcbiAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nQ29tcG9uZW50LFxuICBHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dEYXRhLFxufSBmcm9tICcuLi9mbG93LWZvcm0tZGlhbG9nL2Zsb3ctbWVzc2FnZS1mb3JtLWRpYWxvZy9naW8tcHMtZmxvdy1tZXNzYWdlLWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGbG93R3JvdXBWTSwgRmxvd1ZNIH0gZnJvbSAnLi4vLi4vcG9saWN5LXN0dWRpby9naW8tcG9saWN5LXN0dWRpby5tb2RlbCc7XG5pbXBvcnQgeyBBcGlUeXBlLCBDaGFubmVsU2VsZWN0b3IsIENvbmRpdGlvblNlbGVjdG9yLCBDb25uZWN0b3JJbmZvLCBGbG93RXhlY3V0aW9uLCBIdHRwU2VsZWN0b3IsIE9wZXJhdGlvbiB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nQ29tcG9uZW50LFxuICBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1mb3JtLWRpYWxvZy9mbG93LXByb3h5LWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LXByb3h5LWZvcm0tZGlhbG9nLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdCB9IGZyb20gJy4uL2Zsb3ctZm9ybS1kaWFsb2cvZ2lvLXBzLWZsb3ctZm9ybS1kaWFsb2ctcmVzdWx0Lm1vZGVsJztcbmltcG9ydCB7XG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nQ29tcG9uZW50LFxuICBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0RhdGEsXG59IGZyb20gJy4uL2Zsb3ctZXhlY3V0aW9uLWZvcm0tZGlhbG9nL2dpby1wcy1mbG93LWV4ZWN1dGlvbi1mb3JtLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHtcbiAgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gIEdpb1BvbGljeVN0dWRpb0Zsb3dOYXRpdmVGb3JtRGlhbG9nRGF0YSxcbn0gZnJvbSAnLi4vZmxvdy1mb3JtLWRpYWxvZy9mbG93LW5hdGl2ZS1mb3JtLWRpYWxvZy9naW8tcHMtZmxvdy1uYXRpdmUtZm9ybS1kaWFsb2cuY29tcG9uZW50JztcblxuaW50ZXJmYWNlIEZsb3dHcm91cE1lbnVWTSBleHRlbmRzIEZsb3dHcm91cFZNIHtcbiAgZmxvd3M6IEZsb3dNZW51Vk1bXTtcbn1cblxuaW50ZXJmYWNlIEZsb3dNZW51Vk0gZXh0ZW5kcyBGbG93Vk0ge1xuICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgbW91c2VPdmVyOiBib29sZWFuO1xuICBiYWRnZXM6IHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIGNsYXNzOiBzdHJpbmc7XG4gIH1bXTtcbiAgcGF0aE9yQ2hhbm5lbExhYmVsOiBzdHJpbmc7XG4gIGhhc0NvbmRpdGlvbjogYm9vbGVhbjtcbn1cblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtHaW9JY29uc01vZHVsZSwgTWF0VG9vbHRpcE1vZHVsZSwgTWF0QnV0dG9uTW9kdWxlLCBDb21tb25Nb2R1bGUsIEdpb0xvYWRlck1vZHVsZSwgTWF0TWVudU1vZHVsZSwgRHJhZ0Ryb3BNb2R1bGVdLFxuICBzZWxlY3RvcjogJ2dpby1wcy1mbG93cy1tZW51JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dpby1wcy1mbG93cy1tZW51LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2lvLXBzLWZsb3dzLW1lbnUuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgR2lvUG9saWN5U3R1ZGlvRmxvd3NNZW51Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgQElucHV0KClcbiAgcHVibGljIHJlYWRPbmx5ID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgYXBpVHlwZSE6IEFwaVR5cGU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZsb3dFeGVjdXRpb24hOiBGbG93RXhlY3V0aW9uO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmbG93c0dyb3VwczogRmxvd0dyb3VwVk1bXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZWxlY3RlZEZsb3dJZD86IHN0cmluZyA9IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZW50cnlwb2ludHM6IENvbm5lY3RvckluZm9bXSA9IFtdO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlbnRyeXBvaW50c0luZm86IENvbm5lY3RvckluZm9bXSA9IFtdO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgc2VsZWN0ZWRGbG93SWRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGZsb3dzR3JvdXBzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxGbG93R3JvdXBWTVtdPigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgZmxvd0V4ZWN1dGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Rmxvd0V4ZWN1dGlvbj4oKTtcblxuICBAT3V0cHV0KClcbiAgcHVibGljIGRlbGV0ZUZsb3cgPSBuZXcgRXZlbnRFbWl0dGVyPEZsb3dWTT4oKTtcblxuICBwdWJsaWMgZmxvd0dyb3VwTWVudUl0ZW1zOiBGbG93R3JvdXBNZW51Vk1bXSA9IFtdO1xuXG4gIHB1YmxpYyBlbnRlclByZWRpY2F0ZTogKGRyYWc6IENka0RyYWc8Rmxvd0dyb3VwTWVudVZNPiwgZHJvcDogQ2RrRHJvcExpc3Q8Rmxvd0dyb3VwTWVudVZNPikgPT4gYm9vbGVhbiA9ICgpID0+IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZykge31cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmZsb3dzR3JvdXBzIHx8IGNoYW5nZXMuc2VsZWN0ZWRGbG93SWQpIHtcbiAgICAgIHRoaXMuZmxvd0dyb3VwTWVudUl0ZW1zID0gY2xvbmVEZWVwKHRoaXMuZmxvd3NHcm91cHMpLm1hcChmbG93R3JvdXAgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLmZsb3dHcm91cCxcbiAgICAgICAgICBmbG93czogZmxvd0dyb3VwLmZsb3dzLm1hcChmbG93ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhZGdlczogRmxvd01lbnVWTVsnYmFkZ2VzJ10gPSBbXTtcbiAgICAgICAgICAgIGxldCBwYXRoT3JDaGFubmVsTGFiZWwgPSAnJztcbiAgICAgICAgICAgIGxldCBoYXNDb25kaXRpb24gPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gTUVTU0FHRSBBUEkgLSBDSEFOTkVMXG4gICAgICAgICAgICBjb25zdCBjaGFubmVsU2VsZWN0b3IgPSBmbG93LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0NIQU5ORUwnKSBhcyBDaGFubmVsU2VsZWN0b3I7XG4gICAgICAgICAgICBpZiAoY2hhbm5lbFNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvblRvQmFkZ2U6IFJlY29yZDxPcGVyYXRpb24sIHN0cmluZz4gPSB7XG4gICAgICAgICAgICAgICAgUFVCTElTSDogJ1BVQicsXG4gICAgICAgICAgICAgICAgU1VCU0NSSUJFOiAnU1VCJyxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgLy8gSWYgbm8gb3BlcmF0aW9ucyBhcmUgc2VsZWN0ZWQsIGFsbCBvcGVyYXRpb25zIGFyZSB2YWxpZFxuICAgICAgICAgICAgICBjb25zdCBvcGVyYXRpb25CYWRnZXMgPSAoXG4gICAgICAgICAgICAgICAgIWNoYW5uZWxTZWxlY3Rvci5vcGVyYXRpb25zIHx8IGlzRW1wdHkoY2hhbm5lbFNlbGVjdG9yLm9wZXJhdGlvbnMpXG4gICAgICAgICAgICAgICAgICA/IChbJ1BVQkxJU0gnLCAnU1VCU0NSSUJFJ10gYXMgY29uc3QpXG4gICAgICAgICAgICAgICAgICA6IGNoYW5uZWxTZWxlY3Rvci5vcGVyYXRpb25zXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAubWFwKG9wZXJhdGlvbiA9PiAoe1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IG9wZXJhdGlvblRvQmFkZ2Vbb3BlcmF0aW9uXSxcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiAnZ2lvLWJhZGdlLW5ldXRyYWwnLFxuICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiBhLmxhYmVsLmxvY2FsZUNvbXBhcmUoYi5sYWJlbCkpO1xuICAgICAgICAgICAgICBvcGVyYXRpb25CYWRnZXMgJiYgYmFkZ2VzLnB1c2goLi4ub3BlcmF0aW9uQmFkZ2VzKTtcbiAgICAgICAgICAgICAgcGF0aE9yQ2hhbm5lbExhYmVsID0gYCR7Y2hhbm5lbFNlbGVjdG9yLmNoYW5uZWx9JHtjaGFubmVsU2VsZWN0b3IuY2hhbm5lbE9wZXJhdG9yID09PSAnU1RBUlRTX1dJVEgnID8gJyoqJyA6ICcnfWA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhUVFAgQVBJIC0gSFRUUFxuICAgICAgICAgICAgY29uc3QgaHR0cFNlbGVjdG9yID0gZmxvdy5zZWxlY3RvcnM/LmZpbmQocyA9PiBzLnR5cGUgPT09ICdIVFRQJykgYXMgSHR0cFNlbGVjdG9yO1xuICAgICAgICAgICAgaWYgKGh0dHBTZWxlY3Rvcikge1xuICAgICAgICAgICAgICAvLyBLZWVwIG9ubHkgMiBmaXJzdCBodHRwIG1ldGhvZHMgYW5kIGFkZCArWCBiYWRnZSBpZiB0aGVyZSBhcmUgbW9yZVxuICAgICAgICAgICAgICBjb25zdCBodHRwTWV0aG9kc1RvS2VlcCA9IGh0dHBTZWxlY3Rvci5tZXRob2RzPy5zbGljZSgwLCAyKTtcbiAgICAgICAgICAgICAgY29uc3QgaHR0cE1ldGhvZHNMZW5ndGggPSBodHRwU2VsZWN0b3IubWV0aG9kcz8ubGVuZ3RoID8/IDA7XG4gICAgICAgICAgICAgIGh0dHBNZXRob2RzVG9LZWVwICYmXG4gICAgICAgICAgICAgICAgYmFkZ2VzLnB1c2goLi4uaHR0cE1ldGhvZHNUb0tlZXAubWFwKG1ldGhvZCA9PiAoeyBsYWJlbDogbWV0aG9kLCBjbGFzczogYGdpby1tZXRob2QtYmFkZ2UtJHttZXRob2QudG9Mb3dlckNhc2UoKX1gIH0pKSk7XG4gICAgICAgICAgICAgIGlmIChodHRwTWV0aG9kc0xlbmd0aCAmJiBodHRwTWV0aG9kc0xlbmd0aCA+IDIpIHtcbiAgICAgICAgICAgICAgICBiYWRnZXM/LnB1c2goe1xuICAgICAgICAgICAgICAgICAgbGFiZWw6IGArJHtodHRwTWV0aG9kc0xlbmd0aCAtIDJ9YCxcbiAgICAgICAgICAgICAgICAgIGNsYXNzOiAnZ2lvLWJhZGdlLW5ldXRyYWwnLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChodHRwTWV0aG9kc0xlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGJhZGdlcz8ucHVzaCh7XG4gICAgICAgICAgICAgICAgICBsYWJlbDogJ0FMTCcsXG4gICAgICAgICAgICAgICAgICBjbGFzczogJ2dpby1iYWRnZS1uZXV0cmFsJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHBhdGhPckNoYW5uZWxMYWJlbCA9IGAke2h0dHBTZWxlY3Rvci5wYXRofSR7aHR0cFNlbGVjdG9yLnBhdGhPcGVyYXRvciA9PT0gJ1NUQVJUU19XSVRIJyA/ICcvKionIDogJyd9YDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgY29uZGl0aW9uU2VsZWN0b3IgPSBmbG93LnNlbGVjdG9ycz8uZmluZChzID0+IHMudHlwZSA9PT0gJ0NPTkRJVElPTicpIGFzIENvbmRpdGlvblNlbGVjdG9yO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvblNlbGVjdG9yICYmIGNvbmRpdGlvblNlbGVjdG9yLmNvbmRpdGlvbikge1xuICAgICAgICAgICAgICBoYXNDb25kaXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5mbG93LFxuICAgICAgICAgICAgICBzZWxlY3RlZDogdGhpcy5zZWxlY3RlZEZsb3dJZCA9PT0gZmxvdy5faWQsXG4gICAgICAgICAgICAgIG1vdXNlT3ZlcjogZmFsc2UsXG4gICAgICAgICAgICAgIGJhZGdlcyxcbiAgICAgICAgICAgICAgcGF0aE9yQ2hhbm5lbExhYmVsLFxuICAgICAgICAgICAgICBoYXNDb25kaXRpb24sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZW50ZXJQcmVkaWNhdGUgPSAoX2RyYWc6IENka0RyYWc8Rmxvd0dyb3VwTWVudVZNPiwgZHJvcDogQ2RrRHJvcExpc3Q8Rmxvd0dyb3VwTWVudVZNPikgPT4ge1xuICAgICAgICBpZiAodGhpcy5hcGlUeXBlID09PSAnTkFUSVZFJykge1xuICAgICAgICAgIHJldHVybiBpc0VtcHR5KGRyb3AuZGF0YS5mbG93cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RGbG93KGdyb3VwSWQ6IHN0cmluZywgZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93ID0gdGhpcy5mbG93c0dyb3Vwcy5maW5kKGZnID0+IGZnLl9pZCA9PT0gZ3JvdXBJZCk/LmZsb3dzLmZpbmQoZiA9PiBmLl9pZCA9PT0gZmxvd0lkKTtcbiAgICBpZiAoZmxvdykge1xuICAgICAgdGhpcy5zZWxlY3RlZEZsb3dJZENoYW5nZS5lbWl0KGZsb3cuX2lkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb25BZGRGbG93KGZsb3dHcm91cDogRmxvd0dyb3VwVk0pOiB2b2lkIHtcbiAgICBsZXQgZGlhbG9nUmVzdWx0O1xuXG4gICAgc3dpdGNoICh0aGlzLmFwaVR5cGUpIHtcbiAgICAgIGNhc2UgJ01FU1NBR0UnOlxuICAgICAgICBkaWFsb2dSZXN1bHQgPSB0aGlzLm1hdERpYWxvZ1xuICAgICAgICAgIC5vcGVuPFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nQ29tcG9uZW50LFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nRGF0YSxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0XG4gICAgICAgICAgPihHaW9Qb2xpY3lTdHVkaW9GbG93TWVzc2FnZUZvcm1EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZmxvdzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBlbnRyeXBvaW50czogdGhpcy5lbnRyeXBvaW50cyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dGb3JtRGlhbG9nJyxcbiAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1BST1hZJzpcbiAgICAgICAgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAub3BlbjxHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nQ29tcG9uZW50LCBHaW9Qb2xpY3lTdHVkaW9GbG93UHJveHlGb3JtRGlhbG9nRGF0YSwgR2lvUG9saWN5U3R1ZGlvRmxvd0Zvcm1EaWFsb2dSZXN1bHQ+KFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIGZsb3c6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcm9sZTogJ2FsZXJ0ZGlhbG9nJyxcbiAgICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dGb3JtRGlhbG9nJyxcbiAgICAgICAgICAgICAgd2lkdGg6IEdJT19ESUFMT0dfV0lEVEguTUVESVVNLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApXG4gICAgICAgICAgLmFmdGVyQ2xvc2VkKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnTkFUSVZFJzpcbiAgICAgICAgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAub3BlbjxHaW9Qb2xpY3lTdHVkaW9GbG93TmF0aXZlRm9ybURpYWxvZ0NvbXBvbmVudCwgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dEYXRhLCBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdD4oXG4gICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93TmF0aXZlRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwTmFtZTogZmxvd0dyb3VwLm5hbWUsXG4gICAgICAgICAgICAgICAgZmxvdzogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd0Zvcm1EaWFsb2cnLFxuICAgICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIClcbiAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEFQSSB0eXBlICR7dGhpcy5hcGlUeXBlfWApO1xuICAgIH1cblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChjcmVhdGVkT3JFZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghY3JlYXRlZE9yRWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGVkaXRlZEZsb3dzR3JvdXBzID0gY2xvbmVEZWVwKHRoaXMuZmxvd3NHcm91cHMpO1xuXG4gICAgICAgICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IGVkaXRlZEZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBmbG93R3JvdXAuX2lkKTtcbiAgICAgICAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2Zsb3dHcm91cC5faWR9IG5vdCBmb3VuZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbG93c0dyb3VwVG9FZGl0LmZsb3dzLnB1c2goY3JlYXRlZE9yRWRpdGVkKTtcblxuICAgICAgICAgIHRoaXMuZmxvd3NHcm91cHNDaGFuZ2UuZW1pdChlZGl0ZWRGbG93c0dyb3Vwcyk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEZsb3dJZENoYW5nZS5lbWl0KGNyZWF0ZWRPckVkaXRlZC5faWQpO1xuICAgICAgICB9KSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHB1YmxpYyBvbkNvbmZpZ3VyZUV4ZWN1dGlvbihmbG93RXhlY3V0aW9uOiBGbG93RXhlY3V0aW9uKTogdm9pZCB7XG4gICAgY29uc3QgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgIC5vcGVuPEdpb1BvbGljeVN0dWRpb0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nQ29tcG9uZW50LCBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0RhdGEsIEZsb3dFeGVjdXRpb24gfCB1bmRlZmluZWQ+KFxuICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93RXhlY3V0aW9uRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAge1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGZsb3dFeGVjdXRpb24sXG4gICAgICAgICAgICByZWFkT25seTogdGhpcy5yZWFkT25seSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dFeGVjdXRpb25Gb3JtRGlhbG9nJyxcbiAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgICAuYWZ0ZXJDbG9zZWQoKTtcblxuICAgIGRpYWxvZ1Jlc3VsdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcChlZGl0ZWQgPT4ge1xuICAgICAgICAgIGlmICghZWRpdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuZmxvd0V4ZWN1dGlvbkNoYW5nZS5lbWl0KGVkaXRlZCk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRGlzYWJsZUZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuICAgIGlmICghZmxvd1RvRWRpdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGbG93ICR7Zmxvd0lkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgZmxvd1RvRWRpdC5lbmFibGVkID0gIWZsb3dUb0VkaXQuZW5hYmxlZDtcbiAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gIH1cblxuICBwdWJsaWMgb25Ecm9wRmxvdyhldmVudDogQ2RrRHJhZ0Ryb3A8Rmxvd0dyb3VwTWVudVZNPik6IHZvaWQge1xuICAgIGlmIChldmVudC5wcmV2aW91c0NvbnRhaW5lciA9PT0gZXZlbnQuY29udGFpbmVyKSB7XG4gICAgICAvLyBNb3ZlIGluc2lkZSB0aGUgc2FtZSBncm91cFxuICAgICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IHRoaXMuZmxvd3NHcm91cHMuZmluZChmZyA9PiBmZy5faWQgPT09IGV2ZW50LmNvbnRhaW5lci5kYXRhLl9pZCk7XG4gICAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGbG93IGdyb3VwICR7ZXZlbnQuY29udGFpbmVyLmRhdGEuX2lkfSBub3QgZm91bmRgKTtcbiAgICAgIH1cbiAgICAgIG1vdmVJdGVtSW5BcnJheShmbG93c0dyb3VwVG9FZGl0LmZsb3dzLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xuICAgICAgdGhpcy5mbG93c0dyb3Vwc0NoYW5nZS5lbWl0KHRoaXMuZmxvd3NHcm91cHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBNb3ZlIGZyb20gYSBncm91cCB0byBhbm90aGVyXG4gICAgICBjb25zdCBwcmV2aW91c0Zsb3dzR3JvdXBUb0VkaXQgPSB0aGlzLmZsb3dzR3JvdXBzLmZpbmQoZmcgPT4gZmcuX2lkID09PSBldmVudC5wcmV2aW91c0NvbnRhaW5lci5kYXRhLl9pZCk7XG4gICAgICBjb25zdCBmbG93c0dyb3VwVG9FZGl0ID0gdGhpcy5mbG93c0dyb3Vwcy5maW5kKGZnID0+IGZnLl9pZCA9PT0gZXZlbnQuY29udGFpbmVyLmRhdGEuX2lkKTtcbiAgICAgIGlmICghcHJldmlvdXNGbG93c0dyb3VwVG9FZGl0IHx8ICFmbG93c0dyb3VwVG9FZGl0KSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2V2ZW50LnByZXZpb3VzQ29udGFpbmVyLmRhdGEuX2lkfSBvciAke2V2ZW50LmNvbnRhaW5lci5kYXRhLl9pZH0gbm90IGZvdW5kYCk7XG4gICAgICB9XG4gICAgICB0cmFuc2ZlckFycmF5SXRlbShwcmV2aW91c0Zsb3dzR3JvdXBUb0VkaXQuZmxvd3MsIGZsb3dzR3JvdXBUb0VkaXQuZmxvd3MsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG9uRWRpdEZsb3coZmxvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmbG93VG9FZGl0ID0gZmxhdHRlbih0aGlzLmZsb3dzR3JvdXBzLm1hcChmbG93R3JvdXAgPT4gZmxvd0dyb3VwLmZsb3dzKSkuZmluZChmID0+IGYuX2lkID09PSBmbG93SWQpO1xuXG4gICAgbGV0IGRpYWxvZ1Jlc3VsdDtcblxuICAgIHN3aXRjaCAodGhpcy5hcGlUeXBlKSB7XG4gICAgICBjYXNlICdNRVNTQUdFJzpcbiAgICAgICAgZGlhbG9nUmVzdWx0ID0gdGhpcy5tYXREaWFsb2dcbiAgICAgICAgICAub3BlbjxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0NvbXBvbmVudCxcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dNZXNzYWdlRm9ybURpYWxvZ0RhdGEsXG4gICAgICAgICAgICBHaW9Qb2xpY3lTdHVkaW9GbG93Rm9ybURpYWxvZ1Jlc3VsdFxuICAgICAgICAgID4oR2lvUG9saWN5U3R1ZGlvRmxvd01lc3NhZ2VGb3JtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGZsb3c6IGZsb3dUb0VkaXQsXG4gICAgICAgICAgICAgIGVudHJ5cG9pbnRzOiB0aGlzLmVudHJ5cG9pbnRzSW5mbyA/PyBbXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgaWQ6ICdnaW9Qc0Zsb3dNZXNzYWdlRm9ybURpYWxvZycsXG4gICAgICAgICAgICB3aWR0aDogR0lPX0RJQUxPR19XSURUSC5NRURJVU0sXG4gICAgICAgICAgfSlcbiAgICAgICAgICAuYWZ0ZXJDbG9zZWQoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdQUk9YWSc6XG4gICAgICAgIGRpYWxvZ1Jlc3VsdCA9IHRoaXMubWF0RGlhbG9nXG4gICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0NvbXBvbmVudCwgR2lvUG9saWN5U3R1ZGlvRmxvd1Byb3h5Rm9ybURpYWxvZ0RhdGEsIEdpb1BvbGljeVN0dWRpb0Zsb3dGb3JtRGlhbG9nUmVzdWx0PihcbiAgICAgICAgICAgIEdpb1BvbGljeVN0dWRpb0Zsb3dQcm94eUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBmbG93OiBmbG93VG9FZGl0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByb2xlOiAnYWxlcnRkaWFsb2cnLFxuICAgICAgICAgICAgICBpZDogJ2dpb1BzRmxvd1Byb3h5Rm9ybURpYWxvZycsXG4gICAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ05BVElWRSc6XG4gICAgICAgIGRpYWxvZ1Jlc3VsdCA9IHRoaXMubWF0RGlhbG9nXG4gICAgICAgICAgLm9wZW48R2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsIEdpb1BvbGljeVN0dWRpb0Zsb3dOYXRpdmVGb3JtRGlhbG9nRGF0YSwgR2lvUG9saWN5U3R1ZGlvRmxvd0Zvcm1EaWFsb2dSZXN1bHQ+KFxuICAgICAgICAgICAgR2lvUG9saWN5U3R1ZGlvRmxvd05hdGl2ZUZvcm1EaWFsb2dDb21wb25lbnQsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBwYXJlbnRHcm91cE5hbWU6IGZsb3dUb0VkaXQhLl9wYXJlbnRGbG93R3JvdXBOYW1lLFxuICAgICAgICAgICAgICAgIGZsb3c6IGZsb3dUb0VkaXQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJvbGU6ICdhbGVydGRpYWxvZycsXG4gICAgICAgICAgICAgIGlkOiAnZ2lvUHNGbG93TmF0aXZlRm9ybURpYWxvZycsXG4gICAgICAgICAgICAgIHdpZHRoOiBHSU9fRElBTE9HX1dJRFRILk1FRElVTSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuICAgICAgICAgIC5hZnRlckNsb3NlZCgpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgQVBJIHR5cGUgJHt0aGlzLmFwaVR5cGV9YCk7XG4gICAgfVxuXG4gICAgZGlhbG9nUmVzdWx0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKGVkaXRlZEZsb3cgPT4ge1xuICAgICAgICAgIGlmICghZWRpdGVkRmxvdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmZsb3dzR3JvdXBzID0gdGhpcy5mbG93c0dyb3Vwcy5tYXAoZmcgPT4gKHtcbiAgICAgICAgICAgIC4uLmZnLFxuICAgICAgICAgICAgZmxvd3M6IGZnLmZsb3dzLm1hcChmID0+IChmLl9pZCA9PT0gZWRpdGVkRmxvdy5faWQgPyBlZGl0ZWRGbG93IDogZikpLFxuICAgICAgICAgIH0pKTtcbiAgICAgICAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHVibGljIG9uRGVsZXRlRmxvdyhmbG93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZsb3dUb0VkaXQgPSBmbGF0dGVuKHRoaXMuZmxvd3NHcm91cHMubWFwKGZsb3dHcm91cCA9PiBmbG93R3JvdXAuZmxvd3MpKS5maW5kKGYgPT4gZi5faWQgPT09IGZsb3dJZCk7XG4gICAgdGhpcy5kZWxldGVGbG93LmVtaXQoZmxvd1RvRWRpdCk7XG4gIH1cblxuICBwdWJsaWMgb25EdXBsaWNhdGVGbG93KGZsb3dHcm91cElkOiBzdHJpbmcsIGZsb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmxvd3NHcm91cFRvRWRpdCA9IHRoaXMuZmxvd3NHcm91cHMuZmluZChmZyA9PiBmZy5faWQgPT09IGZsb3dHcm91cElkKTtcbiAgICBpZiAoIWZsb3dzR3JvdXBUb0VkaXQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyBncm91cCAke2Zsb3dHcm91cElkfSBub3QgZm91bmRgKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1RvRHVwbGljYXRlID0gZmxvd3NHcm91cFRvRWRpdC5mbG93cy5maW5kKGYgPT4gZi5faWQgPT09IGZsb3dJZCk7XG4gICAgaWYgKCFmbG93VG9EdXBsaWNhdGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmxvdyAke2Zsb3dJZH0gbm90IGZvdW5kYCk7XG4gICAgfVxuICAgIGNvbnN0IGR1cGxpY2F0ZWRGbG93ID0gY2xvbmVEZWVwKGZsb3dUb0R1cGxpY2F0ZSk7XG4gICAgZHVwbGljYXRlZEZsb3cuX2lkID0gdW5pcXVlSWQoJ2Zsb3dfJyk7XG4gICAgZHVwbGljYXRlZEZsb3cubmFtZSA9IGAke2R1cGxpY2F0ZWRGbG93Lm5hbWV9IC0gQ29weWA7XG4gICAgY29uc3QgaW5kZXggPSBmbG93c0dyb3VwVG9FZGl0LmZsb3dzLmluZGV4T2YoZmxvd1RvRHVwbGljYXRlKTtcbiAgICBmbG93c0dyb3VwVG9FZGl0LmZsb3dzLnNwbGljZShpbmRleCArIDEsIDAsIGR1cGxpY2F0ZWRGbG93KTtcbiAgICB0aGlzLmZsb3dzR3JvdXBzQ2hhbmdlLmVtaXQodGhpcy5mbG93c0dyb3Vwcyk7XG4gICAgdGhpcy5zZWxlY3RlZEZsb3dJZENoYW5nZS5lbWl0KGR1cGxpY2F0ZWRGbG93Ll9pZCk7XG4gIH1cbn1cbiIsIjwhLS1cblxuICAgIENvcHlyaWdodCAoQykgMjAyMyBUaGUgR3Jhdml0ZWUgdGVhbSAoaHR0cDovL2dyYXZpdGVlLmlvKVxuICAgIFxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIFxuICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG5cbi0tPlxuXG48ZGl2IGNsYXNzPVwiaGVhZGVyXCI+XG4gIDxkaXYgY2xhc3M9XCJoZWFkZXJfX2xhYmVsXCI+XG4gICAgRmxvd3MgPG1hdC1pY29uIHN2Z0ljb249XCJnaW86aW5mb1wiIG1hdFRvb2x0aXA9XCJGbG93cyBhbGxvdyB5b3UgdG8gYXBwbHkgZGlmZmVyZW50IHBvbGljaWVzIG9uIHlvdXIgQVBJIGV2ZW50IHBoYXNlc1wiPjwvbWF0LWljb24+XG4gIDwvZGl2PlxuICBAaWYgKGFwaVR5cGUgIT09ICdOQVRJVkUnKSB7XG4gICAgPGRpdiBjbGFzcz1cImhlYWRlcl9fY29uZmlnQnRuXCI+XG4gICAgICA8YnV0dG9uIGNsYXNzPVwiaGVhZGVyX19jb25maWdCdG5fZWRpdFwiIG1hdC1zdHJva2VkLWJ1dHRvbiBbZGlzYWJsZWRdPVwibG9hZGluZ1wiIChjbGljayk9XCJvbkNvbmZpZ3VyZUV4ZWN1dGlvbihmbG93RXhlY3V0aW9uKVwiPlxuICAgICAgICA8bWF0LWljb24gW3N2Z0ljb25dPVwicmVhZE9ubHkgPyAnZ2lvOmV5ZS1lbXB0eScgOiAnZ2lvOnNldHRpbmdzJ1wiPjwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L2Rpdj5cbiAgfVxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJsaXN0XCIgKm5nSWY9XCIhbG9hZGluZzsgZWxzZSBsb2FkaW5nTGlzdFwiIGNka0Ryb3BMaXN0R3JvdXA+XG4gIDxkaXZcbiAgICAqbmdGb3I9XCJsZXQgZmxvd3NHcm91cCBvZiBmbG93R3JvdXBNZW51SXRlbXNcIlxuICAgIGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cFwiXG4gICAgY2RrRHJvcExpc3RcbiAgICBbY2RrRHJvcExpc3REYXRhXT1cImZsb3dzR3JvdXBcIlxuICAgIFtjZGtEcm9wTGlzdEVudGVyUHJlZGljYXRlXT1cImVudGVyUHJlZGljYXRlXCJcbiAgICAoY2RrRHJvcExpc3REcm9wcGVkKT1cIm9uRHJvcEZsb3coJGV2ZW50KVwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9faGVhZGVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9faGVhZGVyX19sYWJlbFwiPlxuICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJmbG93c0dyb3VwLl9pY29uXCIgW3N2Z0ljb25dPVwiZmxvd3NHcm91cC5faWNvblwiPjwvbWF0LWljb24+XG4gICAgICAgIDxzcGFuPnt7IGZsb3dzR3JvdXAubmFtZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2hlYWRlcl9fYWRkQnRuXCI+XG4gICAgICAgIEBpZiAoYXBpVHlwZSA9PT0gJ05BVElWRScpIHtcbiAgICAgICAgICA8c3BhbiBbbWF0VG9vbHRpcERpc2FibGVkXT1cImZsb3dzR3JvdXAuZmxvd3MubGVuZ3RoIDwgMVwiIG1hdFRvb2x0aXA9XCJPbmx5IG9uZSBmbG93IGlzIGFsbG93ZWQgZm9yIGEgbmF0aXZlIEFQSVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFtkaXNhYmxlZF09XCJyZWFkT25seSB8fCBmbG93c0dyb3VwLmZsb3dzLmxlbmd0aCA+IDBcIiAoY2xpY2spPVwib25BZGRGbG93KGZsb3dzR3JvdXApXCI+XG4gICAgICAgICAgICAgIDxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnBsdXNcIiBtYXRUb29sdGlwPVwiTmV3IGZsb3dcIj48L21hdC1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW2Rpc2FibGVkXT1cInJlYWRPbmx5XCIgKGNsaWNrKT1cIm9uQWRkRmxvdyhmbG93c0dyb3VwKVwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249XCJnaW86cGx1c1wiIG1hdFRvb2x0aXA9XCJOZXcgZmxvd1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzXCI+XG4gICAgICBAZm9yIChmbG93IG9mIGZsb3dzR3JvdXAuZmxvd3M7IHRyYWNrIGZsb3cuX2lkKSB7XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93XCJcbiAgICAgICAgICBbY2xhc3Muc2VsZWN0ZWRdPVwiZmxvdy5zZWxlY3RlZFwiXG4gICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiFmbG93LmVuYWJsZWRcIlxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RGbG93KGZsb3dzR3JvdXAuX2lkLCBmbG93Ll9pZClcIlxuICAgICAgICAgIChtb3VzZW91dCk9XCJmbG93Lm1vdXNlT3ZlciA9IGZhbHNlXCJcbiAgICAgICAgICAobW91c2VvdmVyKT1cImZsb3cubW91c2VPdmVyID0gdHJ1ZVwiXG4gICAgICAgICAgY2RrRHJhZ1xuICAgICAgICA+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0XCI+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZmxvdy5uYW1lXCIgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fbGVmdF9fbmFtZVwiIFthdHRyLnRpdGxlXT1cImZsb3cubmFtZVwiPlxuICAgICAgICAgICAgICB7eyBmbG93Lm5hbWUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgQGlmIChhcGlUeXBlICE9PSAnTkFUSVZFJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9fZmxvd3NfX2Zsb3dfX2xlZnRfX2luZm9zXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0X19pbmZvc19fYmFkZ2VzXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgYmFkZ2Ugb2YgZmxvdy5iYWRnZXNcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0X19pbmZvc19fYmFkZ2VzX19iYWRnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImJhZGdlLmNsYXNzXCJcbiAgICAgICAgICAgICAgICAgICAgPnt7IGJhZGdlLmxhYmVsIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpc3RfX2Zsb3dzR3JvdXBfX2Zsb3dzX19mbG93X19sZWZ0X19pbmZvc19fcGF0aE9yQ2hhbm5lbExhYmVsXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImZsb3cucGF0aE9yQ2hhbm5lbExhYmVsOyBlbHNlIGVtcHR5UGF0aE9yQ2hhbm5lbExhYmVsXCIgW2F0dHIudGl0bGVdPVwiZmxvdy5wYXRoT3JDaGFubmVsTGFiZWxcIj57e1xuICAgICAgICAgICAgICAgICAgICBmbG93LnBhdGhPckNoYW5uZWxMYWJlbFxuICAgICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VtcHR5UGF0aE9yQ2hhbm5lbExhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8ZW0+RW1wdHk8L2VtPlxuICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImZsb3cuaGFzQ29uZGl0aW9uXCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGlzdF9fZmxvd3NHcm91cF9fZmxvd3NfX2Zsb3dfX2xlZnRfX2luZm9zX19jb25kaXRpb25CYWRnZSBnaW8tYmFkZ2UtbmV1dHJhbFwiXG4gICAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiQ29uZGl0aW9uZWRcIlxuICAgICAgICAgICAgICAgICAgPjxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOmlmXCI+PC9tYXQtaWNvblxuICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fcmlnaHRcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJsaXN0X19mbG93c0dyb3VwX19mbG93c19fZmxvd19fcmlnaHRfX25hbWVfX21lbnVcIlxuICAgICAgICAgICAgICBtYXQtYnV0dG9uXG4gICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJyZWFkT25seVwiXG4gICAgICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJmbG93TWVudVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzptb3JlLXZlcnRpY2FsXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPG1hdC1tZW51ICNmbG93TWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwicmVhZE9ubHlcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJvbkRpc2FibGVGbG93KGZsb3cuX2lkKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbc3ZnSWNvbl09XCJmbG93LmVuYWJsZWQgPyAnZ2lvOnByb2hpYml0aW9uJyA6ICdnaW86Y2hlY2stY2lyY2xlZC1vdXRsaW5lJ1wiPjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgPHNwYW4+e3sgZmxvdy5lbmFibGVkID8gJ0Rpc2FibGUnIDogJ0VuYWJsZScgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uRWRpdEZsb3coZmxvdy5faWQpXCI+PG1hdC1pY29uIHN2Z0ljb249XCJnaW86ZWRpdC1wZW5jaWxcIj48L21hdC1pY29uPiBFZGl0PC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwib25EZWxldGVGbG93KGZsb3cuX2lkKVwiPjxtYXQtaWNvbiBzdmdJY29uPVwiZ2lvOnRyYXNoXCI+PC9tYXQtaWNvbj4gRGVsZXRlPC9idXR0b24+XG4gICAgICAgICAgICAgIEBpZiAoYXBpVHlwZSAhPT0gJ05BVElWRScpIHtcbiAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm9uRHVwbGljYXRlRmxvdyhmbG93c0dyb3VwLl9pZCwgZmxvdy5faWQpXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gc3ZnSWNvbj1cImdpbzpjb3B5XCI+PC9tYXQtaWNvbj4gRHVwbGljYXRlXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvbWF0LW1lbnU+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgfVxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdMaXN0PlxuICA8ZGl2IGNsYXNzPVwibG9hZGluZ0xpc3RcIj5cbiAgICA8Z2lvLWxvYWRlcj48L2dpby1sb2FkZXI+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==