@seniorsistemas/angular-components 17.1.4 → 17.1.6

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 (35) hide show
  1. package/bundles/seniorsistemas-angular-components.umd.js +168 -130
  2. package/bundles/seniorsistemas-angular-components.umd.js.map +1 -1
  3. package/bundles/seniorsistemas-angular-components.umd.min.js +2 -2
  4. package/bundles/seniorsistemas-angular-components.umd.min.js.map +1 -1
  5. package/components/dynamic-form/components/lookup/lookup.component.d.ts +46 -14
  6. package/components/gantt/components/gantt/gantt.d.ts +1 -3
  7. package/components/gantt/components/side-table/side-table.component.d.ts +4 -1
  8. package/components/gantt/gantt.component.d.ts +1 -0
  9. package/components/gantt/models/view-mode.d.ts +1 -0
  10. package/esm2015/components/dynamic-form/components/lookup/lookup.component.js +43 -52
  11. package/esm2015/components/dynamic-form/configurations/fields/lookup-field.js +1 -11
  12. package/esm2015/components/dynamic-form/dynamic-form.module.js +3 -1
  13. package/esm2015/components/gantt/components/gantt/bar.js +2 -2
  14. package/esm2015/components/gantt/components/gantt/gantt.js +92 -64
  15. package/esm2015/components/gantt/components/gantt/utils/date-utils.js +3 -2
  16. package/esm2015/components/gantt/components/side-table/side-table.component.js +7 -1
  17. package/esm2015/components/gantt/gantt.component.js +14 -3
  18. package/esm2015/components/gantt/models/view-mode.js +2 -1
  19. package/esm2015/locale/fallback.js +11 -1
  20. package/esm5/components/dynamic-form/components/lookup/lookup.component.js +43 -52
  21. package/esm5/components/dynamic-form/configurations/fields/lookup-field.js +1 -11
  22. package/esm5/components/dynamic-form/dynamic-form.module.js +3 -1
  23. package/esm5/components/gantt/components/gantt/bar.js +2 -2
  24. package/esm5/components/gantt/components/gantt/gantt.js +95 -67
  25. package/esm5/components/gantt/components/gantt/utils/date-utils.js +3 -2
  26. package/esm5/components/gantt/components/side-table/side-table.component.js +7 -1
  27. package/esm5/components/gantt/gantt.component.js +14 -3
  28. package/esm5/components/gantt/models/view-mode.js +2 -1
  29. package/esm5/locale/fallback.js +11 -1
  30. package/fesm2015/seniorsistemas-angular-components.js +165 -127
  31. package/fesm2015/seniorsistemas-angular-components.js.map +1 -1
  32. package/fesm5/seniorsistemas-angular-components.js +168 -130
  33. package/fesm5/seniorsistemas-angular-components.js.map +1 -1
  34. package/package.json +1 -1
  35. package/seniorsistemas-angular-components.metadata.json +1 -1
@@ -148,7 +148,11 @@ export class Gantt {
148
148
  update_view_scale(view_mode) {
149
149
  this.options.viewMode = view_mode;
150
150
  // this.isHourView = false;
151
- if (view_mode === ViewMode.Hour) {
151
+ if (view_mode === ViewMode.QuarterHour) {
152
+ this.options.step = 24 / 24 / 4;
153
+ this.options.columnWidth = 50;
154
+ }
155
+ else if (view_mode === ViewMode.Hour) {
152
156
  this.options.step = 24 / 24;
153
157
  this.options.columnWidth = 50;
154
158
  }
@@ -181,7 +185,7 @@ export class Gantt {
181
185
  this.setup_date_values();
182
186
  }
183
187
  setup_gantt_dates() {
184
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p;
188
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
185
189
  this._minDate = null;
186
190
  this._maxDate = null;
187
191
  for (let task of this.tasks) {
@@ -193,36 +197,37 @@ export class Gantt {
193
197
  this._maxDate = task.end;
194
198
  }
195
199
  }
196
- this._realMinDate = this.minDate;
197
- this._realMaxDate = this.maxDate;
198
200
  switch (this.options.viewMode) {
201
+ case ViewMode.QuarterHour:
202
+ this._minDate = DateUtils.add(this.minDate, -((_a = this.options.marginBeforeStart) !== null && _a !== void 0 ? _a : 15), "minutes");
203
+ this._maxDate = DateUtils.add(this.maxDate, (_b = this.options.marginAfterEnd) !== null && _b !== void 0 ? _b : 15, "minutes");
199
204
  case ViewMode.Hour:
200
- this._minDate = DateUtils.add(this.minDate, -((_a = this.options.marginBeforeStart) !== null && _a !== void 0 ? _a : 1), "hour");
201
- this._maxDate = DateUtils.add(this.maxDate, (_b = this.options.marginAfterEnd) !== null && _b !== void 0 ? _b : 1, "hour");
205
+ this._minDate = DateUtils.add(this.minDate, -((_c = this.options.marginBeforeStart) !== null && _c !== void 0 ? _c : 1), "hour");
206
+ this._maxDate = DateUtils.add(this.maxDate, (_d = this.options.marginAfterEnd) !== null && _d !== void 0 ? _d : 1, "hour");
202
207
  break;
203
208
  case ViewMode.QuarterDay:
204
- this._minDate = DateUtils.add(this.minDate, -((_c = this.options.marginBeforeStart) !== null && _c !== void 0 ? _c : 6), "hour");
205
- this._maxDate = DateUtils.add(this.maxDate, (_d = this.options.marginAfterEnd) !== null && _d !== void 0 ? _d : 6, "hour");
209
+ this._minDate = DateUtils.add(this.minDate, -((_e = this.options.marginBeforeStart) !== null && _e !== void 0 ? _e : 6), "hour");
210
+ this._maxDate = DateUtils.add(this.maxDate, (_f = this.options.marginAfterEnd) !== null && _f !== void 0 ? _f : 6, "hour");
206
211
  break;
207
212
  case ViewMode.HalfDay:
208
- this._minDate = DateUtils.add(this.minDate, -((_e = this.options.marginBeforeStart) !== null && _e !== void 0 ? _e : 12), "hour");
209
- this._maxDate = DateUtils.add(this.maxDate, (_f = this.options.marginAfterEnd) !== null && _f !== void 0 ? _f : 12, "hour");
213
+ this._minDate = DateUtils.add(this.minDate, -((_g = this.options.marginBeforeStart) !== null && _g !== void 0 ? _g : 12), "hour");
214
+ this._maxDate = DateUtils.add(this.maxDate, (_h = this.options.marginAfterEnd) !== null && _h !== void 0 ? _h : 12, "hour");
210
215
  break;
211
216
  case ViewMode.Day:
212
- this._minDate = DateUtils.add(this.minDate, -((_g = this.options.marginBeforeStart) !== null && _g !== void 0 ? _g : 1), "day");
213
- this._maxDate = DateUtils.add(this.maxDate, (_h = this.options.marginAfterEnd) !== null && _h !== void 0 ? _h : 1, "day");
217
+ this._minDate = DateUtils.add(this.minDate, -((_j = this.options.marginBeforeStart) !== null && _j !== void 0 ? _j : 1), "day");
218
+ this._maxDate = DateUtils.add(this.maxDate, (_k = this.options.marginAfterEnd) !== null && _k !== void 0 ? _k : 1, "day");
214
219
  break;
215
220
  case ViewMode.Week:
216
- this._minDate = DateUtils.add(this.minDate, -((_j = this.options.marginBeforeStart) !== null && _j !== void 0 ? _j : 1), "week");
217
- this._maxDate = DateUtils.add(this.maxDate, (_k = this.options.marginAfterEnd) !== null && _k !== void 0 ? _k : 1, "week");
221
+ this._minDate = DateUtils.add(this.minDate, -((_l = this.options.marginBeforeStart) !== null && _l !== void 0 ? _l : 1), "week");
222
+ this._maxDate = DateUtils.add(this.maxDate, (_m = this.options.marginAfterEnd) !== null && _m !== void 0 ? _m : 1, "week");
218
223
  break;
219
224
  case ViewMode.Month:
220
- this._minDate = DateUtils.add(this.minDate, -((_l = this.options.marginBeforeStart) !== null && _l !== void 0 ? _l : 1), "month");
221
- this._maxDate = DateUtils.add(this.maxDate, (_m = this.options.marginAfterEnd) !== null && _m !== void 0 ? _m : 1, "month");
225
+ this._minDate = DateUtils.add(this.minDate, -((_o = this.options.marginBeforeStart) !== null && _o !== void 0 ? _o : 1), "month");
226
+ this._maxDate = DateUtils.add(this.maxDate, (_p = this.options.marginAfterEnd) !== null && _p !== void 0 ? _p : 1, "month");
222
227
  break;
223
228
  case ViewMode.Year:
224
- this._minDate = DateUtils.add(this.minDate, -((_o = this.options.marginBeforeStart) !== null && _o !== void 0 ? _o : 1), "year");
225
- this._maxDate = DateUtils.add(this.maxDate, (_p = this.options.marginAfterEnd) !== null && _p !== void 0 ? _p : 1, "year");
229
+ this._minDate = DateUtils.add(this.minDate, -((_q = this.options.marginBeforeStart) !== null && _q !== void 0 ? _q : 1), "year");
230
+ this._maxDate = DateUtils.add(this.maxDate, (_r = this.options.marginAfterEnd) !== null && _r !== void 0 ? _r : 1, "year");
226
231
  break;
227
232
  }
228
233
  }
@@ -250,8 +255,6 @@ export class Gantt {
250
255
  const columnWidth = (this.options.containerWidth - 1) / this.dates.length;
251
256
  this.options.columnWidth = columnWidth < 45 ? 45 : columnWidth;
252
257
  }
253
- console.log("cur_date", cur_date);
254
- console.log("dates", this.dates);
255
258
  }
256
259
  bind_events() {
257
260
  this.bind_grid_click();
@@ -356,23 +359,24 @@ export class Gantt {
356
359
  this.tasks.length;
357
360
  for (let date of this.dates) {
358
361
  let tick_class = "tick";
359
- // thick tick for monday
360
- if (this.view_is(ViewMode.Day) && date.getDate() === 1) {
362
+ if (this.view_is(ViewMode.QuarterHour) && date.getHours() === 0 && date.getMinutes() === 0) {
363
+ // thick tick for first hour of day.
364
+ tick_class += " thick";
365
+ }
366
+ else if (this.view_is([ViewMode.Hour, ViewMode.QuarterDay, ViewMode.HalfDay]) && date.getHours() === 0) {
367
+ // thick tick for first hour of day.
361
368
  tick_class += " thick";
362
369
  }
363
- // thick tick for first week
364
- if (this.view_is(ViewMode.Week) &&
365
- date.getDate() >= 1 &&
366
- date.getDate() < 8) {
370
+ else if (this.view_is(ViewMode.Day) && date.getDate() === 1) {
371
+ // thick tick for monday
367
372
  tick_class += " thick";
368
373
  }
369
- // thick ticks for quarters
370
- if (this.view_is(ViewMode.Month) && date.getMonth() % 3 === 0) {
374
+ else if (this.view_is(ViewMode.Week) && date.getDate() >= 1 && date.getDate() < 8) {
375
+ // thick tick for first week
371
376
  tick_class += " thick";
372
377
  }
373
- // Thick ticks for hours
374
- if (this.view_is(ViewMode.Hour) &&
375
- date.getHours() == 0) {
378
+ else if (this.view_is(ViewMode.Month) && date.getMonth() % 3 === 0) {
379
+ // thick ticks for quarters
376
380
  tick_class += " thick";
377
381
  }
378
382
  createSVG("path", {
@@ -401,7 +405,7 @@ export class Gantt {
401
405
  let x = 0;
402
406
  for (let date of this.dates) {
403
407
  let y = (this.options.headerHeight + this.options.padding) / 2;
404
- let isToday = date.toString() == DateUtils.today();
408
+ let isToday = date == DateUtils.today();
405
409
  let isWeekend = (date.getDay() == 0 || date.getDay() == 6);
406
410
  let className;
407
411
  if (isToday) {
@@ -431,19 +435,8 @@ export class Gantt {
431
435
  }
432
436
  make_dates() {
433
437
  const dates = this.get_dates_to_draw();
434
- const isHourView = this.view_is([ViewMode.Hour, ViewMode.QuarterDay, ViewMode.HalfDay]);
435
- let counter = 0;
436
438
  for (let i = 0; i < dates.length; i++) {
437
439
  const date = dates[i];
438
- if (isHourView && date.date >= this._realMinDate && date.date <= this._realMaxDate) {
439
- createSVG("text", {
440
- x: date.lower_x,
441
- y: date.lower_y,
442
- innerHTML: `H${counter++ * this.options.step}`,
443
- class: "title-1",
444
- append_to: this.layers.date,
445
- });
446
- }
447
440
  createSVG("text", {
448
441
  x: date.lower_x,
449
442
  y: date.lower_y + 20,
@@ -451,6 +444,15 @@ export class Gantt {
451
444
  class: "title-2",
452
445
  append_to: this.layers.date,
453
446
  });
447
+ if (date.middle_text) {
448
+ createSVG("text", {
449
+ x: date.middle_x,
450
+ y: date.middle_y,
451
+ innerHTML: date.middle_text,
452
+ class: "middle-text",
453
+ append_to: this.layers.date,
454
+ });
455
+ }
454
456
  if (date.upper_text) {
455
457
  const $upper_text = createSVG("text", {
456
458
  x: date.upper_x,
@@ -480,67 +482,93 @@ export class Gantt {
480
482
  last_date = DateUtils.add(date, 1, "year");
481
483
  }
482
484
  const date_text = {
483
- hourLower: DateUtils.format(date, "HH:mm", this.options.language),
484
- quarterDayLower: DateUtils.format(date, "HH:mm", this.options.language),
485
- halfDayLower: DateUtils.format(date, "HH:mm", this.options.language),
486
- dayLower: DateUtils.format(date, "D", this.options.language),
487
- weekLower: date.getMonth() !== last_date.getMonth()
485
+ // quarter hour
486
+ quarterHourUpper: date.getDate() !== last_date.getDate()
488
487
  ? DateUtils.format(date, "D MMM", this.options.language)
489
- : DateUtils.format(date, "D", this.options.language),
490
- monthLower: DateUtils.format(date, "MMMM", this.options.language),
491
- yearLower: DateUtils.format(date, "YYYY", this.options.language),
488
+ : "",
489
+ quarterHourLower: DateUtils.format(date, "HH:mm", this.options.language),
490
+ // hour
491
+ hourUpper: date.getDate() !== last_date.getDate()
492
+ ? DateUtils.format(date, "D MMM", this.options.language)
493
+ : "",
494
+ hourLower: DateUtils.format(date, "HH:mm", this.options.language),
495
+ // quarter day
492
496
  quarterDayUpper: date.getDate() !== last_date.getDate()
493
497
  ? DateUtils.format(date, "D MMM", this.options.language)
494
498
  : "",
499
+ quarterDayLower: DateUtils.format(date, "HH:mm", this.options.language),
500
+ // half day
495
501
  halfDayUpper: (date.getDate() !== last_date.getDate())
496
502
  ? (((date.getMonth() !== last_date.getMonth()) || i < 2)
497
503
  ? DateUtils.format(date, "D MMM", this.options.language)
498
504
  : DateUtils.format(date, "D", this.options.language))
499
505
  : "",
506
+ halfDayLower: DateUtils.format(date, "HH:mm", this.options.language),
507
+ // day
500
508
  dayUpper: ((date.getMonth() !== last_date.getMonth()) || i === 0)
501
509
  ? DateUtils.format(date, "MMMM", this.options.language)
502
510
  : "",
511
+ dayMiddle: DateUtils.format(date, "ddd", this.options.language),
512
+ dayLower: DateUtils.format(date, "D", this.options.language),
513
+ // week
503
514
  weekUpper: date.getMonth() !== last_date.getMonth()
504
515
  ? DateUtils.format(date, "MMMM", this.options.language)
505
516
  : "",
517
+ weekLower: date.getMonth() !== last_date.getMonth()
518
+ ? DateUtils.format(date, "D MMM", this.options.language)
519
+ : DateUtils.format(date, "D", this.options.language),
520
+ // month
506
521
  monthUpper: date.getFullYear() !== last_date.getFullYear()
507
522
  ? DateUtils.format(date, "YYYY", this.options.language)
508
523
  : "",
524
+ monthLower: DateUtils.format(date, "MMMM", this.options.language),
525
+ // year
509
526
  yearUpper: date.getFullYear() !== last_date.getFullYear()
510
527
  ? DateUtils.format(date, "YYYY", this.options.language)
511
528
  : "",
512
- hourUpper: date.getDate() !== last_date.getDate()
513
- ? DateUtils.format(date, "D MMM", this.options.language)
514
- : "",
529
+ yearLower: DateUtils.format(date, "YYYY", this.options.language),
515
530
  };
516
531
  // Descontando 20 para adcionar uma segunda linha de informação no cabeçalho
517
532
  const base_pos = {
518
533
  x: i * this.options.columnWidth,
519
- lower_y: this.options.headerHeight - 20,
520
534
  upper_y: this.options.headerHeight - 20 - 25,
535
+ middle_y: this.options.headerHeight - 20,
536
+ lower_y: this.options.headerHeight - 20,
521
537
  };
522
- debugger;
523
538
  const x_pos = {
524
- hourLower: this.options.columnWidth / 2,
539
+ quarterHourUpper: (this.dates.length < 14) ? (this.options.columnWidth) : (this.options.columnWidth * 24 / 2),
540
+ quarterHourMiddle: this.options.columnWidth / 2,
541
+ quarterHourLower: this.options.columnWidth / 2,
525
542
  hourUpper: (this.dates.length < 14) ? (this.options.columnWidth) : (this.options.columnWidth * 24 / 2),
526
- quarterDayLower: this.options.columnWidth / 2,
543
+ hourMiddle: this.options.columnWidth / 2,
544
+ hourLower: this.options.columnWidth / 2,
527
545
  quarterDayUpper: this.options.columnWidth * 4 / 2,
528
- halfDayLower: this.options.columnWidth / 2,
546
+ quarterDayMiddle: this.options.columnWidth / 2,
547
+ quarterDayLower: this.options.columnWidth / 2,
529
548
  halfDayUpper: this.options.columnWidth * 2 / 2,
530
- dayLower: this.options.columnWidth / 2,
549
+ halfDayMiddle: this.options.columnWidth / 2,
550
+ halfDayLower: this.options.columnWidth / 2,
531
551
  dayUpper: (this.dates.length < 15) ? (this.options.columnWidth) : ((this.options.columnWidth * 30) / 2),
532
- weekLower: 0,
552
+ dayMiddle: this.options.columnWidth / 2 - 12,
553
+ dayLower: this.options.columnWidth / 2,
533
554
  weekUpper: (this.options.columnWidth * 4) / 2,
555
+ weekMiddle: 0,
556
+ weekLower: 0,
557
+ monthUpper: (this.dates.length < 15) ? (this.options.columnWidth) : ((this.options.columnWidth * 12) / 2),
558
+ monthMiddle: 0,
534
559
  monthLower: this.options.columnWidth / 2,
535
- monthUpper: (this.options.columnWidth * 12) / 2,
536
- yearLower: this.options.columnWidth / 2,
537
560
  yearUpper: (this.options.columnWidth * 30) / 2,
561
+ yearMiddle: this.options.columnWidth / 2,
562
+ yearLower: this.options.columnWidth / 2,
538
563
  };
539
564
  return {
540
565
  upper_text: date_text[`${this.options.viewMode}Upper`],
566
+ middle_text: date_text[`${this.options.viewMode}Middle`],
541
567
  lower_text: date_text[`${this.options.viewMode}Lower`],
542
568
  upper_x: base_pos.x + x_pos[`${this.options.viewMode}Upper`],
543
569
  upper_y: base_pos.upper_y,
570
+ middle_x: base_pos.x + x_pos[`${this.options.viewMode}Middle`],
571
+ middle_y: base_pos.middle_y,
544
572
  lower_x: base_pos.x + x_pos[`${this.options.viewMode}Lower`],
545
573
  lower_y: base_pos.lower_y,
546
574
  date,
@@ -777,4 +805,4 @@ export class Gantt {
777
805
  function generate_id(task) {
778
806
  return task.name + "_" + Math.random().toString(36).slice(2, 12);
779
807
  }
780
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHbEQsTUFBTSxPQUFPLEtBQUs7SUE0QmQsWUFBWSxPQUFZLEVBQUUsS0FBYSxFQUFFLE9BQWlCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQWZELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFXTyxhQUFhLENBQUMsT0FBWTtRQUM5QixJQUFJLFdBQVcsRUFBRSxlQUFlLENB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QyxLQUFLO2FBQ1osR0FBRyxDQUFDLENBQUMsSUFBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO2FBQy9CLE1BQU0sQ0FBQyxDQUFDLFNBQWMsRUFBRSxRQUFhLEVBQUUsRUFBRSxDQUN0QyxRQUFRLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FDL0MsQ0FBQztJQUNWLENBQUM7SUFFTyxLQUFLO1FBQ1QsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQzdCLENBQUM7Q0FDSjtBQUVELFNBQVMsV0FBVyxDQUFDLElBQVM7SUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGVVdGlscyB9IGZyb20gXCIuL3V0aWxzL2RhdGUtdXRpbHNcIjtcbmltcG9ydCB7ICQsIGNyZWF0ZVNWRyB9IGZyb20gXCIuL3V0aWxzL3N2Zy11dGlsc1wiO1xuaW1wb3J0IHsgQmFyIH0gZnJvbSBcIi4vYmFyXCI7XG5pbXBvcnQgeyBQb3B1cCB9IGZyb20gXCIuL3BvcHVwXCI7XG5pbXBvcnQgeyBBcnJvdyB9IGZyb20gXCIuL2Fycm93XCI7XG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSBcIi4uLy4uL21vZGVscy9vcHRpb25zXCI7XG5pbXBvcnQgeyBkZWZhdWx0T3B0aW9ucyB9IGZyb20gXCIuL2dhbnR0LW9wdGlvbnNcIjtcbmltcG9ydCB7IFZpZXdNb2RlIH0gZnJvbSBcIi4uLy4uL21vZGVscy92aWV3LW1vZGVcIjtcbmltcG9ydCB7IFRhc2ssIEVucmljaGVkVGFzayB9IGZyb20gXCIuLi8uLi9tb2RlbHNcIjtcblxuZXhwb3J0IGNsYXNzIEdhbnR0IHtcbiAgICBwdWJsaWMgb3B0aW9uczogT3B0aW9ucztcbiAgICBwdWJsaWMgdGFza3M6IEVucmljaGVkVGFza1tdO1xuICAgIHB1YmxpYyBkZXBlbmRlbmN5X21hcDogYW55O1xuXG4gICAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcbiAgICBwcml2YXRlIF9tYXhEYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX3JlYWxNaW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX3JlYWxNYXhEYXRlOiBEYXRlO1xuXG4gICAgcHVibGljIGRhdGVzOiBhbnk7XG4gICAgcHVibGljIGxheWVyczogYW55O1xuICAgIHB1YmxpYyBiYXJzOiBCYXJbXTtcbiAgICBwdWJsaWMgYXJyb3dzOiBBcnJvd1tdO1xuICAgIHB1YmxpYyBiYXJfYmVpbmdfZHJhZ2dlZDogYW55O1xuICAgIHB1YmxpYyAkc3ZnOiBhbnk7XG4gICAgcHVibGljICRjb250YWluZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cF93cmFwcGVyOiBIVE1MRGl2RWxlbWVudDtcbiAgICBwdWJsaWMgcG9wdXA6IGFueTtcblxuICAgIHB1YmxpYyBnZXQgbWluRGF0ZSgpOiBEYXRlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBtYXhEYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4RGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcih3cmFwcGVyOiBhbnksIHRhc2tzOiBUYXNrW10sIG9wdGlvbnM/OiBPcHRpb25zKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfb3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5zZXR1cF93cmFwcGVyKHdyYXBwZXIpO1xuICAgICAgICB0aGlzLnNldHVwX3Rhc2tzKHRhc2tzKTtcbiAgICAgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIGRlZmF1bHQgdmlldyBtb2RlXG4gICAgICAgIHRoaXMuY2hhbmdlX3ZpZXdfbW9kZSgpO1xuICAgICAgICB0aGlzLmJpbmRfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF93cmFwcGVyKGVsZW1lbnQ6IGFueSkge1xuICAgICAgICBsZXQgc3ZnX2VsZW1lbnQsIHdyYXBwZXJfZWxlbWVudDtcblxuICAgICAgICAvLyBDU1MgU2VsZWN0b3IgaXMgcGFzc2VkXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgZWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoZWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBnZXQgdGhlIFNWR0VsZW1lbnRcbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgICAgICAgd3JhcHBlcl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKFwic3ZnXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7XG4gICAgICAgICAgICBzdmdfZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIFwiRnJhcHDDqSBHYW50dCBvbmx5IHN1cHBvcnRzIHVzYWdlIG9mIGEgc3RyaW5nIENTUyBzZWxlY3RvciwgSFRNTCBET00gZWxlbWVudCBvciBTVkcgRE9NIGVsZW1lbnQgZm9yIHRoZSBcXCdlbGVtZW50XFwnIHBhcmFtZXRlclwiXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3ZnIGVsZW1lbnRcbiAgICAgICAgaWYgKCFzdmdfZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGl0XG4gICAgICAgICAgICB0aGlzLiRzdmcgPSBjcmVhdGVTVkcoXCJzdmdcIiwge1xuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogd3JhcHBlcl9lbGVtZW50LFxuICAgICAgICAgICAgICAgIGNsYXNzOiBcImdhbnR0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IHN2Z19lbGVtZW50O1xuICAgICAgICAgICAgdGhpcy4kc3ZnLmNsYXNzTGlzdC5hZGQoXCJnYW50dFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdyYXBwZXIgZWxlbWVudFxuICAgICAgICB0aGlzLiRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLiRjb250YWluZXIuY2xhc3NMaXN0LmFkZChcImdhbnR0LWNvbnRhaW5lclwiKTtcbiAgICAgICAgaWYodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRjb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGggKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgcGFyZW50X2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy4kY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJHN2Zyk7XG5cbiAgICAgICAgLy8gcG9wdXAgd3JhcHBlclxuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwLXdyYXBwZXJcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwX3dyYXBwZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfb3B0aW9ucyhvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXR1cF90YXNrcyh0YXNrczogYW55KSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGFza3NcbiAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzLm1hcCgodGFzazogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vc3RhbmRhcmQgY29sb3JzIGlmIG5lZWRlZFxuICAgICAgICAgICAgdGFzay5jb2xvciA9IHRhc2suY29sb3IgfHwgJyM3ODkyQTEnO1xuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRvIERhdGUgb2JqZWN0c1xuICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5zdGFydCk7XG4gICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5lbmQpO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHRhc2sgaW52YWxpZCBpZiBkdXJhdGlvbiB0b28gbGFyZ2VcbiAgICAgICAgICAgIGlmIChEYXRlVXRpbHMuZGlmZih0YXNrLl9lbmQsIHRhc2suX3N0YXJ0LCBcInllYXJcIikgPiAxMCkge1xuICAgICAgICAgICAgICAgIHRhc2suZW5kID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FjaGUgaW5kZXhcbiAgICAgICAgICAgIHRhc2suX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXNrLl9yb3dfaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9pbmRleCA9IHRhc2suX3Jvd19pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBkYXRlc1xuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSB0b2RheTtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRvZGF5LCAyLCBcImRheVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmIHRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgLTIsICdkYXknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhc2suc3RhcnQgJiYgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9zdGFydCwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGhvdXJzIGlzIG5vdCBzZXQsIGFzc3VtZSB0aGUgbGFzdCBkYXkgaXMgZnVsbCBkYXlcbiAgICAgICAgICAgIC8vIGUuZzogMjAxOC0wOS0wOSBiZWNvbWVzIDIwMTgtMDktMDkgMjM6NTk6NTlcbiAgICAgICAgICAgIGNvbnN0IHRhc2tfZW5kX3ZhbHVlcyA9IERhdGVVdGlscy5nZXREYXRlVmFsdWVzKHRhc2suX2VuZCk7XG4gICAgICAgICAgICBpZiAodGFza19lbmRfdmFsdWVzLnNsaWNlKDMpLmV2ZXJ5KChkKSA9PiBkID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fZW5kLCAyNCwgXCJob3VyXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnZhbGlkIGZsYWdcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCB8fCAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICB0YXNrLmludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5kZXBlbmRlbmNpZXMgPT09IFwic3RyaW5nXCIgfHwgIXRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBkLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kZW5jaWVzID0gZGVwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdWlkc1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pZCA9IGdlbmVyYXRlX2lkKHRhc2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXR1cF9kZXBlbmRlbmNpZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RlcGVuZGVuY2llcygpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcCA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdID0gdGhpcy5kZXBlbmRlbmN5X21hcFtkXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdLnB1c2godC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaCh0YXNrczogVGFza1tdKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICB0aGlzLmNoYW5nZV92aWV3X21vZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlX3ZpZXdfbW9kZShtb2RlID0gdGhpcy5vcHRpb25zLnZpZXdNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfZ2FudHRfZGF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVfdmlld19zY2FsZShtb2RlKTtcbiAgICAgICAgdGhpcy5zZXR1cF9kYXRlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAvLyBmaXJlIHZpZXdtb2RlX2NoYW5nZSBldmVudFxuICAgICAgICB0aGlzLnRyaWdnZXJfZXZlbnQoXCJvblZpZXdDaGFuZ2VcIiwgW21vZGVdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZV92aWV3X3NjYWxlKHZpZXdfbW9kZTogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9IHZpZXdfbW9kZTtcbiAgICAgICAgLy8gdGhpcy5pc0hvdXJWaWV3ID0gZmFsc2U7XG4gICAgICAgIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLkhvdXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgLyAyNDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5IYWxmRGF5KSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuUXVhcnRlckRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLldlZWspIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiA3O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTQwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuTW9udGgpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzMDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDEyMDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlllYXIpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgKiAzNjU7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVzKCkge1xuICAgICAgICB0aGlzLnNldHVwX2RhdGVfdmFsdWVzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9nYW50dF9kYXRlcygpIHtcbiAgICAgICAgdGhpcy5fbWluRGF0ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuX21heERhdGUgPSBudWxsO1xuXG4gICAgICAgIGZvciAobGV0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgLy8gc2V0IGdsb2JhbCBzdGFydCBhbmQgZW5kIGRhdGVcbiAgICAgICAgICAgIGlmICghdGhpcy5taW5EYXRlIHx8IHRhc2suc3RhcnQgPCB0aGlzLm1pbkRhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLnN0YXJ0T2YodGFzay5zdGFydCwgJ2RheScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aGlzLm1heERhdGUgfHwgdGFzay5lbmQgPiB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gdGFzay5lbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZWFsTWluRGF0ZSA9IHRoaXMubWluRGF0ZTtcbiAgICAgICAgdGhpcy5fcmVhbE1heERhdGUgPSB0aGlzLm1heERhdGU7XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSG91cjpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5RdWFydGVyRGF5OlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gNiksIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyA2LCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLkhhbGZEYXk6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxMiksIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxMiwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5EYXk6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJkYXlcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLldlZWs6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwid2Vla1wiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuTW9udGg6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJtb250aFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5ZZWFyOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcInllYXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RhdGVfdmFsdWVzKCkge1xuICAgICAgICB0aGlzLmRhdGVzID0gW107XG4gICAgICAgIGxldCBjdXJfZGF0ZSA9IG51bGw7XG5cbiAgICAgICAgd2hpbGUgKGN1cl9kYXRlID09PSBudWxsIHx8IGN1cl9kYXRlIDwgdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICBpZiAoIWN1cl9kYXRlKSB7XG4gICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuY2xvbmUodGhpcy5taW5EYXRlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5ZZWFyKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoY3VyX2RhdGUsIDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKGN1cl9kYXRlLCAxLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAnaG91cidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmRhdGVzLnB1c2goY3VyX2RhdGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgY29uc3QgY29sdW1uV2lkdGggPSAodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoIC0gMSkgLyB0aGlzLmRhdGVzLmxlbmd0aFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gY29sdW1uV2lkdGggPCA0NSA/IDQ1IDogY29sdW1uV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcImN1cl9kYXRlXCIsIGN1cl9kYXRlKTtcbiAgICAgICAgY29uc29sZS5sb2coXCJkYXRlc1wiLCB0aGlzLmRhdGVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJpbmRfZXZlbnRzKCkge1xuICAgICAgICB0aGlzLmJpbmRfZ3JpZF9jbGljaygpO1xuICAgICAgICB0aGlzLmJpbmRfYmFyX2V2ZW50cygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgIHRoaXMuc2V0dXBfbGF5ZXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkKCk7XG4gICAgICAgIHRoaXMubWFrZV9kYXRlcygpO1xuICAgICAgICB0aGlzLm1ha2VfYmFycygpO1xuICAgICAgICB0aGlzLm1ha2VfYXJyb3dzKCk7XG4gICAgICAgIHRoaXMubWFwX2Fycm93c19vbl9iYXJzKCk7XG4gICAgICAgIHRoaXMuc2V0X3dpZHRoKCk7XG4gICAgICAgIHRoaXMuc2V0X3Njcm9sbF9wb3NpdGlvbigpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfbGF5ZXJzKCkge1xuICAgICAgICB0aGlzLmxheWVycyA9IHt9O1xuICAgICAgICBjb25zdCBsYXllcnMgPSBbXCJncmlkXCIsIFwiZGF0ZVwiLCBcImFycm93XCIsIFwicHJvZ3Jlc3NcIiwgXCJiYXJcIiwgXCJkZXRhaWxzXCJdO1xuICAgICAgICAvLyBtYWtlIGdyb3VwIGxheWVyc1xuICAgICAgICBmb3IgKGxldCBsYXllciBvZiBsYXllcnMpIHtcbiAgICAgICAgICAgIHRoaXMubGF5ZXJzW2xheWVyXSA9IGNyZWF0ZVNWRygnZycsIHtcbiAgICAgICAgICAgICAgICBjbGFzczogbGF5ZXIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLiRzdmcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkKCkge1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9iYWNrZ3JvdW5kKCk7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX3Jvd3MoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGVhZGVyKCk7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2hpZ2hsaWdodHMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfdGlja3MoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9iYWNrZ3JvdW5kKCkge1xuICAgICAgICBsZXQgZ3JpZF93aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGgpIHtcbiAgICAgICAgICAgIGdyaWRfd2lkdGggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkaXN0aW5jdF9yb3dzID0gWy4uLm5ldyBTZXQodGhpcy50YXNrcy5tYXAoKHg6IGFueSkgPT4geC5fcm93X2lkKSldO1xuICAgICAgICBjb25zdCBncmlkX2hlaWdodCA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyICtcbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpICpcbiAgICAgICAgICAgIGRpc3RpbmN0X3Jvd3MubGVuZ3RoO1xuXG4gICAgICAgIGNyZWF0ZVNWRyhcInJlY3RcIiwge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICB3aWR0aDogZ3JpZF93aWR0aCxcbiAgICAgICAgICAgIGhlaWdodDogZ3JpZF9oZWlnaHQsXG4gICAgICAgICAgICBjbGFzczogXCJncmlkLWJhY2tncm91bmRcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC5hdHRyKHRoaXMuJHN2Zywge1xuICAgICAgICAgICAgaGVpZ2h0OiBncmlkX2hlaWdodCxcbiAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgfSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWRfcm93cygpIHtcbiAgICAgICAgY29uc3Qgcm93c19sYXllciA9IGNyZWF0ZVNWRyhcImdcIiwgeyBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQgfSk7XG4gICAgICAgIGNvbnN0IGxpbmVzX2xheWVyID0gY3JlYXRlU1ZHKFwiZ1wiLCB7IGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCB9KTtcblxuICAgICAgICBjb25zdCByb3dfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3Qgcm93X2hlaWdodCA9IHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZztcbiAgICAgICAgLy9UT0RPOiAgYWp1c3RhciBvIHBvc2ljaW9uYW1lbnRvIGRhcyBsaW5oYXNcbiAgICAgICAgbGV0IHJvd195ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICB0aGlzLnRhc2tzLmZvckVhY2goXyA9PiB7XG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgICAgIHk6IHJvd195LFxuICAgICAgICAgICAgICAgIHdpZHRoOiByb3dfd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtcm93XCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiByb3dzX2xheWVyLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcImxpbmVcIiwge1xuICAgICAgICAgICAgICAgIHgxOiAwLFxuICAgICAgICAgICAgICAgIHkxOiByb3dfeSArIHJvd19oZWlnaHQsXG4gICAgICAgICAgICAgICAgeDI6IHJvd193aWR0aCxcbiAgICAgICAgICAgICAgICB5Mjogcm93X3kgKyByb3dfaGVpZ2h0LFxuICAgICAgICAgICAgICAgIGNsYXNzOiBcInJvdy1saW5lXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiBsaW5lc19sYXllcixcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByb3dfeSArPSB0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2hlYWRlcigpIHtcbiAgICAgICAgLy8gY29uc3QgYWRkSXNIb3VyVmlldyA9IHRoaXMuaXNIb3VyVmlldyA/IDI1IDogMTBcbiAgICAgICAgY29uc3QgaGVhZGVyX3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgIGNvbnN0IGhlYWRlcl9oZWlnaHQgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgMTA7XG4gICAgICAgIGNyZWF0ZVNWRyhcInJlY3RcIiwge1xuICAgICAgICAgICAgeDogMCxcbiAgICAgICAgICAgIHk6IDAsXG4gICAgICAgICAgICB3aWR0aDogaGVhZGVyX3dpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBoZWFkZXJfaGVpZ2h0LFxuICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWRfdGlja3MoKSB7XG4gICAgICAgIGxldCB0aWNrX3ggPSAwO1xuICAgICAgICBsZXQgdGlja195ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcbiAgICAgICAgbGV0IHRpY2tfaGVpZ2h0ID1cbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpICpcbiAgICAgICAgICAgIHRoaXMudGFza3MubGVuZ3RoO1xuXG4gICAgICAgIGZvciAobGV0IGRhdGUgb2YgdGhpcy5kYXRlcykge1xuICAgICAgICAgICAgbGV0IHRpY2tfY2xhc3MgPSBcInRpY2tcIjtcbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIG1vbmRheVxuICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5EYXkpICYmIGRhdGUuZ2V0RGF0ZSgpID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGlja19jbGFzcyArPSBcIiB0aGlja1wiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGhpY2sgdGljayBmb3IgZmlyc3Qgd2Vla1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSAmJlxuICAgICAgICAgICAgICAgIGRhdGUuZ2V0RGF0ZSgpID49IDEgJiZcbiAgICAgICAgICAgICAgICBkYXRlLmdldERhdGUoKSA8IDhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHRoaWNrIHRpY2tzIGZvciBxdWFydGVyc1xuICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkgJiYgZGF0ZS5nZXRNb250aCgpICUgMyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRoaWNrIHRpY2tzIGZvciBob3Vyc1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHRoaXMudmlld19pcyhWaWV3TW9kZS5Ib3VyKSAmJlxuICAgICAgICAgICAgICAgIGRhdGUuZ2V0SG91cnMoKSA9PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInBhdGhcIiwge1xuICAgICAgICAgICAgICAgIGQ6IGBNICR7dGlja194fSAke3RpY2tfeX0gdiAke3RpY2tfaGVpZ2h0fWAsXG4gICAgICAgICAgICAgICAgY2xhc3M6IHRpY2tfY2xhc3MsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuTW9udGgpKSB7XG4gICAgICAgICAgICAgICAgdGlja194ICs9XG4gICAgICAgICAgICAgICAgICAgIChEYXRlVXRpbHMuZ2V0RGF5c0luTW9udGgoZGF0ZSkgKlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoKSAvXG4gICAgICAgICAgICAgICAgICAgIDMwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz0gdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbWFrZV9ncmlkX2hpZ2hsaWdodHMoKSB7XG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuRGF5KSkge1xuICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAodGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAqXG4gICAgICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgK1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5wYWRkaW5nIC8gMjtcblxuICAgICAgICAgICAgbGV0IHggPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBkYXRlIG9mIHRoaXMuZGF0ZXMpIHtcblxuICAgICAgICAgICAgICAgIGxldCB5ID0gKHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgLyAyO1xuXG4gICAgICAgICAgICAgICAgbGV0IGlzVG9kYXkgPSBkYXRlLnRvU3RyaW5nKCkgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG4gICAgICAgIGNvbnN0IGlzSG91clZpZXcgPSB0aGlzLnZpZXdfaXMoW1ZpZXdNb2RlLkhvdXIsIFZpZXdNb2RlLlF1YXJ0ZXJEYXksIFZpZXdNb2RlLkhhbGZEYXldKTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSAwO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBkYXRlc1tpXTtcblxuICAgICAgICAgICAgaWYgKGlzSG91clZpZXcgJiYgZGF0ZS5kYXRlID49IHRoaXMuX3JlYWxNaW5EYXRlICYmIGRhdGUuZGF0ZSA8PSB0aGlzLl9yZWFsTWF4RGF0ZSkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUubG93ZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBgSCR7Y291bnRlcisrICogdGhpcy5vcHRpb25zLnN0ZXB9YCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMVwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgIHg6IGRhdGUubG93ZXJfeCxcbiAgICAgICAgICAgICAgICB5OiBkYXRlLmxvd2VyX3kgKyAyMCxcbiAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubG93ZXJfdGV4dCxcbiAgICAgICAgICAgICAgICBjbGFzczogXCJ0aXRsZS0yXCIsXG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmIChkYXRlLnVwcGVyX3RleHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCAkdXBwZXJfdGV4dCA9IGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLnVwcGVyX3gsXG4gICAgICAgICAgICAgICAgICAgIHk6IGRhdGUudXBwZXJfeSxcbiAgICAgICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLnVwcGVyX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcInVwcGVyLXRleHRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5kYXRlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIG91dC1vZi1ib3VuZCBkYXRlc1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQuZ2V0QkJveCgpLngyID4gdGhpcy5sYXllcnMuZ3JpZC5nZXRCQm94KCkud2lkdGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgJHVwcGVyX3RleHQucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfZGF0ZXNfdG9fZHJhdygpIHtcbiAgICAgICAgbGV0IGxhc3RfZGF0ZTogYW55ID0gbnVsbDtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmRhdGVzLm1hcCgoZGF0ZTogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGQgPSB0aGlzLmdldF9kYXRlX2luZm8oZGF0ZSwgbGFzdF9kYXRlLCBpKTtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IGRhdGU7XG4gICAgICAgICAgICByZXR1cm4gZDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBkYXRlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlX2luZm8oZGF0ZTogRGF0ZSwgbGFzdF9kYXRlOiBEYXRlLCBpOiBhbnkpIHtcbiAgICAgICAgaWYgKCFsYXN0X2RhdGUpIHtcbiAgICAgICAgICAgIGxhc3RfZGF0ZSA9IERhdGVVdGlscy5hZGQoZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRhdGVfdGV4dCA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIGRheUxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICB3ZWVrTG93ZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBtb250aExvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiTU1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICB5ZWFyTG93ZXI6IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJZWVlZXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlVcHBlcjogZGF0ZS5nZXREYXRlKCkgIT09IGxhc3RfZGF0ZS5nZXREYXRlKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IChkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKSlcbiAgICAgICAgICAgICAgICA/ICgoKGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKCkpIHx8IGkgPCAyKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIGRheVVwcGVyOiAoKGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKCkpIHx8IGkgPT09IDApXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiTU1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICB3ZWVrVXBwZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIG1vbnRoVXBwZXI6IGRhdGUuZ2V0RnVsbFllYXIoKSAhPT0gbGFzdF9kYXRlLmdldEZ1bGxZZWFyKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJZWVlZXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHllYXJVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgaG91clVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkQgTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRGVzY29udGFuZG8gMjAgcGFyYSBhZGNpb25hciB1bWEgc2VndW5kYSBsaW5oYSBkZSBpbmZvcm1hw6fDo28gbm8gY2FiZcOnYWxob1xuICAgICAgICBjb25zdCBiYXNlX3BvcyA9IHtcbiAgICAgICAgICAgIHg6IGkgKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgsXG4gICAgICAgICAgICBsb3dlcl95OiB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0IC0gMjAsXG4gICAgICAgICAgICB1cHBlcl95OiB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0IC0gMjAgLSAyNSxcbiAgICAgICAgfTtcbmRlYnVnZ2VyO1xuICAgICAgICBjb25zdCB4X3BvcyA9IHtcbiAgICAgICAgICAgIGhvdXJMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIGhvdXJVcHBlcjogKHRoaXMuZGF0ZXMubGVuZ3RoIDwgMTQpID8gKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCkgOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMjQgLyAyKSxcbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlVcHBlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCAvIDIsXG4gICAgICAgICAgICBoYWxmRGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDIgLyAyLFxuICAgICAgICAgICAgZGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBkYXlVcHBlcjogKHRoaXMuZGF0ZXMubGVuZ3RoIDwgMTUpID8gKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCkgOiAoKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDMwKSAvIDIpLFxuICAgICAgICAgICAgd2Vla0xvd2VyOiAwLFxuICAgICAgICAgICAgd2Vla1VwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCkgLyAyLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyLFxuICAgICAgICAgICAgeWVhckxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXBwZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIGxvd2VyX3g6IGJhc2VfcG9zLnggKyB4X3Bvc1tgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9TG93ZXJgXSxcbiAgICAgICAgICAgIGxvd2VyX3k6IGJhc2VfcG9zLmxvd2VyX3ksXG4gICAgICAgICAgICBkYXRlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9iYXJzKCkge1xuICAgICAgICB0aGlzLmJhcnMgPSB0aGlzLnRhc2tzLm1hcCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBiYXIgPSBuZXcgQmFyKHRoaXMsIHRhc2spO1xuICAgICAgICAgICAgdGhpcy5sYXllcnMuYmFyLmFwcGVuZENoaWxkKGJhci5ncm91cCk7XG4gICAgICAgICAgICByZXR1cm4gYmFyO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfYXJyb3dzKCkge1xuICAgICAgICB0aGlzLmFycm93cyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGxldCBhcnJvd3MgPSBbXTtcbiAgICAgICAgICAgIGFycm93cyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgLm1hcCgodGFza19pZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY3kgPSB0aGlzLmdldF90YXNrKHRhc2tfaWQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRlcGVuZGVuY3kpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyb3cgPSBuZXcgQXJyb3coXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iYXJzW2RlcGVuZGVuY3kuX2luZGV4XSwgLy8gZnJvbV90YXNrXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbdGFzay5faW5kZXhdIC8vIHRvX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXllcnMuYXJyb3cuYXBwZW5kQ2hpbGQoYXJyb3cuZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJvdztcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbik7IC8vIGZpbHRlciBmYWxzeSB2YWx1ZXNcbiAgICAgICAgICAgIHRoaXMuYXJyb3dzID0gdGhpcy5hcnJvd3MuY29uY2F0KGFycm93cyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcF9hcnJvd3Nfb25fYmFycygpIHtcbiAgICAgICAgZm9yIChsZXQgYmFyIG9mIHRoaXMuYmFycykge1xuICAgICAgICAgICAgYmFyLmFycm93cyA9IHRoaXMuYXJyb3dzLmZpbHRlcigoYXJyb3c6IEFycm93KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cuZnJvbVRhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWQgfHxcbiAgICAgICAgICAgICAgICAgICAgYXJyb3cudG9UYXNrLnRhc2suaWQgPT09IGJhci50YXNrLmlkXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfd2lkdGgoKSB7XG4gICAgICAgIGNvbnN0IGN1cl93aWR0aCA9IHRoaXMuJHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICAgICAgY29uc3QgYWN0dWFsX3dpZHRoID0gdGhpcy4kc3ZnXG4gICAgICAgICAgICAucXVlcnlTZWxlY3RvcihcIi5ncmlkIC5ncmlkLXJvd1wiKVxuICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShcIndpZHRoXCIpO1xuICAgICAgICBpZiAoY3VyX3dpZHRoIDwgYWN0dWFsX3dpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRzdmcuc2V0QXR0cmlidXRlKFwid2lkdGhcIiwgYWN0dWFsX3dpZHRoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0X3Njcm9sbF9wb3NpdGlvbigpIHtcbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgaWYgKCFwYXJlbnRfZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgICAgIGNvbnN0IGhvdXJzX2JlZm9yZV9maXJzdF90YXNrID0gRGF0ZVV0aWxzLmRpZmYoXG4gICAgICAgICAgICB0aGlzLmdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpLFxuICAgICAgICAgICAgdGhpcy5taW5EYXRlLFxuICAgICAgICAgICAgXCJob3VyXCJcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBzY3JvbGxfcG9zID1cbiAgICAgICAgICAgIChob3Vyc19iZWZvcmVfZmlyc3RfdGFzayAvIHRoaXMub3B0aW9ucy5zdGVwKSAqXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuXG4gICAgICAgIHBhcmVudF9lbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxfcG9zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ncmlkX2NsaWNrKCkge1xuICAgICAgICAkLm9uKFxuICAgICAgICAgICAgdGhpcy4kc3ZnLFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcHVwVHJpZ2dlcixcbiAgICAgICAgICAgIFwiLmdyaWQtcm93LCAuZ3JpZC1oZWFkZXJcIixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0X2FsbCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaGlkZV9wb3B1cCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9iYXJfZXZlbnRzKCkge1xuICAgICAgICBsZXQgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgbGV0IHhfb25fc3RhcnQgPSAwO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfbGVmdCA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNfcmVzaXppbmdfcmlnaHQgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhcmVudF9iYXJfaWQ6IGFueSA9IG51bGw7XG4gICAgICAgIGxldCBiYXJzOiBCYXJbXSA9IFtdO1xuICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gbnVsbDtcblxuICAgICAgICBmdW5jdGlvbiBhY3Rpb25faW5fcHJvZ3Jlc3MoKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNfZHJhZ2dpbmcgfHwgaXNfcmVzaXppbmdfbGVmdCB8fCBpc19yZXNpemluZ19yaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNlZG93blwiLCBcIi5iYXItd3JhcHBlciwgLmhhbmRsZVwiLCAoZTogYW55LCBlbGVtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhcl93cmFwcGVyID0gJC5jbG9zZXN0KFwiLmJhci13cmFwcGVyXCIsIGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJsZWZ0XCIpKSB7XG4gICAgICAgICAgICAgICAgaXNfcmVzaXppbmdfbGVmdCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwicmlnaHRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKFwiYmFyLXdyYXBwZXJcIikgJiYgdGhpcy5vcHRpb25zLmFsbG93TW92ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBpc19kcmFnZ2luZyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJhcl93cmFwcGVyLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG5cbiAgICAgICAgICAgIHhfb25fc3RhcnQgPSBlLm9mZnNldFg7XG5cbiAgICAgICAgICAgIHBhcmVudF9iYXJfaWQgPSBiYXJfd3JhcHBlci5nZXRBdHRyaWJ1dGUoXCJkYXRhLWlkXCIpO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gW1xuICAgICAgICAgICAgICAgIHBhcmVudF9iYXJfaWQsXG4gICAgICAgICAgICAgICAgLi4udGhpcy5nZXRfYWxsX2RlcGVuZGVudF90YXNrcyhwYXJlbnRfYmFyX2lkKSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBiYXJzID0gaWRzLm1hcCgoaWQpID0+IHRoaXMuZ2V0X2JhcihpZCkpO1xuXG4gICAgICAgICAgICB0aGlzLmJhcl9iZWluZ19kcmFnZ2VkID0gcGFyZW50X2Jhcl9pZDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5veCA9ICRiYXIuZ2V0WCgpO1xuICAgICAgICAgICAgICAgICRiYXIub3kgPSAkYmFyLmdldFkoKTtcbiAgICAgICAgICAgICAgICAkYmFyLm93aWR0aCA9ICRiYXIuZ2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSAwO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2Vtb3ZlXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmICghYWN0aW9uX2luX3Byb2dyZXNzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGR4ID0gZS5vZmZzZXRYIC0geF9vbl9zdGFydDtcblxuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgJGJhci5maW5hbGR4ID0gdGhpcy5nZXRfc25hcF9wb3NpdGlvbihkeCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlX3BvcHVwKCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzX3Jlc2l6aW5nX2xlZnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudF9iYXJfaWQgPT09IGJhci50YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6ICRiYXIub3ggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICRiYXIub3dpZHRoIC0gJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6ICRiYXIub3ggKyAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNfcmVzaXppbmdfcmlnaHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudF9iYXJfaWQgPT09IGJhci50YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiAkYmFyLm93aWR0aCArICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc19kcmFnZ2luZykge1xuICAgICAgICAgICAgICAgICAgICBiYXIudXBkYXRlQmFyUG9zaXRpb24oeyB4OiAkYmFyLm94ICsgJGJhci5maW5hbGR4IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBudWxsKTtcblxuXG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChpc19kcmFnZ2luZyB8fCBpc19yZXNpemluZ19sZWZ0IHx8IGlzX3Jlc2l6aW5nX3JpZ2h0IHx8ICF0aGlzLm9wdGlvbnMuYWxsb3dNb3ZlbWVudCkge1xuICAgICAgICAgICAgICAgIGJhcnMuZm9yRWFjaCgoYmFyKSA9PiBiYXIuZ3JvdXAuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlzX2RyYWdnaW5nID0gZmFsc2U7XG4gICAgICAgICAgICBpc19yZXNpemluZ19sZWZ0ID0gZmFsc2U7XG4gICAgICAgICAgICBpc19yZXNpemluZ19yaWdodCA9IGZhbHNlO1xuICAgICAgICB9KTtcblxuICAgICAgICAkLm9uKHRoaXMuJHN2ZywgXCJtb3VzZXVwXCIsIChlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYmFyX2JlaW5nX2RyYWdnZWQgPSBudWxsO1xuICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCAkYmFyID0gYmFyLmVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCEkYmFyLmZpbmFsZHgpIHJldHVybjtcbiAgICAgICAgICAgICAgICBiYXIuZGF0ZUNoYW5nZWQoKTtcbiAgICAgICAgICAgICAgICBiYXIuc2V0QWN0aW9uQ29tcGxldGVkKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSwgbnVsbCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfYWxsX2RlcGVuZGVudF90YXNrcyh0YXNrX2lkOiBhbnkpIHtcbiAgICAgICAgbGV0IG91dDogYW55W10gPSBbXTtcbiAgICAgICAgbGV0IHRvX3Byb2Nlc3MgPSBbdGFza19pZF07XG4gICAgICAgIHdoaWxlICh0b19wcm9jZXNzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZGVwcyA9IHRvX3Byb2Nlc3MucmVkdWNlKChhY2MsIGN1cnIpID0+IHtcbiAgICAgICAgICAgICAgICBhY2MgPSBhY2MuY29uY2F0KHRoaXMuZGVwZW5kZW5jeV9tYXBbY3Vycl0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgICB9LCBbXSk7XG5cbiAgICAgICAgICAgIG91dCA9IG91dC5jb25jYXQoZGVwcyk7XG4gICAgICAgICAgICB0b19wcm9jZXNzID0gZGVwcy5maWx0ZXIoKGQ6IGFueSkgPT4gIXRvX3Byb2Nlc3MuaW5jbHVkZXMoZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG91dC5maWx0ZXIoQm9vbGVhbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRfc25hcF9wb3NpdGlvbihkeDogYW55KSB7XG4gICAgICAgIGxldCBvZHggPSBkeCxcbiAgICAgICAgICAgIHJlbSxcbiAgICAgICAgICAgIHBvc2l0aW9uO1xuXG4gICAgICAgIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuSG91cikpIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYpO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMTIgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNik7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLldlZWspKSB7XG4gICAgICAgICAgICByZW0gPSBkeCAlICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA3KTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDE0ID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDMwKTtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gb2R4IC0gcmVtICsgKHJlbSA8IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDYwID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDMwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMiA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgdW5zZWxlY3RfYWxsKCkge1xuICAgICAgICBbLi4udGhpcy4kc3ZnLnF1ZXJ5U2VsZWN0b3JBbGwoXCIuYmFyLXdyYXBwZXJcIildLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdmlld19pcyhtb2RlczogVmlld01vZGUgfCBWaWV3TW9kZVtdKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG1vZGVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG1vZGVzLnNvbWUoKG1vZGUpID0+IHRoaXMub3B0aW9ucy52aWV3TW9kZSA9PT0gbW9kZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSBtb2RlcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF90YXNrKGlkOiBhbnkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza3MuZmluZCgodGFzazogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGFzay5pZCA9PT0gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRfYmFyKGlkOiBhbnkpOiBCYXIge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXJzLmZpbmQoKGJhcjogYW55KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYmFyLnRhc2suaWQgPT09IGlkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvd19wb3B1cChvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgaWYgKCF0aGlzLnBvcHVwKSB7XG4gICAgICAgICAgICB0aGlzLnBvcHVwID0gbmV3IFBvcHVwKFxuICAgICAgICAgICAgICAgIHRoaXMucG9wdXBfd3JhcHBlcixcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY3VzdG9tUG9wdXBIdG1sXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucG9wdXAuc2hvdyhvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGlkZV9wb3B1cCgpIHtcbiAgICAgICAgdGhpcy5wb3B1cCAmJiB0aGlzLnBvcHVwLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdHJpZ2dlcl9ldmVudChldmVudDogc3RyaW5nLCBhcmdzOiBhbnkpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uc1tldmVudF0pIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9uc1tldmVudF0uYXBwbHkobnVsbCwgYXJncyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9vbGRlc3Rfc3RhcnRpbmdfZGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFza3NcbiAgICAgICAgICAgIC5tYXAoKHRhc2s6IGFueSkgPT4gdGFzay5fc3RhcnQpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2X2RhdGU6IGFueSwgY3VyX2RhdGU6IGFueSkgPT5cbiAgICAgICAgICAgICAgICBjdXJfZGF0ZSA8PSBwcmV2X2RhdGUgPyBjdXJfZGF0ZSA6IHByZXZfZGF0ZVxuICAgICAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyKCkge1xuICAgICAgICB0aGlzLiRzdmcuaW5uZXJIVE1MID0gJyc7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZV9pZCh0YXNrOiBhbnkpIHtcbiAgICByZXR1cm4gdGFzay5uYW1lICsgXCJfXCIgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyLCAxMik7XG59XG4iXX0=
808
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2FudHQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy9nYW50dC9jb21wb25lbnRzL2dhbnR0L2dhbnR0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDNUIsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHbEQsTUFBTSxPQUFPLEtBQUs7SUEwQmQsWUFBWSxPQUFZLEVBQUUsS0FBYSxFQUFFLE9BQWlCO1FBQ3RELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1QixJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQWZELElBQVcsT0FBTztRQUNkLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBVyxPQUFPO1FBQ2QsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3pCLENBQUM7SUFXTyxhQUFhLENBQUMsT0FBWTtRQUM5QixJQUFJLFdBQVcsRUFBRSxlQUFlLENB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QUFDLEVBQU87UUFDN0IsSUFBSSxHQUFHLEdBQUcsRUFBRSxFQUNSLEdBQUcsRUFDSCxRQUFRLENBQUM7UUFFYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQzdCLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3BDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDbkc7YUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3JDLEdBQUcsR0FBRyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUMzQyxRQUFRLEdBQUcsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLENB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RyxFQUFFLENBQUM7SUFDN0IsQ0FBQztDQUNKO0FBRUQsU0FBUyxXQUFXLENBQUMsSUFBUztJQUMxQixPQUFPLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGF0ZVV0aWxzIH0gZnJvbSBcIi4vdXRpbHMvZGF0ZS11dGlsc1wiO1xuaW1wb3J0IHsgJCwgY3JlYXRlU1ZHIH0gZnJvbSBcIi4vdXRpbHMvc3ZnLXV0aWxzXCI7XG5pbXBvcnQgeyBCYXIgfSBmcm9tIFwiLi9iYXJcIjtcbmltcG9ydCB7IFBvcHVwIH0gZnJvbSBcIi4vcG9wdXBcIjtcbmltcG9ydCB7IEFycm93IH0gZnJvbSBcIi4vYXJyb3dcIjtcbmltcG9ydCB7IE9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL29wdGlvbnNcIjtcbmltcG9ydCB7IGRlZmF1bHRPcHRpb25zIH0gZnJvbSBcIi4vZ2FudHQtb3B0aW9uc1wiO1xuaW1wb3J0IHsgVmlld01vZGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3ZpZXctbW9kZVwiO1xuaW1wb3J0IHsgVGFzaywgRW5yaWNoZWRUYXNrIH0gZnJvbSBcIi4uLy4uL21vZGVsc1wiO1xuXG5leHBvcnQgY2xhc3MgR2FudHQge1xuICAgIHB1YmxpYyBvcHRpb25zOiBPcHRpb25zO1xuICAgIHB1YmxpYyB0YXNrczogRW5yaWNoZWRUYXNrW107XG4gICAgcHVibGljIGRlcGVuZGVuY3lfbWFwOiBhbnk7XG5cbiAgICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xuICAgIHByaXZhdGUgX21heERhdGU6IERhdGU7XG5cbiAgICBwdWJsaWMgZGF0ZXM6IERhdGVbXTtcbiAgICBwdWJsaWMgbGF5ZXJzOiBhbnk7XG4gICAgcHVibGljIGJhcnM6IEJhcltdO1xuICAgIHB1YmxpYyBhcnJvd3M6IEFycm93W107XG4gICAgcHVibGljIGJhcl9iZWluZ19kcmFnZ2VkOiBhbnk7XG4gICAgcHVibGljICRzdmc6IGFueTtcbiAgICBwdWJsaWMgJGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQ7XG4gICAgcHVibGljIHBvcHVwX3dyYXBwZXI6IEhUTUxEaXZFbGVtZW50O1xuICAgIHB1YmxpYyBwb3B1cDogYW55O1xuXG4gICAgcHVibGljIGdldCBtaW5EYXRlKCk6IERhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IG1heERhdGUoKTogRGF0ZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHdyYXBwZXI6IGFueSwgdGFza3M6IFRhc2tbXSwgb3B0aW9ucz86IE9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zZXR1cF9vcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnNldHVwX3dyYXBwZXIod3JhcHBlcik7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICAvLyBpbml0aWFsaXplIHdpdGggZGVmYXVsdCB2aWV3IG1vZGVcbiAgICAgICAgdGhpcy5jaGFuZ2Vfdmlld19tb2RlKCk7XG4gICAgICAgIHRoaXMuYmluZF9ldmVudHMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX3dyYXBwZXIoZWxlbWVudDogYW55KSB7XG4gICAgICAgIGxldCBzdmdfZWxlbWVudCwgd3JhcHBlcl9lbGVtZW50O1xuXG4gICAgICAgIC8vIENTUyBTZWxlY3RvciBpcyBwYXNzZWRcbiAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICBlbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGdldCB0aGUgU1ZHRWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7XG4gICAgICAgICAgICB3cmFwcGVyX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICAgICAgc3ZnX2VsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoXCJzdmdcIik7XG4gICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQpIHtcbiAgICAgICAgICAgIHN2Z19lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgXCJGcmFwcMOpIEdhbnR0IG9ubHkgc3VwcG9ydHMgdXNhZ2Ugb2YgYSBzdHJpbmcgQ1NTIHNlbGVjdG9yLCBIVE1MIERPTSBlbGVtZW50IG9yIFNWRyBET00gZWxlbWVudCBmb3IgdGhlIFxcJ2VsZW1lbnRcXCcgcGFyYW1ldGVyXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdmcgZWxlbWVudFxuICAgICAgICBpZiAoIXN2Z19lbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBjcmVhdGUgaXRcbiAgICAgICAgICAgIHRoaXMuJHN2ZyA9IGNyZWF0ZVNWRyhcInN2Z1wiLCB7XG4gICAgICAgICAgICAgICAgYXBwZW5kX3RvOiB3cmFwcGVyX2VsZW1lbnQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ2FudHRcIixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kc3ZnID0gc3ZnX2VsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLiRzdmcuY2xhc3NMaXN0LmFkZChcImdhbnR0XCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gd3JhcHBlciBlbGVtZW50XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiZ2FudHQtY29udGFpbmVyXCIpO1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLiRjb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGggKyAncHgnO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcGFyZW50X2VsZW1lbnQgPSB0aGlzLiRzdmcucGFyZW50RWxlbWVudDtcbiAgICAgICAgcGFyZW50X2VsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy4kY29udGFpbmVyKTtcbiAgICAgICAgdGhpcy4kY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuJHN2Zyk7XG5cbiAgICAgICAgLy8gcG9wdXAgd3JhcHBlclxuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnBvcHVwX3dyYXBwZXIuY2xhc3NMaXN0LmFkZChcInBvcHVwLXdyYXBwZXJcIik7XG4gICAgICAgIHRoaXMuJGNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLnBvcHVwX3dyYXBwZXIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfb3B0aW9ucyhvcHRpb25zOiBhbnkpIHtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXR1cF90YXNrcyh0YXNrczogYW55KSB7XG4gICAgICAgIC8vIHByZXBhcmUgdGFza3NcbiAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzLm1hcCgodGFzazogYW55LCBpOiBhbnkpID0+IHtcbiAgICAgICAgICAgIC8vc3RhbmRhcmQgY29sb3JzIGlmIG5lZWRlZFxuICAgICAgICAgICAgdGFzay5jb2xvciA9IHRhc2suY29sb3IgfHwgJyM3ODkyQTEnO1xuXG4gICAgICAgICAgICAvLyBjb252ZXJ0IHRvIERhdGUgb2JqZWN0c1xuICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5zdGFydCk7XG4gICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMucGFyc2UodGFzay5lbmQpO1xuXG4gICAgICAgICAgICAvLyBtYWtlIHRhc2sgaW52YWxpZCBpZiBkdXJhdGlvbiB0b28gbGFyZ2VcbiAgICAgICAgICAgIGlmIChEYXRlVXRpbHMuZGlmZih0YXNrLl9lbmQsIHRhc2suX3N0YXJ0LCBcInllYXJcIikgPiAxMCkge1xuICAgICAgICAgICAgICAgIHRhc2suZW5kID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2FjaGUgaW5kZXhcbiAgICAgICAgICAgIHRhc2suX2luZGV4ID0gaTtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXNrLl9yb3dfaWQgPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgICAgICAgICB0YXNrLl9pbmRleCA9IHRhc2suX3Jvd19pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW52YWxpZCBkYXRlc1xuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmICF0YXNrLmVuZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRvZGF5ID0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSB0b2RheTtcbiAgICAgICAgICAgICAgICB0YXNrLl9lbmQgPSBEYXRlVXRpbHMuYWRkKHRvZGF5LCAyLCBcImRheVwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXNrLnN0YXJ0ICYmIHRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fc3RhcnQgPSBEYXRlVXRpbHMuYWRkKHRhc2suX2VuZCwgLTIsICdkYXknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRhc2suc3RhcnQgJiYgIXRhc2suZW5kKSB7XG4gICAgICAgICAgICAgICAgdGFzay5fZW5kID0gRGF0ZVV0aWxzLmFkZCh0YXNrLl9zdGFydCwgMiwgXCJkYXlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGlmIGhvdXJzIGlzIG5vdCBzZXQsIGFzc3VtZSB0aGUgbGFzdCBkYXkgaXMgZnVsbCBkYXlcbiAgICAgICAgICAgIC8vIGUuZzogMjAxOC0wOS0wOSBiZWNvbWVzIDIwMTgtMDktMDkgMjM6NTk6NTlcbiAgICAgICAgICAgIGNvbnN0IHRhc2tfZW5kX3ZhbHVlcyA9IERhdGVVdGlscy5nZXREYXRlVmFsdWVzKHRhc2suX2VuZCk7XG4gICAgICAgICAgICBpZiAodGFza19lbmRfdmFsdWVzLnNsaWNlKDMpLmV2ZXJ5KChkKSA9PiBkID09PSAwKSkge1xuICAgICAgICAgICAgICAgIHRhc2suX2VuZCA9IERhdGVVdGlscy5hZGQodGFzay5fZW5kLCAyNCwgXCJob3VyXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpbnZhbGlkIGZsYWdcbiAgICAgICAgICAgIGlmICghdGFzay5zdGFydCB8fCAhdGFzay5lbmQpIHtcbiAgICAgICAgICAgICAgICB0YXNrLmludmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXNcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFzay5kZXBlbmRlbmNpZXMgPT09IFwic3RyaW5nXCIgfHwgIXRhc2suZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlcHMgPSBbXTtcbiAgICAgICAgICAgICAgICBpZiAodGFzay5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcyA9IHRhc2suZGVwZW5kZW5jaWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJywnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoZDogYW55KSA9PiBkLnRyaW0oKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGQ6IGFueSkgPT4gZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRhc2suZGVwZW5kZW5jaWVzID0gZGVwcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdWlkc1xuICAgICAgICAgICAgaWYgKCF0YXNrLmlkKSB7XG4gICAgICAgICAgICAgICAgdGFzay5pZCA9IGdlbmVyYXRlX2lkKHRhc2spO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGFzaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXR1cF9kZXBlbmRlbmNpZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNldHVwX2RlcGVuZGVuY2llcygpIHtcbiAgICAgICAgdGhpcy5kZXBlbmRlbmN5X21hcCA9IHt9O1xuICAgICAgICBmb3IgKGxldCB0IG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGQgb2YgdC5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdID0gdGhpcy5kZXBlbmRlbmN5X21hcFtkXSB8fCBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lfbWFwW2RdLnB1c2godC5pZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVmcmVzaCh0YXNrczogVGFza1tdKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfdGFza3ModGFza3MpO1xuICAgICAgICB0aGlzLmNoYW5nZV92aWV3X21vZGUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2hhbmdlX3ZpZXdfbW9kZShtb2RlID0gdGhpcy5vcHRpb25zLnZpZXdNb2RlKSB7XG4gICAgICAgIHRoaXMuc2V0dXBfZ2FudHRfZGF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVfdmlld19zY2FsZShtb2RlKTtcbiAgICAgICAgdGhpcy5zZXR1cF9kYXRlcygpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAvLyBmaXJlIHZpZXdtb2RlX2NoYW5nZSBldmVudFxuICAgICAgICB0aGlzLnRyaWdnZXJfZXZlbnQoXCJvblZpZXdDaGFuZ2VcIiwgW21vZGVdKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZV92aWV3X3NjYWxlKHZpZXdfbW9kZTogYW55KSB7XG4gICAgICAgIHRoaXMub3B0aW9ucy52aWV3TW9kZSA9IHZpZXdfbW9kZTtcbiAgICAgICAgLy8gdGhpcy5pc0hvdXJWaWV3ID0gZmFsc2U7XG4gICAgICAgIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlF1YXJ0ZXJIb3VyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjQgLyA0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5Ib3VyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0IC8gMjQ7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLkRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNDtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDUwO1xuICAgICAgICB9IGVsc2UgaWYgKHZpZXdfbW9kZSA9PT0gVmlld01vZGUuSGFsZkRheSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnN0ZXAgPSAyNCAvIDI7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSA1MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLlF1YXJ0ZXJEYXkpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5zdGVwID0gMjQgLyA0O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gNTA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5XZWVrKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0ICogNztcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCA9IDE0MDtcbiAgICAgICAgfSBlbHNlIGlmICh2aWV3X21vZGUgPT09IFZpZXdNb2RlLk1vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0ICogMzA7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSAxMjA7XG4gICAgICAgIH0gZWxzZSBpZiAodmlld19tb2RlID09PSBWaWV3TW9kZS5ZZWFyKSB7XG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCA9IDI0ICogMzY1O1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoID0gMTIwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9kYXRlcygpIHtcbiAgICAgICAgdGhpcy5zZXR1cF9kYXRlX3ZhbHVlcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfZ2FudHRfZGF0ZXMoKSB7XG4gICAgICAgIHRoaXMuX21pbkRhdGUgPSBudWxsO1xuICAgICAgICB0aGlzLl9tYXhEYXRlID0gbnVsbDtcblxuICAgICAgICBmb3IgKGxldCB0YXNrIG9mIHRoaXMudGFza3MpIHtcbiAgICAgICAgICAgIC8vIHNldCBnbG9iYWwgc3RhcnQgYW5kIGVuZCBkYXRlXG4gICAgICAgICAgICBpZiAoIXRoaXMubWluRGF0ZSB8fCB0YXNrLnN0YXJ0IDwgdGhpcy5taW5EYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5zdGFydE9mKHRhc2suc3RhcnQsICdkYXknKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5tYXhEYXRlIHx8IHRhc2suZW5kID4gdGhpcy5tYXhEYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IHRhc2suZW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLm9wdGlvbnMudmlld01vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuUXVhcnRlckhvdXI6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxNSksIFwibWludXRlc1wiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxNSwgXCJtaW51dGVzXCIpO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5Ib3VyOlxuICAgICAgICAgICAgICAgIHRoaXMuX21pbkRhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWluRGF0ZSwgLSh0aGlzLm9wdGlvbnMubWFyZ2luQmVmb3JlU3RhcnQgPz8gMSksIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLlF1YXJ0ZXJEYXk6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyA2KSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDYsIFwiaG91clwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuSGFsZkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEyKSwgXCJob3VyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEyLCBcImhvdXJcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLkRheTpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYXhEYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1heERhdGUsIHRoaXMub3B0aW9ucy5tYXJnaW5BZnRlckVuZCA/PyAxLCBcImRheVwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgVmlld01vZGUuV2VlazpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcIndlZWtcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWF4RGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5tYXhEYXRlLCB0aGlzLm9wdGlvbnMubWFyZ2luQWZ0ZXJFbmQgPz8gMSwgXCJ3ZWVrXCIpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBWaWV3TW9kZS5Nb250aDpcbiAgICAgICAgICAgICAgICB0aGlzLl9taW5EYXRlID0gRGF0ZVV0aWxzLmFkZCh0aGlzLm1pbkRhdGUsIC0odGhpcy5vcHRpb25zLm1hcmdpbkJlZm9yZVN0YXJ0ID8/IDEpLCBcIm1vbnRoXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFZpZXdNb2RlLlllYXI6XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluRGF0ZSA9IERhdGVVdGlscy5hZGQodGhpcy5taW5EYXRlLCAtKHRoaXMub3B0aW9ucy5tYXJnaW5CZWZvcmVTdGFydCA/PyAxKSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21heERhdGUgPSBEYXRlVXRpbHMuYWRkKHRoaXMubWF4RGF0ZSwgdGhpcy5vcHRpb25zLm1hcmdpbkFmdGVyRW5kID8/IDEsIFwieWVhclwiKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2V0dXBfZGF0ZV92YWx1ZXMoKSB7XG4gICAgICAgIHRoaXMuZGF0ZXMgPSBbXTtcbiAgICAgICAgbGV0IGN1cl9kYXRlID0gbnVsbDtcblxuICAgICAgICB3aGlsZSAoY3VyX2RhdGUgPT09IG51bGwgfHwgY3VyX2RhdGUgPCB0aGlzLm1heERhdGUpIHtcbiAgICAgICAgICAgIGlmICghY3VyX2RhdGUpIHtcbiAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5jbG9uZSh0aGlzLm1pbkRhdGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLlllYXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1cl9kYXRlID0gRGF0ZVV0aWxzLmFkZChjdXJfZGF0ZSwgMSwgXCJ5ZWFyXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLk1vbnRoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJfZGF0ZSA9IERhdGVVdGlscy5hZGQoY3VyX2RhdGUsIDEsIFwibW9udGhcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUgPSBEYXRlVXRpbHMuYWRkKFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VyX2RhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc3RlcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICdob3VyJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZGF0ZXMucHVzaChjdXJfZGF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRhaW5lcldpZHRoKSB7XG4gICAgICAgICAgICBjb25zdCBjb2x1bW5XaWR0aCA9ICh0aGlzLm9wdGlvbnMuY29udGFpbmVyV2lkdGggLSAxKSAvIHRoaXMuZGF0ZXMubGVuZ3RoXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggPSBjb2x1bW5XaWR0aCA8IDQ1ID8gNDUgOiBjb2x1bW5XaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgYmluZF9ldmVudHMoKSB7XG4gICAgICAgIHRoaXMuYmluZF9ncmlkX2NsaWNrKCk7XG4gICAgICAgIHRoaXMuYmluZF9iYXJfZXZlbnRzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICAgICAgdGhpcy5zZXR1cF9sYXllcnMoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2RhdGVzKCk7XG4gICAgICAgIHRoaXMubWFrZV9iYXJzKCk7XG4gICAgICAgIHRoaXMubWFrZV9hcnJvd3MoKTtcbiAgICAgICAgdGhpcy5tYXBfYXJyb3dzX29uX2JhcnMoKTtcbiAgICAgICAgdGhpcy5zZXRfd2lkdGgoKTtcbiAgICAgICAgdGhpcy5zZXRfc2Nyb2xsX3Bvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXR1cF9sYXllcnMoKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzID0ge307XG4gICAgICAgIGNvbnN0IGxheWVycyA9IFtcImdyaWRcIiwgXCJkYXRlXCIsIFwiYXJyb3dcIiwgXCJwcm9ncmVzc1wiLCBcImJhclwiLCBcImRldGFpbHNcIl07XG4gICAgICAgIC8vIG1ha2UgZ3JvdXAgbGF5ZXJzXG4gICAgICAgIGZvciAobGV0IGxheWVyIG9mIGxheWVycykge1xuICAgICAgICAgICAgdGhpcy5sYXllcnNbbGF5ZXJdID0gY3JlYXRlU1ZHKCdnJywge1xuICAgICAgICAgICAgICAgIGNsYXNzOiBsYXllcixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMuJHN2ZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWQoKSB7XG4gICAgICAgIHRoaXMubWFrZV9ncmlkX2JhY2tncm91bmQoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfcm93cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF9oZWFkZXIoKTtcbiAgICAgICAgdGhpcy5tYWtlX2dyaWRfaGlnaGxpZ2h0cygpO1xuICAgICAgICB0aGlzLm1ha2VfZ3JpZF90aWNrcygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9ncmlkX2JhY2tncm91bmQoKSB7XG4gICAgICAgIGxldCBncmlkX3dpZHRoID0gdGhpcy5kYXRlcy5sZW5ndGggKiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb250YWluZXJXaWR0aCkge1xuICAgICAgICAgICAgZ3JpZF93aWR0aCA9IHRoaXMub3B0aW9ucy5jb250YWluZXJXaWR0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpc3RpbmN0X3Jvd3MgPSBbLi4ubmV3IFNldCh0aGlzLnRhc2tzLm1hcCgoeDogYW55KSA9PiB4Ll9yb3dfaWQpKV07XG4gICAgICAgIGNvbnN0IGdyaWRfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFkZGluZyAvIDIgK1xuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgKlxuICAgICAgICAgICAgZGlzdGluY3Rfcm93cy5sZW5ndGg7XG5cbiAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHdpZHRoOiBncmlkX3dpZHRoLFxuICAgICAgICAgICAgaGVpZ2h0OiBncmlkX2hlaWdodCxcbiAgICAgICAgICAgIGNsYXNzOiBcImdyaWQtYmFja2dyb3VuZFwiLFxuICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICB9KTtcblxuICAgICAgICAkLmF0dHIodGhpcy4kc3ZnLCB7XG4gICAgICAgICAgICBoZWlnaHQ6IGdyaWRfaGVpZ2h0LFxuICAgICAgICAgICAgd2lkdGg6IFwiMTAwJVwiLFxuICAgICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF9yb3dzKCkge1xuICAgICAgICBjb25zdCByb3dzX2xheWVyID0gY3JlYXRlU1ZHKFwiZ1wiLCB7IGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZCB9KTtcbiAgICAgICAgY29uc3QgbGluZXNfbGF5ZXIgPSBjcmVhdGVTVkcoXCJnXCIsIHsgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkIH0pO1xuXG4gICAgICAgIGNvbnN0IHJvd193aWR0aCA9IHRoaXMuZGF0ZXMubGVuZ3RoICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoO1xuICAgICAgICBjb25zdCByb3dfaGVpZ2h0ID0gdGhpcy5vcHRpb25zLmJhckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nO1xuICAgICAgICAvL1RPRE86ICBhanVzdGFyIG8gcG9zaWNpb25hbWVudG8gZGFzIGxpbmhhc1xuICAgICAgICBsZXQgcm93X3kgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyO1xuXG4gICAgICAgIHRoaXMudGFza3MuZm9yRWFjaChfID0+IHtcbiAgICAgICAgICAgIGNyZWF0ZVNWRyhcInJlY3RcIiwge1xuICAgICAgICAgICAgICAgIHg6IDAsXG4gICAgICAgICAgICAgICAgeTogcm93X3ksXG4gICAgICAgICAgICAgICAgd2lkdGg6IHJvd193aWR0aCxcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IHJvd19oZWlnaHQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwiZ3JpZC1yb3dcIixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHJvd3NfbGF5ZXIsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY3JlYXRlU1ZHKFwibGluZVwiLCB7XG4gICAgICAgICAgICAgICAgeDE6IDAsXG4gICAgICAgICAgICAgICAgeTE6IHJvd195ICsgcm93X2hlaWdodCxcbiAgICAgICAgICAgICAgICB4Mjogcm93X3dpZHRoLFxuICAgICAgICAgICAgICAgIHkyOiByb3dfeSArIHJvd19oZWlnaHQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwicm93LWxpbmVcIixcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IGxpbmVzX2xheWVyLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJvd195ICs9IHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZztcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2dyaWRfaGVhZGVyKCkge1xuICAgICAgICAvLyBjb25zdCBhZGRJc0hvdXJWaWV3ID0gdGhpcy5pc0hvdXJWaWV3ID8gMjUgOiAxMFxuICAgICAgICBjb25zdCBoZWFkZXJfd2lkdGggPSB0aGlzLmRhdGVzLmxlbmd0aCAqIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgY29uc3QgaGVhZGVyX2hlaWdodCA9IHRoaXMub3B0aW9ucy5oZWFkZXJIZWlnaHQgKyAxMDtcbiAgICAgICAgY3JlYXRlU1ZHKFwicmVjdFwiLCB7XG4gICAgICAgICAgICB4OiAwLFxuICAgICAgICAgICAgeTogMCxcbiAgICAgICAgICAgIHdpZHRoOiBoZWFkZXJfd2lkdGgsXG4gICAgICAgICAgICBoZWlnaHQ6IGhlYWRlcl9oZWlnaHQsXG4gICAgICAgICAgICBjbGFzczogXCJncmlkLWhlYWRlclwiLFxuICAgICAgICAgICAgYXBwZW5kX3RvOiB0aGlzLmxheWVycy5ncmlkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1ha2VfZ3JpZF90aWNrcygpIHtcbiAgICAgICAgbGV0IHRpY2tfeCA9IDA7XG4gICAgICAgIGxldCB0aWNrX3kgPSB0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyO1xuICAgICAgICBsZXQgdGlja19oZWlnaHQgPVxuICAgICAgICAgICAgKHRoaXMub3B0aW9ucy5iYXJIZWlnaHQgKyB0aGlzLm9wdGlvbnMucGFkZGluZykgKlxuICAgICAgICAgICAgdGhpcy50YXNrcy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChsZXQgZGF0ZSBvZiB0aGlzLmRhdGVzKSB7XG4gICAgICAgICAgICBsZXQgdGlja19jbGFzcyA9IFwidGlja1wiO1xuXG4gICAgICAgICAgICBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLlF1YXJ0ZXJIb3VyKSAmJiBkYXRlLmdldEhvdXJzKCkgPT09IDAgJiYgZGF0ZS5nZXRNaW51dGVzKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBmaXJzdCBob3VyIG9mIGRheS5cbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhbVmlld01vZGUuSG91ciwgVmlld01vZGUuUXVhcnRlckRheSwgVmlld01vZGUuSGFsZkRheV0pICYmIGRhdGUuZ2V0SG91cnMoKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IGhvdXIgb2YgZGF5LlxuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLkRheSkgJiYgZGF0ZS5nZXREYXRlKCkgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGljayB0aWNrIGZvciBtb25kYXlcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5XZWVrKSAmJiBkYXRlLmdldERhdGUoKSA+PSAxICYmIGRhdGUuZ2V0RGF0ZSgpIDwgOCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaWNrIHRpY2sgZm9yIGZpcnN0IHdlZWtcbiAgICAgICAgICAgICAgICB0aWNrX2NsYXNzICs9IFwiIHRoaWNrXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkgJiYgZGF0ZS5nZXRNb250aCgpICUgMyA9PT0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaWNrIHRpY2tzIGZvciBxdWFydGVyc1xuICAgICAgICAgICAgICAgIHRpY2tfY2xhc3MgKz0gXCIgdGhpY2tcIjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3JlYXRlU1ZHKFwicGF0aFwiLCB7XG4gICAgICAgICAgICAgICAgZDogYE0gJHt0aWNrX3h9ICR7dGlja195fSB2ICR7dGlja19oZWlnaHR9YCxcbiAgICAgICAgICAgICAgICBjbGFzczogdGlja19jbGFzcyxcbiAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmdyaWQsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Nb250aCkpIHtcbiAgICAgICAgICAgICAgICB0aWNrX3ggKz1cbiAgICAgICAgICAgICAgICAgICAgKERhdGVVdGlscy5nZXREYXlzSW5Nb250aChkYXRlKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIC9cbiAgICAgICAgICAgICAgICAgICAgMzA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRpY2tfeCArPSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBtYWtlX2dyaWRfaGlnaGxpZ2h0cygpIHtcbiAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5EYXkpKSB7XG4gICAgICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9ICh0aGlzLm9wdGlvbnMuYmFySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpICpcbiAgICAgICAgICAgICAgICB0aGlzLnRhc2tzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArXG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhZGRpbmcgLyAyO1xuXG4gICAgICAgICAgICBsZXQgeCA9IDA7XG5cbiAgICAgICAgICAgIGZvciAobGV0IGRhdGUgb2YgdGhpcy5kYXRlcykge1xuXG4gICAgICAgICAgICAgICAgbGV0IHkgPSAodGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCArIHRoaXMub3B0aW9ucy5wYWRkaW5nKSAvIDI7XG5cbiAgICAgICAgICAgICAgICBsZXQgaXNUb2RheSA9IGRhdGUgPT0gRGF0ZVV0aWxzLnRvZGF5KCk7XG4gICAgICAgICAgICAgICAgbGV0IGlzV2Vla2VuZCA9IChkYXRlLmdldERheSgpID09IDAgfHwgZGF0ZS5nZXREYXkoKSA9PSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY2xhc3NOYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGlzVG9kYXkpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lID0gXCJ0b2RheS1oaWdobGlnaHRcIjtcbiAgICAgICAgICAgICAgICAgICAgeSA9ICh0aGlzLm9wdGlvbnMuaGVhZGVySGVpZ2h0ICsgdGhpcy5vcHRpb25zLnBhZGRpbmcpIC8gMjtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUgPSBcIndlZWtlbmQtaGlnaGxpZ2h0XCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgcnggPSAzO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJ5ID0gMztcblxuICAgICAgICAgICAgICAgIGlmIChpc1RvZGF5IHx8IGlzV2Vla2VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjcmVhdGVTVkcoXCJyZWN0XCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5LFxuICAgICAgICAgICAgICAgICAgICAgICAgcngsXG4gICAgICAgICAgICAgICAgICAgICAgICByeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6IGNsYXNzTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZ3JpZFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4ICs9IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9kYXRlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXMgPSB0aGlzLmdldF9kYXRlc190b19kcmF3KCk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgZGF0ZSA9IGRhdGVzW2ldO1xuXG4gICAgICAgICAgICBjcmVhdGVTVkcoXCJ0ZXh0XCIsIHtcbiAgICAgICAgICAgICAgICB4OiBkYXRlLmxvd2VyX3gsXG4gICAgICAgICAgICAgICAgeTogZGF0ZS5sb3dlcl95ICsgMjAsXG4gICAgICAgICAgICAgICAgaW5uZXJIVE1MOiBkYXRlLmxvd2VyX3RleHQsXG4gICAgICAgICAgICAgICAgY2xhc3M6IFwidGl0bGUtMlwiLFxuICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZGF0ZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoZGF0ZS5taWRkbGVfdGV4dCkge1xuICAgICAgICAgICAgICAgIGNyZWF0ZVNWRyhcInRleHRcIiwge1xuICAgICAgICAgICAgICAgICAgICB4OiBkYXRlLm1pZGRsZV94LFxuICAgICAgICAgICAgICAgICAgICB5OiBkYXRlLm1pZGRsZV95LFxuICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUubWlkZGxlX3RleHQsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzOiBcIm1pZGRsZS10ZXh0XCIsXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZF90bzogdGhpcy5sYXllcnMuZGF0ZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGRhdGUudXBwZXJfdGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnN0ICR1cHBlcl90ZXh0ID0gY3JlYXRlU1ZHKFwidGV4dFwiLCB7XG4gICAgICAgICAgICAgICAgICAgIHg6IGRhdGUudXBwZXJfeCxcbiAgICAgICAgICAgICAgICAgICAgeTogZGF0ZS51cHBlcl95LFxuICAgICAgICAgICAgICAgICAgICBpbm5lckhUTUw6IGRhdGUudXBwZXJfdGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6IFwidXBwZXItdGV4dFwiLFxuICAgICAgICAgICAgICAgICAgICBhcHBlbmRfdG86IHRoaXMubGF5ZXJzLmRhdGUsXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgb3V0LW9mLWJvdW5kIGRhdGVzXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkdXBwZXJfdGV4dC5nZXRCQm94KCkueDIgPiB0aGlzLmxheWVycy5ncmlkLmdldEJCb3goKS53aWR0aFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkdXBwZXJfdGV4dC5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9kYXRlc190b19kcmF3KCkge1xuICAgICAgICBsZXQgbGFzdF9kYXRlOiBhbnkgPSBudWxsO1xuICAgICAgICBjb25zdCBkYXRlcyA9IHRoaXMuZGF0ZXMubWFwKChkYXRlOiBhbnksIGk6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZCA9IHRoaXMuZ2V0X2RhdGVfaW5mbyhkYXRlLCBsYXN0X2RhdGUsIGkpO1xuICAgICAgICAgICAgbGFzdF9kYXRlID0gZGF0ZTtcbiAgICAgICAgICAgIHJldHVybiBkO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X2RhdGVfaW5mbyhkYXRlOiBEYXRlLCBsYXN0X2RhdGU6IERhdGUsIGk6IGFueSkge1xuICAgICAgICBpZiAoIWxhc3RfZGF0ZSkge1xuICAgICAgICAgICAgbGFzdF9kYXRlID0gRGF0ZVV0aWxzLmFkZChkYXRlLCAxLCBcInllYXJcIik7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXRlX3RleHQgPSB7XG4gICAgICAgICAgICAvLyBxdWFydGVyIGhvdXJcbiAgICAgICAgICAgIHF1YXJ0ZXJIb3VyVXBwZXI6IGRhdGUuZ2V0RGF0ZSgpICE9PSBsYXN0X2RhdGUuZ2V0RGF0ZSgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRCBNTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgcXVhcnRlckhvdXJMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIC8vIGhvdXJcbiAgICAgICAgICAgIGhvdXJVcHBlcjogZGF0ZS5nZXREYXRlKCkgIT09IGxhc3RfZGF0ZS5nZXREYXRlKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICBob3VyTG93ZXI6IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJISDptbVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICAvLyBxdWFydGVyIGRheVxuICAgICAgICAgICAgcXVhcnRlckRheVVwcGVyOiBkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkQgTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIC8vIGhhbGYgZGF5XG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IChkYXRlLmdldERhdGUoKSAhPT0gbGFzdF9kYXRlLmdldERhdGUoKSlcbiAgICAgICAgICAgICAgICA/ICgoKGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKCkpIHx8IGkgPCAyKVxuICAgICAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgICAgIDogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkhIOm1tXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSksXG5cbiAgICAgICAgICAgIC8vIGRheVxuICAgICAgICAgICAgZGF5VXBwZXI6ICgoZGF0ZS5nZXRNb250aCgpICE9PSBsYXN0X2RhdGUuZ2V0TW9udGgoKSkgfHwgaSA9PT0gMClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJNTU1NXCIsIHRoaXMub3B0aW9ucy5sYW5ndWFnZSlcbiAgICAgICAgICAgICAgICA6IFwiXCIsXG5cbiAgICAgICAgICAgIGRheU1pZGRsZTogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcImRkZFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICBkYXlMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIkRcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgLy8gd2Vla1xuICAgICAgICAgICAgd2Vla1VwcGVyOiBkYXRlLmdldE1vbnRoKCkgIT09IGxhc3RfZGF0ZS5nZXRNb250aCgpXG4gICAgICAgICAgICAgICAgPyBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiTU1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBcIlwiLFxuXG4gICAgICAgICAgICB3ZWVrTG93ZXI6IGRhdGUuZ2V0TW9udGgoKSAhPT0gbGFzdF9kYXRlLmdldE1vbnRoKClcbiAgICAgICAgICAgICAgICA/IERhdGVVdGlscy5mb3JtYXQoZGF0ZSwgXCJEIE1NTVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpXG4gICAgICAgICAgICAgICAgOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiRFwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuXG4gICAgICAgICAgICAvLyBtb250aFxuICAgICAgICAgICAgbW9udGhVcHBlcjogZGF0ZS5nZXRGdWxsWWVhcigpICE9PSBsYXN0X2RhdGUuZ2V0RnVsbFllYXIoKVxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgbW9udGhMb3dlcjogRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIk1NTU1cIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKSxcblxuICAgICAgICAgICAgLy8geWVhclxuICAgICAgICAgICAgeWVhclVwcGVyOiBkYXRlLmdldEZ1bGxZZWFyKCkgIT09IGxhc3RfZGF0ZS5nZXRGdWxsWWVhcigpIFxuICAgICAgICAgICAgICAgID8gRGF0ZVV0aWxzLmZvcm1hdChkYXRlLCBcIllZWVlcIiwgdGhpcy5vcHRpb25zLmxhbmd1YWdlKVxuICAgICAgICAgICAgICAgIDogXCJcIixcblxuICAgICAgICAgICAgeWVhckxvd2VyOiBEYXRlVXRpbHMuZm9ybWF0KGRhdGUsIFwiWVlZWVwiLCB0aGlzLm9wdGlvbnMubGFuZ3VhZ2UpLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIERlc2NvbnRhbmRvIDIwIHBhcmEgYWRjaW9uYXIgdW1hIHNlZ3VuZGEgbGluaGEgZGUgaW5mb3JtYcOnw6NvIG5vIGNhYmXDp2FsaG9cbiAgICAgICAgY29uc3QgYmFzZV9wb3MgPSB7XG4gICAgICAgICAgICB4OiBpICogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoLFxuICAgICAgICAgICAgdXBwZXJfeTogdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCAtIDIwIC0gMjUsXG4gICAgICAgICAgICBtaWRkbGVfeTogdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCAtIDIwLFxuICAgICAgICAgICAgbG93ZXJfeTogdGhpcy5vcHRpb25zLmhlYWRlckhlaWdodCAtIDIwLFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB4X3BvcyA9IHtcbiAgICAgICAgICAgIHF1YXJ0ZXJIb3VyVXBwZXI6ICh0aGlzLmRhdGVzLmxlbmd0aCA8IDE0KSA/ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIDogKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDI0IC8gMiksXG4gICAgICAgICAgICBxdWFydGVySG91ck1pZGRsZTogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIHF1YXJ0ZXJIb3VyTG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG5cbiAgICAgICAgICAgIGhvdXJVcHBlcjogKHRoaXMuZGF0ZXMubGVuZ3RoIDwgMTQpID8gKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCkgOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMjQgLyAyKSxcbiAgICAgICAgICAgIGhvdXJNaWRkbGU6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBob3VyTG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG5cbiAgICAgICAgICAgIHF1YXJ0ZXJEYXlVcHBlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogNCAvIDIsXG4gICAgICAgICAgICBxdWFydGVyRGF5TWlkZGxlOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgcXVhcnRlckRheUxvd2VyOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyLFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBoYWxmRGF5VXBwZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDIgLyAyLFxuICAgICAgICAgICAgaGFsZkRheU1pZGRsZTogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIGhhbGZEYXlMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZGF5VXBwZXI6ICh0aGlzLmRhdGVzLmxlbmd0aCA8IDE1KSA/ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIDogKCh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAzMCkgLyAyKSxcbiAgICAgICAgICAgIGRheU1pZGRsZTogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMiAtIDEyLFxuICAgICAgICAgICAgZGF5TG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdlZWtVcHBlcjogKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAqIDQpIC8gMixcbiAgICAgICAgICAgIHdlZWtNaWRkbGU6IDAsXG4gICAgICAgICAgICB3ZWVrTG93ZXI6IDAsXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG1vbnRoVXBwZXI6ICh0aGlzLmRhdGVzLmxlbmd0aCA8IDE1KSA/ICh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGgpIDogKCh0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggKiAxMikgLyAyKSxcbiAgICAgICAgICAgIG1vbnRoTWlkZGxlOiAwLFxuICAgICAgICAgICAgbW9udGhMb3dlcjogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMixcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgeWVhclVwcGVyOiAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoICogMzApIC8gMixcbiAgICAgICAgICAgIHllYXJNaWRkbGU6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgICAgICB5ZWFyTG93ZXI6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDIsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVwcGVyX3RleHQ6IGRhdGVfdGV4dFtgJHt0aGlzLm9wdGlvbnMudmlld01vZGV9VXBwZXJgXSxcbiAgICAgICAgICAgIG1pZGRsZV90ZXh0OiBkYXRlX3RleHRbYCR7dGhpcy5vcHRpb25zLnZpZXdNb2RlfU1pZGRsZWBdLFxuICAgICAgICAgICAgbG93ZXJfdGV4dDogZGF0ZV90ZXh0W2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1VcHBlcmBdLFxuICAgICAgICAgICAgdXBwZXJfeTogYmFzZV9wb3MudXBwZXJfeSxcbiAgICAgICAgICAgIG1pZGRsZV94OiBiYXNlX3Bvcy54ICsgeF9wb3NbYCR7dGhpcy5vcHRpb25zLnZpZXdNb2RlfU1pZGRsZWBdLFxuICAgICAgICAgICAgbWlkZGxlX3k6IGJhc2VfcG9zLm1pZGRsZV95LFxuICAgICAgICAgICAgbG93ZXJfeDogYmFzZV9wb3MueCArIHhfcG9zW2Ake3RoaXMub3B0aW9ucy52aWV3TW9kZX1Mb3dlcmBdLFxuICAgICAgICAgICAgbG93ZXJfeTogYmFzZV9wb3MubG93ZXJfeSxcbiAgICAgICAgICAgIGRhdGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBtYWtlX2JhcnMoKSB7XG4gICAgICAgIHRoaXMuYmFycyA9IHRoaXMudGFza3MubWFwKCh0YXNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGJhciA9IG5ldyBCYXIodGhpcywgdGFzayk7XG4gICAgICAgICAgICB0aGlzLmxheWVycy5iYXIuYXBwZW5kQ2hpbGQoYmFyLmdyb3VwKTtcbiAgICAgICAgICAgIHJldHVybiBiYXI7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFrZV9hcnJvd3MoKSB7XG4gICAgICAgIHRoaXMuYXJyb3dzID0gW107XG4gICAgICAgIGZvciAobGV0IHRhc2sgb2YgdGhpcy50YXNrcykge1xuICAgICAgICAgICAgbGV0IGFycm93cyA9IFtdO1xuICAgICAgICAgICAgYXJyb3dzID0gdGFzay5kZXBlbmRlbmNpZXNcbiAgICAgICAgICAgICAgICAubWFwKCh0YXNrX2lkOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwZW5kZW5jeSA9IHRoaXMuZ2V0X3Rhc2sodGFza19pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZGVwZW5kZW5jeSkgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJvdyA9IG5ldyBBcnJvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJhcnNbZGVwZW5kZW5jeS5faW5kZXhdLCAvLyBmcm9tX3Rhc2tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYmFyc1t0YXNrLl9pbmRleF0gLy8gdG9fdGFza1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxheWVycy5hcnJvdy5hcHBlbmRDaGlsZChhcnJvdy5lbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFycm93O1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTsgLy8gZmlsdGVyIGZhbHN5IHZhbHVlc1xuICAgICAgICAgICAgdGhpcy5hcnJvd3MgPSB0aGlzLmFycm93cy5jb25jYXQoYXJyb3dzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFwX2Fycm93c19vbl9iYXJzKCkge1xuICAgICAgICBmb3IgKGxldCBiYXIgb2YgdGhpcy5iYXJzKSB7XG4gICAgICAgICAgICBiYXIuYXJyb3dzID0gdGhpcy5hcnJvd3MuZmlsdGVyKChhcnJvdzogQXJyb3cpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBhcnJvdy5mcm9tVGFzay50YXNrLmlkID09PSBiYXIudGFzay5pZCB8fFxuICAgICAgICAgICAgICAgICAgICBhcnJvdy50b1Rhc2sudGFzay5pZCA9PT0gYmFyLnRhc2suaWRcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldF93aWR0aCgpIHtcbiAgICAgICAgY29uc3QgY3VyX3dpZHRoID0gdGhpcy4kc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgICAgICBjb25zdCBhY3R1YWxfd2lkdGggPSB0aGlzLiRzdmdcbiAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKFwiLmdyaWQgLmdyaWQtcm93XCIpXG4gICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFwid2lkdGhcIik7XG4gICAgICAgIGlmIChjdXJfd2lkdGggPCBhY3R1YWxfd2lkdGgpIHtcbiAgICAgICAgICAgIHRoaXMuJHN2Zy5zZXRBdHRyaWJ1dGUoXCJ3aWR0aFwiLCBhY3R1YWxfd2lkdGgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRfc2Nyb2xsX3Bvc2l0aW9uKCkge1xuICAgICAgICBjb25zdCBwYXJlbnRfZWxlbWVudCA9IHRoaXMuJHN2Zy5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudF9lbGVtZW50KSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgaG91cnNfYmVmb3JlX2ZpcnN0X3Rhc2sgPSBEYXRlVXRpbHMuZGlmZihcbiAgICAgICAgICAgIHRoaXMuZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCksXG4gICAgICAgICAgICB0aGlzLm1pbkRhdGUsXG4gICAgICAgICAgICBcImhvdXJcIlxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHNjcm9sbF9wb3MgPVxuICAgICAgICAgICAgKGhvdXJzX2JlZm9yZV9maXJzdF90YXNrIC8gdGhpcy5vcHRpb25zLnN0ZXApICpcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAtXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG5cbiAgICAgICAgcGFyZW50X2VsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbF9wb3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kX2dyaWRfY2xpY2soKSB7XG4gICAgICAgICQub24oXG4gICAgICAgICAgICB0aGlzLiRzdmcsXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9wdXBUcmlnZ2VyLFxuICAgICAgICAgICAgXCIuZ3JpZC1yb3csIC5ncmlkLWhlYWRlclwiLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RfYWxsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlX3BvcHVwKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBiaW5kX2Jhcl9ldmVudHMoKSB7XG4gICAgICAgIGxldCBpc19kcmFnZ2luZyA9IGZhbHNlO1xuICAgICAgICBsZXQgeF9vbl9zdGFydCA9IDA7XG4gICAgICAgIGxldCBpc19yZXNpemluZ19sZWZ0ID0gZmFsc2U7XG4gICAgICAgIGxldCBpc19yZXNpemluZ19yaWdodCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFyZW50X2Jhcl9pZDogYW55ID0gbnVsbDtcbiAgICAgICAgbGV0IGJhcnM6IEJhcltdID0gW107XG4gICAgICAgIHRoaXMuYmFyX2JlaW5nX2RyYWdnZWQgPSBudWxsO1xuXG4gICAgICAgIGZ1bmN0aW9uIGFjdGlvbl9pbl9wcm9ncmVzcygpIHtcbiAgICAgICAgICAgIHJldHVybiBpc19kcmFnZ2luZyB8fCBpc19yZXNpemluZ19sZWZ0IHx8IGlzX3Jlc2l6aW5nX3JpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgJC5vbih0aGlzLiRzdmcsIFwibW91c2Vkb3duXCIsIFwiLmJhci13cmFwcGVyLCAuaGFuZGxlXCIsIChlOiBhbnksIGVsZW1lbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYmFyX3dyYXBwZXIgPSAkLmNsb3Nlc3QoXCIuYmFyLXdyYXBwZXJcIiwgZWxlbWVudCk7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhcImxlZnRcIikpIHtcbiAgICAgICAgICAgICAgICBpc19yZXNpemluZ19sZWZ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJyaWdodFwiKSkge1xuICAgICAgICAgICAgICAgIGlzX3Jlc2l6aW5nX3JpZ2h0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoXCJiYXItd3JhcHBlclwiKSAmJiB0aGlzLm9wdGlvbnMuYWxsb3dNb3ZlbWVudCkge1xuICAgICAgICAgICAgICAgIGlzX2RyYWdnaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYmFyX3dyYXBwZXIuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgeF9vbl9zdGFydCA9IGUub2Zmc2V0WDtcblxuICAgICAgICAgICAgcGFyZW50X2Jhcl9pZCA9IGJhcl93cmFwcGVyLmdldEF0dHJpYnV0ZShcImRhdGEtaWRcIik7XG4gICAgICAgICAgICBjb25zdCBpZHMgPSBbXG4gICAgICAgICAgICAgICAgcGFyZW50X2Jhcl9pZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLmdldF9hbGxfZGVwZW5kZW50X3Rhc2tzKHBhcmVudF9iYXJfaWQpLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGJhcnMgPSBpZHMubWFwKChpZCkgPT4gdGhpcy5nZXRfYmFyKGlkKSk7XG5cbiAgICAgICAgICAgIHRoaXMuYmFyX2JlaW5nX2RyYWdnZWQgPSBwYXJlbnRfYmFyX2lkO1xuXG4gICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRiYXIgPSBiYXIuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAkYmFyLm94ID0gJGJhci5nZXRYKCk7XG4gICAgICAgICAgICAgICAgJGJhci5veSA9ICRiYXIuZ2V0WSgpO1xuICAgICAgICAgICAgICAgICRiYXIub3dpZHRoID0gJGJhci5nZXRXaWR0aCgpO1xuICAgICAgICAgICAgICAgICRiYXIuZmluYWxkeCA9IDA7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAkLm9uKHRoaXMuJHN2ZywgXCJtb3VzZW1vdmVcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY3Rpb25faW5fcHJvZ3Jlc3MoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZHggPSBlLm9mZnNldFggLSB4X29uX3N0YXJ0O1xuXG4gICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRiYXIgPSBiYXIuZWxlbWVudDtcbiAgICAgICAgICAgICAgICAkYmFyLmZpbmFsZHggPSB0aGlzLmdldF9zbmFwX3Bvc2l0aW9uKGR4KTtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVfcG9wdXAoKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNfcmVzaXppbmdfbGVmdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50X2Jhcl9pZCA9PT0gYmFyLnRhc2suaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogJGJhci5veCArICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogJGJhci5vd2lkdGggLSAkYmFyLmZpbmFsZHgsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogJGJhci5veCArICRiYXIuZmluYWxkeCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc19yZXNpemluZ19yaWdodCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50X2Jhcl9pZCA9PT0gYmFyLnRhc2suaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg6ICRiYXIub3dpZHRoICsgJGJhci5maW5hbGR4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzX2RyYWdnaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhci51cGRhdGVCYXJQb3NpdGlvbih7IHg6ICRiYXIub3ggKyAkYmFyLmZpbmFsZHggfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sIG51bGwpO1xuXG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzX2RyYWdnaW5nIHx8IGlzX3Jlc2l6aW5nX2xlZnQgfHwgaXNfcmVzaXppbmdfcmlnaHQgfHwgIXRoaXMub3B0aW9ucy5hbGxvd01vdmVtZW50KSB7XG4gICAgICAgICAgICAgICAgYmFycy5mb3JFYWNoKChiYXIpID0+IGJhci5ncm91cC5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaXNfZHJhZ2dpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzX3Jlc2l6aW5nX2xlZnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlzX3Jlc2l6aW5nX3JpZ2h0ID0gZmFsc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQub24odGhpcy4kc3ZnLCBcIm1vdXNldXBcIiwgKGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5iYXJfYmVpbmdfZHJhZ2dlZCA9IG51bGw7XG4gICAgICAgICAgICBiYXJzLmZvckVhY2goKGJhcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0ICRiYXIgPSBiYXIuZWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAoISRiYXIuZmluYWxkeCkgcmV0dXJuO1xuICAgICAgICAgICAgICAgIGJhci5kYXRlQ2hhbmdlZCgpO1xuICAgICAgICAgICAgICAgIGJhci5zZXRBY3Rpb25Db21wbGV0ZWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCBudWxsKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9hbGxfZGVwZW5kZW50X3Rhc2tzKHRhc2tfaWQ6IGFueSkge1xuICAgICAgICBsZXQgb3V0OiBhbnlbXSA9IFtdO1xuICAgICAgICBsZXQgdG9fcHJvY2VzcyA9IFt0YXNrX2lkXTtcbiAgICAgICAgd2hpbGUgKHRvX3Byb2Nlc3MubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBkZXBzID0gdG9fcHJvY2Vzcy5yZWR1Y2UoKGFjYywgY3VycikgPT4ge1xuICAgICAgICAgICAgICAgIGFjYyA9IGFjYy5jb25jYXQodGhpcy5kZXBlbmRlbmN5X21hcFtjdXJyXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgICAgIH0sIFtdKTtcblxuICAgICAgICAgICAgb3V0ID0gb3V0LmNvbmNhdChkZXBzKTtcbiAgICAgICAgICAgIHRvX3Byb2Nlc3MgPSBkZXBzLmZpbHRlcigoZDogYW55KSA9PiAhdG9fcHJvY2Vzcy5pbmNsdWRlcyhkKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0LmZpbHRlcihCb29sZWFuKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldF9zbmFwX3Bvc2l0aW9uKGR4OiBhbnkpIHtcbiAgICAgICAgbGV0IG9keCA9IGR4LFxuICAgICAgICAgICAgcmVtLFxuICAgICAgICAgICAgcG9zaXRpb247XG5cbiAgICAgICAgaWYgKHRoaXMudmlld19pcyhWaWV3TW9kZS5Ib3VyKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNik7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAxMiA/IDAgOiB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyA2KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZpZXdfaXMoVmlld01vZGUuV2VlaykpIHtcbiAgICAgICAgICAgIHJlbSA9IGR4ICUgKHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCAvIDcpO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMTQgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy52aWV3X2lzKFZpZXdNb2RlLk1vbnRoKSkge1xuICAgICAgICAgICAgcmVtID0gZHggJSAodGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMzApO1xuICAgICAgICAgICAgcG9zaXRpb24gPSBvZHggLSByZW0gKyAocmVtIDwgdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gNjAgPyAwIDogdGhpcy5vcHRpb25zLmNvbHVtbldpZHRoIC8gMzApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVtID0gZHggJSB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGg7XG4gICAgICAgICAgICBwb3NpdGlvbiA9IG9keCAtIHJlbSArIChyZW0gPCB0aGlzLm9wdGlvbnMuY29sdW1uV2lkdGggLyAyID8gMCA6IHRoaXMub3B0aW9ucy5jb2x1bW5XaWR0aCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyB1bnNlbGVjdF9hbGwoKSB7XG4gICAgICAgIFsuLi50aGlzLiRzdmcucXVlcnlTZWxlY3RvckFsbChcIi5iYXItd3JhcHBlclwiKV0uZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyB2aWV3X2lzKG1vZGVzOiBWaWV3TW9kZSB8IFZpZXdNb2RlW10pIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobW9kZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbW9kZXMuc29tZSgobW9kZSkgPT4gdGhpcy5vcHRpb25zLnZpZXdNb2RlID09PSBtb2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMudmlld01vZGUgPT09IG1vZGVzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X3Rhc2soaWQ6IGFueSkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrcy5maW5kKCh0YXNrOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0YXNrLmlkID09PSBpZDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldF9iYXIoaWQ6IGFueSk6IEJhciB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhcnMuZmluZCgoYmFyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBiYXIudGFzay5pZCA9PT0gaWQ7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93X3BvcHVwKG9wdGlvbnM6IGFueSkge1xuICAgICAgICBpZiAoIXRoaXMucG9wdXApIHtcbiAgICAgICAgICAgIHRoaXMucG9wdXAgPSBuZXcgUG9wdXAoXG4gICAgICAgICAgICAgICAgdGhpcy5wb3B1cF93cmFwcGVyLFxuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jdXN0b21Qb3B1cEh0bWxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3B1cC5zaG93KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlX3BvcHVwKCkge1xuICAgICAgICB0aGlzLnBvcHVwICYmIHRoaXMucG9wdXAuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyB0cmlnZ2VyX2V2ZW50KGV2ZW50OiBzdHJpbmcsIGFyZ3M6IGFueSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zW2V2ZW50XSkge1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zW2V2ZW50XS5hcHBseShudWxsLCBhcmdzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0X29sZGVzdF9zdGFydGluZ19kYXRlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50YXNrc1xuICAgICAgICAgICAgLm1hcCgodGFzazogYW55KSA9PiB0YXNrLl9zdGFydClcbiAgICAgICAgICAgIC5yZWR1Y2UoKHByZXZfZGF0ZTogYW55LCBjdXJfZGF0ZTogYW55KSA9PlxuICAgICAgICAgICAgICAgIGN1cl9kYXRlIDw9IHByZXZfZGF0ZSA/IGN1cl9kYXRlIDogcHJldl9kYXRlXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuJHN2Zy5pbm5lckhUTUwgPSAnJztcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlX2lkKHRhc2s6IGFueSkge1xuICAgIHJldHVybiB0YXNrLm5hbWUgKyBcIl9cIiArIE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIsIDEyKTtcbn1cbiJdfQ==