@ngrdt/menu 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { DOCUMENT } from '@angular/common';
2
- import { booleanAttribute, ChangeDetectorRef, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, inject, Input, QueryList, Renderer2, ViewChildren, } from '@angular/core';
2
+ import { booleanAttribute, ChangeDetectorRef, DestroyRef, Directive, ElementRef, EnvironmentInjector, HostBinding, HostListener, inject, Input, numberAttribute, QueryList, Renderer2, ViewChild, ViewChildren, } from '@angular/core';
3
3
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
4
4
  import { Router } from '@angular/router';
5
5
  import { RdtRouterService } from '@ngrdt/router';
@@ -8,6 +8,7 @@ import { KB_CODE, RdtStringUtils, } from '@ngrdt/utils';
8
8
  import { animationFrameScheduler, fromEvent, Subscription, throttleTime, } from 'rxjs';
9
9
  import { RdtMenuOverlayComponent } from '../menu-overlay/rdt-menu-overlay.component';
10
10
  import { DEFAULT_MENU_HORIZONTAL_DIR, DEFAULT_MENU_VERTICAL_DIR, RDT_MENU_MARGIN_BOTTOM_PROPERTY_NAME, RDT_MENU_MARGIN_LEFT_PROPERTY_NAME, RDT_MENU_MARGIN_RIGHT_PROPERTY_NAME, RDT_MENU_MARGIN_TOP_PROPERTY_NAME, RdtMenuShortcutMode, } from '../models';
11
+ import { RdtMenuExpandSource, } from '../private-models';
11
12
  import { findNextItemWithPrefix, FOCUS_VISIBLE, getChildRoutesMap, getMenuItemsShortcuts, menuItemHasChildren, menuItemHasRoute, } from '../utils';
12
13
  import * as i0 from "@angular/core";
13
14
  export class RdtMenuBaseComponent {
@@ -20,6 +21,7 @@ export class RdtMenuBaseComponent {
20
21
  shortcutMode = RdtMenuShortcutMode.OPEN_SUBMENU;
21
22
  closeOnFocusOut = true;
22
23
  openOnHover = false;
24
+ hitboxMargin = 10;
23
25
  cd = inject(ChangeDetectorRef);
24
26
  destroyRef = inject(DestroyRef);
25
27
  rdtRouter = inject(RdtRouterService);
@@ -31,8 +33,9 @@ export class RdtMenuBaseComponent {
31
33
  injector = inject(EnvironmentInjector);
32
34
  children;
33
35
  focusableElements;
36
+ buttonContainer;
34
37
  classes = 'rdt-menu-base';
35
- expanded = null;
38
+ expandedChild = null;
36
39
  autofocusSubmenuItem = null;
37
40
  parsedItems;
38
41
  get clientSize() {
@@ -43,6 +46,10 @@ export class RdtMenuBaseComponent {
43
46
  return this._bodyMargin;
44
47
  }
45
48
  _bodyMargin;
49
+ get buttonContainerRect() {
50
+ return this._buttonContainerRect;
51
+ }
52
+ _buttonContainerRect;
46
53
  allParsedItems;
47
54
  childRoutesMap = new Map();
48
55
  shortcutSub = new Subscription();
@@ -50,8 +57,8 @@ export class RdtMenuBaseComponent {
50
57
  keyActions = {
51
58
  [KB_CODE.ARROW.LEFT]: (index) => this.focusPrevItem(index),
52
59
  [KB_CODE.ARROW.RIGHT]: (index) => this.focusNextItem(index),
53
- [KB_CODE.ARROW.DOWN]: (index) => this.openSubmenu(index, 'first'),
54
- [KB_CODE.ARROW.UP]: (index) => this.openSubmenu(index, 'last'),
60
+ [KB_CODE.ARROW.DOWN]: (index) => this.openSubmenu(index, 'first', RdtMenuExpandSource.Shortcut),
61
+ [KB_CODE.ARROW.UP]: (index) => this.openSubmenu(index, 'last', RdtMenuExpandSource.Shortcut),
55
62
  [KB_CODE.HOME]: () => this.focusItem(0),
56
63
  [KB_CODE.END]: () => this.focusItem(this.parsedItems.length - 1),
57
64
  [KB_CODE.ENTER]: (index) => this.invokeItemClickByIndex(index),
@@ -86,19 +93,21 @@ export class RdtMenuBaseComponent {
86
93
  });
87
94
  }
88
95
  closeSubmenus(focusExpanded = false) {
89
- if (focusExpanded && this.expanded) {
90
- this.focusItem(this.expanded);
96
+ if (focusExpanded && this.expandedChild) {
97
+ this.focusItem(this.expandedChild.item);
91
98
  }
92
- this.expanded = null;
99
+ this.expandedChild = null;
93
100
  this.cd.markForCheck();
94
101
  }
95
102
  onItemClick(item) {
96
- if (menuItemHasChildren(item) && this.expanded !== item) {
103
+ if ((menuItemHasChildren(item) && this.expandedChild?.item !== item) ||
104
+ (this.openOnHover &&
105
+ this.expandedChild?.src === RdtMenuExpandSource.Hover)) {
97
106
  this.autofocusSubmenuItem = null;
98
- this.expanded = item;
107
+ this.expandedChild = { item, src: RdtMenuExpandSource.Click };
99
108
  }
100
109
  else {
101
- this.expanded = null;
110
+ this.expandedChild = null;
102
111
  }
103
112
  if (typeof item.command === 'function') {
104
113
  item.command();
@@ -106,15 +115,13 @@ export class RdtMenuBaseComponent {
106
115
  }
107
116
  onItemPointerEnter(item) {
108
117
  if (this.openOnHover &&
109
- this.expanded !== item &&
110
- menuItemHasChildren(item)) {
118
+ menuItemHasChildren(item) &&
119
+ this.expandedChild?.src !== RdtMenuExpandSource.Click) {
111
120
  this.autofocusSubmenuItem = null;
112
- this.expanded = item;
121
+ this.expandedChild = { item, src: RdtMenuExpandSource.Hover };
113
122
  }
114
- }
115
- onItemPointerLeave(item) {
116
- if (this.openOnHover && this.expanded === item) {
117
- this.expanded = null;
123
+ else {
124
+ this.expandedChild = null;
118
125
  }
119
126
  }
120
127
  onKeyDown(itemIndex, event) {
@@ -203,12 +210,12 @@ export class RdtMenuBaseComponent {
203
210
  }
204
211
  this.invokeItemClick(item);
205
212
  }
206
- openSubmenu(itemIndex, visibleFocus) {
213
+ openSubmenu(itemIndex, visibleFocus, src) {
207
214
  if (itemIndex < this.parsedItems.length &&
208
215
  menuItemHasChildren(this.parsedItems[itemIndex])) {
209
216
  const item = this.parsedItems[itemIndex];
210
217
  this.autofocusSubmenuItem = visibleFocus;
211
- this.expanded = item;
218
+ this.expandedChild = { item, src };
212
219
  }
213
220
  }
214
221
  focusItem(item) {
@@ -242,13 +249,26 @@ export class RdtMenuBaseComponent {
242
249
  elRef.nativeElement.focus();
243
250
  }
244
251
  }
252
+ onPointerMove(event) {
253
+ if (this.openOnHover && this.expandedChild) {
254
+ const hitboxes = this.getHitboxes();
255
+ const isInside = hitboxes.some((hitbox) => this.isPointerInsideHitbox(hitbox.rect, event));
256
+ for (let i = hitboxes.length - 1; i >= 0; i--) {
257
+ const hitbox = hitboxes[i];
258
+ if (!hitbox.fixed && !isInside) {
259
+ hitbox.close();
260
+ break;
261
+ }
262
+ }
263
+ }
264
+ }
245
265
  // Closes menu if user navigates outside it using Tab.
246
266
  checkActiveElement(event) {
247
- if (this.closeOnFocusOut) {
267
+ if (this.closeOnFocusOut && !this.openOnHover) {
248
268
  const thisEl = this.elRef.nativeElement;
249
269
  const target = event.relatedTarget;
250
270
  if (!(target instanceof HTMLElement) || !thisEl.contains(target)) {
251
- this.expanded = null;
271
+ this.expandedChild = null;
252
272
  }
253
273
  }
254
274
  }
@@ -260,6 +280,7 @@ export class RdtMenuBaseComponent {
260
280
  }
261
281
  }
262
282
  measure() {
283
+ this.measureButtonContainer();
263
284
  this.measureClientSize();
264
285
  this.readMargin();
265
286
  }
@@ -282,6 +303,15 @@ export class RdtMenuBaseComponent {
282
303
  height: this.document.body.clientHeight,
283
304
  };
284
305
  }
306
+ measureButtonContainer() {
307
+ const el = this.buttonContainer?.nativeElement;
308
+ if (el) {
309
+ this._buttonContainerRect = el.getBoundingClientRect();
310
+ }
311
+ else {
312
+ this._buttonContainerRect = undefined;
313
+ }
314
+ }
285
315
  listenWindowResize() {
286
316
  fromEvent(window, 'resize')
287
317
  .pipe(throttleTime(0, animationFrameScheduler, { trailing: true }), takeUntilDestroyed(this.destroyRef))
@@ -325,10 +355,10 @@ export class RdtMenuBaseComponent {
325
355
  }
326
356
  }
327
357
  else {
328
- this.activateItemRecursively(path);
358
+ this.activateItemRecursively(path, RdtMenuExpandSource.Shortcut);
329
359
  }
330
360
  }
331
- activateItemRecursively(path) {
361
+ activateItemRecursively(path, src) {
332
362
  const children = [...path];
333
363
  if (this.shortcutMode === RdtMenuShortcutMode.OPEN_SUBMENU) {
334
364
  const last = children[children.length - 1];
@@ -338,17 +368,55 @@ export class RdtMenuBaseComponent {
338
368
  }
339
369
  const thisItem = children.shift();
340
370
  if (children.length > 0) {
341
- this.expanded = thisItem;
371
+ this.expandedChild = { item: thisItem, src };
342
372
  const overlay = this.children.find((child) => child.item === thisItem);
343
373
  overlay.focusItemRecursively(children);
344
374
  }
345
375
  else {
346
- this.expanded = null;
376
+ this.expandedChild = null;
347
377
  this.focusItem(thisItem);
348
378
  }
349
379
  }
380
+ isPointerInsideHitbox(hitbox, event) {
381
+ const rect = hitbox;
382
+ const x = event.clientX;
383
+ const y = event.clientY;
384
+ return (x >= rect.left - this.hitboxMargin &&
385
+ x <= rect.right + this.hitboxMargin &&
386
+ y >= rect.top - this.hitboxMargin &&
387
+ y <= rect.bottom + this.hitboxMargin);
388
+ }
389
+ getHitboxes() {
390
+ const boxes = this.getOpenMenuBoundingBoxes();
391
+ const buttonContainerRect = this.buttonContainerRect;
392
+ if (buttonContainerRect) {
393
+ boxes.push({ rect: buttonContainerRect, fixed: true, close: () => { } });
394
+ }
395
+ return boxes;
396
+ }
397
+ getOpenMenuBoundingBoxes() {
398
+ const boxes = [];
399
+ this.children.forEach((overlay) => {
400
+ this.getOpenMenuBoundingBoxesRec(overlay, boxes);
401
+ });
402
+ return boxes;
403
+ }
404
+ getOpenMenuBoundingBoxesRec(overlay, boxes) {
405
+ if (overlay.expanded) {
406
+ let someByClick = false;
407
+ overlay.children.forEach((child) => (someByClick ||= this.getOpenMenuBoundingBoxesRec(child, boxes)));
408
+ const fixed = someByClick || overlay.selfExpandSrc === RdtMenuExpandSource.Click;
409
+ boxes.push({
410
+ rect: overlay.box,
411
+ fixed: fixed,
412
+ close: () => overlay.closeSelf(),
413
+ });
414
+ return fixed;
415
+ }
416
+ return false;
417
+ }
350
418
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, deps: [], target: i0.ɵɵFactoryTarget.Directive });
351
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBaseComponent, inputs: { preferredVerticalDir: "preferredVerticalDir", preferredHorizontalDir: "preferredHorizontalDir", shortcutMode: "shortcutMode", closeOnFocusOut: ["closeOnFocusOut", "closeOnFocusOut", booleanAttribute], openOnHover: ["openOnHover", "openOnHover", booleanAttribute] }, host: { listeners: { "window:focusout": "checkActiveElement($event)", "document:click": "onDocumentClick($event)" }, properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "children", predicate: RdtMenuOverlayComponent, descendants: true }, { propertyName: "focusableElements", predicate: ["focusableItem"], descendants: true }], usesOnChanges: true, ngImport: i0 });
419
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.7", type: RdtMenuBaseComponent, inputs: { preferredVerticalDir: "preferredVerticalDir", preferredHorizontalDir: "preferredHorizontalDir", shortcutMode: "shortcutMode", closeOnFocusOut: ["closeOnFocusOut", "closeOnFocusOut", booleanAttribute], openOnHover: ["openOnHover", "openOnHover", booleanAttribute], hitboxMargin: ["hitboxMargin", "hitboxMargin", numberAttribute] }, host: { listeners: { "window:pointermove": "onPointerMove($event)", "window:focusout": "checkActiveElement($event)", "document:click": "onDocumentClick($event)" }, properties: { "class": "this.classes" } }, viewQueries: [{ propertyName: "buttonContainer", first: true, predicate: ["buttonContainer"], descendants: true, static: true }, { propertyName: "children", predicate: RdtMenuOverlayComponent, descendants: true }, { propertyName: "focusableElements", predicate: ["focusableItem"], descendants: true }], usesOnChanges: true, ngImport: i0 });
352
420
  }
353
421
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: RdtMenuBaseComponent, decorators: [{
354
422
  type: Directive
@@ -364,15 +432,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
364
432
  }], openOnHover: [{
365
433
  type: Input,
366
434
  args: [{ transform: booleanAttribute }]
435
+ }], hitboxMargin: [{
436
+ type: Input,
437
+ args: [{ transform: numberAttribute }]
367
438
  }], children: [{
368
439
  type: ViewChildren,
369
440
  args: [RdtMenuOverlayComponent]
370
441
  }], focusableElements: [{
371
442
  type: ViewChildren,
372
443
  args: ['focusableItem']
444
+ }], buttonContainer: [{
445
+ type: ViewChild,
446
+ args: ['buttonContainer', { static: true }]
373
447
  }], classes: [{
374
448
  type: HostBinding,
375
449
  args: ['class']
450
+ }], onPointerMove: [{
451
+ type: HostListener,
452
+ args: ['window:pointermove', ['$event']]
376
453
  }], checkActiveElement: [{
377
454
  type: HostListener,
378
455
  args: ['window:focusout', ['$event']]
@@ -380,4 +457,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
380
457
  type: HostListener,
381
458
  args: ['document:click', ['$event']]
382
459
  }] } });
383
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvbGliL21lbnUtYmFzZS9yZHQtbWVudS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFHTCxTQUFTLEVBQ1QsU0FBUyxFQUVULFlBQVksR0FDYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxFQUFZLGdCQUFnQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBZSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ25FLE9BQU8sRUFDTCxPQUFPLEVBRVAsY0FBYyxHQUVmLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEdBQ2IsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNyRixPQUFPLEVBQ0wsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QixvQ0FBb0MsRUFDcEMsa0NBQWtDLEVBQ2xDLG1DQUFtQyxFQUNuQyxpQ0FBaUMsRUFDakMsbUJBQW1CLEdBQ3BCLE1BQU0sV0FBVyxDQUFDO0FBRW5CLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGlCQUFp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QUUsZ0JBQWdCLEVBQUU7Z0JBSXRDLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFjNUIsUUFBUTtzQkFEakIsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBSTNCLGlCQUFpQjtzQkFEMUIsWUFBWTt1QkFBQyxlQUFlO2dCQUk3QixPQUFPO3NCQUROLFdBQVc7dUJBQUMsT0FBTztnQkEwUVYsa0JBQWtCO3NCQUQzQixZQUFZO3VCQUFDLGlCQUFpQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVlqQyxlQUFlO3NCQUR4QixZQUFZO3VCQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIEFmdGVyVmlld0luaXQsXHJcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBEZXN0cm95UmVmLFxyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEVudmlyb25tZW50SW5qZWN0b3IsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIGluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0LFxyXG4gIFF1ZXJ5TGlzdCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0Um91dGUsIFJkdFJvdXRlclNlcnZpY2UgfSBmcm9tICdAbmdyZHQvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0U2hvcnRjdXQsIFJkdFNob3J0Y3V0U2VydmljZSB9IGZyb20gJ0BuZ3JkdC9zaG9ydGN1dHMnO1xyXG5pbXBvcnQge1xyXG4gIEtCX0NPREUsXHJcbiAgUmR0SG9yaXpvbnRhbERpcmVjdGlvbixcclxuICBSZHRTdHJpbmdVdGlscyxcclxuICBSZHRWZXJ0aWNhbERpcmVjdGlvbixcclxufSBmcm9tICdAbmdyZHQvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxyXG4gIGZyb21FdmVudCxcclxuICBTdWJzY3JpcHRpb24sXHJcbiAgdGhyb3R0bGVUaW1lLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZHRNZW51T3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4uL21lbnUtb3ZlcmxheS9yZHQtbWVudS1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9NRU5VX0hPUklaT05UQUxfRElSLFxyXG4gIERFRkFVTFRfTUVOVV9WRVJUSUNBTF9ESVIsXHJcbiAgUkRUX01FTlVfTUFSR0lOX0JPVFRPTV9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9MRUZUX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX1JJR0hUX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX1RPUF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJkdE1lbnVTaG9ydGN1dE1vZGUsXHJcbn0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHsgUGFyc2VkUmR0TWVudUl0ZW0gfSBmcm9tICcuLi9wcml2YXRlLW1vZGVscyc7XHJcbmltcG9ydCB7XHJcbiAgZmluZE5leHRJdGVtV2l0aFByZWZpeCxcclxuICBGT0NVU19WSVNJQkxFLFxyXG4gIGdldENoaWxkUm91dGVzTWFwLFxyXG4gIGdldE1lbnVJdGVtc1Nob3J0Y3V0cyxcclxuICBtZW51SXRlbUhhc0NoaWxkcmVuLFxyXG4gIG1lbnVJdGVtSGFzUm91dGUsXHJcbiAgUGFyc2VkUmR0TWVudUl0ZW1XaXRoU2hvcnRjdXQsXHJcbiAgU2l6ZSxcclxufSBmcm9tICcuLi91dGlscyc7XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJkdE1lbnVCYXNlQ29tcG9uZW50XHJcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdFxyXG57XHJcbiAgQElucHV0KClcclxuICBwcmVmZXJyZWRWZXJ0aWNhbERpcjogUmR0VmVydGljYWxEaXJlY3Rpb24gPSBERUZBVUxUX01FTlVfVkVSVElDQUxfRElSO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHByZWZlcnJlZEhvcml6b250YWxEaXI6IFJkdEhvcml6b250YWxEaXJlY3Rpb24gPSBERUZBVUxUX01FTlVfSE9SSVpPTlRBTF9ESVI7XHJcblxyXG4gIC8vIE1vZGUgb25seSBtYXR0ZXJzIGlmIGl0ZW0gaGFzIHNob3J0Y3V0IGFuZCBvbmx5IGNoaWxkcmVuLCBubyBjb21tYW5kIG5vciByb3V0ZXJMaW5rXHJcbiAgLy8gRk9DVVNfSVRFTSB3aWxsIHB1dCBmb2N1cyBvbiBpdGVtIHdpdGggc2hvcnRjdXRcclxuICAvLyBPUEVOX1NVQk1FTlUgd2lsbCBvcGVuIGl0cyBzdWJtZW51IGFuZCBwdXQgZm9jdXMgb24gdGhlIGZpcnN0IGl0ZW0gaW4gaXRcclxuICAvLyBJZiBpdGVtIGhhcyBjb21tYW5kIG9yIHJvdXRlckxpbmssIGl0IHdpbGwgYWx3YXlzIGJlIGFjdGl2YXRlZCBhbmQgZXZlcnl0aGluZyBjbG9zZWRcclxuICBASW5wdXQoKVxyXG4gIHNob3J0Y3V0TW9kZTogJ2ZvY3VzLWl0ZW0nIHwgJ29wZW4tc3VibWVudScgPVxyXG4gICAgUmR0TWVudVNob3J0Y3V0TW9kZS5PUEVOX1NVQk1FTlU7XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIGNsb3NlT25Gb2N1c091dCA9IHRydWU7XHJcblxyXG4gIEBJbnB1dCh7IHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxyXG4gIG9wZW5PbkhvdmVyID0gZmFsc2U7XHJcblxyXG4gIHJlYWRvbmx5IGNkID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcclxuICByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZHRSb3V0ZXIgPSBpbmplY3QoUmR0Um91dGVyU2VydmljZSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PiA9IGluamVjdChFbGVtZW50UmVmKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByZW5kZXJlciA9IGluamVjdChSZW5kZXJlcjIpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2hvcnRjdXRTZXJ2aWNlID0gaW5qZWN0KFJkdFNob3J0Y3V0U2VydmljZSk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluamVjdG9yID0gaW5qZWN0KEVudmlyb25tZW50SW5qZWN0b3IpO1xyXG5cclxuICBAVmlld0NoaWxkcmVuKFJkdE1lbnVPdmVybGF5Q29tcG9uZW50KVxyXG4gIHByb3RlY3RlZCBjaGlsZHJlbiE6IFF1ZXJ5TGlzdDxSZHRNZW51T3ZlcmxheUNvbXBvbmVudD47XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oJ2ZvY3VzYWJsZUl0ZW0nKVxyXG4gIHByb3RlY3RlZCBmb2N1c2FibGVFbGVtZW50cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxFbGVtZW50Pj47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxyXG4gIGNsYXNzZXMgPSAncmR0LW1lbnUtYmFzZSc7XHJcblxyXG4gIHByb3RlY3RlZCBleHBhbmRlZDogUGFyc2VkUmR0TWVudUl0ZW0gfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgYXV0b2ZvY3VzU3VibWVudUl0ZW06ICdmaXJzdCcgfCAnbGFzdCcgfCBudWxsID0gbnVsbDtcclxuICBwcm90ZWN0ZWQgcGFyc2VkSXRlbXMhOiBQYXJzZWRSZHRNZW51SXRlbVtdO1xyXG5cclxuICBnZXQgY2xpZW50U2l6ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9jbGllbnRTaXplO1xyXG4gIH1cclxuICBwcml2YXRlIF9jbGllbnRTaXplITogU2l6ZTtcclxuXHJcbiAgZ2V0IGJvZHlNYXJnaW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fYm9keU1hcmdpbjtcclxuICB9XHJcbiAgcHJpdmF0ZSBfYm9keU1hcmdpbiE6IHtcclxuICAgIHRvcDogbnVtYmVyO1xyXG4gICAgYm90dG9tOiBudW1iZXI7XHJcbiAgICBsZWZ0OiBudW1iZXI7XHJcbiAgICByaWdodDogbnVtYmVyO1xyXG4gIH07XHJcblxyXG4gIHByb3RlY3RlZCBhbGxQYXJzZWRJdGVtcyE6IFBhcnNlZFJkdE1lbnVJdGVtW107XHJcbiAgcHJvdGVjdGVkIGNoaWxkUm91dGVzTWFwOiBNYXA8UGFyc2VkUmR0TWVudUl0ZW0sIHN0cmluZ1tdW10+ID0gbmV3IE1hcCgpO1xyXG4gIHByb3RlY3RlZCBzaG9ydGN1dFN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICBwcm90ZWN0ZWQgc2hvcnRjdXRNYXA6IFJlY29yZDxzdHJpbmcsIFBhcnNlZFJkdE1lbnVJdGVtW10+ID0ge307XHJcblxyXG4gIHJlYWRvbmx5IGtleUFjdGlvbnMgPSB7XHJcbiAgICBbS0JfQ09ERS5BUlJPVy5MRUZUXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuZm9jdXNQcmV2SXRlbShpbmRleCksXHJcbiAgICBbS0JfQ09ERS5BUlJPVy5SSUdIVF06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmZvY3VzTmV4dEl0ZW0oaW5kZXgpLFxyXG4gICAgW0tCX0NPREUuQVJST1cuRE9XTl06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLm9wZW5TdWJtZW51KGluZGV4LCAnZmlyc3QnKSxcclxuICAgIFtLQl9DT0RFLkFSUk9XLlVQXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMub3BlblN1Ym1lbnUoaW5kZXgsICdsYXN0JyksXHJcbiAgICBbS0JfQ09ERS5IT01FXTogKCkgPT4gdGhpcy5mb2N1c0l0ZW0oMCksXHJcbiAgICBbS0JfQ09ERS5FTkRdOiAoKSA9PiB0aGlzLmZvY3VzSXRlbSh0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCAtIDEpLFxyXG4gICAgW0tCX0NPREUuRU5URVJdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5pbnZva2VJdGVtQ2xpY2tCeUluZGV4KGluZGV4KSxcclxuICAgIFtLQl9DT0RFLlNQQUNFQkFSXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuaW52b2tlSXRlbUNsaWNrQnlJbmRleChpbmRleCksXHJcbiAgfTtcclxuXHJcbiAgLy8gUmV0dXJucyBhbGwgcm91dGVzIGFzb2NpYXRlZCB3aXRoIGl0ZW0gb3IgaXRzIHN1Yml0ZW1zLlxyXG4gIGdldENoaWxkUm91dGVzKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICByZXR1cm4gdGhpcy5jaGlsZFJvdXRlc01hcC5nZXQoaXRlbSkgPz8gW107XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucmR0Um91dGVyLm5hdmlnYXRpb25FbmQkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpKVxyXG4gICAgICAuc3Vic2NyaWJlKChldikgPT4gdGhpcy5maWx0ZXJJdGVtcygpKTtcclxuICAgIHRoaXMubWVhc3VyZSgpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xyXG4gICAgaWYgKHRoaXMuY2hpbGRyZW4pIHtcclxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICB0aGlzLmxpc3RlbldpbmRvd1Jlc2l6ZSgpO1xyXG5cclxuICAgIC8vIE5vdCB1c2luZyB0aW1lb3V0IHJlc3VsdHMgaW4gaG9yaXpvbnRhbCBvdmVyZmxvdyBvbiBodG1sIGVsZW1lbnRcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLm1lYXN1cmUoKTtcclxuICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICB9LCA1MCk7XHJcbiAgfVxyXG5cclxuICByZWNhbGN1bGF0ZUNoaWxkcmVuKCkge1xyXG4gICAgdGhpcy5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZCkgPT4ge1xyXG4gICAgICBjaGlsZC5yZWNhbGN1bGF0ZVBvc2l0aW9uKFxyXG4gICAgICAgIHRoaXMucHJlZmVycmVkSG9yaXpvbnRhbERpcixcclxuICAgICAgICB0aGlzLnByZWZlcnJlZFZlcnRpY2FsRGlyXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGNsb3NlU3VibWVudXMoZm9jdXNFeHBhbmRlZCA9IGZhbHNlKSB7XHJcbiAgICBpZiAoZm9jdXNFeHBhbmRlZCAmJiB0aGlzLmV4cGFuZGVkKSB7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKHRoaXMuZXhwYW5kZWQpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5leHBhbmRlZCA9IG51bGw7XHJcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSXRlbUNsaWNrKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAobWVudUl0ZW1IYXNDaGlsZHJlbihpdGVtKSAmJiB0aGlzLmV4cGFuZGVkICE9PSBpdGVtKSB7XHJcbiAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBpdGVtLmNvbW1hbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgaXRlbS5jb21tYW5kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25JdGVtUG9pbnRlckVudGVyKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3Blbk9uSG92ZXIgJiZcclxuICAgICAgdGhpcy5leHBhbmRlZCAhPT0gaXRlbSAmJlxyXG4gICAgICBtZW51SXRlbUhhc0NoaWxkcmVuKGl0ZW0pXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBpdGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uSXRlbVBvaW50ZXJMZWF2ZShpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgaWYgKHRoaXMub3Blbk9uSG92ZXIgJiYgdGhpcy5leHBhbmRlZCA9PT0gaXRlbSkge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbktleURvd24oaXRlbUluZGV4OiBudW1iZXIsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBjb25zdCBoYXNBY3Rpb24gPSBldmVudC5jb2RlIGluIHRoaXMua2V5QWN0aW9ucztcclxuICAgIGNvbnN0IGlzTGV0dGVyID1cclxuICAgICAgUmR0U3RyaW5nVXRpbHMuaXNBbHBoYWJldENoYXJhY3RlcihldmVudC5rZXkpIHx8XHJcbiAgICAgIFJkdFN0cmluZ1V0aWxzLmlzTnVtZXJpY0NoYXJhY3RlcihldmVudC5rZXkpO1xyXG5cclxuICAgIGlmIChoYXNBY3Rpb24gfHwgaXNMZXR0ZXIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzQWN0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5rZXlBY3Rpb25zW2V2ZW50LmNvZGVdKGl0ZW1JbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKGlzTGV0dGVyKSB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBmaW5kTmV4dEl0ZW1XaXRoUHJlZml4KFxyXG4gICAgICAgIHRoaXMucGFyc2VkSXRlbXMsXHJcbiAgICAgICAgaXRlbUluZGV4LFxyXG4gICAgICAgIGV2ZW50LmtleVxyXG4gICAgICApO1xyXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKG5leHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW52b2tlSXRlbUNsaWNrKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAobWVudUl0ZW1IYXNSb3V0ZShpdGVtKSAmJiBpdGVtLnJvdXRlckxpbmspIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoaXRlbS5yb3V0ZXJMaW5rKTtcclxuICAgIH1cclxuICAgIHRoaXMub25JdGVtQ2xpY2soaXRlbSk7XHJcbiAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gJ2ZpcnN0JztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJkdFJvdXRlci5wYXJzZUFic29sdXRlVXJsKCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHtcclxuICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IHRoaXMuYWxsUGFyc2VkSXRlbXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gdGhpcy5maWx0ZXJSZWModGhpcy5hbGxQYXJzZWRJdGVtcywgY3VycmVudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoaWxkUm91dGVzTWFwID0gZ2V0Q2hpbGRSb3V0ZXNNYXAodGhpcy5wYXJzZWRJdGVtcyk7XHJcbiAgICB0aGlzLmxpc3RlblNob3J0Y3V0cygpO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJSZWMoXHJcbiAgICBpdGVtczogUGFyc2VkUmR0TWVudUl0ZW1bXSxcclxuICAgIGN1cnJlbnQ6IHsgcm91dGU6IFJkdFJvdXRlOyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfVxyXG4gICk6IFBhcnNlZFJkdE1lbnVJdGVtW10ge1xyXG4gICAgbGV0IGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50LnJvdXRlO1xyXG4gICAgY29uc3QgY3VycmVudFBhcmFtcyA9IGN1cnJlbnQucGFyYW1zO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmICghaXRlbS5yZXF1aXJlZFBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gaXRlbS5yZXF1aXJlZFBhcmVudDtcclxuICAgICAgd2hpbGUgKGN1cnJlbnRQYXJlbnQuYWJzb2x1dGVQYXRoICE9PSByZXF1aXJlZC5hYnNvbHV0ZVBhdGgpIHtcclxuICAgICAgICBjdXJyZW50UGFyZW50ID0gY3VycmVudFBhcmVudC5wYXJlbnQhO1xyXG4gICAgICAgIGlmICghY3VycmVudFBhcmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgcmVxdWlyZWRQYXJlbnQ6IFJkdFJvdXRlIHwgbnVsbCA9IHJlcXVpcmVkO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlcXVpcmVkUGFyZW50LmFic29sdXRlUGF0aDtcclxuICAgICAgICBpZiAocGF0aCBpbiBjdXJyZW50UGFyYW1zKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXF1aXJlZFBhcmVudC5zdGF0aWNQYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbXNbcGF0aF1ba2V5XSAhPT0gcmVxdWlyZWRQYXJlbnQuc3RhdGljUGFyYW1zW2tleV0pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWlyZWRQYXJlbnQgPSByZXF1aXJlZFBhcmVudC5wYXJlbnQ7XHJcbiAgICAgIH0gd2hpbGUgKHJlcXVpcmVkUGFyZW50KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBpdGVtczogdGhpcy5maWx0ZXJSZWMoaXRlbS5pdGVtcywgY3VycmVudCksXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW52b2tlSXRlbUNsaWNrQnlJbmRleChpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaXRlbUluZGV4XTtcclxuICAgIGlmICghaXRlbSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmludm9rZUl0ZW1DbGljayhpdGVtKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvcGVuU3VibWVudShpdGVtSW5kZXg6IG51bWJlciwgdmlzaWJsZUZvY3VzOiAnZmlyc3QnIHwgJ2xhc3QnKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGl0ZW1JbmRleCA8IHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoICYmXHJcbiAgICAgIG1lbnVJdGVtSGFzQ2hpbGRyZW4odGhpcy5wYXJzZWRJdGVtc1tpdGVtSW5kZXhdKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2l0ZW1JbmRleF07XHJcbiAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSB2aXNpYmxlRm9jdXM7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSBpdGVtO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzSXRlbShpdGVtOiBudW1iZXIgfCBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgbGV0IGl0ZW1JbmRleDogbnVtYmVyO1xyXG5cclxuICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHtcclxuICAgICAgaXRlbUluZGV4ID0gaXRlbTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGl0ZW1JbmRleCA9IHRoaXMucGFyc2VkSXRlbXMuaW5kZXhPZihpdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaXRlbUluZGV4ID49IDAgJiYgaXRlbUluZGV4IDwgdGhpcy5mb2N1c2FibGVFbGVtZW50cy5sZW5ndGgpIHtcclxuICAgICAgdGhpcy5ibHVyQWxsRm9jdXNhYmxlKCk7XHJcbiAgICAgIHRoaXMuZm9jdXNGb2N1c2FibGUoaXRlbUluZGV4KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c05leHRJdGVtKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBuZXh0ID0gKGl0ZW1JbmRleCArIDEpICUgdGhpcy5wYXJzZWRJdGVtcy5sZW5ndGg7XHJcbiAgICB0aGlzLmZvY3VzSXRlbShuZXh0KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmb2N1c1ByZXZJdGVtKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBwcmV2ID1cclxuICAgICAgKGl0ZW1JbmRleCAtIDEgKyB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aCkgJSB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDtcclxuICAgIHRoaXMuZm9jdXNJdGVtKHByZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGJsdXJBbGxGb2N1c2FibGUoKSB7XHJcbiAgICB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzLmZvckVhY2goKGVsKSA9PlxyXG4gICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNsYXNzKGVsLm5hdGl2ZUVsZW1lbnQsIEZPQ1VTX1ZJU0lCTEUpXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzRm9jdXNhYmxlKGl0ZW1JbmRleDogbnVtYmVyKSB7XHJcbiAgICBjb25zdCBlbFJlZiA9IHRoaXMuZm9jdXNhYmxlRWxlbWVudHMuZ2V0KGl0ZW1JbmRleCk7XHJcbiAgICBpZiAoZWxSZWYpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5hZGRDbGFzcyhlbFJlZi5uYXRpdmVFbGVtZW50LCBGT0NVU19WSVNJQkxFKTtcclxuICAgICAgZWxSZWYubmF0aXZlRWxlbWVudC5mb2N1cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gQ2xvc2VzIG1lbnUgaWYgdXNlciBuYXZpZ2F0ZXMgb3V0c2lkZSBpdCB1c2luZyBUYWIuXHJcbiAgQEhvc3RMaXN0ZW5lcignd2luZG93OmZvY3Vzb3V0JywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgY2hlY2tBY3RpdmVFbGVtZW50KGV2ZW50OiBGb2N1c0V2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5jbG9zZU9uRm9jdXNPdXQpIHtcclxuICAgICAgY29uc3QgdGhpc0VsID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgICBjb25zdCB0YXJnZXQgPSBldmVudC5yZWxhdGVkVGFyZ2V0O1xyXG4gICAgICBpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgfHwgIXRoaXNFbC5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgICAgdGhpcy5leHBhbmRlZCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBwcm90ZWN0ZWQgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcclxuICAgIGNvbnN0IGVsUmVmID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFlbFJlZi5jb250YWlucyh0YXJnZXQpKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VTdWJtZW51cygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmUoKSB7XHJcbiAgICB0aGlzLm1lYXN1cmVDbGllbnRTaXplKCk7XHJcbiAgICB0aGlzLnJlYWRNYXJnaW4oKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkTWFyZ2luKCkge1xyXG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IHRvcFZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX1RPUF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgYm90dG9tVmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fQk9UVE9NX1BST1BFUlRZX05BTUVcclxuICAgICk7XHJcbiAgICBjb25zdCBsZWZ0VmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fTEVGVF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmlnaHRWYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9SSUdIVF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgdGhpcy5fYm9keU1hcmdpbiA9IHtcclxuICAgICAgdG9wOiBwYXJzZUludCh0b3BWYWwpIHx8IDAsXHJcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoYm90dG9tVmFsKSB8fCAwLFxyXG4gICAgICBsZWZ0OiBwYXJzZUludChsZWZ0VmFsKSB8fCAwLFxyXG4gICAgICByaWdodDogcGFyc2VJbnQocmlnaHRWYWwpIHx8IDAsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmVDbGllbnRTaXplKCkge1xyXG4gICAgdGhpcy5fY2xpZW50U2l6ZSA9IHtcclxuICAgICAgd2lkdGg6IHRoaXMuZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBsaXN0ZW5XaW5kb3dSZXNpemUoKSB7XHJcbiAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJylcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGhyb3R0bGVUaW1lKDAsIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLCB7IHRyYWlsaW5nOiB0cnVlIH0pLFxyXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNoaWxkcmVuKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxpc3RlblNob3J0Y3V0cygpIHtcclxuICAgIGNvbnN0IGl0ZW1zV2l0aFNob3J0Y3V0cyA9IGdldE1lbnVJdGVtc1Nob3J0Y3V0cyh0aGlzLnBhcnNlZEl0ZW1zKTtcclxuICAgIGNvbnN0IHNob3J0Y3V0czogUmR0U2hvcnRjdXRbXSA9IGl0ZW1zV2l0aFNob3J0Y3V0cy5tYXAoXHJcbiAgICAgIChpdCkgPT4gaXQuc2hvcnRjdXRcclxuICAgICk7XHJcblxyXG4gICAgdGhpcy5zaG9ydGN1dE1hcCA9IHRoaXMuZ2V0U2hvcnRjdXRNYXAoaXRlbXNXaXRoU2hvcnRjdXRzKTtcclxuICAgIHRoaXMuc2hvcnRjdXRTdWIudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuc2hvcnRjdXRTdWIgPSB0aGlzLnNob3J0Y3V0U2VydmljZVxyXG4gICAgICAubGlzdGVuKHNob3J0Y3V0cylcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2dCkgPT4gdGhpcy5vblNob3J0Y3V0KGV2dC5zaG9ydGN1dCkpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFNob3J0Y3V0TWFwKFxyXG4gICAgaXRlbXNXaXRoU2hvcnRjdXRzOiBQYXJzZWRSZHRNZW51SXRlbVdpdGhTaG9ydGN1dFtdXHJcbiAgKSB7XHJcbiAgICBjb25zdCBzaG9ydGN1dE1hcDogUmVjb3JkPHN0cmluZywgUGFyc2VkUmR0TWVudUl0ZW1bXT4gPSB7fTtcclxuICAgIGl0ZW1zV2l0aFNob3J0Y3V0cy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIHNob3J0Y3V0TWFwW2l0ZW0uc2hvcnRjdXQuaG90a2V5c1ZhbHVlXSA9IGl0ZW0ucGF0aDtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHNob3J0Y3V0TWFwO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG9uU2hvcnRjdXQoc2hvcnRjdXQ6IFJkdFNob3J0Y3V0KSB7XHJcbiAgICBjb25zdCBwYXRoID0gdGhpcy5zaG9ydGN1dE1hcFtzaG9ydGN1dC5ob3RrZXlzVmFsdWVdO1xyXG4gICAgaWYgKCFwYXRoKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBgTWVudSBzaG9ydGN1dCAke3Nob3J0Y3V0LmhvdGtleXNWYWx1ZX0gd2FzIGRldGVjdGVkLCBidXQgdGhlcmUgaXMgbm8gcGF0aCBhc3NvY2lhdGVkIHdpdGggaXQuYCxcclxuICAgICAgICB0aGlzLnNob3J0Y3V0TWFwXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICBjb25zdCBsYXN0ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xyXG4gICAgY29uc3QgaGFzUm91dGUgPSBtZW51SXRlbUhhc1JvdXRlKGxhc3QpO1xyXG4gICAgY29uc3QgaGFzQ29tbWFuZCA9IHR5cGVvZiBsYXN0LmNvbW1hbmQgPT09ICdmdW5jdGlvbic7XHJcbiAgICBpZiAoaGFzUm91dGUgfHwgaGFzQ29tbWFuZCkge1xyXG4gICAgICB0aGlzLmNsb3NlU3VibWVudXMoZmFsc2UpO1xyXG4gICAgICBpZiAoaGFzQ29tbWFuZCkge1xyXG4gICAgICAgIGxhc3QuY29tbWFuZCEoKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoaGFzUm91dGUpIHtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShsYXN0LnJvdXRlckxpbmshKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmF0ZUl0ZW1SZWN1cnNpdmVseShwYXRoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBhY3RpdmF0ZUl0ZW1SZWN1cnNpdmVseShwYXRoOiBQYXJzZWRSZHRNZW51SXRlbVtdKSB7XHJcbiAgICBjb25zdCBjaGlsZHJlbiA9IFsuLi5wYXRoXTtcclxuXHJcbiAgICBpZiAodGhpcy5zaG9ydGN1dE1vZGUgPT09IFJkdE1lbnVTaG9ydGN1dE1vZGUuT1BFTl9TVUJNRU5VKSB7XHJcbiAgICAgIGNvbnN0IGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcclxuICAgICAgaWYgKG1lbnVJdGVtSGFzQ2hpbGRyZW4obGFzdCkgJiYgbGFzdC5pdGVtc1swXSkge1xyXG4gICAgICAgIGNoaWxkcmVuLnB1c2gobGFzdC5pdGVtc1swXSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBjb25zdCB0aGlzSXRlbSA9IGNoaWxkcmVuLnNoaWZ0KCkhO1xyXG5cclxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWQgPSB0aGlzSXRlbTtcclxuICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNoaWxkLml0ZW0gPT09IHRoaXNJdGVtKTtcclxuICAgICAgb3ZlcmxheSEuZm9jdXNJdGVtUmVjdXJzaXZlbHkoY2hpbGRyZW4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHBhbmRlZCA9IG51bGw7XHJcbiAgICAgIHRoaXMuZm9jdXNJdGVtKHRoaXNJdGVtKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
460
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmR0LW1lbnUtYmFzZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9AbmdyZHQvbWVudS9zcmMvbGliL21lbnUtYmFzZS9yZHQtbWVudS1iYXNlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUVMLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsVUFBVSxFQUNWLFNBQVMsRUFDVCxVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLFdBQVcsRUFDWCxZQUFZLEVBQ1osTUFBTSxFQUNOLEtBQUssRUFDTCxlQUFlLEVBR2YsU0FBUyxFQUNULFNBQVMsRUFFVCxTQUFTLEVBQ1QsWUFBWSxHQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEVBQVksZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFlLGtCQUFrQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbkUsT0FBTyxFQUNMLE9BQU8sRUFFUCxjQUFjLEdBRWYsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsWUFBWSxFQUNaLFlBQVksR0FDYixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3JGLE9BQU8sRUFDTCwyQkFBMkIsRUFDM0IseUJBQXlCLEVBQ3pCLG9DQUFvQyxFQUNwQyxrQ0FBa0MsRUFDbEMsbUNBQW1DLEVBQ25DLGlDQUFpQyxFQUNqQyxtQkFBbUIsR0FDcEIsTUFBTSxXQUFXLENBQUM7QUFDbkIsT0FBTyxFQUdMLG1CQUFtQixHQUNwQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsYUFBYSxFQUNiLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsbUJBQW1CLEVBQ25CLGdCQUFnQixHQUdqQixNQUFNLFVBQVUsQ0FBQzs7QUFHbEIsTUFBTSxPQUFnQixvQkFBb0I7SUFJeEMsb0JBQW9CLEdBQXlCLHlCQUF5QixDQUFDO0lBR3ZFLHNCQUFzQixHQUEyQiwyQkFBMkIsQ0FBQztJQUU3RSxzRkFBc0Y7SUFDdEYsa0RBQWtEO0lBQ2xELDJFQUEyRTtJQUMzRSx1RkFBdUY7SUFFdkYsWUFBWSxHQUNWLG1CQUFtQixDQUFDLFlBQVksQ0FBQztJQUduQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBR3ZCLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFHcEIsWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUVULEVBQUUsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUMvQixVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RCLFNBQVMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNyQyxLQUFLLEdBQTRCLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNwRCxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzVCLFFBQVEsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDN0IsTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QixlQUFlLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDN0MsUUFBUSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBR2hELFFBQVEsQ0FBc0M7SUFHOUMsaUJBQWlCLENBQXNDO0lBR2pFLGVBQWUsQ0FBMkI7SUFHMUMsT0FBTyxHQUFHLGVBQWUsQ0FBQztJQUUxQixhQUFhLEdBQWdDLElBQUksQ0FBQztJQUV4QyxvQkFBb0IsR0FBNEIsSUFBSSxDQUFDO0lBQ3JELFdBQVcsQ0FBdUI7SUFFNUMsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFDTyxXQUFXLENBQVE7SUFFM0IsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFDTyxXQUFXLENBS2pCO0lBRUYsSUFBSSxtQkFBbUI7UUFDckIsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDbkMsQ0FBQztJQUNPLG9CQUFvQixDQUFXO0lBRTdCLGNBQWMsQ0FBdUI7SUFDckMsY0FBYyxHQUF1QyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQy9ELFdBQVcsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO0lBQ2pDLFdBQVcsR0FBd0MsRUFBRSxDQUFDO0lBRXZELFVBQVUsR0FBRztRQUNwQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQ2xFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFDbkUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDdEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLFFBQVEsQ0FBQztRQUNoRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxDQUFDO1FBQy9ELENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO1FBQ3RFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDO0tBQzFFLENBQUM7SUFFRiwwREFBMEQ7SUFDMUQsY0FBYyxDQUFDLElBQXVCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzdDLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjO2FBQzFCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN6QyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDakIsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUM3QixDQUFDO0lBQ0gsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQixtRUFBbUU7UUFDbkUsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNmLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNULENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUM5QixLQUFLLENBQUMsbUJBQW1CLENBQ3ZCLElBQUksQ0FBQyxzQkFBc0IsRUFDM0IsSUFBSSxDQUFDLG9CQUFvQixDQUMxQixDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLGFBQWEsR0FBRyxLQUFLO1FBQ2pDLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzFCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVTLFdBQVcsQ0FBQyxJQUF1QjtRQUMzQyxJQUNFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxJQUFJLEtBQUssSUFBSSxDQUFDO1lBQ2hFLENBQUMsSUFBSSxDQUFDLFdBQVc7Z0JBQ2YsSUFBSSxDQUFDLGFBQWEsRUFBRSxHQUFHLEtBQUssbUJBQW1CLENBQUMsS0FBSyxDQUFDLEVBQ3hELENBQUM7WUFDRCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2hFLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUVTLGtCQUFrQixDQUFDLElBQXVCO1FBQ2xELElBQ0UsSUFBSSxDQUFDLFdBQVc7WUFDaEIsbUJBQW1CLENBQUMsSUFBSSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxhQUFhLEVBQUUsR0FBRyxLQUFLLG1CQUFtQixDQUFDLEtBQUssRUFDckQsQ0FBQztZQUNELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7WUFDakMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDaEUsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUM1QixDQUFDO0lBQ0gsQ0FBQztJQUVTLFNBQVMsQ0FBQyxTQUFpQixFQUFFLEtBQW9CO1FBQ3pELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNoRCxNQUFNLFFBQVEsR0FDWixjQUFjLENBQUMsbUJBQW1CLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQztZQUM3QyxjQUFjLENBQUMsa0JBQWtCLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRS9DLElBQUksU0FBUyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQzFCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6QixDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLEtBQUssQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBRUQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUNqQyxJQUFJLENBQUMsV0FBVyxFQUNoQixTQUFTLEVBQ1QsS0FBSyxDQUFDLEdBQUcsQ0FDVixDQUFDO1lBQ0YsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdkIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRVMsZUFBZSxDQUFDLElBQXVCO1FBQy9DLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzlDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsb0JBQW9CLEdBQUcsT0FBTyxDQUFDO0lBQ3RDLENBQUM7SUFFUyxXQUFXO1FBQ25CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUM7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVTLFNBQVMsQ0FDakIsS0FBMEIsRUFDMUIsT0FBeUQ7UUFFekQsSUFBSSxhQUFhLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNsQyxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBRXJDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNyQyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixPQUFPLElBQUksQ0FBQztZQUNkLENBQUM7WUFDRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBQ3JDLE9BQU8sYUFBYSxDQUFDLFlBQVksS0FBSyxRQUFRLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQzVELGFBQWEsR0FBRyxhQUFhLENBQUMsTUFBTyxDQUFDO2dCQUN0QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ25CLE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxjQUFjLEdBQW9CLFFBQVEsQ0FBQztZQUMvQyxHQUFHLENBQUM7Z0JBQ0YsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLFlBQVksQ0FBQztnQkFDekMsSUFBSSxJQUFJLElBQUksYUFBYSxFQUFFLENBQUM7b0JBQzFCLEtBQUssTUFBTSxHQUFHLElBQUksY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO3dCQUM5QyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxjQUFjLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7NEJBQ2xFLE9BQU8sS0FBSyxDQUFDO3dCQUNmLENBQUM7b0JBQ0gsQ0FBQztnQkFDSCxDQUFDO2dCQUNELGNBQWMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDO1lBQ3pDLENBQUMsUUFBUSxjQUFjLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzNCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU87b0JBQ0wsR0FBRyxJQUFJO29CQUNQLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDO2lCQUMzQyxDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLHNCQUFzQixDQUFDLFNBQWlCO1FBQ2hELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1YsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7SUFFUyxXQUFXLENBQ25CLFNBQWlCLEVBQ2pCLFlBQThCLEVBQzlCLEdBQXdCO1FBRXhCLElBQ0UsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTTtZQUNuQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQ2hELENBQUM7WUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxZQUFZLENBQUM7WUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQztRQUNyQyxDQUFDO0lBQ0gsQ0FBQztJQUVTLFNBQVMsQ0FBQyxJQUFnQztRQUNsRCxJQUFJLFNBQWlCLENBQUM7UUFFdEIsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM3QixTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ25CLENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFFRCxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoRSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pDLENBQUM7SUFDSCxDQUFDO0lBRVMsYUFBYSxDQUFDLFNBQWlCO1FBQ3ZDLE1BQU0sSUFBSSxHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVTLGFBQWEsQ0FBQyxTQUFpQjtRQUN2QyxNQUFNLElBQUksR0FDUixDQUFDLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztRQUN0RSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxnQkFBZ0I7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQ3BDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQzNELENBQUM7SUFDSixDQUFDO0lBRVMsY0FBYyxDQUFDLFNBQWlCO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDM0QsS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUdTLGFBQWEsQ0FBQyxLQUFtQjtRQUN6QyxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNwQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FDeEMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQy9DLENBQUM7WUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUMvQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ2YsTUFBTTtnQkFDUixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsc0RBQXNEO0lBRTVDLGtCQUFrQixDQUFDLEtBQWlCO1FBQzVDLElBQUksSUFBSSxDQUFDLGVBQWUsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQztZQUN4QyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDO1lBQ25DLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBWSxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDakUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDNUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBR1MsZUFBZSxDQUFDLEtBQW1CO1FBQzNDLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFxQixDQUFDO1FBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRVMsT0FBTztRQUNmLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRVMsVUFBVTtRQUNsQixNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDM0MsaUNBQWlDLENBQ2xDLENBQUM7UUFDRixNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsZ0JBQWdCLENBQzlDLG9DQUFvQyxDQUNyQyxDQUFDO1FBQ0YsTUFBTSxPQUFPLEdBQUcsYUFBYSxDQUFDLGdCQUFnQixDQUM1QyxrQ0FBa0MsQ0FDbkMsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FDN0MsbUNBQW1DLENBQ3BDLENBQUM7UUFDRixJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLEdBQUcsRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQztZQUMxQixNQUFNLEVBQUUsUUFBUSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDaEMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQzVCLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQztTQUMvQixDQUFDO0lBQ0osQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHO1lBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXO1lBQ3JDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZO1NBQ3hDLENBQUM7SUFDSixDQUFDO0lBRVMsc0JBQXNCO1FBQzlCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsYUFBYSxDQUFDO1FBQy9DLElBQUksRUFBRSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsb0JBQW9CLEdBQUcsRUFBRSxDQUFDLHFCQUFxQixFQUFFLENBQUM7UUFDekQsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsb0JBQW9CLEdBQUcsU0FBUyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDO2FBQ3hCLElBQUksQ0FDSCxZQUFZLENBQUMsQ0FBQyxFQUFFLHVCQUF1QixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQzVELGtCQUFrQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FDcEM7YUFDQSxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ2QsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRVMsZUFBZTtRQUN2QixNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNuRSxNQUFNLFNBQVMsR0FBa0Isa0JBQWtCLENBQUMsR0FBRyxDQUNyRCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FDcEIsQ0FBQztRQUVGLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZTthQUNwQyxNQUFNLENBQUMsU0FBUyxDQUFDO2FBQ2pCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekMsU0FBUyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFUyxjQUFjLENBQ3RCLGtCQUFtRDtRQUVuRCxNQUFNLFdBQVcsR0FBd0MsRUFBRSxDQUFDO1FBQzVELGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQ2xDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBRVMsVUFBVSxDQUFDLFFBQXFCO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxJQUFJLENBQ1YsaUJBQWlCLFFBQVEsQ0FBQyxZQUFZLHlEQUF5RCxFQUMvRixJQUFJLENBQUMsV0FBVyxDQUNqQixDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxVQUFVLENBQUM7UUFDdEQsSUFBSSxRQUFRLElBQUksVUFBVSxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMxQixJQUFJLFVBQVUsRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxPQUFRLEVBQUUsQ0FBQztZQUNsQixDQUFDO1lBQ0QsSUFBSSxRQUFRLEVBQUUsQ0FBQztnQkFDYixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVyxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVTLHVCQUF1QixDQUMvQixJQUF5QixFQUN6QixHQUF3QjtRQUV4QixNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFFM0IsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO1lBQzNELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMvQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvQixDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUcsQ0FBQztRQUVuQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLENBQUM7WUFDN0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7WUFDdkUsT0FBUSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7WUFDMUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELHFCQUFxQixDQUFDLE1BQWUsRUFBRSxLQUFtQjtRQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7UUFDcEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUN4QixNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBRXhCLE9BQU8sQ0FDTCxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNsQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNuQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWTtZQUNqQyxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUNyQyxDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztRQUM5QyxNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUNyRCxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxtQkFBbUIsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCx3QkFBd0I7UUFDdEIsTUFBTSxLQUFLLEdBQTJELEVBQUUsQ0FBQztRQUN6RSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQ2hDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTywyQkFBMkIsQ0FDakMsT0FBZ0MsRUFDaEMsS0FBNkQ7UUFFN0QsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDckIsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQ3hCLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUN0QixDQUFDLEtBQUssRUFBRSxFQUFFLENBQ1IsQ0FBQyxXQUFXLEtBQUssSUFBSSxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUNuRSxDQUFDO1lBQ0YsTUFBTSxLQUFLLEdBQ1QsV0FBVyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssbUJBQW1CLENBQUMsS0FBSyxDQUFDO1lBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLE9BQU8sQ0FBQyxHQUFHO2dCQUNqQixLQUFLLEVBQUUsS0FBSztnQkFDWixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRTthQUNqQyxDQUFDLENBQUM7WUFDSCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7dUdBMWhCbUIsb0JBQW9COzJGQUFwQixvQkFBb0Isa01BaUJwQixnQkFBZ0IsK0NBR2hCLGdCQUFnQixrREFHaEIsZUFBZSw0WEFhckIsdUJBQXVCOzsyRkFwQ2pCLG9CQUFvQjtrQkFEekMsU0FBUzs4QkFLUixvQkFBb0I7c0JBRG5CLEtBQUs7Z0JBSU4sc0JBQXNCO3NCQURyQixLQUFLO2dCQVFOLFlBQVk7c0JBRFgsS0FBSztnQkFLTixlQUFlO3NCQURkLEtBQUs7dUJBQUMsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7Z0JBSXRDLFdBQVc7c0JBRFYsS0FBSzt1QkFBQyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJdEMsWUFBWTtzQkFEWCxLQUFLO3VCQUFDLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFjM0IsUUFBUTtzQkFEakIsWUFBWTt1QkFBQyx1QkFBdUI7Z0JBSTNCLGlCQUFpQjtzQkFEMUIsWUFBWTt1QkFBQyxlQUFlO2dCQUk3QixlQUFlO3NCQURkLFNBQVM7dUJBQUMsaUJBQWlCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUk5QyxPQUFPO3NCQUROLFdBQVc7dUJBQUMsT0FBTztnQkFxUlYsYUFBYTtzQkFEdEIsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFtQnBDLGtCQUFrQjtzQkFEM0IsWUFBWTt1QkFBQyxpQkFBaUIsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFZakMsZUFBZTtzQkFEeEIsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBBZnRlclZpZXdJbml0LFxyXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgRGVzdHJveVJlZixcclxuICBEaXJlY3RpdmUsXHJcbiAgRWxlbWVudFJlZixcclxuICBFbnZpcm9ubWVudEluamVjdG9yLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBpbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgbnVtYmVyQXR0cmlidXRlLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkluaXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFJlbmRlcmVyMixcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IHRha2VVbnRpbERlc3Ryb3llZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0Um91dGUsIFJkdFJvdXRlclNlcnZpY2UgfSBmcm9tICdAbmdyZHQvcm91dGVyJztcclxuaW1wb3J0IHsgUmR0U2hvcnRjdXQsIFJkdFNob3J0Y3V0U2VydmljZSB9IGZyb20gJ0BuZ3JkdC9zaG9ydGN1dHMnO1xyXG5pbXBvcnQge1xyXG4gIEtCX0NPREUsXHJcbiAgUmR0SG9yaXpvbnRhbERpcmVjdGlvbixcclxuICBSZHRTdHJpbmdVdGlscyxcclxuICBSZHRWZXJ0aWNhbERpcmVjdGlvbixcclxufSBmcm9tICdAbmdyZHQvdXRpbHMnO1xyXG5pbXBvcnQge1xyXG4gIGFuaW1hdGlvbkZyYW1lU2NoZWR1bGVyLFxyXG4gIGZyb21FdmVudCxcclxuICBTdWJzY3JpcHRpb24sXHJcbiAgdGhyb3R0bGVUaW1lLFxyXG59IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBSZHRNZW51T3ZlcmxheUNvbXBvbmVudCB9IGZyb20gJy4uL21lbnUtb3ZlcmxheS9yZHQtbWVudS1vdmVybGF5LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7XHJcbiAgREVGQVVMVF9NRU5VX0hPUklaT05UQUxfRElSLFxyXG4gIERFRkFVTFRfTUVOVV9WRVJUSUNBTF9ESVIsXHJcbiAgUkRUX01FTlVfTUFSR0lOX0JPVFRPTV9QUk9QRVJUWV9OQU1FLFxyXG4gIFJEVF9NRU5VX01BUkdJTl9MRUZUX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX1JJR0hUX1BST1BFUlRZX05BTUUsXHJcbiAgUkRUX01FTlVfTUFSR0lOX1RPUF9QUk9QRVJUWV9OQU1FLFxyXG4gIFJkdE1lbnVTaG9ydGN1dE1vZGUsXHJcbn0gZnJvbSAnLi4vbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICBQYXJzZWRSZHRNZW51SXRlbSxcclxuICBSZHRNZW51RXhwYW5kZWRDaGlsZCxcclxuICBSZHRNZW51RXhwYW5kU291cmNlLFxyXG59IGZyb20gJy4uL3ByaXZhdGUtbW9kZWxzJztcclxuaW1wb3J0IHtcclxuICBmaW5kTmV4dEl0ZW1XaXRoUHJlZml4LFxyXG4gIEZPQ1VTX1ZJU0lCTEUsXHJcbiAgZ2V0Q2hpbGRSb3V0ZXNNYXAsXHJcbiAgZ2V0TWVudUl0ZW1zU2hvcnRjdXRzLFxyXG4gIG1lbnVJdGVtSGFzQ2hpbGRyZW4sXHJcbiAgbWVudUl0ZW1IYXNSb3V0ZSxcclxuICBQYXJzZWRSZHRNZW51SXRlbVdpdGhTaG9ydGN1dCxcclxuICBTaXplLFxyXG59IGZyb20gJy4uL3V0aWxzJztcclxuXHJcbkBEaXJlY3RpdmUoKVxyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmR0TWVudUJhc2VDb21wb25lbnRcclxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBBZnRlclZpZXdJbml0XHJcbntcclxuICBASW5wdXQoKVxyXG4gIHByZWZlcnJlZFZlcnRpY2FsRGlyOiBSZHRWZXJ0aWNhbERpcmVjdGlvbiA9IERFRkFVTFRfTUVOVV9WRVJUSUNBTF9ESVI7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHJlZmVycmVkSG9yaXpvbnRhbERpcjogUmR0SG9yaXpvbnRhbERpcmVjdGlvbiA9IERFRkFVTFRfTUVOVV9IT1JJWk9OVEFMX0RJUjtcclxuXHJcbiAgLy8gTW9kZSBvbmx5IG1hdHRlcnMgaWYgaXRlbSBoYXMgc2hvcnRjdXQgYW5kIG9ubHkgY2hpbGRyZW4sIG5vIGNvbW1hbmQgbm9yIHJvdXRlckxpbmtcclxuICAvLyBGT0NVU19JVEVNIHdpbGwgcHV0IGZvY3VzIG9uIGl0ZW0gd2l0aCBzaG9ydGN1dFxyXG4gIC8vIE9QRU5fU1VCTUVOVSB3aWxsIG9wZW4gaXRzIHN1Ym1lbnUgYW5kIHB1dCBmb2N1cyBvbiB0aGUgZmlyc3QgaXRlbSBpbiBpdFxyXG4gIC8vIElmIGl0ZW0gaGFzIGNvbW1hbmQgb3Igcm91dGVyTGluaywgaXQgd2lsbCBhbHdheXMgYmUgYWN0aXZhdGVkIGFuZCBldmVyeXRoaW5nIGNsb3NlZFxyXG4gIEBJbnB1dCgpXHJcbiAgc2hvcnRjdXRNb2RlOiAnZm9jdXMtaXRlbScgfCAnb3Blbi1zdWJtZW51JyA9XHJcbiAgICBSZHRNZW51U2hvcnRjdXRNb2RlLk9QRU5fU1VCTUVOVTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXHJcbiAgY2xvc2VPbkZvY3VzT3V0ID0gdHJ1ZTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBib29sZWFuQXR0cmlidXRlIH0pXHJcbiAgb3Blbk9uSG92ZXIgPSBmYWxzZTtcclxuXHJcbiAgQElucHV0KHsgdHJhbnNmb3JtOiBudW1iZXJBdHRyaWJ1dGUgfSlcclxuICBoaXRib3hNYXJnaW4gPSAxMDtcclxuXHJcbiAgcmVhZG9ubHkgY2QgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJkdFJvdXRlciA9IGluamVjdChSZHRSb3V0ZXJTZXJ2aWNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZWxSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBkb2N1bWVudCA9IGluamVjdChET0NVTUVOVCk7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlbmRlcmVyID0gaW5qZWN0KFJlbmRlcmVyMik7XHJcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvdXRlciA9IGluamVjdChSb3V0ZXIpO1xyXG4gIHByb3RlY3RlZCByZWFkb25seSBzaG9ydGN1dFNlcnZpY2UgPSBpbmplY3QoUmR0U2hvcnRjdXRTZXJ2aWNlKTtcclxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoRW52aXJvbm1lbnRJbmplY3Rvcik7XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oUmR0TWVudU92ZXJsYXlDb21wb25lbnQpXHJcbiAgcHJvdGVjdGVkIGNoaWxkcmVuITogUXVlcnlMaXN0PFJkdE1lbnVPdmVybGF5Q29tcG9uZW50PjtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbignZm9jdXNhYmxlSXRlbScpXHJcbiAgcHJvdGVjdGVkIGZvY3VzYWJsZUVsZW1lbnRzITogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcclxuXHJcbiAgQFZpZXdDaGlsZCgnYnV0dG9uQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBidXR0b25Db250YWluZXI/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXHJcbiAgY2xhc3NlcyA9ICdyZHQtbWVudS1iYXNlJztcclxuXHJcbiAgZXhwYW5kZWRDaGlsZDogUmR0TWVudUV4cGFuZGVkQ2hpbGQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJvdGVjdGVkIGF1dG9mb2N1c1N1Ym1lbnVJdGVtOiAnZmlyc3QnIHwgJ2xhc3QnIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJvdGVjdGVkIHBhcnNlZEl0ZW1zITogUGFyc2VkUmR0TWVudUl0ZW1bXTtcclxuXHJcbiAgZ2V0IGNsaWVudFNpemUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fY2xpZW50U2l6ZTtcclxuICB9XHJcbiAgcHJpdmF0ZSBfY2xpZW50U2l6ZSE6IFNpemU7XHJcblxyXG4gIGdldCBib2R5TWFyZ2luKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2JvZHlNYXJnaW47XHJcbiAgfVxyXG4gIHByaXZhdGUgX2JvZHlNYXJnaW4hOiB7XHJcbiAgICB0b3A6IG51bWJlcjtcclxuICAgIGJvdHRvbTogbnVtYmVyO1xyXG4gICAgbGVmdDogbnVtYmVyO1xyXG4gICAgcmlnaHQ6IG51bWJlcjtcclxuICB9O1xyXG5cclxuICBnZXQgYnV0dG9uQ29udGFpbmVyUmVjdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9idXR0b25Db250YWluZXJSZWN0O1xyXG4gIH1cclxuICBwcml2YXRlIF9idXR0b25Db250YWluZXJSZWN0PzogRE9NUmVjdDtcclxuXHJcbiAgcHJvdGVjdGVkIGFsbFBhcnNlZEl0ZW1zITogUGFyc2VkUmR0TWVudUl0ZW1bXTtcclxuICBwcm90ZWN0ZWQgY2hpbGRSb3V0ZXNNYXA6IE1hcDxQYXJzZWRSZHRNZW51SXRlbSwgc3RyaW5nW11bXT4gPSBuZXcgTWFwKCk7XHJcbiAgcHJvdGVjdGVkIHNob3J0Y3V0U3ViID0gbmV3IFN1YnNjcmlwdGlvbigpO1xyXG4gIHByb3RlY3RlZCBzaG9ydGN1dE1hcDogUmVjb3JkPHN0cmluZywgUGFyc2VkUmR0TWVudUl0ZW1bXT4gPSB7fTtcclxuXHJcbiAgcmVhZG9ubHkga2V5QWN0aW9ucyA9IHtcclxuICAgIFtLQl9DT0RFLkFSUk9XLkxFRlRdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5mb2N1c1ByZXZJdGVtKGluZGV4KSxcclxuICAgIFtLQl9DT0RFLkFSUk9XLlJJR0hUXTogKGluZGV4OiBudW1iZXIpID0+IHRoaXMuZm9jdXNOZXh0SXRlbShpbmRleCksXHJcbiAgICBbS0JfQ09ERS5BUlJPVy5ET1dOXTogKGluZGV4OiBudW1iZXIpID0+XHJcbiAgICAgIHRoaXMub3BlblN1Ym1lbnUoaW5kZXgsICdmaXJzdCcsIFJkdE1lbnVFeHBhbmRTb3VyY2UuU2hvcnRjdXQpLFxyXG4gICAgW0tCX0NPREUuQVJST1cuVVBdOiAoaW5kZXg6IG51bWJlcikgPT5cclxuICAgICAgdGhpcy5vcGVuU3VibWVudShpbmRleCwgJ2xhc3QnLCBSZHRNZW51RXhwYW5kU291cmNlLlNob3J0Y3V0KSxcclxuICAgIFtLQl9DT0RFLkhPTUVdOiAoKSA9PiB0aGlzLmZvY3VzSXRlbSgwKSxcclxuICAgIFtLQl9DT0RFLkVORF06ICgpID0+IHRoaXMuZm9jdXNJdGVtKHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoIC0gMSksXHJcbiAgICBbS0JfQ09ERS5FTlRFUl06IChpbmRleDogbnVtYmVyKSA9PiB0aGlzLmludm9rZUl0ZW1DbGlja0J5SW5kZXgoaW5kZXgpLFxyXG4gICAgW0tCX0NPREUuU1BBQ0VCQVJdOiAoaW5kZXg6IG51bWJlcikgPT4gdGhpcy5pbnZva2VJdGVtQ2xpY2tCeUluZGV4KGluZGV4KSxcclxuICB9O1xyXG5cclxuICAvLyBSZXR1cm5zIGFsbCByb3V0ZXMgYXNvY2lhdGVkIHdpdGggaXRlbSBvciBpdHMgc3ViaXRlbXMuXHJcbiAgZ2V0Q2hpbGRSb3V0ZXMoaXRlbTogUGFyc2VkUmR0TWVudUl0ZW0pIHtcclxuICAgIHJldHVybiB0aGlzLmNoaWxkUm91dGVzTWFwLmdldChpdGVtKSA/PyBbXTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5yZHRSb3V0ZXIubmF2aWdhdGlvbkVuZCRcclxuICAgICAgLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZikpXHJcbiAgICAgIC5zdWJzY3JpYmUoKGV2KSA9PiB0aGlzLmZpbHRlckl0ZW1zKCkpO1xyXG4gICAgdGhpcy5tZWFzdXJlKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAodGhpcy5jaGlsZHJlbikge1xyXG4gICAgICB0aGlzLnJlY2FsY3VsYXRlQ2hpbGRyZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgIHRoaXMubGlzdGVuV2luZG93UmVzaXplKCk7XHJcblxyXG4gICAgLy8gTm90IHVzaW5nIHRpbWVvdXQgcmVzdWx0cyBpbiBob3Jpem9udGFsIG92ZXJmbG93IG9uIGh0bWwgZWxlbWVudFxyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMubWVhc3VyZSgpO1xyXG4gICAgICB0aGlzLnJlY2FsY3VsYXRlQ2hpbGRyZW4oKTtcclxuICAgIH0sIDUwKTtcclxuICB9XHJcblxyXG4gIHJlY2FsY3VsYXRlQ2hpbGRyZW4oKSB7XHJcbiAgICB0aGlzLmNoaWxkcmVuLmZvckVhY2goKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNoaWxkLnJlY2FsY3VsYXRlUG9zaXRpb24oXHJcbiAgICAgICAgdGhpcy5wcmVmZXJyZWRIb3Jpem9udGFsRGlyLFxyXG4gICAgICAgIHRoaXMucHJlZmVycmVkVmVydGljYWxEaXJcclxuICAgICAgKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VTdWJtZW51cyhmb2N1c0V4cGFuZGVkID0gZmFsc2UpIHtcclxuICAgIGlmIChmb2N1c0V4cGFuZGVkICYmIHRoaXMuZXhwYW5kZWRDaGlsZCkge1xyXG4gICAgICB0aGlzLmZvY3VzSXRlbSh0aGlzLmV4cGFuZGVkQ2hpbGQuaXRlbSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbkl0ZW1DbGljayhpdGVtOiBQYXJzZWRSZHRNZW51SXRlbSkge1xyXG4gICAgaWYgKFxyXG4gICAgICAobWVudUl0ZW1IYXNDaGlsZHJlbihpdGVtKSAmJiB0aGlzLmV4cGFuZGVkQ2hpbGQ/Lml0ZW0gIT09IGl0ZW0pIHx8XHJcbiAgICAgICh0aGlzLm9wZW5PbkhvdmVyICYmXHJcbiAgICAgICAgdGhpcy5leHBhbmRlZENoaWxkPy5zcmMgPT09IFJkdE1lbnVFeHBhbmRTb3VyY2UuSG92ZXIpXHJcbiAgICApIHtcclxuICAgICAgdGhpcy5hdXRvZm9jdXNTdWJtZW51SXRlbSA9IG51bGw7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IHsgaXRlbSwgc3JjOiBSZHRNZW51RXhwYW5kU291cmNlLkNsaWNrIH07XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBpdGVtLmNvbW1hbmQgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgaXRlbS5jb21tYW5kKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25JdGVtUG9pbnRlckVudGVyKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMub3Blbk9uSG92ZXIgJiZcclxuICAgICAgbWVudUl0ZW1IYXNDaGlsZHJlbihpdGVtKSAmJlxyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQ/LnNyYyAhPT0gUmR0TWVudUV4cGFuZFNvdXJjZS5DbGlja1xyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSBudWxsO1xyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSB7IGl0ZW0sIHNyYzogUmR0TWVudUV4cGFuZFNvdXJjZS5Ib3ZlciB9O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvbktleURvd24oaXRlbUluZGV4OiBudW1iZXIsIGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XHJcbiAgICBjb25zdCBoYXNBY3Rpb24gPSBldmVudC5jb2RlIGluIHRoaXMua2V5QWN0aW9ucztcclxuICAgIGNvbnN0IGlzTGV0dGVyID1cclxuICAgICAgUmR0U3RyaW5nVXRpbHMuaXNBbHBoYWJldENoYXJhY3RlcihldmVudC5rZXkpIHx8XHJcbiAgICAgIFJkdFN0cmluZ1V0aWxzLmlzTnVtZXJpY0NoYXJhY3RlcihldmVudC5rZXkpO1xyXG5cclxuICAgIGlmIChoYXNBY3Rpb24gfHwgaXNMZXR0ZXIpIHtcclxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoaGFzQWN0aW9uKSB7XHJcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChoYXNBY3Rpb24pIHtcclxuICAgICAgdGhpcy5rZXlBY3Rpb25zW2V2ZW50LmNvZGVdKGl0ZW1JbmRleCk7XHJcbiAgICB9IGVsc2UgaWYgKGlzTGV0dGVyKSB7XHJcbiAgICAgIGNvbnN0IG5leHQgPSBmaW5kTmV4dEl0ZW1XaXRoUHJlZml4KFxyXG4gICAgICAgIHRoaXMucGFyc2VkSXRlbXMsXHJcbiAgICAgICAgaXRlbUluZGV4LFxyXG4gICAgICAgIGV2ZW50LmtleVxyXG4gICAgICApO1xyXG4gICAgICBpZiAobmV4dCAhPT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuZm9jdXNJdGVtKG5leHQpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW52b2tlSXRlbUNsaWNrKGl0ZW06IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBpZiAobWVudUl0ZW1IYXNSb3V0ZShpdGVtKSAmJiBpdGVtLnJvdXRlckxpbmspIHtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoaXRlbS5yb3V0ZXJMaW5rKTtcclxuICAgIH1cclxuICAgIHRoaXMub25JdGVtQ2xpY2soaXRlbSk7XHJcbiAgICB0aGlzLmF1dG9mb2N1c1N1Ym1lbnVJdGVtID0gJ2ZpcnN0JztcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJJdGVtcygpIHtcclxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLnJkdFJvdXRlci5wYXJzZUFic29sdXRlVXJsKCk7XHJcbiAgICBpZiAoIWN1cnJlbnQpIHtcclxuICAgICAgdGhpcy5wYXJzZWRJdGVtcyA9IHRoaXMuYWxsUGFyc2VkSXRlbXM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnBhcnNlZEl0ZW1zID0gdGhpcy5maWx0ZXJSZWModGhpcy5hbGxQYXJzZWRJdGVtcywgY3VycmVudCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNoaWxkUm91dGVzTWFwID0gZ2V0Q2hpbGRSb3V0ZXNNYXAodGhpcy5wYXJzZWRJdGVtcyk7XHJcbiAgICB0aGlzLmxpc3RlblNob3J0Y3V0cygpO1xyXG4gICAgdGhpcy5jZC5tYXJrRm9yQ2hlY2soKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBmaWx0ZXJSZWMoXHJcbiAgICBpdGVtczogUGFyc2VkUmR0TWVudUl0ZW1bXSxcclxuICAgIGN1cnJlbnQ6IHsgcm91dGU6IFJkdFJvdXRlOyBwYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4gfVxyXG4gICk6IFBhcnNlZFJkdE1lbnVJdGVtW10ge1xyXG4gICAgbGV0IGN1cnJlbnRQYXJlbnQgPSBjdXJyZW50LnJvdXRlO1xyXG4gICAgY29uc3QgY3VycmVudFBhcmFtcyA9IGN1cnJlbnQucGFyYW1zO1xyXG5cclxuICAgIGNvbnN0IGZpbHRlcmVkID0gaXRlbXMuZmlsdGVyKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmICghaXRlbS5yZXF1aXJlZFBhcmVudCkge1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IHJlcXVpcmVkID0gaXRlbS5yZXF1aXJlZFBhcmVudDtcclxuICAgICAgd2hpbGUgKGN1cnJlbnRQYXJlbnQuYWJzb2x1dGVQYXRoICE9PSByZXF1aXJlZC5hYnNvbHV0ZVBhdGgpIHtcclxuICAgICAgICBjdXJyZW50UGFyZW50ID0gY3VycmVudFBhcmVudC5wYXJlbnQhO1xyXG4gICAgICAgIGlmICghY3VycmVudFBhcmVudCkge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBsZXQgcmVxdWlyZWRQYXJlbnQ6IFJkdFJvdXRlIHwgbnVsbCA9IHJlcXVpcmVkO1xyXG4gICAgICBkbyB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IHJlcXVpcmVkUGFyZW50LmFic29sdXRlUGF0aDtcclxuICAgICAgICBpZiAocGF0aCBpbiBjdXJyZW50UGFyYW1zKSB7XHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiByZXF1aXJlZFBhcmVudC5zdGF0aWNQYXJhbXMpIHtcclxuICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbXNbcGF0aF1ba2V5XSAhPT0gcmVxdWlyZWRQYXJlbnQuc3RhdGljUGFyYW1zW2tleV0pIHtcclxuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmVxdWlyZWRQYXJlbnQgPSByZXF1aXJlZFBhcmVudC5wYXJlbnQ7XHJcbiAgICAgIH0gd2hpbGUgKHJlcXVpcmVkUGFyZW50KTtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gZmlsdGVyZWQubWFwKChpdGVtKSA9PiB7XHJcbiAgICAgIGlmIChpdGVtLml0ZW1zKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBpdGVtczogdGhpcy5maWx0ZXJSZWMoaXRlbS5pdGVtcywgY3VycmVudCksXHJcbiAgICAgICAgfTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gaXRlbTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgaW52b2tlSXRlbUNsaWNrQnlJbmRleChpdGVtSW5kZXg6IG51bWJlcikge1xyXG4gICAgY29uc3QgaXRlbSA9IHRoaXMucGFyc2VkSXRlbXNbaXRlbUluZGV4XTtcclxuICAgIGlmICghaXRlbSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLmludm9rZUl0ZW1DbGljayhpdGVtKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBvcGVuU3VibWVudShcclxuICAgIGl0ZW1JbmRleDogbnVtYmVyLFxyXG4gICAgdmlzaWJsZUZvY3VzOiAnZmlyc3QnIHwgJ2xhc3QnLFxyXG4gICAgc3JjOiBSZHRNZW51RXhwYW5kU291cmNlXHJcbiAgKSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGl0ZW1JbmRleCA8IHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoICYmXHJcbiAgICAgIG1lbnVJdGVtSGFzQ2hpbGRyZW4odGhpcy5wYXJzZWRJdGVtc1tpdGVtSW5kZXhdKVxyXG4gICAgKSB7XHJcbiAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLnBhcnNlZEl0ZW1zW2l0ZW1JbmRleF07XHJcbiAgICAgIHRoaXMuYXV0b2ZvY3VzU3VibWVudUl0ZW0gPSB2aXNpYmxlRm9jdXM7XHJcbiAgICAgIHRoaXMuZXhwYW5kZWRDaGlsZCA9IHsgaXRlbSwgc3JjIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZm9jdXNJdGVtKGl0ZW06IG51bWJlciB8IFBhcnNlZFJkdE1lbnVJdGVtKSB7XHJcbiAgICBsZXQgaXRlbUluZGV4OiBudW1iZXI7XHJcblxyXG4gICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykge1xyXG4gICAgICBpdGVtSW5kZXggPSBpdGVtO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaXRlbUluZGV4ID0gdGhpcy5wYXJzZWRJdGVtcy5pbmRleE9mKGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChpdGVtSW5kZXggPj0gMCAmJiBpdGVtSW5kZXggPCB0aGlzLmZvY3VzYWJsZUVsZW1lbnRzLmxlbmd0aCkge1xyXG4gICAgICB0aGlzLmJsdXJBbGxGb2N1c2FibGUoKTtcclxuICAgICAgdGhpcy5mb2N1c0ZvY3VzYWJsZShpdGVtSW5kZXgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzTmV4dEl0ZW0oaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IG5leHQgPSAoaXRlbUluZGV4ICsgMSkgJSB0aGlzLnBhcnNlZEl0ZW1zLmxlbmd0aDtcclxuICAgIHRoaXMuZm9jdXNJdGVtKG5leHQpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGZvY3VzUHJldkl0ZW0oaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IHByZXYgPVxyXG4gICAgICAoaXRlbUluZGV4IC0gMSArIHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoKSAlIHRoaXMucGFyc2VkSXRlbXMubGVuZ3RoO1xyXG4gICAgdGhpcy5mb2N1c0l0ZW0ocHJldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgYmx1ckFsbEZvY3VzYWJsZSgpIHtcclxuICAgIHRoaXMuZm9jdXNhYmxlRWxlbWVudHMuZm9yRWFjaCgoZWwpID0+XHJcbiAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2xhc3MoZWwubmF0aXZlRWxlbWVudCwgRk9DVVNfVklTSUJMRSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZm9jdXNGb2N1c2FibGUoaXRlbUluZGV4OiBudW1iZXIpIHtcclxuICAgIGNvbnN0IGVsUmVmID0gdGhpcy5mb2N1c2FibGVFbGVtZW50cy5nZXQoaXRlbUluZGV4KTtcclxuICAgIGlmIChlbFJlZikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGVsUmVmLm5hdGl2ZUVsZW1lbnQsIEZPQ1VTX1ZJU0lCTEUpO1xyXG4gICAgICBlbFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cG9pbnRlcm1vdmUnLCBbJyRldmVudCddKVxyXG4gIHByb3RlY3RlZCBvblBvaW50ZXJNb3ZlKGV2ZW50OiBQb2ludGVyRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLm9wZW5PbkhvdmVyICYmIHRoaXMuZXhwYW5kZWRDaGlsZCkge1xyXG4gICAgICBjb25zdCBoaXRib3hlcyA9IHRoaXMuZ2V0SGl0Ym94ZXMoKTtcclxuICAgICAgY29uc3QgaXNJbnNpZGUgPSBoaXRib3hlcy5zb21lKChoaXRib3gpID0+XHJcbiAgICAgICAgdGhpcy5pc1BvaW50ZXJJbnNpZGVIaXRib3goaGl0Ym94LnJlY3QsIGV2ZW50KVxyXG4gICAgICApO1xyXG4gICAgICBmb3IgKGxldCBpID0gaGl0Ym94ZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICBjb25zdCBoaXRib3ggPSBoaXRib3hlc1tpXTtcclxuICAgICAgICBpZiAoIWhpdGJveC5maXhlZCAmJiAhaXNJbnNpZGUpIHtcclxuICAgICAgICAgIGhpdGJveC5jbG9zZSgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyBDbG9zZXMgbWVudSBpZiB1c2VyIG5hdmlnYXRlcyBvdXRzaWRlIGl0IHVzaW5nIFRhYi5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6Zm9jdXNvdXQnLCBbJyRldmVudCddKVxyXG4gIHByb3RlY3RlZCBjaGVja0FjdGl2ZUVsZW1lbnQoZXZlbnQ6IEZvY3VzRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmNsb3NlT25Gb2N1c091dCAmJiAhdGhpcy5vcGVuT25Ib3Zlcikge1xyXG4gICAgICBjb25zdCB0aGlzRWwgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7XHJcbiAgICAgIGlmICghKHRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB8fCAhdGhpc0VsLmNvbnRhaW5zKHRhcmdldCkpIHtcclxuICAgICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXHJcbiAgcHJvdGVjdGVkIG9uRG9jdW1lbnRDbGljayhldmVudDogUG9pbnRlckV2ZW50KSB7XHJcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICBjb25zdCBlbFJlZiA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGlmICghZWxSZWYuY29udGFpbnModGFyZ2V0KSkge1xyXG4gICAgICB0aGlzLmNsb3NlU3VibWVudXMoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtZWFzdXJlKCkge1xyXG4gICAgdGhpcy5tZWFzdXJlQnV0dG9uQ29udGFpbmVyKCk7XHJcbiAgICB0aGlzLm1lYXN1cmVDbGllbnRTaXplKCk7XHJcbiAgICB0aGlzLnJlYWRNYXJnaW4oKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWFkTWFyZ2luKCkge1xyXG4gICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50KTtcclxuICAgIGNvbnN0IHRvcFZhbCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcclxuICAgICAgUkRUX01FTlVfTUFSR0lOX1RPUF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgYm90dG9tVmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fQk9UVE9NX1BST1BFUlRZX05BTUVcclxuICAgICk7XHJcbiAgICBjb25zdCBsZWZ0VmFsID0gY29tcHV0ZWRTdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFxyXG4gICAgICBSRFRfTUVOVV9NQVJHSU5fTEVGVF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgY29uc3QgcmlnaHRWYWwgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoXHJcbiAgICAgIFJEVF9NRU5VX01BUkdJTl9SSUdIVF9QUk9QRVJUWV9OQU1FXHJcbiAgICApO1xyXG4gICAgdGhpcy5fYm9keU1hcmdpbiA9IHtcclxuICAgICAgdG9wOiBwYXJzZUludCh0b3BWYWwpIHx8IDAsXHJcbiAgICAgIGJvdHRvbTogcGFyc2VJbnQoYm90dG9tVmFsKSB8fCAwLFxyXG4gICAgICBsZWZ0OiBwYXJzZUludChsZWZ0VmFsKSB8fCAwLFxyXG4gICAgICByaWdodDogcGFyc2VJbnQocmlnaHRWYWwpIHx8IDAsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIG1lYXN1cmVDbGllbnRTaXplKCkge1xyXG4gICAgdGhpcy5fY2xpZW50U2l6ZSA9IHtcclxuICAgICAgd2lkdGg6IHRoaXMuZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxcclxuICAgICAgaGVpZ2h0OiB0aGlzLmRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBtZWFzdXJlQnV0dG9uQ29udGFpbmVyKCkge1xyXG4gICAgY29uc3QgZWwgPSB0aGlzLmJ1dHRvbkNvbnRhaW5lcj8ubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChlbCkge1xyXG4gICAgICB0aGlzLl9idXR0b25Db250YWluZXJSZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9idXR0b25Db250YWluZXJSZWN0ID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGxpc3RlbldpbmRvd1Jlc2l6ZSgpIHtcclxuICAgIGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0aHJvdHRsZVRpbWUoMCwgYW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIsIHsgdHJhaWxpbmc6IHRydWUgfSksXHJcbiAgICAgICAgdGFrZVVudGlsRGVzdHJveWVkKHRoaXMuZGVzdHJveVJlZilcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICB0aGlzLm1lYXN1cmUoKTtcclxuICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQ2hpbGRyZW4oKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbGlzdGVuU2hvcnRjdXRzKCkge1xyXG4gICAgY29uc3QgaXRlbXNXaXRoU2hvcnRjdXRzID0gZ2V0TWVudUl0ZW1zU2hvcnRjdXRzKHRoaXMucGFyc2VkSXRlbXMpO1xyXG4gICAgY29uc3Qgc2hvcnRjdXRzOiBSZHRTaG9ydGN1dFtdID0gaXRlbXNXaXRoU2hvcnRjdXRzLm1hcChcclxuICAgICAgKGl0KSA9PiBpdC5zaG9ydGN1dFxyXG4gICAgKTtcclxuXHJcbiAgICB0aGlzLnNob3J0Y3V0TWFwID0gdGhpcy5nZXRTaG9ydGN1dE1hcChpdGVtc1dpdGhTaG9ydGN1dHMpO1xyXG4gICAgdGhpcy5zaG9ydGN1dFN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5zaG9ydGN1dFN1YiA9IHRoaXMuc2hvcnRjdXRTZXJ2aWNlXHJcbiAgICAgIC5saXN0ZW4oc2hvcnRjdXRzKVxyXG4gICAgICAucGlwZSh0YWtlVW50aWxEZXN0cm95ZWQodGhpcy5kZXN0cm95UmVmKSlcclxuICAgICAgLnN1YnNjcmliZSgoZXZ0KSA9PiB0aGlzLm9uU2hvcnRjdXQoZXZ0LnNob3J0Y3V0KSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0U2hvcnRjdXRNYXAoXHJcbiAgICBpdGVtc1dpdGhTaG9ydGN1dHM6IFBhcnNlZFJkdE1lbnVJdGVtV2l0aFNob3J0Y3V0W11cclxuICApIHtcclxuICAgIGNvbnN0IHNob3J0Y3V0TWFwOiBSZWNvcmQ8c3RyaW5nLCBQYXJzZWRSZHRNZW51SXRlbVtdPiA9IHt9O1xyXG4gICAgaXRlbXNXaXRoU2hvcnRjdXRzLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgc2hvcnRjdXRNYXBbaXRlbS5zaG9ydGN1dC5ob3RrZXlzVmFsdWVdID0gaXRlbS5wYXRoO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gc2hvcnRjdXRNYXA7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgb25TaG9ydGN1dChzaG9ydGN1dDogUmR0U2hvcnRjdXQpIHtcclxuICAgIGNvbnN0IHBhdGggPSB0aGlzLnNob3J0Y3V0TWFwW3Nob3J0Y3V0LmhvdGtleXNWYWx1ZV07XHJcbiAgICBpZiAoIXBhdGgpIHtcclxuICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgIGBNZW51IHNob3J0Y3V0ICR7c2hvcnRjdXQuaG90a2V5c1ZhbHVlfSB3YXMgZGV0ZWN0ZWQsIGJ1dCB0aGVyZSBpcyBubyBwYXRoIGFzc29jaWF0ZWQgd2l0aCBpdC5gLFxyXG4gICAgICAgIHRoaXMuc2hvcnRjdXRNYXBcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGxhc3QgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XHJcbiAgICBjb25zdCBoYXNSb3V0ZSA9IG1lbnVJdGVtSGFzUm91dGUobGFzdCk7XHJcbiAgICBjb25zdCBoYXNDb21tYW5kID0gdHlwZW9mIGxhc3QuY29tbWFuZCA9PT0gJ2Z1bmN0aW9uJztcclxuICAgIGlmIChoYXNSb3V0ZSB8fCBoYXNDb21tYW5kKSB7XHJcbiAgICAgIHRoaXMuY2xvc2VTdWJtZW51cyhmYWxzZSk7XHJcbiAgICAgIGlmIChoYXNDb21tYW5kKSB7XHJcbiAgICAgICAgbGFzdC5jb21tYW5kISgpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChoYXNSb3V0ZSkge1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKGxhc3Qucm91dGVyTGluayEpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmFjdGl2YXRlSXRlbVJlY3Vyc2l2ZWx5KHBhdGgsIFJkdE1lbnVFeHBhbmRTb3VyY2UuU2hvcnRjdXQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFjdGl2YXRlSXRlbVJlY3Vyc2l2ZWx5KFxyXG4gICAgcGF0aDogUGFyc2VkUmR0TWVudUl0ZW1bXSxcclxuICAgIHNyYzogUmR0TWVudUV4cGFuZFNvdXJjZVxyXG4gICkge1xyXG4gICAgY29uc3QgY2hpbGRyZW4gPSBbLi4ucGF0aF07XHJcblxyXG4gICAgaWYgKHRoaXMuc2hvcnRjdXRNb2RlID09PSBSZHRNZW51U2hvcnRjdXRNb2RlLk9QRU5fU1VCTUVOVSkge1xyXG4gICAgICBjb25zdCBsYXN0ID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07XHJcbiAgICAgIGlmIChtZW51SXRlbUhhc0NoaWxkcmVuKGxhc3QpICYmIGxhc3QuaXRlbXNbMF0pIHtcclxuICAgICAgICBjaGlsZHJlbi5wdXNoKGxhc3QuaXRlbXNbMF0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGhpc0l0ZW0gPSBjaGlsZHJlbi5zaGlmdCgpITtcclxuXHJcbiAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLmV4cGFuZGVkQ2hpbGQgPSB7IGl0ZW06IHRoaXNJdGVtLCBzcmMgfTtcclxuICAgICAgY29uc3Qgb3ZlcmxheSA9IHRoaXMuY2hpbGRyZW4uZmluZCgoY2hpbGQpID0+IGNoaWxkLml0ZW0gPT09IHRoaXNJdGVtKTtcclxuICAgICAgb3ZlcmxheSEuZm9jdXNJdGVtUmVjdXJzaXZlbHkoY2hpbGRyZW4pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5leHBhbmRlZENoaWxkID0gbnVsbDtcclxuICAgICAgdGhpcy5mb2N1c0l0ZW0odGhpc0l0ZW0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNQb2ludGVySW5zaWRlSGl0Ym94KGhpdGJveDogRE9NUmVjdCwgZXZlbnQ6IFBvaW50ZXJFdmVudCkge1xyXG4gICAgY29uc3QgcmVjdCA9IGhpdGJveDtcclxuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYO1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFk7XHJcblxyXG4gICAgcmV0dXJuIChcclxuICAgICAgeCA+PSByZWN0LmxlZnQgLSB0aGlzLmhpdGJveE1hcmdpbiAmJlxyXG4gICAgICB4IDw9IHJlY3QucmlnaHQgKyB0aGlzLmhpdGJveE1hcmdpbiAmJlxyXG4gICAgICB5ID49IHJlY3QudG9wIC0gdGhpcy5oaXRib3hNYXJnaW4gJiZcclxuICAgICAgeSA8PSByZWN0LmJvdHRvbSArIHRoaXMuaGl0Ym94TWFyZ2luXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgZ2V0SGl0Ym94ZXMoKTogeyByZWN0OiBET01SZWN0OyBmaXhlZDogYm9vbGVhbjsgY2xvc2U6ICgpID0+IHZvaWQgfVtdIHtcclxuICAgIGNvbnN0IGJveGVzID0gdGhpcy5nZXRPcGVuTWVudUJvdW5kaW5nQm94ZXMoKTtcclxuICAgIGNvbnN0IGJ1dHRvbkNvbnRhaW5lclJlY3QgPSB0aGlzLmJ1dHRvbkNvbnRhaW5lclJlY3Q7XHJcbiAgICBpZiAoYnV0dG9uQ29udGFpbmVyUmVjdCkge1xyXG4gICAgICBib3hlcy5wdXNoKHsgcmVjdDogYnV0dG9uQ29udGFpbmVyUmVjdCwgZml4ZWQ6IHRydWUsIGNsb3NlOiAoKSA9PiB7fSB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBib3hlcztcclxuICB9XHJcblxyXG4gIGdldE9wZW5NZW51Qm91bmRpbmdCb3hlcygpIHtcclxuICAgIGNvbnN0IGJveGVzOiB7IHJlY3Q6IERPTVJlY3Q7IGZpeGVkOiBib29sZWFuOyBjbG9zZTogKCkgPT4gdm9pZCB9W10gPSBbXTtcclxuICAgIHRoaXMuY2hpbGRyZW4uZm9yRWFjaCgob3ZlcmxheSkgPT4ge1xyXG4gICAgICB0aGlzLmdldE9wZW5NZW51Qm91bmRpbmdCb3hlc1JlYyhvdmVybGF5LCBib3hlcyk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBib3hlcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3Blbk1lbnVCb3VuZGluZ0JveGVzUmVjKFxyXG4gICAgb3ZlcmxheTogUmR0TWVudU92ZXJsYXlDb21wb25lbnQsXHJcbiAgICBib3hlczogeyByZWN0OiBET01SZWN0OyBmaXhlZDogYm9vbGVhbjsgY2xvc2U6ICgpID0+IHZvaWQgfVtdXHJcbiAgKTogYm9vbGVhbiB7XHJcbiAgICBpZiAob3ZlcmxheS5leHBhbmRlZCkge1xyXG4gICAgICBsZXQgc29tZUJ5Q2xpY2sgPSBmYWxzZTtcclxuICAgICAgb3ZlcmxheS5jaGlsZHJlbi5mb3JFYWNoKFxyXG4gICAgICAgIChjaGlsZCkgPT5cclxuICAgICAgICAgIChzb21lQnlDbGljayB8fD0gdGhpcy5nZXRPcGVuTWVudUJvdW5kaW5nQm94ZXNSZWMoY2hpbGQsIGJveGVzKSlcclxuICAgICAgKTtcclxuICAgICAgY29uc3QgZml4ZWQgPVxyXG4gICAgICAgIHNvbWVCeUNsaWNrIHx8IG92ZXJsYXkuc2VsZkV4cGFuZFNyYyA9PT0gUmR0TWVudUV4cGFuZFNvdXJjZS5DbGljaztcclxuICAgICAgYm94ZXMucHVzaCh7XHJcbiAgICAgICAgcmVjdDogb3ZlcmxheS5ib3gsXHJcbiAgICAgICAgZml4ZWQ6IGZpeGVkLFxyXG4gICAgICAgIGNsb3NlOiAoKSA9PiBvdmVybGF5LmNsb3NlU2VsZigpLFxyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIGZpeGVkO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxufVxyXG4iXX0=