@chocbite/ts-lib-form 1.2.0 → 1.3.1

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.
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import './style.css';
2
2
  import { AccessTypes, Base, define_element } from "@chocbite/ts-lib-base";
3
- import { IPAddress, IPVersion, get_cursor_position, set_cursor_end, set_cursor_position, set_selection_all, sleep, sync_resolve } from "@chocbite/ts-lib-common";
3
+ import { IPAddress, IPVersion, get_cursor_position, node_clone, set_cursor_end, set_cursor_position, set_selection_all, sleep, sync_resolve } from "@chocbite/ts-lib-common";
4
4
  import { err, none, ok, some } from "@chocbite/ts-lib-result";
5
5
  import { BLUE, GREEN, GREY, ORANGE, RED, YELLOW } from "@chocbite/ts-lib-colors";
6
6
  import { ANIMATION_LEVEL, ANIMATION_SPEED, AnimationLevels, theme_init_variable_root } from "@chocbite/ts-lib-theme";
@@ -40,16 +40,16 @@ colors_basic.make_variable("red", "Basic Red Color", "Commonly used red color in
40
40
  colors_basic.make_variable("blue", "Basic Blue Color", "Commonly used blue color in form elements", BLUE["300"], BLUE["900"], "Color", void 0);
41
41
  colors_basic.make_variable("yellow", "Basic Yellow Color", "Commonly used yellow color in form elements", YELLOW["300"], ORANGE["900"], "Color", void 0);
42
42
  const sizes = theme_root.make_sub_group("size", "Size", "Sizes used in all form elements");
43
- sizes.make_variable("height", "Height", "Default height used in all form elements", "1.6rem", "1.6rem", "Length", {
43
+ sizes.make_variable("height", "Height", "Default height used in all form elements", "1.3rem", "1.3rem", "Length", {
44
44
  min: .1,
45
45
  max: 10
46
46
  });
47
- sizes.make_variable("touchHeight", "Touch Height", "Minimum height for touch devices used in all form elements", "2.6rem", "2.6rem", "Length", {
47
+ sizes.make_variable("touchHeight", "Touch Height", "Minimum height for touch devices used in all form elements", "2.0rem", "2.0rem", "Length", {
48
48
  min: .1,
49
49
  max: 10
50
50
  });
51
51
  const font = theme_root.make_sub_group("font", "Font", "Font settings used in all form elements");
52
- font.make_variable("size", "Font Size", "Default font size used in all form elements", "1rem", "1rem", "Length", {
52
+ font.make_variable("size", "Font Size", "Default font size used in all form elements", "0.9rem", "0.9rem", "Length", {
53
53
  min: .1,
54
54
  max: 10
55
55
  });
@@ -76,6 +76,7 @@ var FormElement = class extends Base {
76
76
  static element_name_space() {
77
77
  return "form";
78
78
  }
79
+ static apply_options(_element, _options) {}
79
80
  };
80
81
  /**Shared class for all components with values*/
81
82
  var FormValue = class extends FormElement {
@@ -86,6 +87,7 @@ var FormValue = class extends FormElement {
86
87
  if (options.description) element.description = options.description;
87
88
  if (options.value_by_state) element.value_by_state = options.value_by_state;
88
89
  else if (options.value !== void 0) element.value = options.value;
90
+ super.apply_options(element, options);
89
91
  }
90
92
  form_id;
91
93
  constructor(id) {
@@ -331,6 +333,14 @@ var FormButton = class extends FormValueWrite {
331
333
  if (color === FormColors.None) this.removeAttribute("color");
332
334
  else this.setAttribute("color", color);
333
335
  }
336
+ /**Centers text and icon */
337
+ set center(center) {
338
+ if (center) this.classList.add("center");
339
+ else this.classList.remove("center");
340
+ }
341
+ get center() {
342
+ return this.classList.contains("center");
343
+ }
334
344
  /**Called when value is changed */
335
345
  new_value(value) {
336
346
  if (value) this.classList.add("active");
@@ -362,6 +372,7 @@ function form_button(options) {
362
372
  if (options.on_click) butt.on_click = options.on_click;
363
373
  if (options.toggle) butt.toggle = options.toggle;
364
374
  if (options.color) butt.color = options.color;
375
+ if (options.center) butt.center = options.center;
365
376
  FormValue.apply_options(butt, options);
366
377
  }
367
378
  return butt;
@@ -398,6 +409,14 @@ var FormLamp = class extends FormValue {
398
409
  this.#colors = colors;
399
410
  this.new_value(this.buffer);
400
411
  }
412
+ /**Centers text and icon */
413
+ set center(center) {
414
+ if (center) this.classList.add("center");
415
+ else this.classList.remove("center");
416
+ }
417
+ get center() {
418
+ return this.classList.contains("center");
419
+ }
401
420
  /**Called when value is changed */
402
421
  new_value(value) {
403
422
  const color = this.#colors[Number(value)];
@@ -420,6 +439,7 @@ function from(options) {
420
439
  lamp.colors = options.colors;
421
440
  if (options.text) lamp.text = options.text;
422
441
  if (options.icon) lamp.icon = options.icon;
442
+ if (options.center) lamp.center = options.center;
423
443
  FormValue.apply_options(lamp, options);
424
444
  }
425
445
  return lamp;
@@ -544,7 +564,7 @@ function form_switch(options) {
544
564
  return swit;
545
565
  }
546
566
  //#endregion
547
- //#region src/group/group.ts
567
+ //#region src/group/group_base.ts
548
568
  /**Different border styles for the component group*/
549
569
  const FormGroupBorderStyle = {
550
570
  None: "none",
@@ -552,109 +572,19 @@ const FormGroupBorderStyle = {
552
572
  Outset: "outset",
553
573
  Line: "line"
554
574
  };
555
- /**Component group class which allows to add elements and controls the flow of the elements*/
556
- var FormGroup = class extends FormValue {
575
+ var FormGroupBase = class extends FormValue {
557
576
  static element_name() {
558
- return "group";
577
+ return "@abstract@";
559
578
  }
560
579
  static element_name_space() {
561
580
  return "form";
562
581
  }
563
- #collapsible;
564
- #collapsed = false;
565
- #collapse_button;
566
- #value_elements = /* @__PURE__ */ new Map();
567
- set elements(elements) {
568
- for (let i = 0, n = elements.length; i < n; i++) {
569
- const comp = elements[i];
570
- if (comp instanceof FormValue && comp.form_id) {
571
- if (this.#value_elements.has(comp.form_id)) {
572
- console.error("Form element with form id " + comp.form_id + " already exists in group");
573
- continue;
574
- }
575
- this.#value_elements.set(comp.form_id, comp);
576
- }
577
- if (this.#collapsible) this.#collapsible.appendChild(comp);
578
- else this.appendChild(comp);
579
- }
580
- }
581
- get elements() {
582
- return [...this.#value_elements.values()];
583
- }
582
+ value_elements = /* @__PURE__ */ new Map();
584
583
  /**This places the group at an absolute position in one of the corners of the container*/
585
584
  set border(border) {
586
585
  this.classList.remove(FormGroupBorderStyle.Inset, FormGroupBorderStyle.Outset);
587
586
  if (border && border !== FormGroupBorderStyle.None) this.classList.add(border);
588
587
  }
589
- set collapsible(collapsible) {
590
- if (collapsible && !this.#collapsible) {
591
- this.#collapsible = document.createElement("div");
592
- if (this.children.length > 1) this.#collapsible.replaceChildren(...this.children);
593
- this.appendChild(this.#collapsible);
594
- this.classList.add("collapsible");
595
- this.appendChild(this.#collapse_button || (this.collapse_text = "") || this.#collapse_button);
596
- this.collapsed = true;
597
- } else if (!collapsible && this.#collapsible) {
598
- this.collapsed = false;
599
- this.replaceChildren(...this.#collapsible.children);
600
- this.#collapsible = void 0;
601
- this.classList.remove("collapsible");
602
- }
603
- }
604
- get collapsible() {
605
- return this.#collapsible !== void 0;
606
- }
607
- set collapsed(collapsed) {
608
- if (this.#collapsible) {
609
- if (collapsed && !this.#collapsed) if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
610
- this.#collapsible.style.overflowY = "hidden";
611
- const full_height = this.#collapsible.getBoundingClientRect().height + "px";
612
- const animation = this.#collapsible.animate([{ height: full_height }, { height: "0" }], {
613
- duration: ANIMATION_SPEED.get().value,
614
- easing: "ease-in"
615
- });
616
- animation.onfinish = () => {
617
- this.classList.add("collapsed");
618
- if (this.#collapsible) this.#collapsible.style.overflowY = "";
619
- };
620
- } else this.classList.add("collapsed");
621
- else if (!collapsed && this.#collapsed) {
622
- this.classList.remove("collapsed");
623
- if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
624
- this.#collapsible.style.overflowY = "hidden";
625
- const full_height = this.#collapsible.getBoundingClientRect().height + "px";
626
- const animation = this.#collapsible.animate([{ height: "0" }, { height: full_height }], {
627
- duration: ANIMATION_SPEED.get().value,
628
- easing: "ease-out"
629
- });
630
- animation.onfinish = () => {
631
- if (this.#collapsible) this.#collapsible.style.overflowY = "";
632
- };
633
- }
634
- }
635
- this.#collapsed = collapsed;
636
- }
637
- }
638
- get collapsed() {
639
- return this.#collapsed;
640
- }
641
- set collapse_text(text) {
642
- if (!this.#collapse_button) {
643
- this.#collapse_button = document.createElement("span");
644
- this.#collapse_button.tabIndex = 0;
645
- this.#collapse_button.appendChild(document.createElement("span"));
646
- this.#collapse_button.appendChild(material_unfold_less_rounded());
647
- this.#collapse_button.appendChild(material_unfold_more_rounded());
648
- this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
649
- this.#collapse_button.onkeydown = (e) => {
650
- if (e.key === "Enter" || e.key === " ") {
651
- e.preventDefault();
652
- this.collapsed = !this.collapsed;
653
- }
654
- };
655
- }
656
- this.#collapse_button.firstChild.textContent = text;
657
- }
658
588
  set max_height(height) {
659
589
  this.style.setProperty("--max_height", height ? height + "rem" : "none");
660
590
  if (height) this.classList.add("max_height");
@@ -671,7 +601,7 @@ var FormGroup = class extends FormValue {
671
601
  get value() {
672
602
  if (this._state) return err("State based component");
673
603
  const result = {};
674
- for (const [key, comp] of this.#value_elements) {
604
+ for (const [key, comp] of this.value_elements) {
675
605
  const val = comp.value;
676
606
  if (val.err) return err("Component with id " + key + " has no value");
677
607
  result[key] = val.value;
@@ -679,10 +609,10 @@ var FormGroup = class extends FormValue {
679
609
  return ok(result);
680
610
  }
681
611
  new_value(val) {
682
- for (const key in val) if (this.#value_elements.has(key)) this.#value_elements.get(key).value = val[key];
612
+ for (const key in val) if (this.value_elements.has(key)) this.value_elements.get(key).value = val[key];
683
613
  }
684
614
  clear_value() {
685
- for (const comp of this.#value_elements.values()) comp.clear();
615
+ for (const comp of this.value_elements.values()) comp.clear();
686
616
  }
687
617
  new_error(err) {
688
618
  console.error(err);
@@ -704,23 +634,173 @@ var FormGroup = class extends FormValue {
704
634
  }
705
635
  }
706
636
  };
637
+ //#endregion
638
+ //#region src/group/group.ts
639
+ /**Component group class which allows to add elements and controls the flow of the elements*/
640
+ var FormGroup = class extends FormGroupBase {
641
+ static element_name() {
642
+ return "group";
643
+ }
644
+ static element_name_space() {
645
+ return "form";
646
+ }
647
+ constructor(id) {
648
+ super(id);
649
+ this.classList.add("flex-col");
650
+ }
651
+ set column(column) {
652
+ this.classList.remove("grid-row", "grid-col", "flex-row", "flex-col");
653
+ if (column === true) this.classList.add("flex-col");
654
+ else {
655
+ this.classList.add("grid-col");
656
+ if (typeof column === "string") this.style.gridTemplateColumns = "repeat(auto-fit, minmax(" + column + ", 1fr))";
657
+ else this.style.gridTemplateColumns = column.map((col) => "minmax(" + col + ", 1fr)").join(" ");
658
+ }
659
+ }
660
+ set row(row) {
661
+ this.classList.remove("grid-row", "grid-col", "flex-row", "flex-col");
662
+ if (row === true) this.classList.add("flex-row");
663
+ else {
664
+ this.classList.add("grid-row");
665
+ if (typeof row === "string") this.style.gridTemplateRows = "repeat(auto-fit, minmax(" + row + ", 1fr))";
666
+ else this.style.gridTemplateRows = row.map((col) => "minmax(" + col + ", 1fr)").join(" ");
667
+ }
668
+ }
669
+ set elements(elements) {
670
+ for (let i = 0, n = elements.length; i < n; i++) {
671
+ const comp = elements[i];
672
+ if (comp instanceof FormValue && comp.form_id) {
673
+ if (this.value_elements.has(comp.form_id)) {
674
+ console.error("Form element with form id " + comp.form_id + " already exists in group");
675
+ continue;
676
+ }
677
+ this.value_elements.set(comp.form_id, comp);
678
+ }
679
+ this.appendChild(comp);
680
+ }
681
+ }
682
+ get elements() {
683
+ return [...this.value_elements.values()];
684
+ }
685
+ };
707
686
  define_element(FormGroup);
708
- /**Creates a dropdown form element */
687
+ /**Creates a form group with elements */
709
688
  function form_group(options) {
710
689
  const slide = new FormGroup(options?.id);
711
690
  if (options) {
712
691
  if (options.border) slide.border = options.border;
713
692
  if (options.elements) slide.elements = options.elements;
714
- if (options.collapse_text) slide.collapse_text = options.collapse_text;
715
- if (options.collapsible) slide.collapsible = options.collapsible;
716
- if (options.collapsed) slide.collapsed = options.collapsed;
717
693
  if (options.max_height) slide.max_height = options.max_height;
718
694
  if (options.embed) slide.embed = options.embed;
695
+ if (options.column) slide.column = options.column;
696
+ else if (options.row) slide.row = options.row;
719
697
  FormValue.apply_options(slide, options);
720
698
  }
721
699
  return slide;
722
700
  }
723
701
  //#endregion
702
+ //#region src/group/group_collapser.ts
703
+ const open_text = document.createElement("span");
704
+ open_text.textContent = "Collapse";
705
+ const close_text = document.createElement("span");
706
+ close_text.textContent = "Expand";
707
+ /**Component group class which allows to add elements and controls the flow of the elements*/
708
+ var FormGroupCollapser = class extends FormElement {
709
+ static element_name() {
710
+ return "group-collapser";
711
+ }
712
+ static element_name_space() {
713
+ return "form";
714
+ }
715
+ #group;
716
+ #collapse_button;
717
+ #collapsed = false;
718
+ #open_text = node_clone(open_text);
719
+ #close_text = node_clone(close_text);
720
+ constructor(group, collapsed) {
721
+ super();
722
+ this.#group = this.appendChild(group);
723
+ if (collapsed) {
724
+ this.classList.add("collapsed");
725
+ this.#collapsed = true;
726
+ }
727
+ this.#collapse_button = this.appendChild(document.createElement("span"));
728
+ this.#collapse_button.tabIndex = 0;
729
+ this.#collapse_button.appendChild(collapsed ? this.#close_text : this.#open_text);
730
+ this.#collapse_button.appendChild(material_unfold_less_rounded());
731
+ this.#collapse_button.onclick = () => this.collapsed = !this.collapsed;
732
+ this.#collapse_button.onkeydown = (e) => {
733
+ if (e.key === "Enter" || e.key === " ") {
734
+ e.preventDefault();
735
+ this.collapsed = !this.collapsed;
736
+ }
737
+ };
738
+ }
739
+ set group(group) {
740
+ const old_group = this.#group;
741
+ this.#group = this.replaceChild(group, old_group);
742
+ }
743
+ get group() {
744
+ return this.#group;
745
+ }
746
+ set collapsed(collapsed) {
747
+ if (collapsed && !this.#collapsed) {
748
+ this.#collapse_button.replaceChildren(this.#close_text, material_unfold_more_rounded());
749
+ if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
750
+ this.#group.style.overflowY = "auto";
751
+ const full_height = this.#group.getBoundingClientRect().height + "px";
752
+ const animation = this.#group.animate([{ maxHeight: full_height }, {
753
+ maxHeight: "0px",
754
+ paddingBlock: "0px"
755
+ }], {
756
+ duration: ANIMATION_SPEED.get().value,
757
+ easing: "ease-in-out"
758
+ });
759
+ animation.onfinish = async () => {
760
+ this.classList.add("collapsed");
761
+ this.#group.style.overflowY = "";
762
+ };
763
+ } else this.classList.add("collapsed");
764
+ } else if (!collapsed && this.#collapsed) {
765
+ this.classList.remove("collapsed");
766
+ this.#collapse_button.replaceChildren(this.#open_text, material_unfold_less_rounded());
767
+ if (ANIMATION_LEVEL.get().value === AnimationLevels.All) {
768
+ this.#group.style.overflowY = "auto";
769
+ const full_height = this.#group.getBoundingClientRect().height + "px";
770
+ const animation = this.#group.animate([{
771
+ maxHeight: "0px",
772
+ paddingBlock: "0px"
773
+ }, { maxHeight: full_height }], {
774
+ duration: ANIMATION_SPEED.get().value,
775
+ easing: "ease-in-out"
776
+ });
777
+ animation.onfinish = () => this.#group.style.overflowY = "";
778
+ }
779
+ }
780
+ this.#collapsed = collapsed;
781
+ }
782
+ get collapsed() {
783
+ return this.#collapsed;
784
+ }
785
+ set open_text(text) {
786
+ this.#open_text.textContent = text;
787
+ }
788
+ set close_text(text) {
789
+ this.#close_text.textContent = text;
790
+ }
791
+ };
792
+ define_element(FormGroupCollapser);
793
+ /**Creates a dropdown form element */
794
+ function form_group_collapser(group, options) {
795
+ const slide = new FormGroupCollapser(group, options?.collapsed);
796
+ if (options) {
797
+ if (options.open_text) slide.open_text = options.open_text;
798
+ if (options.close_text) slide.close_text = options.close_text;
799
+ FormElement.apply_options(slide, options);
800
+ }
801
+ return slide;
802
+ }
803
+ //#endregion
724
804
  //#region src/list/list_field.ts
725
805
  var ListFormField = class extends ListField {
726
806
  static element_name() {
@@ -770,7 +850,7 @@ var FormNumberWrite = class extends FormValueWrite {
770
850
  }
771
851
  };
772
852
  //#endregion
773
- //#region src/number/numberInput/number_input.ts
853
+ //#region src/number/number_input/number_input.ts
774
854
  /**Slide Selector, displays all options in a slider*/
775
855
  var NumberInput = class extends FormNumberWrite {
776
856
  static element_name() {
@@ -863,14 +943,14 @@ var NumberInput = class extends FormNumberWrite {
863
943
  this.#update_min_legend();
864
944
  }
865
945
  #update_min_legend() {
866
- this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
946
+ this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
867
947
  }
868
948
  set max(max) {
869
949
  this.#max = max ?? Infinity;
870
950
  this.#update_max_lengend();
871
951
  }
872
952
  #update_max_lengend() {
873
- this.#max_legend.textContent = this.#max === Infinity ? "" : "Max: " + this.#max.toFixed(this.#decimals) + this.#unit;
953
+ this.#max_legend.textContent = this.#max === Infinity ? "" : "Max:" + this.#max.toFixed(this.#decimals);
874
954
  }
875
955
  set step(step) {
876
956
  this.#step = step || 0;
@@ -1111,7 +1191,7 @@ var FormSlider = class extends FormNumberWrite {
1111
1191
  this.#update_min_legend();
1112
1192
  }
1113
1193
  #update_min_legend() {
1114
- this.#left_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
1194
+ this.#left_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
1115
1195
  }
1116
1196
  set max(max) {
1117
1197
  this.#max = max ?? Infinity;
@@ -1119,7 +1199,7 @@ var FormSlider = class extends FormNumberWrite {
1119
1199
  this.#update_max_legend();
1120
1200
  }
1121
1201
  #update_max_legend() {
1122
- this.#right_legend.textContent = this.#max === Infinity ? "" : this.#max.toFixed(this.#decimals) + this.#unit + " :Max";
1202
+ this.#right_legend.textContent = this.#max === Infinity ? "" : this.#max.toFixed(this.#decimals) + ":Max";
1123
1203
  }
1124
1204
  #update_min_max() {
1125
1205
  this.#span = this.#max - this.#min;
@@ -1379,14 +1459,14 @@ var FormStepper = class extends FormNumberWrite {
1379
1459
  this.#update_min_legend();
1380
1460
  }
1381
1461
  #update_min_legend() {
1382
- this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min: " + this.#min.toFixed(this.#decimals) + this.#unit;
1462
+ this.#min_legend.textContent = this.#min === -Infinity ? "" : "Min:" + this.#min.toFixed(this.#decimals);
1383
1463
  }
1384
1464
  set max(max) {
1385
1465
  this.#max = max ?? Infinity;
1386
1466
  this.#update_max_lengend();
1387
1467
  }
1388
1468
  #update_max_lengend() {
1389
- this.#max_legend.textContent = this.#max === Infinity ? "" : "Max: " + this.#max.toFixed(this.#decimals) + this.#unit;
1469
+ this.#max_legend.textContent = this.#max === Infinity ? "" : "Max:" + this.#max.toFixed(this.#decimals);
1390
1470
  }
1391
1471
  set step(step) {
1392
1472
  this.#step = step || 0;
@@ -1592,10 +1672,14 @@ var FormDropdown = class extends FormSelectorBase {
1592
1672
  }
1593
1673
  set open(open) {
1594
1674
  if (open && !this.is_open) {
1595
- this.#open.replaceChildren(material_unfold_less_rounded());
1675
+ const old = this.#open;
1676
+ this.#open = material_unfold_less_rounded();
1677
+ old.replaceWith(this.#open);
1596
1678
  box.open_menu(this.#map, this, this.buffer);
1597
1679
  } else if (!open && this.is_open) {
1598
- this.#open.replaceChildren(material_unfold_more_rounded());
1680
+ const old = this.#open;
1681
+ this.#open = material_unfold_more_rounded();
1682
+ old.replaceWith(this.#open);
1599
1683
  box.close_menu();
1600
1684
  }
1601
1685
  this.is_open = open;
@@ -1769,6 +1853,7 @@ var DropDownBox = class extends Base {
1769
1853
  close_menu() {
1770
1854
  if (!this.#is_open) return;
1771
1855
  this.#is_open = false;
1856
+ if (this.#dropdown) this.#dropdown.open = false;
1772
1857
  this.classList.remove("open");
1773
1858
  this.#table.replaceChildren();
1774
1859
  if (this.#dropdown) {
@@ -2321,7 +2406,7 @@ function form_text_input(options) {
2321
2406
  return input;
2322
2407
  }
2323
2408
  //#endregion
2324
- //#region src/text/multiLine/text_multi_line.ts
2409
+ //#region src/text/multi_line/text_multi_line.ts
2325
2410
  var FormTextMultiline = class extends FormValueWrite {
2326
2411
  static element_name() {
2327
2412
  return "textmultiline";
@@ -2479,7 +2564,8 @@ var FormText = class extends FormElement {
2479
2564
  }
2480
2565
  /**Sets the current text of the element*/
2481
2566
  set size(size) {
2482
- this.style.fontSize = `${size}rem`;
2567
+ this.style.fontSize = size + "rem";
2568
+ this.style.lineHeight = size + "rem";
2483
2569
  }
2484
2570
  };
2485
2571
  define_element(FormText);
@@ -2496,6 +2582,7 @@ const form = {
2496
2582
  switch: form_switch,
2497
2583
  lamp: form_lamp,
2498
2584
  group: form_group,
2585
+ group_collapser: form_group_collapser,
2499
2586
  color_input: form_color_input,
2500
2587
  date_time_input: form_date_time_input,
2501
2588
  FormDateTimeType,
@@ -2516,4 +2603,4 @@ const form = {
2516
2603
  //#endregion
2517
2604
  export { FormColors, FormDateTimeType, form as default, form };
2518
2605
 
2519
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiN2YWx1ZV9lbGVtZW50cyIsIiNjb2xsYXBzaWJsZSIsIiNjb2xsYXBzZV9idXR0b24iLCIjY29sbGFwc2VkIiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cC50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJJbnB1dC9udW1iZXJfaW5wdXQudHMiLCIuLi9zcmMvbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzLnRzIiwiLi4vc3JjL251bWJlci9zbGlkZXIvc2xpZGVyLnRzIiwiLi4vc3JjL251bWJlci9zdGVwcGVyL3N0ZXBwZXIudHMiLCIuLi9zcmMvc2VsZWN0b3JzL3NlbGVjdG9yX2Jhc2UudHMiLCIuLi9zcmMvc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd24udHMiLCIuLi9zcmMvc2VsZWN0b3JzL3RvZ2dsZV9idXR0b24vdG9nZ2xlX2J1dHRvbi50cyIsIi4uL3NyYy9zcGFjaW5nL3NwYWNlci50cyIsIi4uL3NyYy9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2lwL2lwX2lucHV0LnRzIiwiLi4vc3JjL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXQudHMiLCIuLi9zcmMvdGV4dC9pbnB1dC90ZXh0X2lucHV0LnRzIiwiLi4vc3JjL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZS50cyIsIi4uL3NyYy90ZXh0L3RleHQvdGV4dC50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBCTFVFLFxuICBHUkVFTixcbiAgR1JFWSxcbiAgT1JBTkdFLFxuICBSRUQsXG4gIFlFTExPVyxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29sb3JzXCI7XG5pbXBvcnQgeyB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuXG5jb25zdCB0aGVtZV9yb290ID0gdGhlbWVfaW5pdF92YXJpYWJsZV9yb290KFxuICBcImZvcm1cIixcbiAgXCJVSSBGb3JtIEVsZW1lbnRzXCIsXG4gIFwiVGhlbWUgdmFyaWFibGVzIGZvciBVSSBmb3JtIEVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX18gICAgIF9fX18gIF8gICBfIF8gIF9fICAgICBfX1xuLy8gICAgIHwgIF9fIFxcfCAgX19fX3wgICAvXFwgICB8ICBfXyBcXCAgIC8gX18gXFx8IFxcIHwgfCB8IFxcIFxcICAgLyAvXG4vLyAgICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHwgfCB8ICB8IHwgIFxcfCB8IHwgIFxcIFxcXy8gL1xuLy8gICAgIHwgIF8gIC98ICBfX3wgICAvIC9cXCBcXCB8IHwgIHwgfCB8IHwgIHwgfCAuIGAgfCB8ICAgXFwgICAvXG4vLyAgICAgfCB8IFxcIFxcfCB8X19fXyAvIF9fX18gXFx8IHxfX3wgfCB8IHxfX3wgfCB8XFwgIHwgfF9fX198IHxcbi8vICAgICB8X3wgIFxcX1xcX19fX19fL18vICAgIFxcX1xcX19fX18vICAgXFxfX19fL3xffCBcXF98X19fX19ffF98XG5jb25zdCByZWFkX29ubHkgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInJlYWRcIixcbiAgXCJSZWFkIE9ubHlcIixcbiAgXCJTZXR0aW5ncyBmb3IgZm9ybSBlbGVtZW50cyBpbiByZWFkIG9ubHkgbW9kZVwiLFxuKTtcbnJlYWRfb25seS5tYWtlX3ZhcmlhYmxlKFxuICBcImZpbHRlclwiLFxuICBcIlJlYWQgT25seSBGaWx0ZXJcIixcbiAgXCJGaWx0ZXIgYXBwbGllZCB0byBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwib3BhY2l0eSgwLjYpXCIsXG4gIFwiRmlsdGVyXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJjb2xvcnNcIixcbiAgXCJDb2xvcnNcIixcbiAgXCJDb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgICAgIHwgfCAgfCAgX198ICAgPiA8ICAgIHwgfCAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc190ZXh0ID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcInRleHRcIixcbiAgXCJUZXh0IENvbG9yc1wiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcImxhYmVsXCIsXG4gIFwiTGFiZWwgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnRzIGxhYmVsc1wiLFxuICBHUkVZW1wiNzAwXCJdLFxuICBHUkVZW1wiMzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dC5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlVuc2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI2MDBcIl0sXG4gIEdSRVlbXCI0MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX19fIF9fX19fX19fICAgX19fX19fX19fICAgX19fXyAgXyAgICAgICAgICAgICAgIF9fX19fIF8gIF9fXG4vLyAgICAgfF9fICAgX198ICBfX19fXFwgXFwgLyAvX18gICBfX3wgfCAgXyBcXHwgfCAgICAgICAgL1xcICAgLyBfX19ffCB8LyAvXG4vLyAgICAgICAgfCB8ICB8IHxfXyAgIFxcIFYgLyAgIHwgfCAgICB8IHxfKSB8IHwgICAgICAgLyAgXFwgfCB8ICAgIHwgJyAvXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgIF8gPHwgfCAgICAgIC8gL1xcIFxcfCB8ICAgIHwgIDxcbi8vICAgICAgICB8IHwgIHwgfF9fX18gLyAuIFxcICAgfCB8ICAgIHwgfF8pIHwgfF9fX18gLyBfX19fIFxcIHxfX19ffCAuIFxcXG4vLyAgICAgICAgfF98ICB8X19fX19fL18vIFxcX1xcICB8X3wgICAgfF9fX18vfF9fX19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxcbi8vXG4vL1xuY29uc3QgY29sb3JzX3RleHRfYmxhY2sgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dEJsYWNrXCIsXG4gIFwiVGV4dCBDb2xvcnMgQmxhY2sgQmFja2dyb3VuZFwiLFxuICBcIlRleHQgY29sb3JzIHVzZWQgZm9yIGJsYWNrIGJhY2tncm91bmQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBUZXh0IENvbG9yXCIsXG4gIFwiTm9ybWFsIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiMjAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgVGV4dCBDb2xvclwiLFxuICBcIlNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNTBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHRfYmxhY2subWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fIF9fX19fIF9fX18gIF8gICBfICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfF8gICBfLyBfX19fLyBfXyBcXHwgXFwgfCB8ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAgXFx8IHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICB8IHx8IHwgICB8IHwgIHwgfCAuIGAgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICAgX3wgfHwgfF9fX3wgfF9ffCB8IHxcXCAgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX19fXFxfX19fX1xcX19fXy98X3wgXFxffCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19pY29uID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImljb25cIixcbiAgXCJJY29uIENvbG9yc1wiLFxuICBcIkljb24gY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2YgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiODAwXCJdLFxuICBHUkVZW1wiMjAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInNlbGVjdGVkXCIsXG4gIFwiU2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjkwMFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfaWNvbi5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGljb25zIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgX19fX18gXyAgX19fX19fXyBfX19fXyAgIF9fX18gIF8gICAgXyBfICAgXyBfX19fXyAgICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8ICBfIFxcICAgL1xcICAgLyBfX19ffCB8LyAvIF9fX198ICBfXyBcXCAvIF9fIFxcfCB8ICB8IHwgXFwgfCB8ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IC8gIFxcIHwgfCAgICB8ICcgLyB8ICBfX3wgfF9fKSB8IHwgIHwgfCB8ICB8IHwgIFxcfCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8ICBfIDwgLyAvXFwgXFx8IHwgICAgfCAgPHwgfCB8XyB8ICBfICAvfCB8ICB8IHwgfCAgfCB8IC4gYCB8IHwgIHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSAvIF9fX18gXFwgfF9fX198IC4gXFwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X198IHwgfFxcICB8IHxfX3wgfCB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgfF9fX18vXy8gICAgXFxfXFxfX19fX3xffFxcX1xcX19fX198X3wgIFxcX1xcXFxfX19fLyBcXF9fX18vfF98IFxcX3xfX19fXy8gICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JhY2tncm91bmQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFja2dyb3VuZFwiLFxuICBcIkJhY2tncm91bmQgQ29sb3JzXCIsXG4gIFwiQmFja2dyb3VuZCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJob3ZlclwiLFxuICBcIkhvdmVyIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHMgd2hlbiBob3ZlcmluZ1wiLFxuICBHUkVZW1wiNDAwXCJdLFxuICBHUkVZW1wiNzAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJhY2tncm91bmQgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kc1wiLFxuICBHUkVZW1wiMzAwXCJdLFxuICBHUkVZW1wiODAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgIF9fX18gIF9fX19fICBfX19fXyAgX19fX19fIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgLyBfXyBcXHwgIF9fIFxcfCAgX18gXFx8ICBfX19ffCAgX18gXFwgICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCB8ICB8IHwgfF9fKSB8IHwgIHwgfCB8X18gIHwgfF9fKSB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPHwgfCAgfCB8ICBfICAvfCB8ICB8IHwgIF9ffCB8ICBfICAvICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfKSB8IHxfX3wgfCB8IFxcIFxcfCB8X198IHwgfF9fX198IHwgXFwgXFwgIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy8gXFxfX19fL3xffCAgXFxfXFxfX19fXy98X19fX19ffF98ICBcXF9cXCAgXFxfX19fX1xcX19fXy98X19fX19fXFxfX19fL3xffCAgXFxfXFxfX19fXy9cbmNvbnN0IGNvbG9yc19ib3JkZXIgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYm9yZGVyXCIsXG4gIFwiQm9yZGVyIENvbG9yc1wiLFxuICBcIkJvcmRlciBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQm9yZGVyIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygbm9ybWFsIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19ib3JkZXIubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiB1bnNlbGVjdGVkIGZvcm0gZWxlbWVudCBib3JkZXJzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fX18gX19fXyAgIF9fX19fIF8gICAgXyAgX19fX19cbi8vICAgICB8ICBfX19fLyBfXyBcXCAvIF9fX198IHwgIHwgfC8gX19fX3xcbi8vICAgICB8IHxfXyB8IHwgIHwgfCB8ICAgIHwgfCAgfCB8IChfX19cbi8vICAgICB8ICBfX3x8IHwgIHwgfCB8ICAgIHwgfCAgfCB8XFxfX18gXFxcbi8vICAgICB8IHwgICB8IHxfX3wgfCB8X19fX3wgfF9ffCB8X19fXykgfFxuLy8gICAgIHxffCAgICBcXF9fX18vIFxcX19fX198XFxfX19fL3xfX19fXy9cbmNvbnN0IGNvbG9yc19mb2N1cyA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb2N1c1wiLFxuICBcIkZvY3VzIENvbG9yc1wiLFxuICBcIkZvY3VzIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2ZvY3VzLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiRm9jdXMgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBmb2N1c3NlZCBmb3JtIGVsZW1lbnRcIixcbiAgT1JBTkdFW1wiNjAwXCJdLFxuICBPUkFOR0VbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgICAgICAgICBfX19fXyBfX19fXyBfX19fXyAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAgLyBfX19ffF8gICBfLyBfX19ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgIHwgKF9fXyAgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXCAgXFxfX18gXFwgIHwgfHwgfCAgICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCBfX19fKSB8X3wgfHwgfF9fX18gIHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19fL3xfX19fX1xcX19fX198ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2Jhc2ljID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImJhc2ljXCIsXG4gIFwiQmFzaWMgQ29sb3JzXCIsXG4gIFwiQmFzaWMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJncmVlblwiLFxuICBcIkJhc2ljIEdyZWVuIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCBncmVlbiBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRUVOW1wiMzAwXCJdLFxuICBHUkVFTltcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwicmVkXCIsXG4gIFwiQmFzaWMgUmVkIENvbG9yXCIsXG4gIFwiQ29tbW9ubHkgdXNlZCByZWQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBSRURbXCIzMDBcIl0sXG4gIFJFRFtcIjkwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2Jhc2ljLm1ha2VfdmFyaWFibGUoXG4gIFwiYmx1ZVwiLFxuICBcIkJhc2ljIEJsdWUgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGJsdWUgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBCTFVFW1wiMzAwXCJdLFxuICBCTFVFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJ5ZWxsb3dcIixcbiAgXCJCYXNpYyBZZWxsb3cgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHllbGxvdyBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFlFTExPV1tcIjMwMFwiXSxcbiAgT1JBTkdFW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgICBfX19fXyBfX19fXyBfX19fX19fX19fX18gIF9fX19fXG4vLyAgICAgIC8gX19fX3xfICAgX3xfX18gIC8gIF9fX198LyBfX19ffFxuLy8gICAgIHwgKF9fXyAgIHwgfCAgICAvIC98IHxfXyAgfCAoX19fXG4vLyAgICAgIFxcX19fIFxcICB8IHwgICAvIC8gfCAgX198ICBcXF9fXyBcXFxuLy8gICAgICBfX19fKSB8X3wgfF8gLyAvX198IHxfX19fIF9fX18pIHxcbi8vICAgICB8X19fX18vfF9fX19fL19fX19ffF9fX19fX3xfX19fXy9cbmNvbnN0IHNpemVzID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJzaXplXCIsXG4gIFwiU2l6ZVwiLFxuICBcIlNpemVzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwiaGVpZ2h0XCIsXG4gIFwiSGVpZ2h0XCIsXG4gIFwiRGVmYXVsdCBoZWlnaHQgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjEuNnJlbVwiLFxuICBcIjEuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG5zaXplcy5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoSGVpZ2h0XCIsXG4gIFwiVG91Y2ggSGVpZ2h0XCIsXG4gIFwiTWluaW11bSBoZWlnaHQgZm9yIHRvdWNoIGRldmljZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuICBcIjIuNnJlbVwiLFxuICBcIjIuNnJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8gICAgICBfX19fX18gX19fXyAgXyAgIF8gX19fX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcfCBcXCB8IHxfXyAgIF9ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8ICBcXHwgfCAgfCB8XG4vLyAgICAgfCAgX198fCB8ICB8IHwgLiBgIHwgIHwgfFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxcXCAgfCAgfCB8XG4vLyAgICAgfF98ICAgIFxcX19fXy98X3wgXFxffCAgfF98XG5jb25zdCBmb250ID0gdGhlbWVfcm9vdC5tYWtlX3N1Yl9ncm91cChcbiAgXCJmb250XCIsXG4gIFwiRm9udFwiLFxuICBcIkZvbnQgc2V0dGluZ3MgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInNpemVcIixcbiAgXCJGb250IFNpemVcIixcbiAgXCJEZWZhdWx0IGZvbnQgc2l6ZSB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMXJlbVwiLFxuICBcIjFyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG4vKipDb2xvcnMgZm9yIGZvcm0gZWxlbWVudHMgdGhhdCBoYXZlIHNlbGVjdGFibGUgY29sb3JzKi9cbmV4cG9ydCBjb25zdCBGb3JtQ29sb3JzID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgQmxhY2s6IFwiYmxhY2tcIixcbiAgR3JlZW46IFwiZ3JlZW5cIixcbiAgUmVkOiBcInJlZFwiLFxuICBCbHVlOiBcImJsdWVcIixcbiAgWWVsbG93OiBcInllbGxvd1wiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Db2xvcnMgPSAodHlwZW9mIEZvcm1Db2xvcnMpW2tleW9mIHR5cGVvZiBGb3JtQ29sb3JzXTtcblxuLyoqU2hhcmVkIGNvbXBvbmVudCBjbGFzcyBmb3Igb3RoZXIgY29tcG9uZW50cyB0byBpbmhlcml0IGZyb20qL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1FbGVtZW50IGV4dGVuZHMgQmFzZSB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gICBfX19fXyAgX19fX19fICAgICAgICAgIF9fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcXG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgfCB8X18pIHwgfF9fICAgICAvICBcXCAgfCB8ICB8IHxcbi8vICAgICAgIFxcIFxcLyAvIC9cXCBcXCB8IHwgICB8IHwgIHwgfCAgX198ICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8XG4vLyAgICAgICAgIFxcL18vICAgIFxcX1xcX19fX19fXFxfX19fL3xfX19fX198IHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy9cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVmFsdWVPcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAvKipJRCBmb3JtIGZvcm0gZWxlbWVudCAqL1xuICBpZD86IElEO1xuICAvKipWYWx1ZSBmb3IgZm9ybSBlbGVtZW50ICovXG4gIHZhbHVlPzogUlQ7XG4gIHZhbHVlX2J5X3N0YXRlPzogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPjtcbiAgLyoqTG9uZ2VyIGRlc2NyaXB0aW9uIHdoYXQgZm9ybSBlbGVtZW50IGRvZXMgKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKkNoYW5nZSBsaXN0ZW5lciBmdW5jdGlvbiovXG4gIGNoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xufVxuXG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtRWxlbWVudCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtVmFsdWU8UlQsIElEPixcbiAgICBvcHRpb25zOiBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLmRlc2NyaXB0aW9uKSBlbGVtZW50LmRlc2NyaXB0aW9uID0gb3B0aW9ucy5kZXNjcmlwdGlvbjtcbiAgICBpZiAob3B0aW9ucy52YWx1ZV9ieV9zdGF0ZSkgZWxlbWVudC52YWx1ZV9ieV9zdGF0ZSA9IG9wdGlvbnMudmFsdWVfYnlfc3RhdGU7XG4gICAgZWxzZSBpZiAob3B0aW9ucy52YWx1ZSAhPT0gdW5kZWZpbmVkKSBlbGVtZW50LnZhbHVlID0gb3B0aW9ucy52YWx1ZTtcbiAgfVxuXG4gIHJlYWRvbmx5IGZvcm1faWQ6IElEO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZm9ybV9pZCA9IGlkIGFzIElEO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9kZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqU2V0cyB0aGUgY3VycmVudCBsYWJlbCBvZiB0aGUgZWxlbWVudCovXG4gIHNldCBkZXNjcmlwdGlvbih0ZXh0OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9kZXNjcmlwdGlvbiA9IHRleHQ7XG4gIH1cbiAgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rlc2NyaXB0aW9uIHx8IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgX2J1ZmZlcj86IFJUO1xuICBnZXQgYnVmZmVyKCk6IFJUIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYnVmZmVyO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9zdGF0ZT86IFN0YXRlPFJULCBPcHRpb248e30+LCBSVD47XG4gICNmdW5jPzogU3RhdGVTdWI8UmVzdWx0PFJULCBzdHJpbmc+PjtcbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlX2J5X3N0YXRlKHN0YXRlOiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+IHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKHRoaXMuI2Z1bmMpIHRoaXMuZGV0YWNoX3N0YXRlKHRoaXMuI2Z1bmMpO1xuICAgIGlmIChzdGF0ZSkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGUoc3RhdGUsICh2YWwpID0+IHtcbiAgICAgICAgaWYgKHZhbC5vaykge1xuICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWwudmFsdWU7XG4gICAgICAgICAgaWYgKHRoaXMuI2Vycm9yKSB0aGlzLmVycm9yID0gdW5kZWZpbmVkO1xuICAgICAgICB9IGVsc2UgdGhpcy5lcnJvciA9IHZhbC5lcnJvcjtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVsYXRlZCA9IHN0YXRlLnJlbGF0ZWQoKTtcbiAgICAgIGlmIChyZWxhdGVkLnNvbWUpIHRoaXMuc3RhdGVfcmVsYXRlZChyZWxhdGVkLnZhbHVlKTtcbiAgICB9IGVsc2UgdGhpcy5zdGF0ZV9yZWxhdGVkKHt9KTtcbiAgICB0aGlzLl9zdGF0ZSA9IHN0YXRlO1xuICB9XG5cbiAgLyoqVGhpcyBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50Ki9cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZVxuICAgICAgPyBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIilcbiAgICAgIDogdHlwZW9mIHRoaXMuX2J1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIlxuICAgICAgICA/IGVycihcIk5vIHZhbHVlIHlldFwiKVxuICAgICAgICA6IG9rKHRoaXMuX2J1ZmZlcik7XG4gIH1cblxuICAjZXJyb3IgPSBmYWxzZTtcbiAgc2V0IGVycm9yKGVycjogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGVycikge1xuICAgICAgdGhpcy5uZXdfZXJyb3IoZXJyKTtcbiAgICAgIHRoaXMuI2Vycm9yID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuI2Vycm9yKSB7XG4gICAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gICAgICB0aGlzLiNlcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKkNsZWFycyB0aGUgdmFsdWUgYW5kIGVycm9yIG9mIHRoZSBjb21wb25lbnQgaWYgbm90IHN0YXRlIGJhc2VkKi9cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSByZXR1cm47XG4gICAgdGhpcy5fYnVmZmVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICB0aGlzLmNsZWFyX2Vycm9yKCk7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBzZXQgYnkgdmFsdWUgc2V0dGVyIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZDtcblxuICAvKipDbGVhcnMgZm9ybSBlbGVtZW50IGdyYXBoaWNhbGx5Ki9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGNsZWFyX3ZhbHVlKCk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgc2V0IGJ5IGVycm9yIG9yIHN0YXRlKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IG5ld19lcnJvcih2YWw6IHN0cmluZyk6IHZvaWQ7XG5cbiAgLyoqQ2FsbGVkIHdoZW4gZXJyb3IgaXMgY2xlYXJlZCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl9lcnJvcigpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIHN0YXRlIGhhcyByZWxhdGVkIGluZm9ybWF0aW9uICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IHt9KTogdm9pZDtcbn1cblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuLy8gICAgIF9fICAgICAgX18gICAgIF8gICAgIF8gICAgXyBfX19fX18gIF9fICAgICAgICAgIF9fX19fX18gIF9fX19fIF9fX19fX18gX19fX19fXG4vLyAgICAgXFwgXFwgICAgLyAvXFwgICB8IHwgICB8IHwgIHwgfCAgX19fX3wgXFwgXFwgICAgICAgIC8gLyAgX18gXFx8XyAgIF98X18gICBfX3wgIF9fX198XG4vLyAgICAgIFxcIFxcICAvIC8gIFxcICB8IHwgICB8IHwgIHwgfCB8X18gICAgIFxcIFxcICAvXFwgIC8gL3wgfF9fKSB8IHwgfCAgICB8IHwgIHwgfF9fXG4vLyAgICAgICBcXCBcXC8gLyAvXFwgXFwgfCB8ICAgfCB8ICB8IHwgIF9ffCAgICAgXFwgXFwvICBcXC8gLyB8ICBfICAvICB8IHwgICAgfCB8ICB8ICBfX3xcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gICAgIFxcICAvXFwgIC8gIHwgfCBcXCBcXCBffCB8XyAgIHwgfCAgfCB8X19fX1xuLy8gICAgICAgICBcXC9fLyAgICBcXF9cXF9fX19fX1xcX19fXy98X19fX19ffCAgICAgXFwvICBcXC8gICB8X3wgIFxcX1xcX19fX198ICB8X3wgIHxfX19fX198XG4vKipTaGFyZWQgY2xhc3MgZm9yIGFsbCBjb21wb25lbnRzIHdpdGggdmFsdWVzKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtVmFsdWVXcml0ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgd2Fybl9pbnB1dDogSFRNTElucHV0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcbiAgI3dhcm5fdGltZW91dD86IG51bWJlcjtcbiAgI2NoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2NoYW5nZT86ICh2YWw6IFJUKSA9PiB2b2lkO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy53YXJuX2lucHV0Lm5hbWUgPSBcInZhbFwiO1xuICB9XG5cbiAgc2V0IGNoYW5nZShmdW5jOiAodmFsOiBSVCkgPT4gdm9pZCkge1xuICAgIHRoaXMuI2NoYW5nZSA9IGZ1bmM7XG4gIH1cbiAgZ2V0IGNoYW5nZSgpOiAoKHZhbDogUlQpID0+IHZvaWQpIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlO1xuICB9XG5cbiAgLyoqUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpZiBpdCBoYXMgY2hhbmdlZCovXG4gIGdldCBjaGFuZ2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLiNjaGFuZ2VkO1xuICB9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkobWVzc2FnZSk7XG4gICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgaWYgKHRoaXMuI3dhcm5fdGltZW91dCkgY2xlYXJUaW1lb3V0KHRoaXMuI3dhcm5fdGltZW91dCk7XG4gICAgdGhpcy4jd2Fybl90aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLndhcm5faW5wdXQuc2V0Q3VzdG9tVmFsaWRpdHkoXCJcIik7XG4gICAgICB0aGlzLndhcm5faW5wdXQucmVwb3J0VmFsaWRpdHkoKTtcbiAgICB9LCA1MDAwKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGxpbWl0IHZhbHVlIGVudGVyZWQgKi9cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogUlQpOiBQcm9taXNlTGlrZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGlmICh0aGlzLl9zdGF0ZS53cml0YWJsZSkgcmV0dXJuIHRoaXMuX3N0YXRlLmxpbWl0KHZhbCk7XG4gICAgICBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUoZXJyKFwiTm90IHdyaXRhYmxlXCIpKTtcbiAgICB9IGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShvayh2YWwpKTtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNoZWNrIHZhbHVlICovXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5jaGVjayh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byB1cGRhdGUgdmFsdWUqL1xuICBwcm90ZWN0ZWQgYXN5bmMgc2V0X3ZhbHVlX2xpbWl0KHZhbDogUlQpOiBQcm9taXNlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGNvbnN0IGxpbWl0ZWQgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHZhbCk7XG4gICAgaWYgKGxpbWl0ZWQuZXJyKSB7XG4gICAgICB0aGlzLndhcm4obGltaXRlZC5lcnJvcik7XG4gICAgICByZXR1cm4gbGltaXRlZDtcbiAgICB9XG4gICAgdGhpcy4jc2V0X3ZhbHVlKGxpbWl0ZWQudmFsdWUpO1xuICAgIHJldHVybiBsaW1pdGVkO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9jaGVjayh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBjaGVja2VkID0gYXdhaXQgdGhpcy5jaGVja192YWx1ZSh2YWwpO1xuICAgIGlmIChjaGVja2VkLmVycikge1xuICAgICAgdGhpcy53YXJuKGNoZWNrZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGNoZWNrZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShjaGVja2VkLnZhbHVlKTtcbiAgICByZXR1cm4gY2hlY2tlZDtcbiAgfVxuXG4gICNzZXRfdmFsdWUodmFsOiBSVCkge1xuICAgIGlmICh0aGlzLl9idWZmZXIgPT09IHZhbCkgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICBpZiAodGhpcy4jY2hhbmdlKVxuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcy4jY2hhbmdlKHZhbCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoXCJGYWlsZWQgd2hpbGUgdXBkYXRpbmcgY2hhbmdlIGxpc3RlbmVyXCIsIGUpO1xuICAgICAgfVxuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgY29uc3QgYnVmZiA9IHRoaXMuX2J1ZmZlcjtcbiAgICAgIHRoaXMuX3N0YXRlLndyaXRlISh2YWwpLnRoZW4oKGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyLmVycikge1xuICAgICAgICAgIGlmIChidWZmICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKGJ1ZmYpO1xuICAgICAgICAgIHRoaXMud2FybihlcnIuZXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5uZXdfdmFsdWUodmFsKTtcbiAgICAgIHRoaXMuX2J1ZmZlciA9IHZhbDtcbiAgICAgIHRoaXMuI2NoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQge1xuICBGb3JtQ29sb3JzLFxuICBGb3JtVmFsdWUsXG4gIEZvcm1WYWx1ZVdyaXRlLFxuICB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMsXG59IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuLi8uLi9zaGFyZWRcIjtcbmltcG9ydCBcIi4vYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIEZvcm1CdXR0b25PcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPGJvb2xlYW4sIElEPiB7XG4gIC8qKkJ1dHRvbnMgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBidXR0b24gKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrICovXG4gIG9uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgLyoqU2V0IHRydWUgdG8gbWFrZSBidXR0b24gdG9nZ2xlIG9uIGNsaWNrIGluc3RlYWQgb2Ygbm9ybWFsICovXG4gIHRvZ2dsZT86IGJvb2xlYW47XG4gIC8qKkNoYW5nZXMgdGhlIGJ1dHRvbnMgY29sb3IgKi9cbiAgY29sb3I/OiBGb3JtQ29sb3JzO1xufVxuXG5jbGFzcyBGb3JtQnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN0ZXh0OiBIVE1MU3BhbkVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI29uX2NsaWNrPzogKCkgPT4gdm9pZDtcbiAgI3RvZ2dsZT86IGJvb2xlYW47XG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuXG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+IHtcbiAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICB9O1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSAhPT0gXCJ0b3VjaFwiICYmIGUuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgIHRoaXMub25wb2ludGVydXAgPSAoZXYpID0+IHtcbiAgICAgICAgICBldi5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShldi5wb2ludGVySWQpO1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9udG91Y2hzdGFydCA9IChlKSA9PiB7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgdGhpcy5vbnRvdWNoZW5kID0gKGV2KSA9PiB7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAoZXYudGFyZ2V0VG91Y2hlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgIHRoaXMub250b3VjaGVuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOiB7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRydWUpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jb25fY2xpY2spIHRoaXMuI29uX2NsaWNrKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMub25rZXl1cCA9IG51bGw7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGJ1dHRvbiovXG4gIHNldCB0ZXh0KGxhYmVsOiBzdHJpbmcpIHtcbiAgICB0aGlzLiN0ZXh0LnRleHRDb250ZW50ID0gbGFiZWw7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI3RleHQudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBidXR0b24qL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3RleHQpO1xuICAgIGVsc2UgaWYgKHRoaXMuI2ljb24pIHtcbiAgICAgIHRoaXMucmVtb3ZlQ2hpbGQodGhpcy4jaWNvbik7XG4gICAgICB0aGlzLiNpY29uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIGNhbGwgb24gYnV0dG9uIGNsaWNrKi9cbiAgc2V0IG9uX2NsaWNrKGZ1bmM6ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI29uX2NsaWNrID0gZnVuYztcbiAgfVxuICBnZXQgb25fY2xpY2soKSB7XG4gICAgcmV0dXJuIHRoaXMuI29uX2NsaWNrO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgY29sb3Igb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBjb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUoXCJjb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5ld192YWx1ZShmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihcIlRPRE9cIiwgZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG5cbiAgLyoqQ2hhbmdlcyB3aGV0aGVyIHRoZSBidXR0b24gaXMgbWFpbnRhaW5lZCBvciBtb21lbnRhcnkqL1xuICBzZXQgdG9nZ2xlKHRvZ2dsZTogYm9vbGVhbiB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3RvZ2dsZSA9IEJvb2xlYW4odG9nZ2xlKTtcbiAgfVxuICBnZXQgdG9nZ2xlKCkge1xuICAgIHJldHVybiB0aGlzLiN0b2dnbGU7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1CdXR0b24pO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fYnV0dG9uPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1CdXR0b25PcHRpb25zPElEPixcbik6IEZvcm1CdXR0b248SUQ+IHtcbiAgY29uc3QgYnV0dCA9IG5ldyBGb3JtQnV0dG9uPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgYnV0dC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGJ1dHQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jbGljaykgYnV0dC5vbl9jbGljayA9IG9wdGlvbnMub25fY2xpY2s7XG4gICAgaWYgKG9wdGlvbnMudG9nZ2xlKSBidXR0LnRvZ2dsZSA9IG9wdGlvbnMudG9nZ2xlO1xuICAgIGlmIChvcHRpb25zLmNvbG9yKSBidXR0LmNvbG9yID0gb3B0aW9ucy5jb2xvcjtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhidXR0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gYnV0dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCB0eXBlIEZvcm1Db2xvcnMsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xhbXAuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1MYW1wT3B0aW9uczxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqU2V0cyB0aGUgbGFtcCBjb2xvcnMgKi9cbiAgY29sb3JzOiBDO1xuICAvKipMYW1wIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgbGFtcCAqL1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBudW1iZXIgfCBib29sZWFuKSB7XG4gICAgY29uc3QgY29sb3IgPSB0aGlzLiNjb2xvcnNbTnVtYmVyKHZhbHVlKV07XG4gICAgaWYgKGNvbG9yKSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgICBlbHNlIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybUxhbXApO1xuXG4vKipDcmVhdGVzIGEgYnV0dG9uIGZvcm0gZWxlbWVudCAqL1xuZnVuY3Rpb24gZnJvbTxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8XG4gICAgbnVtYmVyLFxuICAgIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLFxuICAgIElEXG4gID4sXG4pOiBGb3JtTGFtcDxudW1iZXIsIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCBGb3JtQ29sb3JzLCAuLi5Gb3JtQ29sb3JzW11dLCBJRD47XG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxib29sZWFuLCBbRm9ybUNvbG9ycywgRm9ybUNvbG9yc10sIElEPixcbik6IEZvcm1MYW1wPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+O1xuZnVuY3Rpb24gZnJvbTxcbiAgVCBleHRlbmRzIGJvb2xlYW4gfCBudW1iZXIsXG4gIEMgZXh0ZW5kcyBGb3JtQ29sb3JzW10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPihvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPFQsIEMsIElEPik6IEZvcm1MYW1wPFQsIEMsIElEPiB7XG4gIGNvbnN0IGxhbXAgPSBuZXcgRm9ybUxhbXA8VCwgQywgSUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBsYW1wLmNvbG9ycyA9IG9wdGlvbnMuY29sb3JzO1xuICAgIGlmIChvcHRpb25zLnRleHQpIGxhbXAudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBsYW1wLmljb24gPSBvcHRpb25zLmljb247XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcywgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IFByZXR0aWZ5IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF91bmZvbGRfbGVzc19yb3VuZGVkLFxuICBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQge1xuICBBTklNQVRJT05fTEVWRUwsXG4gIEFOSU1BVElPTl9TUEVFRCxcbiAgQW5pbWF0aW9uTGV2ZWxzLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi10aGVtZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1WYWx1ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXAuc2Nzc1wiO1xuXG4vKipEaWZmZXJlbnQgYm9yZGVyIHN0eWxlcyBmb3IgdGhlIGNvbXBvbmVudCBncm91cCovXG5leHBvcnQgY29uc3QgRm9ybUdyb3VwQm9yZGVyU3R5bGUgPSB7XG4gIE5vbmU6IFwibm9uZVwiLFxuICBJbnNldDogXCJpbnNldFwiLFxuICBPdXRzZXQ6IFwib3V0c2V0XCIsXG4gIExpbmU6IFwibGluZVwiLFxufSBhcyBjb25zdDtcbmV4cG9ydCB0eXBlIEZvcm1Hcm91cEJvcmRlclN0eWxlID1cbiAgKHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZSlba2V5b2YgdHlwZW9mIEZvcm1Hcm91cEJvcmRlclN0eWxlXTtcblxudHlwZSBFeHRyYWN0QjxBcnIgZXh0ZW5kcyBhbnlbXT4gPSBBcnIgZXh0ZW5kcyBbaW5mZXIgSGVhZCwgLi4uaW5mZXIgVGFpbF1cbiAgPyBIZWFkIGV4dGVuZHMgRm9ybVZhbHVlPGluZmVyIFQsIGluZmVyIElEPlxuICAgID8gW0Zvcm1WYWx1ZTxULCBJRD4sIC4uLkV4dHJhY3RCPFRhaWw+XVxuICAgIDogWy4uLkV4dHJhY3RCPFRhaWw+XVxuICA6IFtdO1xuXG50eXBlIFRvS2V5VmFsPEFyciBleHRlbmRzIEZvcm1WYWx1ZTxhbnksIGFueT5bXT4gPSB7XG4gIFtLIGluIEFycltudW1iZXJdIGFzIEtbXCJmb3JtX2lkXCJdXTogSyBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBhbnk+XG4gICAgPyBUXG4gICAgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUdyb3VwT3B0aW9uczxcbiAgTCBleHRlbmRzIEZvcm1FbGVtZW50W10sXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBULFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqRWxlbWVudHMgdG8gYWRkIHRvIHRoZSBncm91cCovXG4gIGVsZW1lbnRzPzogWy4uLkxdO1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNpYmxlLCBtZWFuaW5nIGl0IGhhcyBhIGJ1dHRvbiB0byBjb2xsYXBzZSBhbmQgZXhwYW5kIGFsbCBjb250ZW50IHRvIHRoZSBzaXplIG9mIHRoYXQgYnV0dG9uKi9cbiAgY29sbGFwc2libGU/OiBib29sZWFuO1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNlZCBpbml0aWFsbHkqL1xuICBjb2xsYXBzZWQ/OiBib29sZWFuO1xuICAvKipUZXh0IHRvIHNob3cgb24gdGhlIGNvbGxhcHNlIGJ1dHRvbiovXG4gIGNvbGxhcHNlX3RleHQ/OiBzdHJpbmc7XG4gIC8qKkJvcmRlciBzdHlsZSBmb3IgZ3JvdXAqL1xuICBib3JkZXI/OiBGb3JtR3JvdXBCb3JkZXJTdHlsZTtcbiAgLyoqUmVtb3ZlcyBwYWRkaW5nIHdoZW4gdHJ1ZSBhbGxvd3MgZm9yIHB1dHRpbmcgZ3JvdXBzIGluIGdyb3VwcyB3aXRob3V0IHBhZGRpbmcgYnVpbGRpbmcgdXAgKi9cbiAgZW1iZWQ/OiBib29sZWFuO1xuICAvKipHcm91cCBtYXggaGVpZ2h0IGluIHJlbSwgdW5kZWZpbmVkIG1lYW5zIG5vIGxpbWl0Ki9cbiAgbWF4X2hlaWdodD86IG51bWJlcjtcbn1cblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImdyb3VwXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNjb2xsYXBzaWJsZT86IEhUTUxEaXZFbGVtZW50O1xuICAjY29sbGFwc2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNjb2xsYXBzZV9idXR0b24/OiBIVE1MU3BhbkVsZW1lbnQ7XG4gICN2YWx1ZV9lbGVtZW50czogTWFwPHN0cmluZywgRm9ybVZhbHVlPGFueSwgYW55Pj4gPSBuZXcgTWFwKCk7XG5cbiAgc2V0IGVsZW1lbnRzKGVsZW1lbnRzOiBGb3JtRWxlbWVudFtdKSB7XG4gICAgZm9yIChsZXQgaSA9IDAsIG4gPSBlbGVtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBlbGVtZW50c1tpXTtcbiAgICAgIGlmIChjb21wIGluc3RhbmNlb2YgRm9ybVZhbHVlICYmIGNvbXAuZm9ybV9pZCkge1xuICAgICAgICBpZiAodGhpcy4jdmFsdWVfZWxlbWVudHMuaGFzKGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBlbGVtZW50IHdpdGggZm9ybSBpZCBcIiArXG4gICAgICAgICAgICAgIGNvbXAuZm9ybV9pZCArXG4gICAgICAgICAgICAgIFwiIGFscmVhZHkgZXhpc3RzIGluIGdyb3VwXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiN2YWx1ZV9lbGVtZW50cy5zZXQoY29tcC5mb3JtX2lkIGFzIHN0cmluZywgY29tcCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy4jY29sbGFwc2libGUpIHRoaXMuI2NvbGxhcHNpYmxlLmFwcGVuZENoaWxkKGNvbXApO1xuICAgICAgZWxzZSB0aGlzLmFwcGVuZENoaWxkKGNvbXApO1xuICAgIH1cbiAgfVxuXG4gIGdldCBlbGVtZW50cygpOiBGb3JtRWxlbWVudFtdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuI3ZhbHVlX2VsZW1lbnRzLnZhbHVlcygpXTtcbiAgfVxuXG4gIC8qKlRoaXMgcGxhY2VzIHRoZSBncm91cCBhdCBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBpbiBvbmUgb2YgdGhlIGNvcm5lcnMgb2YgdGhlIGNvbnRhaW5lciovXG4gIHNldCBib3JkZXIoYm9yZGVyOiBGb3JtR3JvdXBCb3JkZXJTdHlsZSB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLkluc2V0LFxuICAgICAgRm9ybUdyb3VwQm9yZGVyU3R5bGUuT3V0c2V0LFxuICAgICk7XG4gICAgaWYgKGJvcmRlciAmJiBib3JkZXIgIT09IEZvcm1Hcm91cEJvcmRlclN0eWxlLk5vbmUpXG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoYm9yZGVyKTtcbiAgfVxuXG4gIHNldCBjb2xsYXBzaWJsZShjb2xsYXBzaWJsZTogYm9vbGVhbikge1xuICAgIGlmIChjb2xsYXBzaWJsZSAmJiAhdGhpcy4jY29sbGFwc2libGUpIHtcbiAgICAgIHRoaXMuI2NvbGxhcHNpYmxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtcbiAgICAgIGlmICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEpXG4gICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnJlcGxhY2VDaGlsZHJlbiguLi50aGlzLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy4jY29sbGFwc2libGUpO1xuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY29sbGFwc2libGVcIik7XG4gICAgICB0aGlzLmFwcGVuZENoaWxkKFxuICAgICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24gfHxcbiAgICAgICAgICAodGhpcy5jb2xsYXBzZV90ZXh0ID0gXCJcIikgfHxcbiAgICAgICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24hLFxuICAgICAgKTtcbiAgICAgIHRoaXMuY29sbGFwc2VkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFjb2xsYXBzaWJsZSAmJiB0aGlzLiNjb2xsYXBzaWJsZSkge1xuICAgICAgdGhpcy5jb2xsYXBzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKC4uLnRoaXMuI2NvbGxhcHNpYmxlLmNoaWxkcmVuKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNpYmxlID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY29sbGFwc2libGVcIik7XG4gICAgfVxuICB9XG4gIGdldCBjb2xsYXBzaWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29sbGFwc2libGUgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZWQoY29sbGFwc2VkOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB7XG4gICAgICBpZiAoY29sbGFwc2VkICYmICF0aGlzLiNjb2xsYXBzZWQpIHtcbiAgICAgICAgLy8jIEFuaW1hdGlvblxuICAgICAgICBpZiAoQU5JTUFUSU9OX0xFVkVMLmdldCgpLnZhbHVlID09PSBBbmltYXRpb25MZXZlbHMuQWxsKSB7XG4gICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJoaWRkZW5cIjtcbiAgICAgICAgICBjb25zdCBmdWxsX2hlaWdodCA9XG4gICAgICAgICAgICB0aGlzLiNjb2xsYXBzaWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgY29uc3QgYW5pbWF0aW9uID0gdGhpcy4jY29sbGFwc2libGUuYW5pbWF0ZShcbiAgICAgICAgICAgIFt7IGhlaWdodDogZnVsbF9oZWlnaHQgfSwgeyBoZWlnaHQ6IFwiMFwiIH1dLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBkdXJhdGlvbjogQU5JTUFUSU9OX1NQRUVELmdldCgpLnZhbHVlLFxuICAgICAgICAgICAgICBlYXNpbmc6IFwiZWFzZS1pblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIGlmICh0aGlzLiNjb2xsYXBzaWJsZSkgdGhpcy4jY29sbGFwc2libGUuc3R5bGUub3ZlcmZsb3dZID0gXCJcIjtcbiAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghY29sbGFwc2VkICYmIHRoaXMuI2NvbGxhcHNlZCkge1xuICAgICAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJjb2xsYXBzZWRcIik7XG4gICAgICAgIC8vIyBBbmltYXRpb25cbiAgICAgICAgaWYgKEFOSU1BVElPTl9MRVZFTC5nZXQoKS52YWx1ZSA9PT0gQW5pbWF0aW9uTGV2ZWxzLkFsbCkge1xuICAgICAgICAgIHRoaXMuI2NvbGxhcHNpYmxlLnN0eWxlLm92ZXJmbG93WSA9IFwiaGlkZGVuXCI7XG4gICAgICAgICAgY29uc3QgZnVsbF9oZWlnaHQgPVxuICAgICAgICAgICAgdGhpcy4jY29sbGFwc2libGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuI2NvbGxhcHNpYmxlLmFuaW1hdGUoXG4gICAgICAgICAgICBbeyBoZWlnaHQ6IFwiMFwiIH0sIHsgaGVpZ2h0OiBmdWxsX2hlaWdodCB9XSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgICAgZWFzaW5nOiBcImVhc2Utb3V0XCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuI2NvbGxhcHNpYmxlKSB0aGlzLiNjb2xsYXBzaWJsZS5zdHlsZS5vdmVyZmxvd1kgPSBcIlwiO1xuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMuI2NvbGxhcHNlZCA9IGNvbGxhcHNlZDtcbiAgICB9XG4gIH1cbiAgZ2V0IGNvbGxhcHNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY29sbGFwc2VkO1xuICB9XG5cbiAgc2V0IGNvbGxhcHNlX3RleHQodGV4dDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLiNjb2xsYXBzZV9idXR0b24pIHtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLnRhYkluZGV4ID0gMDtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQobWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkKCkpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9uY2xpY2sgPSAoKSA9PiAodGhpcy5jb2xsYXBzZWQgPSAhdGhpcy5jb2xsYXBzZWQpO1xuICAgICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiIHx8IGUua2V5ID09PSBcIiBcIikge1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLmZpcnN0Q2hpbGQhLnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxuXG4gIHNldCBtYXhfaGVpZ2h0KGhlaWdodDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShcIi0tbWF4X2hlaWdodFwiLCBoZWlnaHQgPyBoZWlnaHQgKyBcInJlbVwiIDogXCJub25lXCIpO1xuICAgIGlmIChoZWlnaHQpIHRoaXMuY2xhc3NMaXN0LmFkZChcIm1heF9oZWlnaHRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJtYXhfaGVpZ2h0XCIpO1xuICB9XG5cbiAgc2V0IGVtYmVkKGVtYmVkOiBib29sZWFuKSB7XG4gICAgaWYgKGVtYmVkKSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJlbWJlZFwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImVtYmVkXCIpO1xuICB9XG5cbiAgc2V0IHZhbHVlKHZhbDogUlQpIHtcbiAgICBzdXBlci52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIC8qKlJldHVybnMgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIGdldCB2YWx1ZSgpOiBSZXN1bHQ8UlQsIHN0cmluZz4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkgcmV0dXJuIGVycihcIlN0YXRlIGJhc2VkIGNvbXBvbmVudFwiKTtcbiAgICBjb25zdCByZXN1bHQ6IFJUID0ge30gYXMgUlQ7XG4gICAgZm9yIChjb25zdCBba2V5LCBjb21wXSBvZiB0aGlzLiN2YWx1ZV9lbGVtZW50cykge1xuICAgICAgY29uc3QgdmFsID0gY29tcC52YWx1ZTtcbiAgICAgIGlmICh2YWwuZXJyKSByZXR1cm4gZXJyKFwiQ29tcG9uZW50IHdpdGggaWQgXCIgKyBrZXkgKyBcIiBoYXMgbm8gdmFsdWVcIik7XG4gICAgICByZXN1bHRba2V5IGFzIGtleW9mIFJUXSA9IHZhbC52YWx1ZSBhcyBSVFtrZXlvZiBSVF07XG4gICAgfVxuICAgIHJldHVybiBvayhyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKVxuICAgICAgaWYgKHRoaXMuI3ZhbHVlX2VsZW1lbnRzLmhhcyhrZXkpKVxuICAgICAgICB0aGlzLiN2YWx1ZV9lbGVtZW50cy5nZXQoa2V5KSEudmFsdWUgPSB2YWxba2V5IGFzIGtleW9mIFJUXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgdGhpcy4jdmFsdWVfZWxlbWVudHMudmFsdWVzKCkpIGNvbXAuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBvbl9hY2Nlc3MoYWNjZXNzOiBBY2Nlc3NUeXBlcyk6IHZvaWQge1xuICAgIHN3aXRjaCAoYWNjZXNzKSB7XG4gICAgICBjYXNlIEFjY2Vzc1R5cGVzLlJlYWQ6IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMub25mb2N1cyA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5Xcml0ZToge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInRhYkluZGV4XCIpO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Hcm91cCk7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2dyb3VwPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQgZXh0ZW5kcyBvYmplY3QgPSBQcmV0dGlmeTxQYXJ0aWFsPFRvS2V5VmFsPEV4dHJhY3RCPEw+Pj4+LFxuPihvcHRpb25zPzogRm9ybUdyb3VwT3B0aW9uczxMLCBJRCwgVD4pOiBGb3JtR3JvdXA8VCwgSUQ+IHtcbiAgY29uc3Qgc2xpZGUgPSBuZXcgRm9ybUdyb3VwPFQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMuYm9yZGVyKSBzbGlkZS5ib3JkZXIgPSBvcHRpb25zLmJvcmRlcjtcbiAgICBpZiAob3B0aW9ucy5lbGVtZW50cykgc2xpZGUuZWxlbWVudHMgPSBvcHRpb25zLmVsZW1lbnRzO1xuICAgIGlmIChvcHRpb25zLmNvbGxhcHNlX3RleHQpIHNsaWRlLmNvbGxhcHNlX3RleHQgPSBvcHRpb25zLmNvbGxhcHNlX3RleHQ7XG4gICAgaWYgKG9wdGlvbnMuY29sbGFwc2libGUpIHNsaWRlLmNvbGxhcHNpYmxlID0gb3B0aW9ucy5jb2xsYXBzaWJsZTtcbiAgICBpZiAob3B0aW9ucy5jb2xsYXBzZWQpIHNsaWRlLmNvbGxhcHNlZCA9IG9wdGlvbnMuY29sbGFwc2VkO1xuICAgIGlmIChvcHRpb25zLm1heF9oZWlnaHQpIHNsaWRlLm1heF9oZWlnaHQgPSBvcHRpb25zLm1heF9oZWlnaHQ7XG4gICAgaWYgKG9wdGlvbnMuZW1iZWQpIHNsaWRlLmVtYmVkID0gb3B0aW9ucy5lbWJlZDtcbiAgICBGb3JtVmFsdWUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBMaXN0RmllbGQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1saXN0XCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gXCIuLi9iYXNlXCI7XG5pbXBvcnQgXCIuL2xpc3RfZmllbGQuc2Nzc1wiO1xuXG5leHBvcnQgY2xhc3MgTGlzdEZvcm1GaWVsZDxUIGV4dGVuZHMgRm9ybUVsZW1lbnQ+IGV4dGVuZHMgTGlzdEZpZWxkIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJsaXN0ZmllbGRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgc2V0IGVsZW1lbnQoY29tcG9uZW50OiBUKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGRyZW4oY29tcG9uZW50KTtcbiAgfVxuXG4gIGdldCBlbGVtZW50KCk6IFQge1xuICAgIHJldHVybiB0aGlzLmZpcnN0RWxlbWVudENoaWxkIGFzIFQ7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KExpc3RGb3JtRmllbGQpO1xuXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9saXN0X2ZpZWxkPFQgZXh0ZW5kcyBGb3JtRWxlbWVudD4oZWxlbWVudDogVCkge1xuICBjb25zdCBmaWVsZCA9IG5ldyBMaXN0Rm9ybUZpZWxkPFQ+KCk7XG4gIGZpZWxkLmVsZW1lbnQgPSBlbGVtZW50O1xuICByZXR1cm4gZmllbGQ7XG59XG4iLCJpbXBvcnQgeyBub25lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlTnVtYmVyUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9udW1iZXJfYmFzZS5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU51bWJlck9wdGlvbnM8XG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBSVCA9IG51bWJlcixcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFJULCBJRD4ge1xuICAvKipMb3dlciBsaW1pdCBmb3Igc2xpZGVyIHZhbHVlKi9cbiAgbWluPzogbnVtYmVyO1xuICAvKipVcHBlciBsaW1pdCBmb3Igc2xpZGVyIHZhbHVlKi9cbiAgbWF4PzogbnVtYmVyO1xuICAvKipBbW91bnQgb2YgZGVjaW1hbHMgdG8gc2hvdyovXG4gIGRlY2ltYWxzPzogbnVtYmVyO1xuICAvKipVbml0IHRvIHVzZSBmb3Igc2xpZGVyKi9cbiAgdW5pdD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtTnVtYmVyV3JpdGVPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybU51bWJlck9wdGlvbnM8SUQsIFJUPiB7XG4gIC8qKlN0ZXAgc2l6ZSwgdXNlIDAgZm9yIGF1dG9tYXRpYyBzdGVwIHNpemUqL1xuICBzdGVwPzogbnVtYmVyO1xuICAvKipTdGFydCBmb3Igc3RlcCwgdXNlIDAgZm9yIGF1dG9tYXRpYyAqL1xuICBzdGFydD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtU3RlcHBlckJhc2VPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRCwgUlQ+IHtcbiAgLyoqd2V0aGVyIHRoZSBldmVudHMgYXJlIGxpdmUgYXMgdGhlIHNsaWRlciBpcyBtb3ZlZCBvciBvbmx5IHdoZW4gbW92aW5nIHN0b3BzICovXG4gIGxpdmU/OiBib29sZWFuO1xuICAvKipJY29uIHRvIHVzZSBmb3IgZGVjcmVhc2luZyB2YWx1ZSovXG4gIGljb25fZGVjcmVhc2U/OiBTVkdGdW5jO1xuICAvKipJY29uIHRvIHVzZSBmb3IgaW5jcmVhc2luZyB2YWx1ZSovXG4gIGljb25faW5jcmVhc2U/OiBTVkdGdW5jO1xufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybU51bWJlcldyaXRlPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8UlQsIElEPiB7XG4gIHN0YXRpYyBhcHBseV9vcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgZWxlbWVudDogRm9ybU51bWJlcldyaXRlPElELCBSVD4sXG4gICAgb3B0aW9uczogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRCwgUlQ+LFxuICApIHtcbiAgICBpZiAob3B0aW9ucy51bml0KSBlbGVtZW50LnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgaWYgKG9wdGlvbnMuZGVjaW1hbHMpIGVsZW1lbnQuZGVjaW1hbHMgPSBvcHRpb25zLmRlY2ltYWxzO1xuICAgIGlmIChvcHRpb25zLm1pbiAhPT0gdW5kZWZpbmVkKSBlbGVtZW50Lm1pbiA9IG9wdGlvbnMubWluO1xuICAgIGlmIChvcHRpb25zLm1heCAhPT0gdW5kZWZpbmVkKSBlbGVtZW50Lm1heCA9IG9wdGlvbnMubWF4O1xuICAgIGlmIChvcHRpb25zLnN0ZXApIGVsZW1lbnQuc3RlcCA9IG9wdGlvbnMuc3RlcDtcbiAgICBpZiAob3B0aW9ucy5zdGFydCkgZWxlbWVudC5zdGFydCA9IG9wdGlvbnMuc3RhcnQ7XG4gICAgc3VwZXIuYXBwbHlfb3B0aW9ucyhlbGVtZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIGFic3RyYWN0IHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldCB0aGUgbWluaW11bSB2YWx1ZSovXG4gIGFic3RyYWN0IHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHNpemUgb2YgbnVtYmVyIGNoYW5nZSBzdGVwcyovXG4gIGFic3RyYWN0IHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgc3RhcnQgb2Zmc2V0IGZvciBudW1iZXIgc3RlcHMqL1xuICBhYnN0cmFjdCBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBhbW91bnQgb2YgZGVjaW1hbHMgdGhlIGVsZW1lbnQgY2FuIGhhdmUqL1xuICBhYnN0cmFjdCBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHVuaXQgb2YgdGhlIGVsZW1lbnQqL1xuICBhYnN0cmFjdCBzZXQgdW5pdCh1bml0OiBzdHJpbmcgfCB1bmRlZmluZWQpO1xuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5zdGVwKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInN0ZXBcIiwgcmVsYXRlZC5zdGVwLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwic3RlcFwiKTtcbiAgICBpZiAocmVsYXRlZC5zdGFydClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJzdGFydFwiLCByZWxhdGVkLnN0YXJ0LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwic3RhcnRcIik7XG4gICAgaWYgKHJlbGF0ZWQuZGVjaW1hbHMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwiZGVjaW1hbHNcIiwgcmVsYXRlZC5kZWNpbWFscywgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcImRlY2ltYWxzXCIpO1xuICAgIGlmIChyZWxhdGVkLnVuaXQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwidW5pdFwiLCByZWxhdGVkLnVuaXQsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJ1bml0XCIpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIHNldF9jdXJzb3JfZW5kLFxuICBzZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBzZXRfc2VsZWN0aW9uX2FsbCxcbiAgc3luY19yZXNvbHZlLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1tYXRoXCI7XG5pbXBvcnQgeyBlcnIsIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtTnVtYmVyV3JpdGUsIHR5cGUgRm9ybU51bWJlcldyaXRlT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9udW1iZXJfaW5wdXQuc2Nzc1wiO1xuXG4vKipTbGlkZSBTZWxlY3RvciwgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBzbGlkZXIqL1xuY2xhc3MgTnVtYmVySW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibnVtYmVyaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3NlbGVjdGVkOiBib29sZWFuID0gZmFsc2U7XG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjbWluOiBudW1iZXIgPSAtSW5maW5pdHk7XG4gICNtYXg6IG51bWJlciA9IEluZmluaXR5O1xuICAjc3RlcDogbnVtYmVyID0gMDtcbiAgI3N0YXJ0OiBudW1iZXIgPSAwO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG5cbiAgI3ZhbHVlX2JveCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdF9ib3ggPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZ2VuZCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgaWYgKGUudGFyZ2V0ICE9PSB0aGlzLiN2YWx1ZV9ib3gpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgfSBlbHNlIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94LmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c2luXCIsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAodGhpcy4jc2VsZWN0ZWQpIHJldHVybjtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IHRydWU7XG4gICAgfSk7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmx1ciA9ICgpID0+IHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gZmFsc2U7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy4jc2V0KGZhbHNlKTtcbiAgICAgIH0sIDApO1xuICAgIH07XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuI3NldCh0cnVlKTtcbiAgICAgIGVsc2UgaWYgKGUua2V5ID09PSBcIkVzY2FwZVwiKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1VwXCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlbHNlIGlmIChlLmRhdGEpIHtcbiAgICAgICAgaWYgKCEvW1xcZCwuLV0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoL1ssLl0vZy50ZXN0KGUuZGF0YSkgJiYgdGhpcy4jZGVjaW1hbHMgPT09IDApXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtaW4gPj0gMCAmJiAvLS9nLnRlc3QoZS5kYXRhKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBhc3luYyAjc2V0KGN1cjogYm9vbGVhbikge1xuICAgIGNvbnN0IHNlbCA9IGdldF9jdXJzb3JfcG9zaXRpb24odGhpcy4jdmFsdWVfYm94KTtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKFxuICAgICAgYXdhaXQgdGhpcy5zZXRfdmFsdWVfY2hlY2soXG4gICAgICAgIHBhcnNlRmxvYXQodGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50Py5yZXBsYWNlKFwiLFwiLCBcIi5cIikgfHwgXCJcIikgfHwgMCxcbiAgICAgIClcbiAgICApXG4gICAgICAubWFwX2VycigoKSA9PiB7XG4gICAgICAgIHRoaXMubmV3X3ZhbHVlKGJ1ZmYgfHwgTWF0aC5tYXgoTWF0aC5taW4oMCwgdGhpcy4jbWF4KSwgdGhpcy4jbWluKSk7XG4gICAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoKSA9PiB7XG4gICAgICAgIGlmICghY3VyKSByZXR1cm47XG4gICAgICAgIHNldF9jdXJzb3JfcG9zaXRpb24odGhpcy4jdmFsdWVfYm94LCBzZWwpO1xuICAgICAgfSk7XG4gIH1cblxuICBmb2N1cyhvcHRpb25zPzogRm9jdXNPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKG9wdGlvbnMpO1xuICB9XG5cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdCA9IHVuaXQgfHwgXCJcIjtcbiAgICB0aGlzLiN1bml0X2JveC50ZXh0Q29udGVudCA9IHRoaXMuI3VuaXQ7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9taW5fbGVnZW5kKCkge1xuICAgIHRoaXMuI21pbl9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpIHtcbiAgICB0aGlzLiNtYXhfbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21heCA9PT0gSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNYXg6IFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0ZXAgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RhcnQgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgI3N0ZXBfdmFsdWUoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc3RlcCA9XG4gICAgICB0aGlzLiNzdGVwIHx8XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgdGhpcy4jZGVjaW1hbHMgPyAxIC8gdGhpcy4jZGVjaW1hbHMgOiAxLFxuICAgICAgICBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuYnVmZmVyIHx8IDApIC8gMTUwKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCh0aGlzLmJ1ZmZlciB8fCAwKSArIChkaXIgPyBzdGVwIDogLXN0ZXApKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoTnVtYmVySW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9udW1iZXJfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRD4sXG4pOiBOdW1iZXJJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBOdW1iZXJJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IG5vbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVOdW1iZXJSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZSB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgeyB0eXBlIEZvcm1OdW1iZXJPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL3Byb2dyZXNzLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1Qcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWU8XG4gIG51bWJlcixcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInByb2dyZXNzXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtaW46IG51bWJlciA9IDA7XG4gICNtYXg6IG51bWJlciA9IDEwMDtcbiAgI3NwYW46IG51bWJlciA9IDEwMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuICAjYmFyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICN2YWw6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1pbihtaW46IG51bWJlcikge1xuICAgIHRoaXMuI21pbiA9IG1pbjtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1heChtYXg6IG51bWJlcikge1xuICAgIHRoaXMuI21heCA9IG1heDtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBNYXRoLm1heChkZWMgPz8gMCwgMCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdC50ZXh0Q29udGVudCA9IHVuaXQgPz8gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI2Jhci5zdHlsZS53aWR0aCA9XG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKHZhbHVlIC0gdGhpcy4jbWluKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSArXG4gICAgICBcIiVcIjtcbiAgICB0aGlzLiN2YWwudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPSBcIjAlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5kZWNpbWFscylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJkZWNpbWFsc1wiLCByZWxhdGVkLmRlY2ltYWxzLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwiZGVjaW1hbHNcIik7XG4gICAgaWYgKHJlbGF0ZWQudW5pdClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJ1bml0XCIsIHJlbGF0ZWQudW5pdCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInVuaXRcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Qcm9ncmVzcyk7XG5cbi8qKkNyZWF0ZXMgYSBwcm9ncmVzcyBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3Byb2dyZXNzPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJPcHRpb25zPElEPixcbik6IEZvcm1Qcm9ncmVzczxJRD4ge1xuICBjb25zdCBwcm9nID0gbmV3IEZvcm1Qcm9ncmVzczxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5taW4gIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWluID0gb3B0aW9ucy5taW47XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heCAhPT0gXCJ1bmRlZmluZWRcIikgcHJvZy5tYXggPSBvcHRpb25zLm1heDtcbiAgICBwcm9nLmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBwcm9nLnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMocHJvZywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc2xpZGVyLnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtU2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQsXG4gIG51bWJlclxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic2xpZGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzcGFuOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2ljb25fZGVjID0gdGhpcy4jc3RlcHBlcl9mdW5jKFxuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICNzbGlkZSA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZnRfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3JpZ2h0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICNzbGlkZXIgPSB0aGlzLiNzbGlkZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiNzbGlkZXIuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcIm1vdXNlXCIgJiYgIXRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgY29uc3QgYm94ID0gdGhpcy4jc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jc2xpZGVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpXG4gICAgICAgID8gZS5jbGllbnRYID49IGJveC54XG4gICAgICAgICAgPyBlLmNsaWVudFggPD0gYm94LnggKyBib3gud2lkdGhcbiAgICAgICAgICAgID8gYm94LnggLSBlLmNsaWVudFhcbiAgICAgICAgICAgIDogLWJveC53aWR0aFxuICAgICAgICAgIDogMFxuICAgICAgICA6IC1ib3gud2lkdGggLyAyO1xuICAgICAgaWYgKHRoaXMuI21pbiA9PT0gLUluZmluaXR5IHx8IHRoaXMuI21heCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlICs9IGRpZmYgLyA1MCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2xpdmUpXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsKSkubWFwKCh2KSA9PiAodmFsdWUgPSB2KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jbW92ZV92YWx1ZSh2KTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBsZXQgZGlmZiA9IHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpIC0gNTA7XG4gICAgICAgIHRoaXMuI21vdmVfc2xpZGUodGhpcy4jeF90b19wZXJjKGUuY2xpZW50WCArIG9mZnNldCkpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgICAgZGlmZiA9ICh0aGlzLiNzdGVwIHx8IDEpICogKChwZXJjIC0gNTApICogMik7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZShwZXJjKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICB0aGlzLiNtb3ZlX2Fic29sdXRlKGUuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jc2xpZGUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbGVmdF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHlcbiAgICAgICAgPyBcIlwiXG4gICAgICAgIDogXCJNaW46IFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdDtcbiAgfVxuXG4gIHNldCBtYXgobWF4OiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtYXggPSBtYXggPz8gSW5maW5pdHk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9tYXgoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgI3VwZGF0ZV9tYXhfbGVnZW5kKCkge1xuICAgIHRoaXMuI3JpZ2h0X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQgKyBcIiA6TWF4XCI7XG4gIH1cblxuICAjdXBkYXRlX21pbl9tYXgoKSB7XG4gICAgdGhpcy4jc3BhbiA9IHRoaXMuI21heCAtIHRoaXMuI21pbjtcbiAgICBpZiAodGhpcy4jc3BhbiA9PT0gSW5maW5pdHkpIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICAgIGVsc2UgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlZ2VuZCgpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfYWRkX3JvdW5kZWQoKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUpO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKC10aGlzLiNtaW4gKyB2YWx1ZSkgLyB0aGlzLiNzcGFuKSAqIDEwMCwgMCksIDEwMCksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIHRoaXMuI21vdmVfc2xpZGUoNTApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgTWF0aC5taW4oTWF0aC5tYXgodmFsLCB0aGlzLiNtaW4pLCB0aGlzLiNtYXgpLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUobGltKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBpZiAodmFsIDwgdGhpcy4jbWluKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWluaW11bSB2YWx1ZSBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBpZiAodmFsID4gdGhpcy4jbWF4KVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKFwiTWF4aW11bSB2YWx1ZSBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQpLFxuICAgICAgKTtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIHZhbCxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmNoZWNrX3ZhbHVlKGxpbSk7XG4gIH1cblxuICBhc3luYyAjbW92ZV9hYnNvbHV0ZSh4OiBudW1iZXIsIGxhc3Q/OiBudW1iZXIpIHtcbiAgICBjb25zdCBwZXJjID0gdGhpcy4jeF90b19wZXJjKHgpO1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICBlbHNlIHtcbiAgICAgIGlmIChsYXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgICAgICBpZiAodmFsdWUub2spIHtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3NsaWRlKCgoLXRoaXMuI21pbiArIHZhbHVlLnZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwKTtcbiAgICAgICAgICB0aGlzLiNtb3ZlX3ZhbHVlKHZhbHVlLnZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZXRfdmFsdWVfbGltaXQodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgI3hfdG9fcGVyYyh4OiBudW1iZXIpIHtcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzbGlkZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCAoKHggLSBib3gueCkgLyBib3gud2lkdGgpICogMTAwKSk7XG4gIH1cblxuICAjcGVyY190b192YWx1ZShwZXJjOiBudW1iZXIpIHtcbiAgICByZXR1cm4gKHBlcmMgLyAxMDApICogdGhpcy4jc3BhbiArIHRoaXMuI21pbjtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG5cbiAgI21vdmVfc2xpZGUocGVyYzogbnVtYmVyKSB7XG4gICAgdGhpcy4jc2xpZGVyLnN0eWxlLmxlZnQgPSBwZXJjICsgXCIlXCI7XG4gIH1cbiAgI21vdmVfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IHZhbHVlLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU2xpZGVyKTtcblxuLyoqQ3JlYXRlcyBhIGRyb3Bkb3duIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8SUQ+LFxuKTogRm9ybVNsaWRlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU2xpZGVyPElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMubGl2ZSkgc2xpZGUubGl2ZSA9IG9wdGlvbnMubGl2ZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2RlY3JlYXNlKSBzbGlkZS5pY29uX2RlY3JlYXNlID0gb3B0aW9ucy5pY29uX2RlY3JlYXNlO1xuICAgIGlmIChvcHRpb25zLmljb25faW5jcmVhc2UpIHNsaWRlLmljb25faW5jcmVhc2UgPSBvcHRpb25zLmljb25faW5jcmVhc2U7XG4gICAgRm9ybU51bWJlcldyaXRlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgc2xlZXAsIHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc3RlcHBlci5zY3NzXCI7XG5cbi8qKlNsaWRlIFNlbGVjdG9yLCBkaXNwbGF5cyBhbGwgb3B0aW9ucyBpbiBhIHNsaWRlciovXG5leHBvcnQgY2xhc3MgRm9ybVN0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybU51bWJlcldyaXRlPFxuICBJRCxcbiAgbnVtYmVyXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzdGVwcGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzdGVwOiBudW1iZXIgPSAwO1xuICAjc3RhcnQ6IG51bWJlciA9IDA7XG4gICNsaXZlOiBib29sZWFuID0gZmFsc2U7XG4gICNpY29uX2RlYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkKCkpLFxuICAgIGZhbHNlLFxuICApO1xuICAjdGV4dCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjaWNvbl9pbmMgPSB0aGlzLiNzdGVwcGVyX2Z1bmMoXG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9hZGRfcm91bmRlZCgpKSxcbiAgICB0cnVlLFxuICApO1xuICAjdmFsdWVfYm94ID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3RleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbGVnZW5kID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtYXhfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21pbl9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuXG4gICAgdGhpcy4jdmFsdWVfYm94LnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiLTFcIik7XG4gICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgIGxldCBkcmFnX2Jsb2NrZXIgPSBmYWxzZTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25mb2N1cyA9IGFzeW5jICgpID0+IHtcbiAgICAgIGRyYWdfYmxvY2tlciA9IHRydWU7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25ibHVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZHJhZ19ibG9ja2VyID0gZmFsc2U7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApO1xuICAgIH07XG4gICAgbGV0IHJlc2V0ID0gKCkgPT4ge307XG4gICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCAmJiAoZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCB8fCAhZHJhZ19ibG9ja2VyKSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCBpbml0aWFsX3ZhbCA9IHRoaXMuYnVmZmVyIHx8IDA7XG4gICAgICAgIGxldCBtb3ZpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy4jdGV4dC5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3RleHQub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI21vdmVfZGlmZihcbiAgICAgICAgICAgICAgaW5pdGlhbF92YWwgKyAoKGV2LmNsaWVudFggLSBlLmNsaWVudFgpIC8gMTApICogKHRoaXMuI3N0ZXAgfHwgMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZXYuY2xpZW50WCkgPiA1KSB7XG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJmYWxzZVwiO1xuICAgICAgICAgICAgbW92aW5nID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJlc2V0ID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcInRydWVcIjtcbiAgICAgICAgICB0aGlzLiN0ZXh0LnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJtb3ZlID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCFtb3ZpbmcgJiYgZS50YXJnZXQgIT09IHRoaXMuI3ZhbHVlX2JveCkge1xuICAgICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgICAgICAgICBjb25zdCByYW5nZSA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7XG4gICAgICAgICAgICByYW5nZS5zZXRTdGFydEFmdGVyKHRoaXMuI3ZhbHVlX2JveC5maXJzdENoaWxkISk7XG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rpb24gPSB0aGlzLm93bmVyRG9jdW1lbnQ/LmRlZmF1bHRWaWV3Py5nZXRTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIGlmIChzZWxlY3Rpb24pIHtcbiAgICAgICAgICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgICAgICAgICBzZWxlY3Rpb24uYWRkUmFuZ2UocmFuZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAobW92aW5nKSB7XG4gICAgICAgICAgICB0aGlzLiNtb3ZlX2RpZmYoXG4gICAgICAgICAgICAgIGluaXRpYWxfdmFsICsgKChldi5jbGllbnRYIC0gZS5jbGllbnRYKSAvIDEwKSAqICh0aGlzLiNzdGVwIHx8IDEpLFxuICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIG1vdmluZyA9IGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93UmlnaHRcIiB8fCBlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMuI3N0ZXBfdmFsdWUoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAocmVzZXQpIHJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRoaXMub3duZXJEb2N1bWVudC5hY3RpdmVFbGVtZW50ICE9PSB0aGlzLiN2YWx1ZV9ib3ggJiZcbiAgICAgICAgICAvW1xcZCwuLV0vZy50ZXN0KGUua2V5KVxuICAgICAgICApIHtcbiAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiN2YWx1ZV9ib3guYmx1cigpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiIHx8IGUua2V5ID09PSBcIkFycm93TGVmdFwiKVxuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9uYmVmb3JlaW5wdXQgPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuaW5wdXRUeXBlID09PSBcImluc2VydFBhcmFncmFwaFwiKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgKHRoaXMuI21pbiA+PSAwICYmIC8tL2cudGVzdChlLmRhdGEpKSB8fFxuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8uaW5jbHVkZXMoXCItXCIpXG4gICAgICAgIClcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWluOiBcIiArIHRoaXMuI21pbi50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWF4X2xlbmdlbmQoKSB7XG4gICAgdGhpcy4jbWF4X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5XG4gICAgICAgID8gXCJcIlxuICAgICAgICA6IFwiTWF4OiBcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKSArIHRoaXMuI3VuaXQ7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgLyoqU2V0IHdldGhlciB0aGUgc2xpZGVyIGlzIGluIGxpdmUgbW9kZSovXG4gIHNldCBsaXZlKGxpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNsaXZlID0gbGl2ZSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldCBpY29uX2RlY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25fZGVjLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9yZW1vdmVfcm91bmRlZCgpLCBmYWxzZSksXG4gICAgKTtcbiAgfVxuXG4gIHNldCBpY29uX2luY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25faW5jLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHZhbHVlIHRvIGEgcG9zaXRpb24gYnkgdGhlIG1vdXNlIHggY29vcmRpbmF0ZXMqL1xuICBhc3luYyAjbW92ZV9kaWZmKHZhbHVlOiBudW1iZXIsIGxhc3Q6IGJvb2xlYW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgZWxzZSB7XG4gICAgICBpZiAobGFzdCkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IGxpbSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodmFsdWUpO1xuICAgICAgICBpZiAobGltLm9rKSB0aGlzLiNtb3ZlX3ZhbHVlKGxpbS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqTW92ZXMgdGhlIHNsaWRlciB0byB0aGUgZ2l2ZW4gcGVyY2VudCBwb3NpdGlvbiovXG4gICNtb3ZlX3ZhbHVlKHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIC8qKkF0dGFjaGVzIGNsaWNrIGFjdGlvbiB0byBvdmVyIHRpbWUgaW5jcmVhc2Ugc3BlZWQgb2Ygc3RlcHBpbmcgd2hlbiBob2xkaW5nIHN0ZXAgYnV0dG9ucyAqL1xuICAjc3RlcHBlcl9mdW5jKGljb246IFNWR1NWR0VsZW1lbnQsIGRpcjogYm9vbGVhbikge1xuICAgIGljb24ub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgbGV0IGludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlcl9pbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXIgPSAyNTA7XG4gICAgICAgIGNvbnN0IHJlbGVhc2UgPSAoKSA9PiB7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChzY2FsZXJfaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICBpY29uLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWNvbi5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICB9O1xuICAgICAgICBpY29uLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgaWNvbi5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgICBjb25zdCB0aW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIHNjYWxlcl9pbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChzY2FsZXIgPiAyMCkgc2NhbGVyIC89IDEuMTtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgIH0sIDUwMCk7XG4gICAgICAgIGljb24ub25wb2ludGVydXAgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGludGVydmFsID09PSAwKSB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgcmVsZWFzZSgpO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGljb247XG4gIH1cblxuICAjc3RlcF92YWx1ZShkaXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzdGVwID1cbiAgICAgIHRoaXMuI3N0ZXAgfHxcbiAgICAgIE1hdGgubWF4KFxuICAgICAgICB0aGlzLiNkZWNpbWFscyA/IDEgLyB0aGlzLiNkZWNpbWFscyA6IDEsXG4gICAgICAgIE1hdGguZmxvb3IoTWF0aC5hYnModGhpcy5idWZmZXIgfHwgMCkgLyAxNTApLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5zZXRfdmFsdWVfY2hlY2soKHRoaXMuYnVmZmVyIHx8IDApICsgKGRpciA/IHN0ZXAgOiAtc3RlcCkpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3RlcHBlcik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N0ZXBwZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU3RlcHBlcjxJRD4ge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtU3RlcHBlcjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmxpdmUpIHNsaWRlLmxpdmUgPSBvcHRpb25zLmxpdmU7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9kZWNyZWFzZSkgc2xpZGUuaWNvbl9kZWNyZWFzZSA9IG9wdGlvbnMuaWNvbl9kZWNyZWFzZTtcbiAgICBpZiAob3B0aW9ucy5pY29uX2luY3JlYXNlKSBzbGlkZS5pY29uX2luY3JlYXNlID0gb3B0aW9ucy5pY29uX2luY3JlYXNlO1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKHNsaWRlLCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gc2xpZGU7XG59XG4iLCJpbXBvcnQgeyBzb21lIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgc3RhdGUsIHsgdHlwZSBTdGF0ZUVudW1SZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi9iYXNlXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yT3B0aW9uPFJUPiB7XG4gIC8qKlZhbHVlIHRvIHNldCB3aGVuIG9wdGlvbiBpcyBzZWxlY3RlZCAqL1xuICB2YWx1ZTogUlQ7XG4gIC8qKlRleHQgZm9yIHNlbGVjdGlvbiAqL1xuICB0ZXh0OiBzdHJpbmc7XG4gIC8qKkljb24gdG8gZGlzcGxheSBmb3Igb3B0aW9uKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8XG4gIFQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8VCwgSUQ+IHtcbiAgLyoqT3B0aW9ucyBmb3Igc2VsZWN0b3IqL1xuICBzZWxlY3Rpb25zPzogRm9ybVNlbGVjdG9yT3B0aW9uPFQ+W107XG59XG5cbi8qKkJhc2UgZm9yIG51bWJlciBlbGVtZW50cyBlbGVtZW50cyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVNlbGVjdG9yQmFzZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICAvKipTZXRzIHRoZSBzZWxlY3Rpb24gb3B0aW9ucyBmb3IgdGhlIHNlbGVjdG9yICovXG4gIGFic3RyYWN0IHNldCBzZWxlY3Rpb25zKHNlbGVjdGlvbnM6IEZvcm1TZWxlY3Rvck9wdGlvbjxSVD5bXSB8IHVuZGVmaW5lZCk7XG5cbiAgc3RhdGljIGFwcGx5X29wdGlvbnM8UlQsIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgICBlbGVtZW50OiBGb3JtU2VsZWN0b3JCYXNlPFJULCBJRD4sXG4gICAgb3B0aW9uczogRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuc2VsZWN0aW9ucykgZWxlbWVudC5zZWxlY3Rpb25zID0gb3B0aW9ucy5zZWxlY3Rpb25zO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlRW51bVJlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubGlzdCkge1xuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcF9tYXAoXG4gICAgICAgIFwic2VsZWN0aW9uc1wiLFxuICAgICAgICByZWxhdGVkLmxpc3QsXG4gICAgICAgICgpID0+IHNvbWUoW10pLFxuICAgICAgICAodmFsKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHNvbWUoXG4gICAgICAgICAgICBzdGF0ZS5lLm1hcCh2YWwsIChrZXksIHZhbCkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHRleHQ6IHZhbC5uYW1lLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBrZXkgYXMgUlQsXG4gICAgICAgICAgICAgICAgaWNvbjogdmFsLmljb24sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEJhc2UsIGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybVNlbGVjdG9yQmFzZSxcbiAgdHlwZSBGb3JtU2VsZWN0b3JCYXNlT3B0aW9ucyxcbiAgdHlwZSBGb3JtU2VsZWN0b3JPcHRpb24sXG59IGZyb20gXCIuLi9zZWxlY3Rvcl9iYXNlXCI7XG5pbXBvcnQgXCIuL2Ryb3BfZG93bi5zY3NzXCI7XG5cbmludGVyZmFjZSBTZWxPcHRpb25zIHtcbiAgdGV4dDogc3RyaW5nO1xuICBpY29uPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtRHJvcERvd25PcHRpb25zPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKkRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQqL1xuICBkZWZhdWx0Pzogc3RyaW5nO1xuICAvKipEZWZhdWx0IGljb24gZGlzcGxheWVkKi9cbiAgZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbn1cblxuLyoqRHJvcGRvd24gYm94IGZvciBzZWxlY3RpbmcgYmV0d2VlbiBtdWx0aXBsZSBjaG9pY2VzIGluIGEgc21hbGwgc3BhY2UqL1xuZXhwb3J0IGNsYXNzIEZvcm1Ecm9wZG93bjxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2U8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiZHJvcGRvd25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI21hcDogTWFwPFJULCBTZWxPcHRpb25zPiA9IG5ldyBNYXAoKTtcbiAgI3ZhbHVlczogUlRbXSA9IFtdO1xuICAjc2VsZWN0ZWQ6IG51bWJlciA9IC0xO1xuXG4gICNpY29uPzogU1ZHU1ZHRWxlbWVudDtcbiAgI3RleHQ6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI29wZW46IFNWR1NWR0VsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQoKSk7XG4gICNkZWZhdWx0OiBUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJTZWxlY3Qgc29tZXRoaW5nXCIpO1xuICAjZGVmYXVsdF9pY29uPzogU1ZHRnVuYztcbiAgcHJpdmF0ZSBpc19vcGVuOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiN0ZXh0LmFwcGVuZCh0aGlzLiNkZWZhdWx0KTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgdGhpcy5vbmNsaWNrID0gKCkgPT4gKHRoaXMub3BlbiA9IHRydWUpO1xuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5wb2ludGVyVHlwZSA9PT0gXCJtb3VzZVwiKSB7XG4gICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub3BlbiA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJBcnJvd0Rvd25cIjpcbiAgICAgICAgY2FzZSBcIkFycm93VXBcIjpcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICB0aGlzLiNzZWxlY3RfYWRqYWNlbnQoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipHZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgZ2V0IGRlZmF1bHQoKSB7XG4gICAgcmV0dXJuIHRoaXMuI2RlZmF1bHQubm9kZVZhbHVlIHx8IFwiXCI7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgc2V0IGRlZmF1bHQoZGVmOiBzdHJpbmcpIHtcbiAgICB0aGlzLiNkZWZhdWx0Lm5vZGVWYWx1ZSA9IGRlZjtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGRlZmF1bHQgdGV4dCBkaXNwbGF5ZWQgd2hlbiBub3RoaW5nIGhhcyBiZWVuIHNlbGVjdGVkIHlldCAqL1xuICBzZXQgZGVmYXVsdF9pY29uKGRlZjogU1ZHRnVuYyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlZmF1bHRfaWNvbiA9IGRlZjtcbiAgICBpZiAoZGVmICYmIHRoaXMuI3NlbGVjdGVkID09PSAtMSkgdGhpcy4jc2V0X2ljb24gPSBkZWY7XG4gIH1cblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IHNlbGVjdGlvbnMgJiYgaSA8IHNlbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUsIHRleHQsIGljb24gfSA9IHNlbGVjdGlvbnNbaV07XG4gICAgICB0aGlzLiNtYXAuc2V0KHZhbHVlLCB7IHRleHQsIGljb24gfSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gIH1cblxuICBzZXQgb3BlbihvcGVuOiBib29sZWFuKSB7XG4gICAgaWYgKG9wZW4gJiYgIXRoaXMuaXNfb3Blbikge1xuICAgICAgdGhpcy4jb3Blbi5yZXBsYWNlQ2hpbGRyZW4obWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICAgIGJveC5vcGVuX21lbnUodGhpcy4jbWFwLCB0aGlzLCB0aGlzLmJ1ZmZlcik7XG4gICAgfSBlbHNlIGlmICghb3BlbiAmJiB0aGlzLmlzX29wZW4pIHtcbiAgICAgIHRoaXMuI29wZW4ucmVwbGFjZUNoaWxkcmVuKG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQoKSk7XG4gICAgICBib3guY2xvc2VfbWVudSgpO1xuICAgIH1cbiAgICB0aGlzLmlzX29wZW4gPSBvcGVuO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0ICNzZXRfaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHtcbiAgICAgIGNvbnN0IGkgPSBpY29uKCk7XG4gICAgICBpZiAodGhpcy4jaWNvbikgdGhpcy5yZXBsYWNlQ2hpbGQoaSwgdGhpcy4jaWNvbik7XG4gICAgICBlbHNlIHRoaXMuaW5zZXJ0QmVmb3JlKGksIHRoaXMuI3RleHQpO1xuICAgICAgdGhpcy4jaWNvbiA9IGk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpY29uKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuI2ljb24pO1xuICAgICAgdGhpcy4jaWNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgI2NsZWFyKCkge1xuICAgIHRoaXMuZGVmYXVsdF9pY29uID0gdGhpcy4jZGVmYXVsdF9pY29uXG4gICAgICA/ICh0aGlzLiNzZXRfaWNvbiA9IHRoaXMuI2RlZmF1bHRfaWNvbilcbiAgICAgIDogKHRoaXMuI3NldF9pY29uID0gdW5kZWZpbmVkKTtcbiAgICB0aGlzLiN0ZXh0LnJlcGxhY2VDaGlsZHJlbih0aGlzLiNkZWZhdWx0KTtcbiAgfVxuXG4gIC8qKkNhbGxlZCB3aGVuIFZhbHVlIGlzIGNoYW5nZWQgKi9cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpIHtcbiAgICBpZiAoIXRoaXMuI21hcC5oYXModmFsdWUpKSB7XG4gICAgICB0aGlzLiNjbGVhcigpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIHRoaXMuI3RleHQuaW5uZXJUZXh0ID0gb3B0LnRleHQ7XG4gICAgdGhpcy4jc2VsZWN0ZWQgPSB0aGlzLiN2YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgaWYgKG9wdC5pY29uKSB0aGlzLiNzZXRfaWNvbiA9IG9wdC5pY29uO1xuICAgIGVsc2UgdGhpcy4jc2V0X2ljb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHN1cGVyLndhcm4obWVzc2FnZSk7XG4gICAgfSwgMCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Ecm9wZG93bik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2Ryb3Bkb3duPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtRHJvcERvd25PcHRpb25zPFJULCBJRD4sXG4pOiBGb3JtRHJvcGRvd248UlQsIElEPiB7XG4gIGNvbnN0IGRyb3AgPSBuZXcgRm9ybURyb3Bkb3duPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHQpIGRyb3AuZGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0X2ljb24pIGRyb3AuZGVmYXVsdF9pY29uID0gb3B0aW9ucy5kZWZhdWx0X2ljb247XG4gICAgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKGRyb3AsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBkcm9wO1xufVxuXG4vLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuY2xhc3MgRHJvcERvd25Cb3ggZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkcm9wZG93bmJveFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjY2xvc2VyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICNjb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3Njcm9sbDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLiNjb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgKTtcbiAgI3RhYmxlOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuI3Njcm9sbC5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICApO1xuICAjZHJvcGRvd246IEZvcm1Ecm9wZG93bjxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICNmb2N1c19vdXRfaGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCFlLnJlbGF0ZWRUYXJnZXQgfHwgIXRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKVxuICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH07XG4gICN3aW5kb3dfcmVzaXplX2hhbmRsZXIgPSAoKSA9PiB0aGlzLmNsb3NlX21lbnUoKTtcbiAgI2lzX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2NvbnRhaW5lci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY29udGFpbmVyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiIHx8IChlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSBcIlRhYlwiKSkge1xuICAgICAgICBjb25zdCBlbGVtID1cbiAgICAgICAgICBlLnRhcmdldCA9PT0gdGhpcy4jY29udGFpbmVyXG4gICAgICAgICAgICA/IHRoaXMuI3RhYmxlLmxhc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoZWxlbSkgKGVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiIHx8IGUua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPVxuICAgICAgICAgIGUudGFyZ2V0ID09PSB0aGlzLiNjb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy4jdGFibGUuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChlbGVtKSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIHRoaXMuI2Nsb3NlclxuICAgICAgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpXG4gICAgICAuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCgpKTtcbiAgICB0aGlzLiNjbG9zZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuaW5uZXJIVE1MID0gXCJDbG9zZVwiO1xuICAgIHRoaXMuI2Nsb3Nlci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY2xvc2VyLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgIH07XG4gICAgdGhpcy4jY2xvc2VyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jZm9jdXNfb3V0X2hhbmRsZXIsIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgLy9AdHMtZXhwZWN0LWVycm9yIENhbGwgcHJpdmF0ZSBtZXRob2QgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHRoaXMuI2Ryb3Bkb3duLnNldF92YWx1ZV9jaGVjayh2YWx1ZSk7XG4gICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH1cblxuICBvcGVuX21lbnUoXG4gICAgbWFwOiBNYXA8YW55LCBTZWxPcHRpb25zPixcbiAgICBwYXJlbnQ6IEZvcm1Ecm9wZG93bjxhbnksIGFueT4sXG4gICAgdmFsdWU6IGFueSxcbiAgKSB7XG4gICAgY29uc3QgaW5uZXJfaGVpZ2h0ID0gdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5pbm5lckhlaWdodCB8fCAwO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgY29uc3QgYm91bmRzID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLyAyIDwgaW5uZXJfaGVpZ2h0IC8gMikge1xuICAgICAgY29uc3QgdG9wID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9IGlubmVyX2hlaWdodCAtIHRvcCAtIDEwICsgXCJweFwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBcImNvbHVtblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3R0b20gPSBpbm5lcl9oZWlnaHQgLSBib3VuZHMueTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IGJvdHRvbSArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSBib3R0b20gLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW4tcmV2ZXJzZVwiO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubGVmdCA9IGJvdW5kcy54ICsgXCJweFwiO1xuICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IGJvdW5kcy53aWR0aCArIFwicHhcIjtcbiAgICB0aGlzLiNkcm9wZG93biA9IHBhcmVudDtcblxuICAgIGlmICh0aGlzLiNzY3JvbGwuc2Nyb2xsSGVpZ2h0ID4gdGhpcy4jc2Nyb2xsLmNsaWVudEhlaWdodClcbiAgICAgIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QuYWRkKFwic2Nyb2xsXCIpO1xuICAgIGVsc2UgdGhpcy4jc2Nyb2xsLmNsYXNzTGlzdC5yZW1vdmUoXCJzY3JvbGxcIik7XG5cbiAgICBsZXQgZm9jdXM6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkIGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLkFycmF5LmZyb20obWFwKS5tYXAoKFt2YWwsIG9wdF0pID0+IHtcbiAgICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnN0IGljb24gPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICBpZiAob3B0Lmljb24pIGljb24uYXBwZW5kQ2hpbGQob3B0Lmljb24oKSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gb3B0LnRleHQ7XG4gICAgICAgIGxpbmUub25wb2ludGVydXAgPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIpIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBsaW5lLm9uY2xpY2sgPSAoKSA9PiB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgbGluZS50YWJJbmRleCA9IDA7XG4gICAgICAgIGxpbmUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdmFsdWUpIGZvY3VzID0gbGluZTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy9TaG93IGNsb3NlciBvciBub3RcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYm94X2FyZWEgPSBib3gud2lkdGggKiBib3guaGVpZ2h0O1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGh0bWxfYXJlYSA9IGh0bWwuY2xpZW50V2lkdGggKiBodG1sLmNsaWVudEhlaWdodDtcbiAgICBpZiAoYm94X2FyZWEgPiBodG1sX2FyZWEgKiAwLjUpIHtcbiAgICAgIHRoaXMuI3RhYmxlLnByZXBlbmQodGhpcy4jY2xvc2VyKTtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGZvY3VzLmZvY3VzKCk7XG4gICAgICBmb2N1cy5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgfSBlbHNlIHRoaXMuI2NvbnRhaW5lci5mb2N1cygpO1xuXG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgdGhpcy4jaXNfb3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZV9tZW51KCkge1xuICAgIGlmICghdGhpcy4jaXNfb3BlbikgcmV0dXJuO1xuICAgIHRoaXMuI2lzX29wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGlmICh0aGlzLiNkcm9wZG93bikge1xuICAgICAgdGhpcy4jZHJvcGRvd24uZm9jdXMoKTtcbiAgICAgIC8vQHRzLWV4cGVjdC1lcnJvciBPdmVyd3JpdGUgcHJpdmF0ZSBwcm9wZXJ0eSBmcm9tIHNpc3RlciBjbGFzc1xuICAgICAgdGhpcy4jZHJvcGRvd24uaXNfb3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInJlc2l6ZVwiLFxuICAgICAgdGhpcy4jd2luZG93X3Jlc2l6ZV9oYW5kbGVyLFxuICAgICk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KERyb3BEb3duQm94KTtcbmNvbnN0IGJveCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChuZXcgRHJvcERvd25Cb3goKSk7XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIEZvcm1TZWxlY3RvckJhc2UsXG4gIHR5cGUgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnMsXG4gIHR5cGUgRm9ybVNlbGVjdG9yT3B0aW9uLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JfYmFzZVwiO1xuaW1wb3J0IFwiLi90b2dnbGVfYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIFNlbE9wdGlvbnMge1xuICB0b3A6IEhUTUxEaXZFbGVtZW50O1xuICBib3Q6IEhUTUxEaXZFbGVtZW50O1xufVxuXG4vKipUb2dnbGUgYnV0dG9ucywgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBtdWx0aSB0b2dnbGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtVG9nZ2xlQnV0dG9uPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+IHtcbiAgLyoqUmV0dXJucyB0aGUgbmFtZSB1c2VkIHRvIGRlZmluZSB0aGUgZWxlbWVudCovXG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwidG9nZ2xlYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtYXA6IE1hcDxSVCwgU2VsT3B0aW9ucz4gPSBuZXcgTWFwKCk7XG4gICN2YWx1ZXM6IFJUW10gPSBbXTtcbiAgI3NlbGVjdGVkOiBudW1iZXIgPSAtMTtcblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgdGhpcy4jYWRkX3NlbGVjdGlvbihzZWxlY3Rpb25zW2ldKSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaChzZWxlY3Rpb25zW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gICNhZGRfc2VsZWN0aW9uKHNlbGVjdGlvbjogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPikge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgdG9wLnRhYkluZGV4ID0gMDtcbiAgICBjb25zdCBib3QgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIGlmIChzZWxlY3Rpb24uaWNvbikge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHNlbGVjdGlvbi5pY29uKCkpO1xuICAgICAgYm90LnRleHRDb250ZW50ID0gc2VsZWN0aW9uLnRleHQ7XG4gICAgfSBlbHNlIHRvcC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIGNvbnN0IGNsaWNrID0gKCkgPT4ge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhzZWxlY3Rpb24udmFsdWUpO1xuICAgIH07XG4gICAgdG9wLm9uY2xpY2sgPSBjbGljaztcbiAgICBib3Qub25jbGljayA9IGNsaWNrO1xuICAgIHRvcC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSBjbGljaygpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB0aGlzLiNzZWxlY3RfYWRqYWNlbnQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KGZhbHNlKTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiB7IHRvcCwgYm90IH07XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAoc2VsKSBzZWwudG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSB0aGlzLiNtYXAuZ2V0KHZhbHVlKSE7XG4gICAgaWYgKG9wdCkge1xuICAgICAgb3B0LnRvcC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICBvcHQuYm90LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdGhpcy4jdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgb3B0LnRvcC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVG9nZ2xlQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIHRvZ2dsZSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90b2dnbGVfYnV0dG9uPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+LFxuKTogRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+IHtcbiAgY29uc3QgdG9nZyA9IG5ldyBGb3JtVG9nZ2xlQnV0dG9uPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKHRvZ2csIG9wdGlvbnMpO1xuICByZXR1cm4gdG9nZztcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL3NwYWNlci5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3BhY2VyT3B0aW9ucyB7XG4gIC8qKlNwYWNpbmcgYW1vdW50ICAqL1xuICBzcGFjZT86IG51bWJlcjtcbn1cblxuY2xhc3MgRm9ybVNwYWNlciBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzcGFjZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBzcGFjZSwgaW4gcmVtICovXG4gIHNldCBzcGFjZShzcGFjZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5oZWlnaHQgPSBgJHtzcGFjZX1yZW1gO1xuICB9XG4gIGdldCBzcGFjZSgpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLnN0eWxlLmhlaWdodCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TcGFjZXIpO1xuXG4vKipDcmVhdGVzIGEgc3BhY2VyIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc3BhY2VyKG9wdGlvbnM/OiBGb3JtU3BhY2VyT3B0aW9ucyk6IEZvcm1TcGFjZXIge1xuICBjb25zdCBzcGFjZXIgPSBuZXcgRm9ybVNwYWNlcigpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNwYWNlKSBzcGFjZXIuc3BhY2UgPSBvcHRpb25zLnNwYWNlO1xuICB9XG4gIHJldHVybiBzcGFjZXI7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vY29sb3JfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db2xvcklucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKldoZXRoZXIgdGhlIGNvbG9yIGlucHV0IHNob3VsZCB1cGRhdGUgbGl2ZSovXG4gIGxpdmU/OiBib29sZWFuO1xufVxuXG5jbGFzcyBGb3JtQ29sb3JJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiY29sb3JpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJjb2xvclwiO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCBsaXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuI2xpdmUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2xpdmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiIzAwMDAwMFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Db2xvcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fY29sb3JfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUNvbG9ySW5wdXRPcHRpb25zPElELCBzdHJpbmc+LFxuKTogRm9ybUNvbG9ySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybUNvbG9ySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBpbnB1dC5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCxcbiAgbWF0ZXJpYWxfc2NoZWR1bGVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZGF0ZV90aW1lX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlVGltZUlucHV0T3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlR5cGUgb2YgZGF0ZSB0aW1lKi9cbiAgdHlwZT86IEZvcm1EYXRlVGltZVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtRGF0ZVRpbWVUeXBlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIERBVEVUSU1FOiBcImRhdGV0aW1lXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybURhdGVUaW1lVHlwZSA9XG4gICh0eXBlb2YgRm9ybURhdGVUaW1lVHlwZSlba2V5b2YgdHlwZW9mIEZvcm1EYXRlVGltZVR5cGVdO1xuXG5jb25zdCBEYXRlVGltZU1vZGUgPSB7XG4gIERBVEU6IFwiZGF0ZVwiLFxuICBTVFJJTkc6IFwic3RyaW5nXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbn0gYXMgY29uc3Q7XG5cbmNsYXNzIEZvcm1EYXRlVGltZUlucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRhdGV0aW1laW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IEZvcm1EYXRlVGltZVR5cGUgPSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FO1xuICAjbW9kZTogc3RyaW5nID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLndhcm5faW5wdXQubGFuZyA9IFwiZGEtREtcIjtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFwiMC4xXCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCgpKS5vbmNsaWNrID0gKCkgPT5cbiAgICAgIHRoaXMud2Fybl9pbnB1dC5zaG93UGlja2VyKCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9zY2hlZHVsZV9yb3VuZGVkKCkpLm9uY2xpY2sgPSAoKSA9PlxuICAgICAgdGhpcy53YXJuX2lucHV0LnNob3dQaWNrZXIoKTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy53YXJuX2lucHV0LnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuREFURSlcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXcgRGF0ZSh0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlcikgYXMgUlQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuU1RSSU5HKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSBhcyBSVCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5OVU1CRVIpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIgYXMgUlQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBzZXQgdHlwZSh0eXBlOiBGb3JtRGF0ZVRpbWVUeXBlKSB7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuREFURSkgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGVcIjtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5USU1FKSB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwidGltZVwiO1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FKVxuICAgICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCBzdGVwKCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy53YXJuX2lucHV0LnN0ZXApO1xuICB9XG4gIC8qKlNldHMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyKSB7XG4gICAgdGhpcy53YXJuX2lucHV0LnN0ZXAgPSBTdHJpbmcoc3RlcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBSVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jbW9kZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5OVU1CRVI7XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuU1RSSU5HO1xuICAgICAgZWxzZSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG4gICAgfVxuICAgIGxldCB0aW1lOiBudW1iZXI7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGltZSA9IHZhbHVlO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGltZSA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgZWxzZSB0aW1lID0gdmFsdWUuZ2V0VGltZSgpO1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyID0gdGltZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtRGF0ZVRpbWVJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2RhdGVfdGltZV9pbnB1dDxcbiAgUlQgZXh0ZW5kcyBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ob3B0aW9ucz86IERhdGVUaW1lSW5wdXRPcHRpb25zPFJULCBJRD4pOiBGb3JtRGF0ZVRpbWVJbnB1dDxSVCwgSUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybURhdGVUaW1lSW5wdXQ8UlQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudHlwZSkgaW5wdXQudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIElQQWRkcmVzcyxcbiAgSVBWZXJzaW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHNsZWVwLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vaXBfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElwSW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPElQQWRkcmVzcywgSUQ+IHtcbiAgLyoqSXAgYWRkcmVzcyB0eXBlLCB0aGlzIGlzIG92ZXJ3cml0dGVuIGlmIHN1cHBsaWVkIHdpdGggYW4gaXBhZGRyZXNzIHdpdGggYSBkaWZmZXJlbnQgdHlwZSovXG4gIHR5cGU6IElQVmVyc2lvbjtcbn1cblxuY2xhc3MgRm9ybUlwSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIElQQWRkcmVzcyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImlwaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IElQVmVyc2lvbjtcbiAgI3BhcnRzOiBIVE1MRGl2RWxlbWVudFtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogOCB9LCAoXywgaSkgPT4ge1xuICAgIGNvbnN0IGlucCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgaWYgKGkgPCA3KSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgICBpbnAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgaW5wLm9uYmVmb3JlaW5wdXQgPSBhc3luYyAoZXYpID0+IHtcbiAgICAgIGlmIChldi5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvL0JhY2tzcGFjZVxuICAgICAgZWxzZSBpZiAoZXYuaW5wdXRUeXBlID09PSBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiKSB7XG4gICAgICAgIGlmIChpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwICYmIGkgPiAwKSB7XG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZVxuICAgICAgfSBlbHNlIGlmIChldi5pbnB1dFR5cGUgPT09IFwiZGVsZXRlQ29udGVudEZvcndhcmRcIikge1xuICAgICAgICBpZiAoaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpIDwgbGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgICAgIChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldi5kYXRhKSB7XG4gICAgICAgIC8vQ2hlY2sgZm9yIC4gb3IgOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV2LmRhdGEgPT09IFwiLlwiIHx8IGV2LmRhdGEgPT09IFwiOlwiIHx8IGV2LmRhdGEgPT09IFwiLFwiKSAmJlxuICAgICAgICAgIGkgPCBsZW5ndGggLSAxXG4gICAgICAgICkge1xuICAgICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9DaGVjayBmb3IgdmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAhZXYuZGF0YS5tYXRjaChcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IC9eW1xcZF0qJC8gOiAvXltcXGRBLUZhLWZdKiQvLFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vUHJldmVudCB0b28gbG9uZyB2YWx1ZXNcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA+PSAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDQpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgLy9QcmV2ZW50IHRvbyBiaWcgdmFsdWVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcG9zID0gZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApO1xuICAgICAgICAgIGNvbnN0IHBvdGVudGlhbCA9XG4gICAgICAgICAgICBpbnAudGV4dENvbnRlbnQuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICBldi5kYXRhICtcbiAgICAgICAgICAgIGlucC50ZXh0Q29udGVudC5zbGljZShwb3MpO1xuICAgICAgICAgIGNvbnN0IG51bSA9XG4gICAgICAgICAgICB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjRcbiAgICAgICAgICAgICAgPyBwYXJzZUludChwb3RlbnRpYWwsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlSW50KHBvdGVudGlhbCwgMTYpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgJiYgbnVtID4gMjU1KSB8fFxuICAgICAgICAgICAgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNiAmJiBudW0gPiA2NTUzNSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpbnAub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA0KSAmJlxuICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggJiZcbiAgICAgICAgaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlucC5vbmtleWRvd24gPSBhc3luYyAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIiAmJiBpID4gMCkge1xuICAgICAgICBpZiAoZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSAwIHx8IGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApXG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiICYmIGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggfHxcbiAgICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwXG4gICAgICAgIClcbiAgICAgICAgICAoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk/LmZvY3VzKCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgfSBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5wO1xuICB9KTtcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBJUFZlcnNpb24sIGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmICghdGhpcy4jcGFydHMuaW5jbHVkZXMoZS50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jcGFydHNbdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDddKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25kYmxjbGljayA9IChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3BhcnRzWzBdKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiB0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy52YWx1ZV9hc19pcCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMudmFsdWVfYXNfaXApO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmNvcHkgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5jbGlwYm9hcmREYXRhPy5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0aGlzLnZhbHVlX2FzX2lwLnRvX3N0cmluZygpKTtcbiAgICB9O1xuICAgIHRoaXMub25wYXN0ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXN0ZSA9IGUuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgXCJcIjtcbiAgICAgIGNvbnN0IG5ld19pcCA9IG5ldyBJUEFkZHJlc3MocGFzdGUpO1xuICAgICAgaWYgKG5ld19pcC52ZXJzaW9uICE9PSB0aGlzLiN0eXBlKSByZXR1cm47XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXdfaXApO1xuICAgIH07XG4gIH1cblxuICBnZXQgdmFsdWVfYXNfaXAoKTogSVBBZGRyZXNzIHtcbiAgICByZXR1cm4gbmV3IElQQWRkcmVzcyhcbiAgICAgIHRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyA0IDogOClcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBwYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgYWNjICs9IHBhcnQuaW5uZXJUZXh0O1xuICAgICAgICAgIGlmIChpIDwgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KSAtIDEpXG4gICAgICAgICAgICBhY2MgKz0gdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gXCIuXCIgOiBcIjpcIjtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBcIlwiKSxcbiAgICApO1xuICB9XG5cbiAgc2V0IHR5cGUodmFsOiBJUFZlcnNpb24pIHtcbiAgICBpZiAodGhpcy4jdHlwZSA9PT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy4jdHlwZSA9IHZhbDtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY0XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY0KTtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY2XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY2KTtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLnRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB2YWwgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KVxuICAgICAgICAuZmxhdE1hcCgodiwgaSkgPT5cbiAgICAgICAgICBpIDwgKHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpIC0gMVxuICAgICAgICAgICAgPyBbdiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsID09PSBJUFZlcnNpb24uVjQgPyBcIi5cIiA6IFwiOlwiKV1cbiAgICAgICAgICAgIDogW3ZdLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogSVBBZGRyZXNzKTogdm9pZCB7XG4gICAgdGhpcy50eXBlID0gdmFsLnZlcnNpb247XG4gICAgdmFsLmFzX2FycmF5LmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgIHRoaXMuI3BhcnRzW2ldLnRleHRDb250ZW50ID1cbiAgICAgICAgdmFsLnZlcnNpb24gPT09IElQVmVyc2lvbi5WNCA/IHBhcnQudG9TdHJpbmcoKSA6IHBhcnQudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3BhcnRzLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgIHBhcnQudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1JcElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1faXBfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zOiBJcElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtSXBJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtSXBJbnB1dDxJRD4ob3B0aW9ucy50eXBlLCBvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vcGFzc3dvcmRfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1QYXNzd29yZElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxzdHJpbmcsIElEPiB7XG4gIC8qKkFsbG93ZWQgY2hhcmFjdGVycyBmb3IgdGhlIHBhc3N3b3JkIGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVBhc3N3b3JkSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInBhc3N3b3JkaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwicGFzc3dvcmRcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uYmVmb3JlaW5wdXQgPSAoZXYpID0+IHtcbiAgICAgIGlmIChldi5kYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGV2LmRhdGEpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLndhcm4oXCJJbnZhbGlkIGNoYXJhY3RlciBlbnRlcmVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVBhc3N3b3JkSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wYXNzd29yZF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtUGFzc3dvcmRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXIpIGlucHV0LmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHNldF9jdXJzb3JfZW5kLCBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVGV4dElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlBsYWNlaG9sZGVyIHRleHQgd2hlbiBpbnB1dCBpcyBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqTWF4aW11bSBsZW5ndGggb2YgdGhlIGlucHV0ICovXG4gIG1heF9sZW5ndGg/OiBudW1iZXI7XG4gIC8qKk1heGltdW0gYnl0ZXMgb2YgdGhlIGlucHV0ICovXG4gIG1heF9ieXRlcz86IG51bWJlcjtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgdGV4dCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1UZXh0SW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZmlsdGVyPzogUmVnRXhwO1xuICAjbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgI21heF9ieXRlcz86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy53YXJuX2lucHV0LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy53YXJuX2lucHV0LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldCgpIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSB8fCBcIlwiKSkubWFwX2VycigoKSA9PiB7XG4gICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IFwiXCIpO1xuICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy53YXJuX2lucHV0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IGZpbHRlcigpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNmaWx0ZXI7XG4gIH1cblxuICBzZXQgcGxhY2Vob2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLndhcm5faW5wdXQucGxhY2Vob2xkZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud2Fybl9pbnB1dC5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHNldCBtYXhfbGVuZ3RoKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2xlbmd0aCA9IHZhbDtcbiAgICB0aGlzLndhcm5faW5wdXQubWF4TGVuZ3RoID0gdmFsID8/IC0xO1xuICB9XG4gIGdldCBtYXhfbGVuZ3RoKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9sZW5ndGg7XG4gIH1cblxuICBzZXQgbWF4X2J5dGVzKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2J5dGVzID0gdmFsO1xuICB9XG4gIGdldCBtYXhfYnl0ZXMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2J5dGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICB2YWwgPSB2YWwuc2xpY2UoMCwgdGhpcy4jbWF4X2xlbmd0aCk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcykgdmFsID0gc3RyaW5nX2J5dGVfbGltaXQodmFsLCB0aGlzLiNtYXhfYnl0ZXMpO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcyAmJiBzdHJpbmdfYnl0ZV9sZW5ndGgodmFsKSA+IHRoaXMuI21heF9ieXRlcylcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2J5dGVzfSBieXRlcyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZVN0cmluZ1JlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfbGVuZ3RoXCIsIHJlbGF0ZWQubWF4X2xlbmd0aCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9sZW5ndGhcIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfYnl0ZXNcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzLCAoKSA9PlxuICAgICAgICBub25lKCksXG4gICAgICApO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2J5dGVzXCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIHNpbmdsZSBsaW5lIHRleHQgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0X2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0SW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikgaW5wdXQuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzZXRfY3Vyc29yX2VuZCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBtYXRlcmlhbF9kcmFnX2hhbmRsZV9yb3VuZGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X211bHRpX2xpbmUuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRNdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRtdWx0aWxpbmVcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG4gICN2YWx1ZV9ib3g6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSxcbiAgKTtcbiAgI3Jlc2l6ZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNyZXNpemVyLmFwcGVuZENoaWxkKG1hdGVyaWFsX2RyYWdfaGFuZGxlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuI3ZhbHVlX2JveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICBjb25zdCBzdGFydF95ID0gZS5jbGllbnRZO1xuICAgICAgdGhpcy4jcmVzaXplci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgY29uc3QgZHkgPSBldi5jbGllbnRZIC0gc3RhcnRfeTtcbiAgICAgICAgdGhpcy4jdmFsdWVfYm94LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodCArIGR5fXB4YDtcbiAgICAgIH07XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gKF9ldikgPT4ge1xuICAgICAgICB0aGlzLiNyZXNpemVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMud2FybihcIlwiKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlLmRhdGEgfHwgZS5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfbGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUubGVuZ3RoICsgZGF0YS5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXMgJiZcbiAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aCh0aGlzLiN2YWx1ZV9ib3gudmFsdWUpICtcbiAgICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKGRhdGEpID5cbiAgICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgZS5jdHJsS2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy4jc2V0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoKSB7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZV9ib3gudmFsdWUgfHwgXCJcIikpLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBcIlwiKTtcbiAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG4gIGdldCBmaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmlsdGVyO1xuICB9XG5cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZV9ib3gucGxhY2Vob2xkZXI7XG4gIH1cblxuICBzZXQgbWF4X2xlbmd0aCh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9sZW5ndGggPSB2YWw7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm1heExlbmd0aCA9IHZhbCA/PyAtMTtcbiAgfVxuICBnZXQgbWF4X2xlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfbGVuZ3RoO1xuICB9XG5cbiAgc2V0IG1heF9ieXRlcyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9ieXRlcyA9IHZhbDtcbiAgfVxuICBnZXQgbWF4X2J5dGVzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9ieXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgdmFsID0gdmFsLnNsaWNlKDAsIHRoaXMuI21heF9sZW5ndGgpO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMpIHZhbCA9IHN0cmluZ19ieXRlX2xpbWl0KHZhbCwgdGhpcy4jbWF4X2J5dGVzKTtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMgJiYgc3RyaW5nX2J5dGVfbGVuZ3RoKHZhbCkgPiB0aGlzLiNtYXhfYnl0ZXMpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVTdHJpbmdSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2xlbmd0aFwiLCByZWxhdGVkLm1heF9sZW5ndGgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfbGVuZ3RoXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2J5dGVzXCIsIHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcywgKCkgPT5cbiAgICAgICAgbm9uZSgpLFxuICAgICAgKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9ieXRlc1wiKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHRNdWx0aWxpbmUpO1xuXG4vKipDcmVhdGVzIGEgbXVsdGkgbGluZSB0ZXh0IGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dF9tdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVRleHRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVRleHRNdWx0aWxpbmU8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRNdWx0aWxpbmU8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5wbGFjZWhvbGRlcikgaW5wdXQucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLm1heF9sZW5ndGgpIGlucHV0Lm1heF9sZW5ndGggPSBvcHRpb25zLm1heF9sZW5ndGg7XG4gICAgaWYgKG9wdGlvbnMubWF4X2J5dGVzKSBpbnB1dC5tYXhfYnl0ZXMgPSBvcHRpb25zLm1heF9ieXRlcztcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtVGV4dE9wdGlvbnMge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqVGV4dCBzaXplICovXG4gIHNpemU/OiBudW1iZXI7XG59XG5cbi8qKkNvbXBvbmVudCBmb3Igc2ltcGxlIHRleHQgKi9cbmNsYXNzIEZvcm1UZXh0IGV4dGVuZHMgRm9ybUVsZW1lbnQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRm9ybVRleHRPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAob3B0aW9ucy50ZXh0KSB0aGlzLnRleHQgPSBvcHRpb25zLnRleHQ7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0eWxlLmZvbnRTaXplID0gYCR7c2l6ZX1yZW1gO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0KG9wdGlvbnM6IEZvcm1UZXh0T3B0aW9ucyk6IEZvcm1UZXh0IHtcbiAgcmV0dXJuIG5ldyBGb3JtVGV4dChvcHRpb25zKTtcbn1cbiIsImltcG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5pbXBvcnQgeyBmb3JtX2J1dHRvbiB9IGZyb20gXCIuL2Jvb2xlYW4vYnV0dG9uL2J1dHRvblwiO1xuaW1wb3J0IHsgZm9ybV9sYW1wIH0gZnJvbSBcIi4vYm9vbGVhbi9sYW1wL2xhbXBcIjtcbmltcG9ydCB7IGZvcm1fc3dpdGNoIH0gZnJvbSBcIi4vYm9vbGVhbi9zd2l0Y2gvc3dpdGNoXCI7XG5pbXBvcnQgeyBmb3JtX2dyb3VwIH0gZnJvbSBcIi4vZ3JvdXAvZ3JvdXBcIjtcbmltcG9ydCB7IGZvcm1fbGlzdF9maWVsZCB9IGZyb20gXCIuL2xpc3QvbGlzdF9maWVsZFwiO1xuaW1wb3J0IHsgZm9ybV9udW1iZXJfaW5wdXQgfSBmcm9tIFwiLi9udW1iZXIvbnVtYmVySW5wdXQvbnVtYmVyX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3Byb2dyZXNzIH0gZnJvbSBcIi4vbnVtYmVyL3Byb2dyZXNzL3Byb2dyZXNzXCI7XG5pbXBvcnQgeyBmb3JtX3NsaWRlciB9IGZyb20gXCIuL251bWJlci9zbGlkZXIvc2xpZGVyXCI7XG5pbXBvcnQgeyBmb3JtX3N0ZXBwZXIgfSBmcm9tIFwiLi9udW1iZXIvc3RlcHBlci9zdGVwcGVyXCI7XG5pbXBvcnQgeyBmb3JtX2Ryb3Bkb3duIH0gZnJvbSBcIi4vc2VsZWN0b3JzL2Ryb3BfZG93bi9kcm9wX2Rvd25cIjtcbmltcG9ydCB7IGZvcm1fdG9nZ2xlX2J1dHRvbiB9IGZyb20gXCIuL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b25cIjtcbmltcG9ydCB7IGZvcm1fc3BhY2VyIH0gZnJvbSBcIi4vc3BhY2luZy9zcGFjZXJcIjtcbmltcG9ydCB7IGZvcm1fY29sb3JfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL2NvbG9yL2NvbG9yX2lucHV0XCI7XG5pbXBvcnQge1xuICBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbn0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX2lwX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9pcC9pcF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wYXNzd29yZF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvcGFzc3dvcmQvcGFzc3dvcmRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9pbnB1dCB9IGZyb20gXCIuL3RleHQvaW5wdXQvdGV4dF9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0X211bHRpbGluZSB9IGZyb20gXCIuL3RleHQvbXVsdGlMaW5lL3RleHRfbXVsdGlfbGluZVwiO1xuaW1wb3J0IHsgZm9ybV90ZXh0IH0gZnJvbSBcIi4vdGV4dC90ZXh0L3RleHRcIjtcblxuLyoqRm9ybSBlbGVtZW50cyB3aXRoIGxhYmVsICovXG5leHBvcnQgY29uc3QgZm9ybSA9IHtcbiAgRm9ybUNvbG9ycyxcblxuICAvL0Jvb2xlYW5cbiAgYnV0dG9uOiBmb3JtX2J1dHRvbixcbiAgc3dpdGNoOiBmb3JtX3N3aXRjaCxcbiAgbGFtcDogZm9ybV9sYW1wLFxuICAvL0dyb3VwXG4gIGdyb3VwOiBmb3JtX2dyb3VwLFxuXG4gIC8vU3BlY2lhbFxuICBjb2xvcl9pbnB1dDogZm9ybV9jb2xvcl9pbnB1dCxcbiAgZGF0ZV90aW1lX2lucHV0OiBmb3JtX2RhdGVfdGltZV9pbnB1dCxcbiAgRm9ybURhdGVUaW1lVHlwZSxcbiAgaXBfaW5wdXQ6IGZvcm1faXBfaW5wdXQsXG4gIHBhc3N3b3JkX2lucHV0OiBmb3JtX3Bhc3N3b3JkX2lucHV0LFxuXG4gIC8vTnVtYmVyXG4gIHByb2dyZXNzOiBmb3JtX3Byb2dyZXNzLFxuICBpbnB1dF9udW1iZXI6IGZvcm1fbnVtYmVyX2lucHV0LFxuICBzbGlkZXI6IGZvcm1fc2xpZGVyLFxuICBzdGVwcGVyOiBmb3JtX3N0ZXBwZXIsXG5cbiAgLy9TZWxlY3RvcnNcbiAgZHJvcGRvd246IGZvcm1fZHJvcGRvd24sXG4gIHRvZ2dsZV9idXR0b246IGZvcm1fdG9nZ2xlX2J1dHRvbixcblxuICAvL1NwYWNpbmdcbiAgc3BhY2VyOiBmb3JtX3NwYWNlcixcblxuICAvL1RleHRcbiAgdGV4dDogZm9ybV90ZXh0LFxuICBpbnB1dF90ZXh0OiBmb3JtX3RleHRfaW5wdXQsXG4gIG11bHRpbGluZV90ZXh0OiBmb3JtX3RleHRfbXVsdGlsaW5lLFxuXG4gIC8vTGlzdFxuICBsaXN0X2ZpZWxkOiBmb3JtX2xpc3RfZmllbGQsXG59O1xuZXhwb3J0IGRlZmF1bHQgZm9ybTtcblxuZXhwb3J0IHsgRm9ybUNvbG9ycyB9IGZyb20gXCIuL2Jhc2VcIjtcbmV4cG9ydCB7IEZvcm1EYXRlVGltZVR5cGUgfSBmcm9tIFwiLi9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXRcIjtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBVUEsTUFBTSxhQUFhLHlCQUNqQixRQUNBLG9CQUNBLHVDQUNEO0FBUWlCLFdBQVcsZUFDM0IsUUFDQSxhQUNBLCtDQUVPLENBQUMsY0FDUixVQUNBLG9CQUNBLHFEQUNBLGdCQUNBLGdCQUNBLFVBQ0EsS0FBQSxFQUNEO0FBVUQsTUFBTSxTQUFTLFdBQVcsZUFDeEIsVUFDQSxVQUNBLG1DQUNEO0FBUUQsTUFBTSxjQUFjLE9BQU8sZUFDekIsUUFDQSxlQUNBLHdDQUNEO0FBQ0QsWUFBWSxjQUNWLFNBQ0EsZUFDQSxpQ0FDQSxLQUFLLFFBQ0wsS0FBSyxRQUNMLFNBQ0EsS0FBQSxFQUNEO0FBQ0QsWUFBWSxjQUNWLFVBQ0EscUJBQ0Esc0NBQ0EsS0FBSyxRQUNMLEtBQUssUUFDTCxTQUNBLEtBQUEsRUFDRDtBQUNELFlBQVksY0FDVixZQUNBLHVCQUNBLHdDQUNBLEtBQUssUUFDTCxLQUFLLE9BQ0wsU0FDQSxLQUFBLEVBQ0Q7QUFDRCxZQUFZLGNBQ1YsY0FDQSx5QkFDQSwwQ0FDQSxLQUFLLFFBQ0wsS0FBSyxRQUNMLFNBQ0EsS0FBQSxFQUNEO0FBVUQsTUFBTSxvQkFBb0IsT0FBTyxlQUMvQixhQUNBLGdDQUNBLDZEQUNEO0FBQ0Qsa0JBQWtCLGNBQ2hCLFVB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
2606
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwibmFtZXMiOlsiI2Z1bmMiLCIjZXJyb3IiLCIjY2hhbmdlIiwiI2NoYW5nZWQiLCIjd2Fybl90aW1lb3V0IiwiI3NldF92YWx1ZSIsIiNvbl9jbGljayIsIiN0b2dnbGUiLCIjdGV4dCIsIiNpY29uIiwiI3RleHQiLCIjaWNvbiIsIiNjb2xvcnMiLCIjc3dpdGNoIiwiI3ByZXZlbnRfY2xpY2siLCIjaWNvbiIsIiNncm91cCIsIiNjb2xsYXBzZWQiLCIjY29sbGFwc2VfYnV0dG9uIiwiI2Nsb3NlX3RleHQiLCIjb3Blbl90ZXh0IiwiI2xlZ2VuZCIsIiN2YWx1ZV9ib3giLCIjc2VsZWN0ZWQiLCIjc2V0IiwiI3N0ZXBfdmFsdWUiLCIjZGVjaW1hbHMiLCIjbWluIiwiI21heCIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heF9sZWdlbmQiLCIjc3RlcCIsIiNzdGFydCIsIiNtaW4iLCIjc3BhbiIsIiNtYXgiLCIjZGVjaW1hbHMiLCIjdW5pdCIsIiNiYXIiLCIjdmFsIiwiI3N0ZXBwZXJfZnVuYyIsIiNsZWdlbmQiLCIjc2xpZGUiLCIjc2xpZGVyIiwiI21pbiIsIiNtYXgiLCIjbGl2ZSIsIiNtb3ZlX3ZhbHVlIiwiI3hfdG9fcGVyYyIsIiNtb3ZlX3NsaWRlIiwiI3N0ZXAiLCIjbW92ZV9hYnNvbHV0ZSIsIiNzdGVwX3ZhbHVlIiwiI3VuaXQiLCIjdW5pdF9ib3giLCIjdXBkYXRlX21pbl9sZWdlbmQiLCIjdXBkYXRlX21heF9sZWdlbmQiLCIjdXBkYXRlX21pbl9tYXgiLCIjbGVmdF9sZWdlbmQiLCIjZGVjaW1hbHMiLCIjcmlnaHRfbGVnZW5kIiwiI3NwYW4iLCIjc3RhcnQiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjdmFsdWVfYm94IiwiI3BlcmNfdG9fdmFsdWUiLCIjc3RlcHBlcl9mdW5jIiwiI3RleHQiLCIjbGVnZW5kIiwiI3ZhbHVlX2JveCIsIiNtb3ZlX2RpZmYiLCIjc3RlcCIsIiNzdGVwX3ZhbHVlIiwiI2RlY2ltYWxzIiwiI21pbiIsIiN1bml0IiwiI3VuaXRfYm94IiwiI3VwZGF0ZV9taW5fbGVnZW5kIiwiI3VwZGF0ZV9tYXhfbGVuZ2VuZCIsIiNtaW5fbGVnZW5kIiwiI21heCIsIiNtYXhfbGVnZW5kIiwiI3N0YXJ0IiwiI2xpdmUiLCIjaWNvbl9kZWMiLCIjaWNvbl9pbmMiLCIjbW92ZV92YWx1ZSIsIiN0ZXh0IiwiI2RlZmF1bHQiLCIjc2VsZWN0X2FkamFjZW50IiwiI2RlZmF1bHRfaWNvbiIsIiNzZWxlY3RlZCIsIiNzZXRfaWNvbiIsIiNtYXAiLCIjdmFsdWVzIiwiI29wZW4iLCIjaWNvbiIsIiNjbGVhciIsIiNjb250YWluZXIiLCIjc2Nyb2xsIiwiI3RhYmxlIiwiI2Nsb3NlciIsIiNmb2N1c19vdXRfaGFuZGxlciIsIiNkcm9wZG93biIsIiNzZXRfdmFsdWUiLCIjd2luZG93X3Jlc2l6ZV9oYW5kbGVyIiwiI2lzX29wZW4iLCIjbWFwIiwiI3ZhbHVlcyIsIiNzZWxlY3RlZCIsIiNhZGRfc2VsZWN0aW9uIiwiI3NlbGVjdF9hZGphY2VudCIsIiNsaXZlIiwiI21vZGUiLCIjdHlwZSIsIiN0eXBlIiwiI3BhcnRzIiwiI2ZpbHRlciIsIiNzZXQiLCIjZmlsdGVyIiwiI21heF9sZW5ndGgiLCIjbWF4X2J5dGVzIiwiI3Jlc2l6ZXIiLCIjdmFsdWVfYm94IiwiI3NldCIsIiNmaWx0ZXIiLCIjbWF4X2xlbmd0aCIsIiNtYXhfYnl0ZXMiXSwic291cmNlcyI6WyIuLi9zcmMvc2hhcmVkLnRzIiwiLi4vc3JjL2Jhc2UudHMiLCIuLi9zcmMvYm9vbGVhbi9idXR0b24vYnV0dG9uLnRzIiwiLi4vc3JjL2Jvb2xlYW4vbGFtcC9sYW1wLnRzIiwiLi4vc3JjL2Jvb2xlYW4vc3dpdGNoL3N3aXRjaC50cyIsIi4uL3NyYy9ncm91cC9ncm91cF9iYXNlLnRzIiwiLi4vc3JjL2dyb3VwL2dyb3VwLnRzIiwiLi4vc3JjL2dyb3VwL2dyb3VwX2NvbGxhcHNlci50cyIsIi4uL3NyYy9saXN0L2xpc3RfZmllbGQudHMiLCIuLi9zcmMvbnVtYmVyL251bWJlcl9iYXNlLnRzIiwiLi4vc3JjL251bWJlci9udW1iZXJfaW5wdXQvbnVtYmVyX2lucHV0LnRzIiwiLi4vc3JjL251bWJlci9wcm9ncmVzcy9wcm9ncmVzcy50cyIsIi4uL3NyYy9udW1iZXIvc2xpZGVyL3NsaWRlci50cyIsIi4uL3NyYy9udW1iZXIvc3RlcHBlci9zdGVwcGVyLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9zZWxlY3Rvcl9iYXNlLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duLnRzIiwiLi4vc3JjL3NlbGVjdG9ycy90b2dnbGVfYnV0dG9uL3RvZ2dsZV9idXR0b24udHMiLCIuLi9zcmMvc3BhY2luZy9zcGFjZXIudHMiLCIuLi9zcmMvc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL2RhdGVfdGltZS9kYXRlX3RpbWVfaW5wdXQudHMiLCIuLi9zcmMvc3BlY2lhbC9pcC9pcF9pbnB1dC50cyIsIi4uL3NyYy9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0LnRzIiwiLi4vc3JjL3RleHQvaW5wdXQvdGV4dF9pbnB1dC50cyIsIi4uL3NyYy90ZXh0L211bHRpX2xpbmUvdGV4dF9tdWx0aV9saW5lLnRzIiwiLi4vc3JjL3RleHQvdGV4dC90ZXh0LnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEJMVUUsXG4gIEdSRUVOLFxuICBHUkVZLFxuICBPUkFOR0UsXG4gIFJFRCxcbiAgWUVMTE9XLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb2xvcnNcIjtcbmltcG9ydCB7IHRoZW1lX2luaXRfdmFyaWFibGVfcm9vdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXRoZW1lXCI7XG5cbmNvbnN0IHRoZW1lX3Jvb3QgPSB0aGVtZV9pbml0X3ZhcmlhYmxlX3Jvb3QoXG4gIFwiZm9ybVwiLFxuICBcIlVJIEZvcm0gRWxlbWVudHNcIixcbiAgXCJUaGVtZSB2YXJpYWJsZXMgZm9yIFVJIGZvcm0gRWxlbWVudHNcIixcbik7XG5cbi8vICAgICAgX19fX18gIF9fX19fXyAgICAgICAgICBfX19fXyAgICAgX19fXyAgXyAgIF8gXyAgX18gICAgIF9fXG4vLyAgICAgfCAgX18gXFx8ICBfX19ffCAgIC9cXCAgIHwgIF9fIFxcICAgLyBfXyBcXHwgXFwgfCB8IHwgXFwgXFwgICAvIC9cbi8vICAgICB8IHxfXykgfCB8X18gICAgIC8gIFxcICB8IHwgIHwgfCB8IHwgIHwgfCAgXFx8IHwgfCAgXFwgXFxfLyAvXG4vLyAgICAgfCAgXyAgL3wgIF9ffCAgIC8gL1xcIFxcIHwgfCAgfCB8IHwgfCAgfCB8IC4gYCB8IHwgICBcXCAgIC9cbi8vICAgICB8IHwgXFwgXFx8IHxfX19fIC8gX19fXyBcXHwgfF9ffCB8IHwgfF9ffCB8IHxcXCAgfCB8X19fX3wgfFxuLy8gICAgIHxffCAgXFxfXFxfX19fX18vXy8gICAgXFxfXFxfX19fXy8gICBcXF9fX18vfF98IFxcX3xfX19fX198X3xcbmNvbnN0IHJlYWRfb25seSA9IHRoZW1lX3Jvb3QubWFrZV9zdWJfZ3JvdXAoXG4gIFwicmVhZFwiLFxuICBcIlJlYWQgT25seVwiLFxuICBcIlNldHRpbmdzIGZvciBmb3JtIGVsZW1lbnRzIGluIHJlYWQgb25seSBtb2RlXCIsXG4pO1xucmVhZF9vbmx5Lm1ha2VfdmFyaWFibGUoXG4gIFwiZmlsdGVyXCIsXG4gIFwiUmVhZCBPbmx5IEZpbHRlclwiLFxuICBcIkZpbHRlciBhcHBsaWVkIHRvIGZvcm0gZWxlbWVudHMgaW4gcmVhZCBvbmx5IG1vZGVcIixcbiAgXCJvcGFjaXR5KDAuNilcIixcbiAgXCJvcGFjaXR5KDAuNilcIixcbiAgXCJGaWx0ZXJcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vICAgICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgIF8gIC8gXFxfX18gXFxcbi8vICAgICB8IHxfX198IHxfX3wgfCB8X19ffCB8X198IHwgfCBcXCBcXCBfX19fKSB8XG4vLyAgICAgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnMgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcImNvbG9yc1wiLFxuICBcIkNvbG9yc1wiLFxuICBcIkNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuXG4vLyAgICAgIF9fX19fX18gX19fX19fX18gICBfX19fX19fX18gICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8X18gICBfX3wgIF9fX19cXCBcXCAvIC9fXyAgIF9ffCAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgICAgIHwgfCAgfCB8X18gICBcXCBWIC8gICB8IHwgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgICAgfCB8ICB8ICBfX3wgICA+IDwgICAgfCB8ICAgIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgICAgIHwgfCAgfCB8X19fXyAvIC4gXFwgICB8IHwgICAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgICAgIHxffCAgfF9fX19fXy9fLyBcXF9cXCAgfF98ICAgICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX3RleHQgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwidGV4dFwiLFxuICBcIlRleHQgQ29sb3JzXCIsXG4gIFwiVGV4dCBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwibGFiZWxcIixcbiAgXCJMYWJlbCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvcm0gZWxlbWVudHMgbGFiZWxzXCIsXG4gIEdSRVlbXCI3MDBcIl0sXG4gIEdSRVlbXCIzMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIFRleHQgQ29sb3JcIixcbiAgXCJOb3JtYWwgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI4MDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0Lm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiU2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI5MDBcIl0sXG4gIEdSRVlbXCI1MFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX3RleHQubWFrZV92YXJpYWJsZShcbiAgXCJ1bnNlbGVjdGVkXCIsXG4gIFwiVW5zZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiVW5zZWxlY3RlZCB0ZXh0IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFWVtcIjYwMFwiXSxcbiAgR1JFWVtcIjQwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fX18gX19fX19fX18gICBfX19fX19fX18gICBfX19fICBfICAgICAgICAgICAgICAgX19fX18gXyAgX19cbi8vICAgICB8X18gICBfX3wgIF9fX19cXCBcXCAvIC9fXyAgIF9ffCB8ICBfIFxcfCB8ICAgICAgICAvXFwgICAvIF9fX198IHwvIC9cbi8vICAgICAgICB8IHwgIHwgfF9fICAgXFwgViAvICAgfCB8ICAgIHwgfF8pIHwgfCAgICAgICAvICBcXCB8IHwgICAgfCAnIC9cbi8vICAgICAgICB8IHwgIHwgIF9ffCAgID4gPCAgICB8IHwgICAgfCAgXyA8fCB8ICAgICAgLyAvXFwgXFx8IHwgICAgfCAgPFxuLy8gICAgICAgIHwgfCAgfCB8X19fXyAvIC4gXFwgICB8IHwgICAgfCB8XykgfCB8X19fXyAvIF9fX18gXFwgfF9fX198IC4gXFxcbi8vICAgICAgICB8X3wgIHxfX19fX18vXy8gXFxfXFwgIHxffCAgICB8X19fXy98X19fX19fL18vICAgIFxcX1xcX19fX198X3xcXF9cXFxuLy9cbi8vXG5jb25zdCBjb2xvcnNfdGV4dF9ibGFjayA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJ0ZXh0QmxhY2tcIixcbiAgXCJUZXh0IENvbG9ycyBCbGFjayBCYWNrZ3JvdW5kXCIsXG4gIFwiVGV4dCBjb2xvcnMgdXNlZCBmb3IgYmxhY2sgYmFja2dyb3VuZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc190ZXh0X2JsYWNrLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIFRleHQgQ29sb3JcIixcbiAgXCJOb3JtYWwgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCIyMDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc190ZXh0X2JsYWNrLm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBUZXh0IENvbG9yXCIsXG4gIFwiU2VsZWN0ZWQgdGV4dCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI1MFwiXSxcbiAgR1JFWVtcIjUwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfdGV4dF9ibGFjay5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIFRleHQgQ29sb3JcIixcbiAgXCJVbnNlbGVjdGVkIHRleHQgY29sb3IgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNjAwXCJdLFxuICBHUkVZW1wiNDAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fX18gX19fX18gX19fXyAgXyAgIF8gICAgX19fX18gX19fXyAgXyAgICAgIF9fX18gIF9fX19fICAgX19fX19cbi8vICAgICB8XyAgIF8vIF9fX18vIF9fIFxcfCBcXCB8IHwgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICAgIHwgfHwgfCAgIHwgfCAgfCB8ICBcXHwgfCB8IHwgICB8IHwgIHwgfCB8ICAgfCB8ICB8IHwgfF9fKSB8IChfX19cbi8vICAgICAgIHwgfHwgfCAgIHwgfCAgfCB8IC4gYCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgICBffCB8fCB8X19ffCB8X198IHwgfFxcICB8IHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fX19cXF9fX19fXFxfX19fL3xffCBcXF98ICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2ljb24gPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiaWNvblwiLFxuICBcIkljb24gQ29sb3JzXCIsXG4gIFwiSWNvbiBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwibm9ybWFsXCIsXG4gIFwiTm9ybWFsIEljb24gQ29sb3JcIixcbiAgXCJDb2xvciBvZiBpY29ucyBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEdSRVlbXCI4MDBcIl0sXG4gIEdSRVlbXCIyMDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwic2VsZWN0ZWRcIixcbiAgXCJTZWxlY3RlZCBJY29uIENvbG9yXCIsXG4gIFwiQ29sb3Igb2Ygc2VsZWN0ZWQgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiOTAwXCJdLFxuICBHUkVZW1wiNTBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19pY29uLm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgSWNvbiBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgaWNvbnMgaW4gZm9ybSBlbGVtZW50c1wiLFxuICBHUkVZW1wiNjAwXCJdLFxuICBHUkVZW1wiNDAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5cbi8vICAgICAgX19fXyAgICAgICAgICBfX19fXyBfICBfX19fX19fIF9fX19fICAgX19fXyAgXyAgICBfIF8gICBfIF9fX19fICAgICBfX19fXyBfX19fICBfICAgICAgX19fXyAgX19fX18gICBfX19fX1xuLy8gICAgIHwgIF8gXFwgICAvXFwgICAvIF9fX198IHwvIC8gX19fX3wgIF9fIFxcIC8gX18gXFx8IHwgIHwgfCBcXCB8IHwgIF9fIFxcICAgLyBfX19fLyBfXyBcXHwgfCAgICAvIF9fIFxcfCAgX18gXFwgLyBfX19ffFxuLy8gICAgIHwgfF8pIHwgLyAgXFwgfCB8ICAgIHwgJyAvIHwgIF9ffCB8X18pIHwgfCAgfCB8IHwgIHwgfCAgXFx8IHwgfCAgfCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCB8X18pIHwgKF9fX1xuLy8gICAgIHwgIF8gPCAvIC9cXCBcXHwgfCAgICB8ICA8fCB8IHxfIHwgIF8gIC98IHwgIHwgfCB8ICB8IHwgLiBgIHwgfCAgfCB8IHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIC8gX19fXyBcXCB8X19fX3wgLiBcXCB8X198IHwgfCBcXCBcXHwgfF9ffCB8IHxfX3wgfCB8XFwgIHwgfF9ffCB8IHwgfF9fX3wgfF9ffCB8IHxfX198IHxfX3wgfCB8IFxcIFxcIF9fX18pIHxcbi8vICAgICB8X19fXy9fLyAgICBcXF9cXF9fX19ffF98XFxfXFxfX19fX3xffCAgXFxfXFxcXF9fX18vIFxcX19fXy98X3wgXFxffF9fX19fLyAgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnNfYmFja2dyb3VuZCA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJiYWNrZ3JvdW5kXCIsXG4gIFwiQmFja2dyb3VuZCBDb2xvcnNcIixcbiAgXCJCYWNrZ3JvdW5kIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2JhY2tncm91bmQubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJOb3JtYWwgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIG5vcm1hbCBmb3JtIGVsZW1lbnQgYmFja2dyb3VuZHNcIixcbiAgR1JFWVtcIjUwXCJdLFxuICBHUkVZW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFja2dyb3VuZC5tYWtlX3ZhcmlhYmxlKFxuICBcImhvdmVyXCIsXG4gIFwiSG92ZXIgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvcm0gZWxlbWVudCBiYWNrZ3JvdW5kcyB3aGVuIGhvdmVyaW5nXCIsXG4gIEdSRVlbXCI0MDBcIl0sXG4gIEdSRVlbXCI3MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19iYWNrZ3JvdW5kLm1ha2VfdmFyaWFibGUoXG4gIFwidW5zZWxlY3RlZFwiLFxuICBcIlVuc2VsZWN0ZWQgQmFja2dyb3VuZCBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgZm9ybSBlbGVtZW50IGJhY2tncm91bmRzXCIsXG4gIEdSRVlbXCIzMDBcIl0sXG4gIEdSRVlbXCI4MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8gICAgICBfX19fICAgX19fXyAgX19fX18gIF9fX19fICBfX19fX18gX19fX18gICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfCAgXyBcXCAvIF9fIFxcfCAgX18gXFx8ICBfXyBcXHwgIF9fX198ICBfXyBcXCAgIC8gX19fXy8gX18gXFx8IHwgICAgLyBfXyBcXHwgIF9fIFxcIC8gX19fX3xcbi8vICAgICB8IHxfKSB8IHwgIHwgfCB8X18pIHwgfCAgfCB8IHxfXyAgfCB8X18pIHwgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCAgXyA8fCB8ICB8IHwgIF8gIC98IHwgIHwgfCAgX198IHwgIF8gIC8gIHwgfCAgIHwgfCAgfCB8IHwgICB8IHwgIHwgfCAgXyAgLyBcXF9fXyBcXFxuLy8gICAgIHwgfF8pIHwgfF9ffCB8IHwgXFwgXFx8IHxfX3wgfCB8X19fX3wgfCBcXCBcXCAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgIHxfX19fLyBcXF9fX18vfF98ICBcXF9cXF9fX19fL3xfX19fX198X3wgIFxcX1xcICBcXF9fX19fXFxfX19fL3xfX19fX19cXF9fX18vfF98ICBcXF9cXF9fX19fL1xuY29uc3QgY29sb3JzX2JvcmRlciA9IGNvbG9ycy5tYWtlX3N1Yl9ncm91cChcbiAgXCJib3JkZXJcIixcbiAgXCJCb3JkZXIgQ29sb3JzXCIsXG4gIFwiQm9yZGVyIGNvbG9ycyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuY29sb3JzX2JvcmRlci5tYWtlX3ZhcmlhYmxlKFxuICBcIm5vcm1hbFwiLFxuICBcIk5vcm1hbCBCb3JkZXIgQ29sb3JcIixcbiAgXCJDb2xvciBvZiBub3JtYWwgZm9ybSBlbGVtZW50IGJvcmRlcnNcIixcbiAgR1JFWVtcIjcwMFwiXSxcbiAgR1JFWVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuY29sb3JzX2JvcmRlci5tYWtlX3ZhcmlhYmxlKFxuICBcInVuc2VsZWN0ZWRcIixcbiAgXCJVbnNlbGVjdGVkIEJvcmRlciBDb2xvclwiLFxuICBcIkNvbG9yIG9mIHVuc2VsZWN0ZWQgZm9ybSBlbGVtZW50IGJvcmRlcnNcIixcbiAgR1JFWVtcIjcwMFwiXSxcbiAgR1JFWVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX19fXyBfX19fICAgX19fX18gXyAgICBfICBfX19fX1xuLy8gICAgIHwgIF9fX18vIF9fIFxcIC8gX19fX3wgfCAgfCB8LyBfX19ffFxuLy8gICAgIHwgfF9fIHwgfCAgfCB8IHwgICAgfCB8ICB8IHwgKF9fX1xuLy8gICAgIHwgIF9ffHwgfCAgfCB8IHwgICAgfCB8ICB8IHxcXF9fXyBcXFxuLy8gICAgIHwgfCAgIHwgfF9ffCB8IHxfX19ffCB8X198IHxfX19fKSB8XG4vLyAgICAgfF98ICAgIFxcX19fXy8gXFxfX19fX3xcXF9fX18vfF9fX19fL1xuY29uc3QgY29sb3JzX2ZvY3VzID0gY29sb3JzLm1ha2Vfc3ViX2dyb3VwKFxuICBcImZvY3VzXCIsXG4gIFwiRm9jdXMgQ29sb3JzXCIsXG4gIFwiRm9jdXMgY29sb3JzIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbik7XG5jb2xvcnNfZm9jdXMubWFrZV92YXJpYWJsZShcbiAgXCJub3JtYWxcIixcbiAgXCJGb2N1cyBDb2xvclwiLFxuICBcIkNvbG9yIG9mIGZvY3Vzc2VkIGZvcm0gZWxlbWVudFwiLFxuICBPUkFOR0VbXCI2MDBcIl0sXG4gIE9SQU5HRVtcIjMwMFwiXSxcbiAgXCJDb2xvclwiLFxuICB1bmRlZmluZWQsXG4pO1xuXG4vLyAgICAgIF9fX18gICAgICAgICAgIF9fX19fIF9fX19fIF9fX19fICAgIF9fX19fIF9fX18gIF8gICAgICBfX19fICBfX19fXyAgIF9fX19fXG4vLyAgICAgfCAgXyBcXCAgIC9cXCAgICAvIF9fX198XyAgIF8vIF9fX198ICAvIF9fX18vIF9fIFxcfCB8ICAgIC8gX18gXFx8ICBfXyBcXCAvIF9fX198XG4vLyAgICAgfCB8XykgfCAvICBcXCAgfCAoX19fICAgfCB8fCB8ICAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8IHxfXykgfCAoX19fXG4vLyAgICAgfCAgXyA8IC8gL1xcIFxcICBcXF9fXyBcXCAgfCB8fCB8ICAgICAgfCB8ICAgfCB8ICB8IHwgfCAgIHwgfCAgfCB8ICBfICAvIFxcX19fIFxcXG4vLyAgICAgfCB8XykgLyBfX19fIFxcIF9fX18pIHxffCB8fCB8X19fXyAgfCB8X19ffCB8X198IHwgfF9fX3wgfF9ffCB8IHwgXFwgXFwgX19fXykgfFxuLy8gICAgIHxfX19fL18vICAgIFxcX1xcX19fX18vfF9fX19fXFxfX19fX3wgIFxcX19fX19cXF9fX18vfF9fX19fX1xcX19fXy98X3wgIFxcX1xcX19fX18vXG5jb25zdCBjb2xvcnNfYmFzaWMgPSBjb2xvcnMubWFrZV9zdWJfZ3JvdXAoXG4gIFwiYmFzaWNcIixcbiAgXCJCYXNpYyBDb2xvcnNcIixcbiAgXCJCYXNpYyBjb2xvcnMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcbmNvbG9yc19iYXNpYy5tYWtlX3ZhcmlhYmxlKFxuICBcImdyZWVuXCIsXG4gIFwiQmFzaWMgR3JlZW4gQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIGdyZWVuIGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgR1JFRU5bXCIzMDBcIl0sXG4gIEdSRUVOW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJyZWRcIixcbiAgXCJCYXNpYyBSZWQgQ29sb3JcIixcbiAgXCJDb21tb25seSB1c2VkIHJlZCBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIFJFRFtcIjMwMFwiXSxcbiAgUkVEW1wiOTAwXCJdLFxuICBcIkNvbG9yXCIsXG4gIHVuZGVmaW5lZCxcbik7XG5jb2xvcnNfYmFzaWMubWFrZV92YXJpYWJsZShcbiAgXCJibHVlXCIsXG4gIFwiQmFzaWMgQmx1ZSBDb2xvclwiLFxuICBcIkNvbW1vbmx5IHVzZWQgYmx1ZSBjb2xvciBpbiBmb3JtIGVsZW1lbnRzXCIsXG4gIEJMVUVbXCIzMDBcIl0sXG4gIEJMVUVbXCI5MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcbmNvbG9yc19iYXNpYy5tYWtlX3ZhcmlhYmxlKFxuICBcInllbGxvd1wiLFxuICBcIkJhc2ljIFllbGxvdyBDb2xvclwiLFxuICBcIkNvbW1vbmx5IHVzZWQgeWVsbG93IGNvbG9yIGluIGZvcm0gZWxlbWVudHNcIixcbiAgWUVMTE9XW1wiMzAwXCJdLFxuICBPUkFOR0VbXCI5MDBcIl0sXG4gIFwiQ29sb3JcIixcbiAgdW5kZWZpbmVkLFxuKTtcblxuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIzNcbi8vICAgICAgIF9fX19fIF9fX19fIF9fX19fX19fX19fXyAgX19fX19cbi8vICAgICAgLyBfX19ffF8gICBffF9fXyAgLyAgX19fX3wvIF9fX198XG4vLyAgICAgfCAoX19fICAgfCB8ICAgIC8gL3wgfF9fICB8IChfX19cbi8vICAgICAgXFxfX18gXFwgIHwgfCAgIC8gLyB8ICBfX3wgIFxcX19fIFxcXG4vLyAgICAgIF9fX18pIHxffCB8XyAvIC9fX3wgfF9fX18gX19fXykgfFxuLy8gICAgIHxfX19fXy98X19fX18vX19fX198X19fX19ffF9fX19fL1xuY29uc3Qgc2l6ZXMgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcInNpemVcIixcbiAgXCJTaXplXCIsXG4gIFwiU2l6ZXMgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50c1wiLFxuKTtcblxuc2l6ZXMubWFrZV92YXJpYWJsZShcbiAgXCJoZWlnaHRcIixcbiAgXCJIZWlnaHRcIixcbiAgXCJEZWZhdWx0IGhlaWdodCB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMS4zcmVtXCIsXG4gIFwiMS4zcmVtXCIsXG4gIFwiTGVuZ3RoXCIsXG4gIHsgbWluOiAwLjEsIG1heDogMTAgfSxcbik7XG5cbnNpemVzLm1ha2VfdmFyaWFibGUoXG4gIFwidG91Y2hIZWlnaHRcIixcbiAgXCJUb3VjaCBIZWlnaHRcIixcbiAgXCJNaW5pbXVtIGhlaWdodCBmb3IgdG91Y2ggZGV2aWNlcyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4gIFwiMi4wcmVtXCIsXG4gIFwiMi4wcmVtXCIsXG4gIFwiTGVuZ3RoXCIsXG4gIHsgbWluOiAwLjEsIG1heDogMTAgfSxcbik7XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjM1xuLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMzXG4vLyAgICAgIF9fX19fXyBfX19fICBfICAgXyBfX19fX19fXG4vLyAgICAgfCAgX19fXy8gX18gXFx8IFxcIHwgfF9fICAgX198XG4vLyAgICAgfCB8X18gfCB8ICB8IHwgIFxcfCB8ICB8IHxcbi8vICAgICB8ICBfX3x8IHwgIHwgfCAuIGAgfCAgfCB8XG4vLyAgICAgfCB8ICAgfCB8X198IHwgfFxcICB8ICB8IHxcbi8vICAgICB8X3wgICAgXFxfX19fL3xffCBcXF98ICB8X3xcbmNvbnN0IGZvbnQgPSB0aGVtZV9yb290Lm1ha2Vfc3ViX2dyb3VwKFxuICBcImZvbnRcIixcbiAgXCJGb250XCIsXG4gIFwiRm9udCBzZXR0aW5ncyB1c2VkIGluIGFsbCBmb3JtIGVsZW1lbnRzXCIsXG4pO1xuXG5mb250Lm1ha2VfdmFyaWFibGUoXG4gIFwic2l6ZVwiLFxuICBcIkZvbnQgU2l6ZVwiLFxuICBcIkRlZmF1bHQgZm9udCBzaXplIHVzZWQgaW4gYWxsIGZvcm0gZWxlbWVudHNcIixcbiAgXCIwLjlyZW1cIixcbiAgXCIwLjlyZW1cIixcbiAgXCJMZW5ndGhcIixcbiAgeyBtaW46IDAuMSwgbWF4OiAxMCB9LFxuKTtcblxuZm9udC5tYWtlX3ZhcmlhYmxlKFxuICBcInRvdWNoX3NpemVcIixcbiAgXCJUb3VjaCBGb250IFNpemVcIixcbiAgXCJGb250IHNpemUgdXNlZCBpbiBhbGwgZm9ybSBlbGVtZW50cyBmb3IgdG91Y2ggZGV2aWNlc1wiLFxuICBcIjEuMXJlbVwiLFxuICBcIjEuMXJlbVwiLFxuICBcIkxlbmd0aFwiLFxuICB7IG1pbjogMC4xLCBtYXg6IDEwIH0sXG4pO1xuIiwiaW1wb3J0IHsgQmFzZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgZXJyLCBvaywgdHlwZSBPcHRpb24sIHR5cGUgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgdHlwZSB7IFN0YXRlLCBTdGF0ZVN1YiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgXCIuL3NoYXJlZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1PcHRpb25zIHt9XG5cbi8qKkNvbG9ycyBmb3IgZm9ybSBlbGVtZW50cyB0aGF0IGhhdmUgc2VsZWN0YWJsZSBjb2xvcnMqL1xuZXhwb3J0IGNvbnN0IEZvcm1Db2xvcnMgPSB7XG4gIE5vbmU6IFwibm9uZVwiLFxuICBCbGFjazogXCJibGFja1wiLFxuICBHcmVlbjogXCJncmVlblwiLFxuICBSZWQ6IFwicmVkXCIsXG4gIEJsdWU6IFwiYmx1ZVwiLFxuICBZZWxsb3c6IFwieWVsbG93XCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybUNvbG9ycyA9ICh0eXBlb2YgRm9ybUNvbG9ycylba2V5b2YgdHlwZW9mIEZvcm1Db2xvcnNdO1xuXG4vKipTaGFyZWQgY29tcG9uZW50IGNsYXNzIGZvciBvdGhlciBjb21wb25lbnRzIHRvIGluaGVyaXQgZnJvbSovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybUVsZW1lbnQgZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIHN0YXRpYyBhcHBseV9vcHRpb25zKF9lbGVtZW50OiBGb3JtRWxlbWVudCwgX29wdGlvbnM6IEZvcm1PcHRpb25zKSB7fVxufVxuXG4vLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4vLyAgICAgX18gICAgICBfXyAgICAgXyAgICAgXyAgICBfIF9fX19fXyAgIF9fX19fICBfX19fX18gICAgICAgICAgX19fX19cbi8vICAgICBcXCBcXCAgICAvIC9cXCAgIHwgfCAgIHwgfCAgfCB8ICBfX19ffCB8ICBfXyBcXHwgIF9fX198ICAgL1xcICAgfCAgX18gXFxcbi8vICAgICAgXFwgXFwgIC8gLyAgXFwgIHwgfCAgIHwgfCAgfCB8IHxfXyAgICB8IHxfXykgfCB8X18gICAgIC8gIFxcICB8IHwgIHwgfFxuLy8gICAgICAgXFwgXFwvIC8gL1xcIFxcIHwgfCAgIHwgfCAgfCB8ICBfX3wgICB8ICBfICAvfCAgX198ICAgLyAvXFwgXFwgfCB8ICB8IHxcbi8vICAgICAgICBcXCAgLyBfX19fIFxcfCB8X19ffCB8X198IHwgfF9fX18gIHwgfCBcXCBcXHwgfF9fX18gLyBfX19fIFxcfCB8X198IHxcbi8vICAgICAgICAgXFwvXy8gICAgXFxfXFxfX19fX19cXF9fX18vfF9fX19fX3wgfF98ICBcXF9cXF9fX19fXy9fLyAgICBcXF9cXF9fX19fL1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1WYWx1ZU9wdGlvbnM8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtT3B0aW9ucyB7XG4gIC8qKklEIGZvcm0gZm9ybSBlbGVtZW50ICovXG4gIGlkPzogSUQ7XG4gIC8qKlZhbHVlIGZvciBmb3JtIGVsZW1lbnQgKi9cbiAgdmFsdWU/OiBSVDtcbiAgdmFsdWVfYnlfc3RhdGU/OiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+O1xuICAvKipMb25nZXIgZGVzY3JpcHRpb24gd2hhdCBmb3JtIGVsZW1lbnQgZG9lcyAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqQ2hhbmdlIGxpc3RlbmVyIGZ1bmN0aW9uKi9cbiAgY2hhbmdlPzogKHZhbDogUlQpID0+IHZvaWQ7XG59XG5cbi8qKlNoYXJlZCBjbGFzcyBmb3IgYWxsIGNvbXBvbmVudHMgd2l0aCB2YWx1ZXMqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1WYWx1ZTxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJAYWJzdHJhY3RAXCI7XG4gIH1cblxuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1WYWx1ZTxSVCwgSUQ+LFxuICAgIG9wdGlvbnM6IEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMuZGVzY3JpcHRpb24pIGVsZW1lbnQuZGVzY3JpcHRpb24gPSBvcHRpb25zLmRlc2NyaXB0aW9uO1xuICAgIGlmIChvcHRpb25zLnZhbHVlX2J5X3N0YXRlKSBlbGVtZW50LnZhbHVlX2J5X3N0YXRlID0gb3B0aW9ucy52YWx1ZV9ieV9zdGF0ZTtcbiAgICBlbHNlIGlmIChvcHRpb25zLnZhbHVlICE9PSB1bmRlZmluZWQpIGVsZW1lbnQudmFsdWUgPSBvcHRpb25zLnZhbHVlO1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICByZWFkb25seSBmb3JtX2lkOiBJRDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmZvcm1faWQgPSBpZCBhcyBJRDtcbiAgfVxuXG4gIHByb3RlY3RlZCBfZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgbGFiZWwgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgZGVzY3JpcHRpb24odGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy5fZGVzY3JpcHRpb24gPSB0ZXh0O1xuICB9XG4gIGdldCBkZXNjcmlwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kZXNjcmlwdGlvbiB8fCBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIF9idWZmZXI/OiBSVDtcbiAgZ2V0IGJ1ZmZlcigpOiBSVCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2J1ZmZlcjtcbiAgfVxuXG4gIHByb3RlY3RlZCBfc3RhdGU/OiBTdGF0ZTxSVCwgT3B0aW9uPHt9PiwgUlQ+O1xuICAjZnVuYz86IFN0YXRlU3ViPFJlc3VsdDxSVCwgc3RyaW5nPj47XG4gIC8qKlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIHNldCB2YWx1ZV9ieV9zdGF0ZShzdGF0ZTogU3RhdGU8UlQsIE9wdGlvbjx7fT4sIFJUPiB8IHVuZGVmaW5lZCkge1xuICAgIGlmICh0aGlzLiNmdW5jKSB0aGlzLmRldGFjaF9zdGF0ZSh0aGlzLiNmdW5jKTtcbiAgICBpZiAoc3RhdGUpIHtcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlKHN0YXRlLCAodmFsKSA9PiB7XG4gICAgICAgIGlmICh2YWwub2spIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsLnZhbHVlO1xuICAgICAgICAgIGlmICh0aGlzLiNlcnJvcikgdGhpcy5lcnJvciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfSBlbHNlIHRoaXMuZXJyb3IgPSB2YWwuZXJyb3I7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlbGF0ZWQgPSBzdGF0ZS5yZWxhdGVkKCk7XG4gICAgICBpZiAocmVsYXRlZC5zb21lKSB0aGlzLnN0YXRlX3JlbGF0ZWQocmVsYXRlZC52YWx1ZSk7XG4gICAgfSBlbHNlIHRoaXMuc3RhdGVfcmVsYXRlZCh7fSk7XG4gICAgdGhpcy5fc3RhdGUgPSBzdGF0ZTtcbiAgfVxuXG4gIC8qKlRoaXMgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCovXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgdGhpcy5fYnVmZmVyID0gdmFsO1xuICAgIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVcbiAgICAgID8gZXJyKFwiU3RhdGUgYmFzZWQgY29tcG9uZW50XCIpXG4gICAgICA6IHR5cGVvZiB0aGlzLl9idWZmZXIgPT09IFwidW5kZWZpbmVkXCJcbiAgICAgICAgPyBlcnIoXCJObyB2YWx1ZSB5ZXRcIilcbiAgICAgICAgOiBvayh0aGlzLl9idWZmZXIpO1xuICB9XG5cbiAgI2Vycm9yID0gZmFsc2U7XG4gIHNldCBlcnJvcihlcnI6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIGlmIChlcnIpIHtcbiAgICAgIHRoaXMubmV3X2Vycm9yKGVycik7XG4gICAgICB0aGlzLiNlcnJvciA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNlcnJvcikge1xuICAgICAgdGhpcy5jbGVhcl9lcnJvcigpO1xuICAgICAgdGhpcy4jZXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipDbGVhcnMgdGhlIHZhbHVlIGFuZCBlcnJvciBvZiB0aGUgY29tcG9uZW50IGlmIG5vdCBzdGF0ZSBiYXNlZCovXG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkgcmV0dXJuO1xuICAgIHRoaXMuX2J1ZmZlciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgdGhpcy5jbGVhcl9lcnJvcigpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgc2V0IGJ5IHZhbHVlIHNldHRlciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZXdfdmFsdWUodmFsOiBSVCk6IHZvaWQ7XG5cbiAgLyoqQ2xlYXJzIGZvcm0gZWxlbWVudCBncmFwaGljYWxseSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBjbGVhcl92YWx1ZSgpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIGVycm9yIGlzIHNldCBieSBlcnJvciBvciBzdGF0ZSovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBuZXdfZXJyb3IodmFsOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKkNhbGxlZCB3aGVuIGVycm9yIGlzIGNsZWFyZWQgYnkgZXJyb3Igb3Igc3RhdGUqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgY2xlYXJfZXJyb3IoKTogdm9pZDtcblxuICAvKipDYWxsZWQgd2hlbiBzdGF0ZSBoYXMgcmVsYXRlZCBpbmZvcm1hdGlvbiAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiB7fSk6IHZvaWQ7XG59XG5cbi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbi8vICAgICBfXyAgICAgIF9fICAgICBfICAgICBfICAgIF8gX19fX19fICBfXyAgICAgICAgICBfX19fX19fICBfX19fXyBfX19fX19fIF9fX19fX1xuLy8gICAgIFxcIFxcICAgIC8gL1xcICAgfCB8ICAgfCB8ICB8IHwgIF9fX198IFxcIFxcICAgICAgICAvIC8gIF9fIFxcfF8gICBffF9fICAgX198ICBfX19ffFxuLy8gICAgICBcXCBcXCAgLyAvICBcXCAgfCB8ICAgfCB8ICB8IHwgfF9fICAgICBcXCBcXCAgL1xcICAvIC98IHxfXykgfCB8IHwgICAgfCB8ICB8IHxfX1xuLy8gICAgICAgXFwgXFwvIC8gL1xcIFxcIHwgfCAgIHwgfCAgfCB8ICBfX3wgICAgIFxcIFxcLyAgXFwvIC8gfCAgXyAgLyAgfCB8ICAgIHwgfCAgfCAgX198XG4vLyAgICAgICAgXFwgIC8gX19fXyBcXHwgfF9fX3wgfF9ffCB8IHxfX19fICAgICBcXCAgL1xcICAvICB8IHwgXFwgXFwgX3wgfF8gICB8IHwgIHwgfF9fX19cbi8vICAgICAgICAgXFwvXy8gICAgXFxfXFxfX19fX19cXF9fX18vfF9fX19fX3wgICAgIFxcLyAgXFwvICAgfF98ICBcXF9cXF9fX19ffCAgfF98ICB8X19fX19ffFxuLyoqU2hhcmVkIGNsYXNzIGZvciBhbGwgY29tcG9uZW50cyB3aXRoIHZhbHVlcyovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRm9ybVZhbHVlV3JpdGU8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWU8UlQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiQGFic3RyYWN0QFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHdhcm5faW5wdXQ6IEhUTUxJbnB1dEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICN3YXJuX3RpbWVvdXQ/OiBudW1iZXI7XG4gICNjaGFuZ2VkOiBib29sZWFuID0gZmFsc2U7XG4gICNjaGFuZ2U/OiAodmFsOiBSVCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5uYW1lID0gXCJ2YWxcIjtcbiAgfVxuXG4gIHNldCBjaGFuZ2UoZnVuYzogKHZhbDogUlQpID0+IHZvaWQpIHtcbiAgICB0aGlzLiNjaGFuZ2UgPSBmdW5jO1xuICB9XG4gIGdldCBjaGFuZ2UoKTogKCh2YWw6IFJUKSA9PiB2b2lkKSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI2NoYW5nZTtcbiAgfVxuXG4gIC8qKlJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaWYgaXQgaGFzIGNoYW5nZWQqL1xuICBnZXQgY2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy4jY2hhbmdlZDtcbiAgfVxuXG4gIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnNldEN1c3RvbVZhbGlkaXR5KG1lc3NhZ2UpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5yZXBvcnRWYWxpZGl0eSgpO1xuICAgIGlmICh0aGlzLiN3YXJuX3RpbWVvdXQpIGNsZWFyVGltZW91dCh0aGlzLiN3YXJuX3RpbWVvdXQpO1xuICAgIHRoaXMuI3dhcm5fdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy53YXJuX2lucHV0LnNldEN1c3RvbVZhbGlkaXR5KFwiXCIpO1xuICAgICAgdGhpcy53YXJuX2lucHV0LnJlcG9ydFZhbGlkaXR5KCk7XG4gICAgfSwgNTAwMCk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byBsaW1pdCB2YWx1ZSBlbnRlcmVkICovXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IFJUKTogUHJvbWlzZUxpa2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuX3N0YXRlKSB7XG4gICAgICBpZiAodGhpcy5fc3RhdGUud3JpdGFibGUpIHJldHVybiB0aGlzLl9zdGF0ZS5saW1pdCh2YWwpO1xuICAgICAgZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKGVycihcIk5vdCB3cml0YWJsZVwiKSk7XG4gICAgfSBlbHNlIHJldHVybiBzeW5jX3Jlc29sdmUob2sodmFsKSk7XG4gIH1cblxuICAvKipGdW5jdGlvbiB0byBjaGVjayB2YWx1ZSAqL1xuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBSVCk6IFByb21pc2VMaWtlPFJlc3VsdDxSVCwgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLl9zdGF0ZSkge1xuICAgICAgaWYgKHRoaXMuX3N0YXRlLndyaXRhYmxlKSByZXR1cm4gdGhpcy5fc3RhdGUuY2hlY2sodmFsKTtcbiAgICAgIGVsc2UgcmV0dXJuIHN5bmNfcmVzb2x2ZShlcnIoXCJOb3Qgd3JpdGFibGVcIikpO1xuICAgIH0gZWxzZSByZXR1cm4gc3luY19yZXNvbHZlKG9rKHZhbCkpO1xuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gdXBkYXRlIHZhbHVlKi9cbiAgcHJvdGVjdGVkIGFzeW5jIHNldF92YWx1ZV9saW1pdCh2YWw6IFJUKTogUHJvbWlzZTxSZXN1bHQ8UlQsIHN0cmluZz4+IHtcbiAgICBjb25zdCBsaW1pdGVkID0gYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpO1xuICAgIGlmIChsaW1pdGVkLmVycikge1xuICAgICAgdGhpcy53YXJuKGxpbWl0ZWQuZXJyb3IpO1xuICAgICAgcmV0dXJuIGxpbWl0ZWQ7XG4gICAgfVxuICAgIHRoaXMuI3NldF92YWx1ZShsaW1pdGVkLnZhbHVlKTtcbiAgICByZXR1cm4gbGltaXRlZDtcbiAgfVxuXG4gIC8qKkZ1bmN0aW9uIHRvIHVwZGF0ZSB2YWx1ZSovXG4gIHByb3RlY3RlZCBhc3luYyBzZXRfdmFsdWVfY2hlY2sodmFsOiBSVCk6IFByb21pc2U8UmVzdWx0PFJULCBzdHJpbmc+PiB7XG4gICAgY29uc3QgY2hlY2tlZCA9IGF3YWl0IHRoaXMuY2hlY2tfdmFsdWUodmFsKTtcbiAgICBpZiAoY2hlY2tlZC5lcnIpIHtcbiAgICAgIHRoaXMud2FybihjaGVja2VkLmVycm9yKTtcbiAgICAgIHJldHVybiBjaGVja2VkO1xuICAgIH1cbiAgICB0aGlzLiNzZXRfdmFsdWUoY2hlY2tlZC52YWx1ZSk7XG4gICAgcmV0dXJuIGNoZWNrZWQ7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbDogUlQpIHtcbiAgICBpZiAodGhpcy5fYnVmZmVyID09PSB2YWwpIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gICAgaWYgKHRoaXMuI2NoYW5nZSlcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuI2NoYW5nZSh2YWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKFwiRmFpbGVkIHdoaWxlIHVwZGF0aW5nIGNoYW5nZSBsaXN0ZW5lclwiLCBlKTtcbiAgICAgIH1cbiAgICBpZiAodGhpcy5fc3RhdGUpIHtcbiAgICAgIGNvbnN0IGJ1ZmYgPSB0aGlzLl9idWZmZXI7XG4gICAgICB0aGlzLl9zdGF0ZS53cml0ZSEodmFsKS50aGVuKChlcnIpID0+IHtcbiAgICAgICAgaWYgKGVyci5lcnIpIHtcbiAgICAgICAgICBpZiAoYnVmZiAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZShidWZmKTtcbiAgICAgICAgICB0aGlzLndhcm4oZXJyLmVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmV3X3ZhbHVlKHZhbCk7XG4gICAgICB0aGlzLl9idWZmZXIgPSB2YWw7XG4gICAgICB0aGlzLiNjaGFuZ2VkID0gdHJ1ZTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHtcbiAgRm9ybUNvbG9ycyxcbiAgRm9ybVZhbHVlLFxuICBGb3JtVmFsdWVXcml0ZSxcbiAgdHlwZSBGb3JtVmFsdWVPcHRpb25zLFxufSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL2J1dHRvbi5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtQnV0dG9uT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqSWNvbiBmb3IgYnV0dG9uICovXG4gIGljb24/OiBTVkdGdW5jO1xuICAvKipGdW5jdGlvbiB0byBjYWxsIG9uIGJ1dHRvbiBjbGljayAqL1xuICBvbl9jbGljaz86ICgpID0+IHZvaWQ7XG4gIC8qKlNldCB0cnVlIHRvIG1ha2UgYnV0dG9uIHRvZ2dsZSBvbiBjbGljayBpbnN0ZWFkIG9mIG5vcm1hbCAqL1xuICB0b2dnbGU/OiBib29sZWFuO1xuICAvKipDaGFuZ2VzIHRoZSBidXR0b25zIGNvbG9yICovXG4gIGNvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ2VudGVycyB0ZXh0IGFuZCBpY29uICovXG4gIGNlbnRlcj86IGJvb2xlYW47XG59XG5cbmNsYXNzIEZvcm1CdXR0b248SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIGJvb2xlYW4sXG4gIElEXG4+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJidXR0b25cIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3RleHQ6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjb25fY2xpY2s/OiAoKSA9PiB2b2lkO1xuICAjdG9nZ2xlPzogYm9vbGVhbjtcbiAgI2ljb24/OiBTVkdTVkdFbGVtZW50O1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG5cbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5zZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiLCBcIjBcIik7XG4gICAgdGhpcy5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI29uX2NsaWNrKSB0aGlzLiNvbl9jbGljaygpO1xuICAgIH07XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIgJiYgZS5idXR0b24gPT09IDApIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIGlmICghdGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgdGhpcy5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHRoaXMucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGV2LnBvaW50ZXJJZCk7XG4gICAgICAgICAgaWYgKHRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICBlbHNlIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKGZhbHNlKTtcbiAgICAgICAgICB0aGlzLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub250b3VjaHN0YXJ0ID0gKGUpID0+IHtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICB0aGlzLm9udG91Y2hlbmQgPSAoZXYpID0+IHtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmIChldi50YXJnZXRUb3VjaGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGlmICh0aGlzLiN0b2dnbGUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgZWxzZSB0aGlzLnNldF92YWx1ZV9jaGVjayhmYWxzZSk7XG4gICAgICAgICAgdGhpcy5vbnRvdWNoZW5kID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgY2FzZSBcIiBcIjpcbiAgICAgICAgY2FzZSBcIkVudGVyXCI6IHtcbiAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICBpZiAoIXRoaXMuI3RvZ2dsZSkgdGhpcy5zZXRfdmFsdWVfY2hlY2sodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5vbmtleXVwID0gKGUpID0+IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZS5rZXkpIHtcbiAgICAgICAgICAgICAgY2FzZSBcIkVudGVyXCI6XG4gICAgICAgICAgICAgIGNhc2UgXCIgXCI6IHtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy4jdG9nZ2xlKSB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgICAgIGVsc2UgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLiNvbl9jbGljaykgdGhpcy4jb25fY2xpY2soKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGN1cnJlbnQgdGV4dCBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0IHRleHQobGFiZWw6IHN0cmluZykge1xuICAgIHRoaXMuI3RleHQudGV4dENvbnRlbnQgPSBsYWJlbDtcbiAgfVxuICBnZXQgdGV4dCgpIHtcbiAgICByZXR1cm4gdGhpcy4jdGV4dC50ZXh0Q29udGVudDtcbiAgfVxuXG4gIC8qKkNoYW5nZXMgdGhlIGljb24gb2YgdGhlIGJ1dHRvbiovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqRnVuY3Rpb24gdG8gY2FsbCBvbiBidXR0b24gY2xpY2sqL1xuICBzZXQgb25fY2xpY2soZnVuYzogKCgpID0+IHZvaWQpIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jb25fY2xpY2sgPSBmdW5jO1xuICB9XG4gIGdldCBvbl9jbGljaygpIHtcbiAgICByZXR1cm4gdGhpcy4jb25fY2xpY2s7XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBjb2xvciBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0IGNvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMucmVtb3ZlQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShcImNvbG9yXCIsIGNvbG9yKTtcbiAgfVxuXG4gIC8qKkNlbnRlcnMgdGV4dCBhbmQgaWNvbiAqL1xuICBzZXQgY2VudGVyKGNlbnRlcjogYm9vbGVhbikge1xuICAgIGlmIChjZW50ZXIpIHRoaXMuY2xhc3NMaXN0LmFkZChcImNlbnRlclwiKTtcbiAgICBlbHNlIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImNlbnRlclwiKTtcbiAgfVxuXG4gIGdldCBjZW50ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3NMaXN0LmNvbnRhaW5zKFwiY2VudGVyXCIpO1xuICB9XG5cbiAgLyoqQ2FsbGVkIHdoZW4gdmFsdWUgaXMgY2hhbmdlZCAqL1xuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlKSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy5uZXdfdmFsdWUoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoXCJUT0RPXCIsIGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIC8qKkNoYW5nZXMgd2hldGhlciB0aGUgYnV0dG9uIGlzIG1haW50YWluZWQgb3IgbW9tZW50YXJ5Ki9cbiAgc2V0IHRvZ2dsZSh0b2dnbGU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiN0b2dnbGUgPSBCb29sZWFuKHRvZ2dsZSk7XG4gIH1cbiAgZ2V0IHRvZ2dsZSgpIHtcbiAgICByZXR1cm4gdGhpcy4jdG9nZ2xlO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIGJ1dHRvbiBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2J1dHRvbjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtQnV0dG9uT3B0aW9uczxJRD4sXG4pOiBGb3JtQnV0dG9uPElEPiB7XG4gIGNvbnN0IGJ1dHQgPSBuZXcgRm9ybUJ1dHRvbjxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnRleHQpIGJ1dHQudGV4dCA9IG9wdGlvbnMudGV4dDtcbiAgICBpZiAob3B0aW9ucy5pY29uKSBidXR0Lmljb24gPSBvcHRpb25zLmljb247XG4gICAgaWYgKG9wdGlvbnMub25fY2xpY2spIGJ1dHQub25fY2xpY2sgPSBvcHRpb25zLm9uX2NsaWNrO1xuICAgIGlmIChvcHRpb25zLnRvZ2dsZSkgYnV0dC50b2dnbGUgPSBvcHRpb25zLnRvZ2dsZTtcbiAgICBpZiAob3B0aW9ucy5jb2xvcikgYnV0dC5jb2xvciA9IG9wdGlvbnMuY29sb3I7XG4gICAgaWYgKG9wdGlvbnMuY2VudGVyKSBidXR0LmNlbnRlciA9IG9wdGlvbnMuY2VudGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGJ1dHQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBidXR0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUsIHR5cGUgRm9ybUNvbG9ycywgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbGFtcC5zY3NzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybUxhbXBPcHRpb25zPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipTZXRzIHRoZSBsYW1wIGNvbG9ycyAqL1xuICBjb2xvcnM6IEM7XG4gIC8qKkxhbXAgdGV4dCAqL1xuICB0ZXh0Pzogc3RyaW5nO1xuICAvKipJY29uIGZvciBsYW1wICovXG4gIGljb24/OiBTVkdGdW5jO1xuICAvKipDZW50ZXJzIHRleHQgYW5kIGljb24gKi9cbiAgY2VudGVyPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEZvcm1MYW1wPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFQsIElEPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGFtcFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjdGV4dDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uOiBTVkdTVkdFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAjY29sb3JzOiBGb3JtQ29sb3JzW10gPSBbXTtcblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGxhbXAqL1xuICBzZXQgdGV4dChsYWJlbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdGV4dC50ZXh0Q29udGVudCA9IGxhYmVsO1xuICB9XG4gIGdldCB0ZXh0KCkge1xuICAgIHJldHVybiB0aGlzLiN0ZXh0LnRleHRDb250ZW50O1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgbGFtcCovXG4gIHNldCBpY29uKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoaWNvbikgdGhpcy4jaWNvbiA9IHRoaXMuaW5zZXJ0QmVmb3JlKGljb24oKSwgdGhpcy4jdGV4dCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIFNldHMgdGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIGxhbXAqL1xuICBzZXQgY29sb3JzKGNvbG9yczogQykge1xuICAgIHRoaXMuI2NvbG9ycyA9IGNvbG9ycztcbiAgICB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlciEpO1xuICB9XG5cbiAgLyoqQ2VudGVycyB0ZXh0IGFuZCBpY29uICovXG4gIHNldCBjZW50ZXIoY2VudGVyOiBib29sZWFuKSB7XG4gICAgaWYgKGNlbnRlcikgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY2VudGVyXCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwiY2VudGVyXCIpO1xuICB9XG5cbiAgZ2V0IGNlbnRlcigpIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzc0xpc3QuY29udGFpbnMoXCJjZW50ZXJcIik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlciB8IGJvb2xlYW4pIHtcbiAgICBjb25zdCBjb2xvciA9IHRoaXMuI2NvbG9yc1tOdW1iZXIodmFsdWUpXTtcbiAgICBpZiAoY29sb3IpIHRoaXMuc2V0QXR0cmlidXRlKFwiY29sb3JcIiwgY29sb3IpO1xuICAgIGVsc2UgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoXCJjb2xvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcImNvbG9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihlcnI6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtTGFtcCk7XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5mdW5jdGlvbiBmcm9tPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1MYW1wT3B0aW9uczxcbiAgICBudW1iZXIsXG4gICAgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIC4uLkZvcm1Db2xvcnNbXV0sXG4gICAgSURcbiAgPixcbik6IEZvcm1MYW1wPG51bWJlciwgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIEZvcm1Db2xvcnMsIC4uLkZvcm1Db2xvcnNbXV0sIElEPjtcbmZ1bmN0aW9uIGZyb208SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUxhbXBPcHRpb25zPGJvb2xlYW4sIFtGb3JtQ29sb3JzLCBGb3JtQ29sb3JzXSwgSUQ+LFxuKTogRm9ybUxhbXA8Ym9vbGVhbiwgW0Zvcm1Db2xvcnMsIEZvcm1Db2xvcnNdLCBJRD47XG5mdW5jdGlvbiBmcm9tPFxuICBUIGV4dGVuZHMgYm9vbGVhbiB8IG51bWJlcixcbiAgQyBleHRlbmRzIEZvcm1Db2xvcnNbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+KG9wdGlvbnM/OiBGb3JtTGFtcE9wdGlvbnM8VCwgQywgSUQ+KTogRm9ybUxhbXA8VCwgQywgSUQ+IHtcbiAgY29uc3QgbGFtcCA9IG5ldyBGb3JtTGFtcDxULCBDLCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGxhbXAuY29sb3JzID0gb3B0aW9ucy5jb2xvcnM7XG4gICAgaWYgKG9wdGlvbnMudGV4dCkgbGFtcC50ZXh0ID0gb3B0aW9ucy50ZXh0O1xuICAgIGlmIChvcHRpb25zLmljb24pIGxhbXAuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5jZW50ZXIpIGxhbXAuY2VudGVyID0gb3B0aW9ucy5jZW50ZXI7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMobGFtcCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGxhbXA7XG59XG5cbi8qKkNyZWF0ZXMgYSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgY29uc3QgZm9ybV9sYW1wID0gZnJvbTtcbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb24gfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybUNvbG9ycywgRm9ybVZhbHVlV3JpdGUsIHR5cGUgRm9ybVZhbHVlT3B0aW9ucyB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgXCIuL3N3aXRjaC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3dpdGNoT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxib29sZWFuLCBJRD4ge1xuICAvKipJY29uIHRvIHVzZSBmb3IgbGVmdCBzaWRlKi9cbiAgaWNvbj86IFNWR0Z1bmM7XG4gIC8qKkNvbG9yIHdoZW4gc3dpdGNoIGlzIG9uICovXG4gIG9uX2NvbG9yPzogRm9ybUNvbG9ycztcbiAgLyoqQ29sb3Igd2hlbiBzd2l0Y2ggaXMgb2ZmICovXG4gIG9mZl9jb2xvcj86IEZvcm1Db2xvcnM7XG59XG5cbmV4cG9ydCBjbGFzcyBGb3JtU3dpdGNoPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFxuICBib29sZWFuLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic3dpdGNoXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzd2l0Y2g6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI2ljb246IFNWR1NWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gICNwcmV2ZW50X2NsaWNrOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcblxuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNzd2l0Y2guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuI3N3aXRjaC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgc3dpdGNoIChlLmtleSkge1xuICAgICAgICBjYXNlIFwiRW50ZXJcIjpcbiAgICAgICAgY2FzZSBcIiBcIjoge1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub25rZXl1cCA9IChlKSA9PiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgICAgICBjYXNlIFwiIFwiOiB7XG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soIXRoaXMuYnVmZmVyKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5vbmtleXVwID0gbnVsbDtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgbGV0IGhhc19tb3ZlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGlmIChoYXNfbW92ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJveCA9IHRoaXMuI3N3aXRjaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgICAgIGNvbnN0IG1pZF9jb3JkID0gYm94LnggKyBib3gud2lkdGggLyAyO1xuICAgICAgICAgICAgaWYgKGV2LmNsaWVudFggPiBtaWRfY29yZCkge1xuICAgICAgICAgICAgICBpZiAoIXRoaXMuYnVmZmVyKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0cnVlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5zZXRfdmFsdWVfY2hlY2soZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDEwIHx8XG4gICAgICAgICAgICBNYXRoLmFicyhlLmNsaWVudFkgLSBldi5jbGllbnRZKSA+IDEwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBoYXNfbW92ZWQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgaWYgKCFoYXNfbW92ZWQpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCF0aGlzLmJ1ZmZlcik7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc3dpdGNoLm9ucG9pbnRlcnVwID0gbnVsbDtcbiAgICAgICAgICB0aGlzLiNzd2l0Y2gub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuI3N3aXRjaC5vbmNsaWNrID0gKGUpID0+IGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICB0aGlzLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLiNwcmV2ZW50X2NsaWNrKSByZXR1cm4gKHRoaXMuI3ByZXZlbnRfY2xpY2sgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayghdGhpcy5idWZmZXIpO1xuICAgICAgcmV0dXJuO1xuICAgIH07XG4gIH1cblxuICAvKipDaGFuZ2VzIHRoZSBpY29uIG9mIHRoZSBzd2l0Y2gqL1xuICBzZXQgaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHRoaXMuI2ljb24gPSB0aGlzLmluc2VydEJlZm9yZShpY29uKCksIHRoaXMuI3N3aXRjaCk7XG4gICAgZWxzZSBpZiAodGhpcy4jaWNvbikge1xuICAgICAgdGhpcy5yZW1vdmVDaGlsZCh0aGlzLiNpY29uKTtcbiAgICAgIHRoaXMuI2ljb24gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgc2V0IG9uX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJvbi1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJvbi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IG9mZl9jb2xvcihjb2xvcjogRm9ybUNvbG9ycykge1xuICAgIGlmIChjb2xvciA9PT0gRm9ybUNvbG9ycy5Ob25lKSB0aGlzLiNzd2l0Y2gucmVtb3ZlQXR0cmlidXRlKFwib2ZmLWNvbG9yXCIpO1xuICAgIGVsc2UgdGhpcy4jc3dpdGNoLnNldEF0dHJpYnV0ZShcIm9mZi1jb2xvclwiLCBjb2xvcik7XG4gIH1cbiAgc2V0IGVycm9yX2NvbG9yKGNvbG9yOiBGb3JtQ29sb3JzKSB7XG4gICAgaWYgKGNvbG9yID09PSBGb3JtQ29sb3JzLk5vbmUpIHRoaXMuI3N3aXRjaC5yZW1vdmVBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiKTtcbiAgICBlbHNlIHRoaXMuI3N3aXRjaC5zZXRBdHRyaWJ1dGUoXCJlcnJvci1jb2xvclwiLCBjb2xvcik7XG4gIH1cblxuICAvKipDYWxsZWQgd2hlbiB2YWx1ZSBpcyBjaGFuZ2VkICovXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUpIHRoaXMuI3N3aXRjaC5jbGFzc0xpc3QuYWRkKFwib25cIik7XG4gICAgZWxzZSB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcIm9uXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMubmV3X3ZhbHVlKGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX2Vycjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy4jc3dpdGNoLmNsYXNzTGlzdC5hZGQoXCJlcnJvclwiKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHtcbiAgICB0aGlzLiNzd2l0Y2guY2xhc3NMaXN0LnJlbW92ZShcImVycm9yXCIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtU3dpdGNoKTtcblxuLyoqQ3JlYXRlcyBhIHN3aXRjaCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3N3aXRjaDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU3dpdGNoT3B0aW9uczxJRD4sXG4pOiBGb3JtU3dpdGNoPElEPiB7XG4gIGNvbnN0IHN3aXQgPSBuZXcgRm9ybVN3aXRjaDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmljb24pIHN3aXQuaWNvbiA9IG9wdGlvbnMuaWNvbjtcbiAgICBpZiAob3B0aW9ucy5vbl9jb2xvcikgc3dpdC5vbl9jb2xvciA9IG9wdGlvbnMub25fY29sb3I7XG4gICAgaWYgKG9wdGlvbnMub2ZmX2NvbG9yKSBzd2l0Lm9mZl9jb2xvciA9IG9wdGlvbnMub2ZmX2NvbG9yO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoc3dpdCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHN3aXQ7XG59XG4iLCJpbXBvcnQgeyBBY2Nlc3NUeXBlcyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IGVyciwgb2ssIE9wdGlvbiwgUmVzdWx0IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWUgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9ncm91cF9iYXNlLnNjc3NcIjtcblxuLyoqRGlmZmVyZW50IGJvcmRlciBzdHlsZXMgZm9yIHRoZSBjb21wb25lbnQgZ3JvdXAqL1xuZXhwb3J0IGNvbnN0IEZvcm1Hcm91cEJvcmRlclN0eWxlID0ge1xuICBOb25lOiBcIm5vbmVcIixcbiAgSW5zZXQ6IFwiaW5zZXRcIixcbiAgT3V0c2V0OiBcIm91dHNldFwiLFxuICBMaW5lOiBcImxpbmVcIixcbn0gYXMgY29uc3Q7XG5leHBvcnQgdHlwZSBGb3JtR3JvdXBCb3JkZXJTdHlsZSA9XG4gICh0eXBlb2YgRm9ybUdyb3VwQm9yZGVyU3R5bGUpW2tleW9mIHR5cGVvZiBGb3JtR3JvdXBCb3JkZXJTdHlsZV07XG5cbmV4cG9ydCB0eXBlIEdyb3VwRXh0cmFjdFZhbHM8QXJyIGV4dGVuZHMgYW55W10+ID0gQXJyIGV4dGVuZHMgW1xuICBpbmZlciBIZWFkLFxuICAuLi5pbmZlciBUYWlsLFxuXVxuICA/IEhlYWQgZXh0ZW5kcyBGb3JtVmFsdWU8aW5mZXIgVCwgaW5mZXIgSUQ+XG4gICAgPyBbRm9ybVZhbHVlPFQsIElEPiwgLi4uR3JvdXBFeHRyYWN0VmFsczxUYWlsPl1cbiAgICA6IFsuLi5Hcm91cEV4dHJhY3RWYWxzPFRhaWw+XVxuICA6IFtdO1xuXG5leHBvcnQgdHlwZSBHcm91cFRvS2V5VmFsPEFyciBleHRlbmRzIEZvcm1WYWx1ZTxhbnksIGFueT5bXT4gPSB7XG4gIFtLIGluIEFycltudW1iZXJdIGFzIEtbXCJmb3JtX2lkXCJdXTogSyBleHRlbmRzIEZvcm1WYWx1ZTxpbmZlciBULCBhbnk+XG4gICAgPyBUXG4gICAgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBGb3JtR3JvdXBCYXNlPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcIkBhYnN0cmFjdEBcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIHZhbHVlX2VsZW1lbnRzOiBNYXA8c3RyaW5nLCBGb3JtVmFsdWU8YW55LCBhbnk+PiA9IG5ldyBNYXAoKTtcblxuICAvKipUaGlzIHBsYWNlcyB0aGUgZ3JvdXAgYXQgYW4gYWJzb2x1dGUgcG9zaXRpb24gaW4gb25lIG9mIHRoZSBjb3JuZXJzIG9mIHRoZSBjb250YWluZXIqL1xuICBzZXQgYm9yZGVyKGJvcmRlcjogRm9ybUdyb3VwQm9yZGVyU3R5bGUgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXG4gICAgICBGb3JtR3JvdXBCb3JkZXJTdHlsZS5JbnNldCxcbiAgICAgIEZvcm1Hcm91cEJvcmRlclN0eWxlLk91dHNldCxcbiAgICApO1xuICAgIGlmIChib3JkZXIgJiYgYm9yZGVyICE9PSBGb3JtR3JvdXBCb3JkZXJTdHlsZS5Ob25lKVxuICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKGJvcmRlcik7XG4gIH1cblxuICBzZXQgbWF4X2hlaWdodChoZWlnaHQ6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkoXCItLW1heF9oZWlnaHRcIiwgaGVpZ2h0ID8gaGVpZ2h0ICsgXCJyZW1cIiA6IFwibm9uZVwiKTtcbiAgICBpZiAoaGVpZ2h0KSB0aGlzLmNsYXNzTGlzdC5hZGQoXCJtYXhfaGVpZ2h0XCIpO1xuICAgIGVsc2UgdGhpcy5jbGFzc0xpc3QucmVtb3ZlKFwibWF4X2hlaWdodFwiKTtcbiAgfVxuXG4gIHNldCBlbWJlZChlbWJlZDogYm9vbGVhbikge1xuICAgIGlmIChlbWJlZCkgdGhpcy5jbGFzc0xpc3QuYWRkKFwiZW1iZWRcIik7XG4gICAgZWxzZSB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJlbWJlZFwiKTtcbiAgfVxuXG4gIHNldCB2YWx1ZSh2YWw6IFJUKSB7XG4gICAgc3VwZXIudmFsdWUgPSB2YWw7XG4gIH1cblxuICAvKipSZXR1cm5zIHZhbHVlIG9mIHRoZSBjb21wb25lbnQqL1xuICBnZXQgdmFsdWUoKTogUmVzdWx0PFJULCBzdHJpbmc+IHtcbiAgICBpZiAodGhpcy5fc3RhdGUpIHJldHVybiBlcnIoXCJTdGF0ZSBiYXNlZCBjb21wb25lbnRcIik7XG4gICAgY29uc3QgcmVzdWx0OiBSVCA9IHt9IGFzIFJUO1xuICAgIGZvciAoY29uc3QgW2tleSwgY29tcF0gb2YgdGhpcy52YWx1ZV9lbGVtZW50cykge1xuICAgICAgY29uc3QgdmFsID0gY29tcC52YWx1ZTtcbiAgICAgIGlmICh2YWwuZXJyKSByZXR1cm4gZXJyKFwiQ29tcG9uZW50IHdpdGggaWQgXCIgKyBrZXkgKyBcIiBoYXMgbm8gdmFsdWVcIik7XG4gICAgICByZXN1bHRba2V5IGFzIGtleW9mIFJUXSA9IHZhbC52YWx1ZSBhcyBSVFtrZXlvZiBSVF07XG4gICAgfVxuICAgIHJldHVybiBvayhyZXN1bHQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IFJUKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdmFsKVxuICAgICAgaWYgKHRoaXMudmFsdWVfZWxlbWVudHMuaGFzKGtleSkpXG4gICAgICAgIHRoaXMudmFsdWVfZWxlbWVudHMuZ2V0KGtleSkhLnZhbHVlID0gdmFsW2tleSBhcyBrZXlvZiBSVF07XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBjb21wIG9mIHRoaXMudmFsdWVfZWxlbWVudHMudmFsdWVzKCkpIGNvbXAuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBvbl9hY2Nlc3MoYWNjZXNzOiBBY2Nlc3NUeXBlcyk6IHZvaWQge1xuICAgIHN3aXRjaCAoYWNjZXNzKSB7XG4gICAgICBjYXNlIEFjY2Vzc1R5cGVzLlJlYWQ6IHtcbiAgICAgICAgdGhpcy50YWJJbmRleCA9IDA7XG4gICAgICAgIHRoaXMub25mb2N1cyA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmZvY3VzKCk7XG4gICAgICAgIH07XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBBY2Nlc3NUeXBlcy5Xcml0ZToge1xuICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShcInRhYkluZGV4XCIpO1xuICAgICAgICB0aGlzLm9uZm9jdXMgPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgdHlwZSBQcmV0dGlmeSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQsIEZvcm1WYWx1ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXAuc2Nzc1wiO1xuaW1wb3J0IHtcbiAgRm9ybUdyb3VwQmFzZSxcbiAgRm9ybUdyb3VwQm9yZGVyU3R5bGUsXG4gIEdyb3VwRXh0cmFjdFZhbHMsXG4gIEdyb3VwVG9LZXlWYWwsXG59IGZyb20gXCIuL2dyb3VwX2Jhc2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBPcHRpb25zPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxULCBJRD4ge1xuICAvKipFbGVtZW50cyB0byBhZGQgdG8gdGhlIGdyb3VwKi9cbiAgZWxlbWVudHM/OiBbLi4uTF07XG4gIC8qKkJvcmRlciBzdHlsZSBmb3IgZ3JvdXAqL1xuICBib3JkZXI/OiBGb3JtR3JvdXBCb3JkZXJTdHlsZTtcbiAgLyoqUmVtb3ZlcyBwYWRkaW5nIHdoZW4gdHJ1ZSBhbGxvd3MgZm9yIHB1dHRpbmcgZ3JvdXBzIGluIGdyb3VwcyB3aXRob3V0IHBhZGRpbmcgYnVpbGRpbmcgdXAgKi9cbiAgZW1iZWQ/OiBib29sZWFuO1xuICAvKipHcm91cCBtYXggaGVpZ2h0IGluIHJlbSwgdW5kZWZpbmVkIG1lYW5zIG5vIGxpbWl0Ki9cbiAgbWF4X2hlaWdodD86IG51bWJlcjtcbiAgLyoqQ29sdW1ucywgdHJ1ZSBpcyBldmVyeXRoaW5nIGluIG9uZSBjb2x1bW5zLCBqdXN0IGEgbnVtYmVyIHdpbGwgbWFrZSByZXBlYXRpbmcgY29sdW1ucyBvZiBtaW5pbXVtIHRoYXQgcmVtIHdpZHRoLCBhbiBhcnJheSB3aWxsIG1ha2UgZXhhY3RseSB0aGF0IG1hbnkgY29sdW1zIHdpdGggc3BlY2lmaWVkIHJlbSB3aWR0aHMgKi9cbiAgY29sdW1uPzogdHJ1ZSB8IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKipSb3dzLCB0cnVlIGlzIGV2ZXJ5dGhpbmcgaW4gb25lIHJvdywganVzdCBhIG51bWJlciB3aWxsIG1ha2UgcmVwZWF0aW5nIHJvd3Mgb2YgbWluaW11bSB0aGF0IHJlbSBoZWlnaHQsIGFuIGFycmF5IHdpbGwgbWFrZSBleGFjdGx5IHRoYXQgbWFueSByb3dzIHdpdGggc3BlY2lmaWVkIHJlbSBoZWlnaHRzICovXG4gIHJvdz86IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXTtcbn1cblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwPFxuICBSVCBleHRlbmRzIG9iamVjdCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybUdyb3VwQmFzZTxSVCwgSUQ+IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJncm91cFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtY29sXCIpO1xuICB9XG5cbiAgc2V0IGNvbHVtbihjb2x1bW46IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImdyaWQtcm93XCIsIFwiZ3JpZC1jb2xcIiwgXCJmbGV4LXJvd1wiLCBcImZsZXgtY29sXCIpO1xuICAgIGlmIChjb2x1bW4gPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtY29sXCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJncmlkLWNvbFwiKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgdGhpcy5zdHlsZS5ncmlkVGVtcGxhdGVDb2x1bW5zID1cbiAgICAgICAgICBcInJlcGVhdChhdXRvLWZpdCwgbWlubWF4KFwiICsgY29sdW1uICsgXCIsIDFmcikpXCI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0eWxlLmdyaWRUZW1wbGF0ZUNvbHVtbnMgPSBjb2x1bW5cbiAgICAgICAgICAubWFwKChjb2wpID0+IFwibWlubWF4KFwiICsgY29sICsgXCIsIDFmcilcIilcbiAgICAgICAgICAuam9pbihcIiBcIik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2V0IHJvdyhyb3c6IHRydWUgfCBzdHJpbmcgfCBzdHJpbmdbXSkge1xuICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImdyaWQtcm93XCIsIFwiZ3JpZC1jb2xcIiwgXCJmbGV4LXJvd1wiLCBcImZsZXgtY29sXCIpO1xuICAgIGlmIChyb3cgPT09IHRydWUpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImZsZXgtcm93XCIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJncmlkLXJvd1wiKTtcbiAgICAgIGlmICh0eXBlb2Ygcm93ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgIHRoaXMuc3R5bGUuZ3JpZFRlbXBsYXRlUm93cyA9XG4gICAgICAgICAgXCJyZXBlYXQoYXV0by1maXQsIG1pbm1heChcIiArIHJvdyArIFwiLCAxZnIpKVwiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdHlsZS5ncmlkVGVtcGxhdGVSb3dzID0gcm93XG4gICAgICAgICAgLm1hcCgoY29sKSA9PiBcIm1pbm1heChcIiArIGNvbCArIFwiLCAxZnIpXCIpXG4gICAgICAgICAgLmpvaW4oXCIgXCIpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldCBlbGVtZW50cyhlbGVtZW50czogRm9ybUVsZW1lbnRbXSkge1xuICAgIGZvciAobGV0IGkgPSAwLCBuID0gZWxlbWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICBjb25zdCBjb21wID0gZWxlbWVudHNbaV07XG4gICAgICBpZiAoY29tcCBpbnN0YW5jZW9mIEZvcm1WYWx1ZSAmJiBjb21wLmZvcm1faWQpIHtcbiAgICAgICAgaWYgKHRoaXMudmFsdWVfZWxlbWVudHMuaGFzKGNvbXAuZm9ybV9pZCBhcyBzdHJpbmcpKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgIFwiRm9ybSBlbGVtZW50IHdpdGggZm9ybSBpZCBcIiArXG4gICAgICAgICAgICAgIGNvbXAuZm9ybV9pZCArXG4gICAgICAgICAgICAgIFwiIGFscmVhZHkgZXhpc3RzIGluIGdyb3VwXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZhbHVlX2VsZW1lbnRzLnNldChjb21wLmZvcm1faWQgYXMgc3RyaW5nLCBjb21wKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29tcCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGVsZW1lbnRzKCk6IEZvcm1FbGVtZW50W10ge1xuICAgIHJldHVybiBbLi4udGhpcy52YWx1ZV9lbGVtZW50cy52YWx1ZXMoKV07XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Hcm91cCk7XG5cbi8qKkNyZWF0ZXMgYSBmb3JtIGdyb3VwIHdpdGggZWxlbWVudHMgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2dyb3VwPFxuICBMIGV4dGVuZHMgRm9ybUVsZW1lbnRbXSxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFQgZXh0ZW5kcyBvYmplY3QgPSBQcmV0dGlmeTxQYXJ0aWFsPEdyb3VwVG9LZXlWYWw8R3JvdXBFeHRyYWN0VmFsczxMPj4+Pixcbj4ob3B0aW9ucz86IEZvcm1Hcm91cE9wdGlvbnM8TCwgSUQsIFQ+KTogRm9ybUdyb3VwPFQsIElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1Hcm91cDxULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmJvcmRlcikgc2xpZGUuYm9yZGVyID0gb3B0aW9ucy5ib3JkZXI7XG4gICAgaWYgKG9wdGlvbnMuZWxlbWVudHMpIHNsaWRlLmVsZW1lbnRzID0gb3B0aW9ucy5lbGVtZW50cztcbiAgICBpZiAob3B0aW9ucy5tYXhfaGVpZ2h0KSBzbGlkZS5tYXhfaGVpZ2h0ID0gb3B0aW9ucy5tYXhfaGVpZ2h0O1xuICAgIGlmIChvcHRpb25zLmVtYmVkKSBzbGlkZS5lbWJlZCA9IG9wdGlvbnMuZW1iZWQ7XG4gICAgaWYgKG9wdGlvbnMuY29sdW1uKSBzbGlkZS5jb2x1bW4gPSBvcHRpb25zLmNvbHVtbjtcbiAgICBlbHNlIGlmIChvcHRpb25zLnJvdykgc2xpZGUucm93ID0gb3B0aW9ucy5yb3c7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgbm9kZV9jbG9uZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCxcbiAgbWF0ZXJpYWxfdW5mb2xkX21vcmVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7XG4gIEFOSU1BVElPTl9MRVZFTCxcbiAgQU5JTUFUSU9OX1NQRUVELFxuICBBbmltYXRpb25MZXZlbHMsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXRoZW1lXCI7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCwgRm9ybU9wdGlvbnMgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IHsgRm9ybUdyb3VwQmFzZSB9IGZyb20gXCIuL2dyb3VwX2Jhc2VcIjtcbmltcG9ydCBcIi4vZ3JvdXBfY29sbGFwc2VyLnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtR3JvdXBDb2xsYXBzZXJPcHRpb25zIGV4dGVuZHMgRm9ybU9wdGlvbnMge1xuICAvKipXZXRoZXIgdGhlIGdyb3VwIGlzIGNvbGxhcHNlZCBpbml0aWFsbHkqL1xuICBjb2xsYXBzZWQ/OiBib29sZWFuO1xuICAvKipUZXh0IHRvIHNob3cgb24gdGhlIGNvbGxhcHNlciB3aGVuIG9wZW4qL1xuICBvcGVuX3RleHQ/OiBzdHJpbmc7XG4gIC8qKlRleHQgdG8gc2hvdyBvbiB0aGUgY29sbGFwc2VyIHdoZW4gY2xvc2VkKi9cbiAgY2xvc2VfdGV4dD86IHN0cmluZztcbn1cblxuY29uc3Qgb3Blbl90ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5vcGVuX3RleHQudGV4dENvbnRlbnQgPSBcIkNvbGxhcHNlXCI7XG5jb25zdCBjbG9zZV90ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7XG5jbG9zZV90ZXh0LnRleHRDb250ZW50ID0gXCJFeHBhbmRcIjtcblxuLyoqQ29tcG9uZW50IGdyb3VwIGNsYXNzIHdoaWNoIGFsbG93cyB0byBhZGQgZWxlbWVudHMgYW5kIGNvbnRyb2xzIHRoZSBmbG93IG9mIHRoZSBlbGVtZW50cyovXG5leHBvcnQgY2xhc3MgRm9ybUdyb3VwQ29sbGFwc2VyIGV4dGVuZHMgRm9ybUVsZW1lbnQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImdyb3VwLWNvbGxhcHNlclwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZ3JvdXA7XG4gICNjb2xsYXBzZV9idXR0b247XG4gICNjb2xsYXBzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI29wZW5fdGV4dCA9IG5vZGVfY2xvbmUob3Blbl90ZXh0KTtcbiAgI2Nsb3NlX3RleHQgPSBub2RlX2Nsb25lKGNsb3NlX3RleHQpO1xuXG4gIGNvbnN0cnVjdG9yKGdyb3VwOiBGb3JtR3JvdXBCYXNlPGFueSwgYW55PiwgY29sbGFwc2VkPzogYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy4jZ3JvdXAgPSB0aGlzLmFwcGVuZENoaWxkKGdyb3VwKTtcbiAgICBpZiAoY29sbGFwc2VkKSB7XG4gICAgICB0aGlzLmNsYXNzTGlzdC5hZGQoXCJjb2xsYXBzZWRcIik7XG4gICAgICB0aGlzLiNjb2xsYXBzZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24gPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24udGFiSW5kZXggPSAwO1xuICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5hcHBlbmRDaGlsZChcbiAgICAgIGNvbGxhcHNlZCA/IHRoaXMuI2Nsb3NlX3RleHQgOiB0aGlzLiNvcGVuX3RleHQsXG4gICAgKTtcbiAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24uYXBwZW5kQ2hpbGQobWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpKTtcbiAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24ub25jbGljayA9ICgpID0+ICh0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZCk7XG4gICAgdGhpcy4jY29sbGFwc2VfYnV0dG9uLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRW50ZXJcIiB8fCBlLmtleSA9PT0gXCIgXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNvbGxhcHNlZCA9ICF0aGlzLmNvbGxhcHNlZDtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0IGdyb3VwKGdyb3VwOiBGb3JtR3JvdXBCYXNlPGFueSwgYW55Pikge1xuICAgIGNvbnN0IG9sZF9ncm91cCA9IHRoaXMuI2dyb3VwO1xuICAgIHRoaXMuI2dyb3VwID0gdGhpcy5yZXBsYWNlQ2hpbGQoZ3JvdXAsIG9sZF9ncm91cCk7XG4gIH1cblxuICBnZXQgZ3JvdXAoKTogRm9ybUdyb3VwQmFzZTxhbnksIGFueT4ge1xuICAgIHJldHVybiB0aGlzLiNncm91cDtcbiAgfVxuXG4gIHNldCBjb2xsYXBzZWQoY29sbGFwc2VkOiBib29sZWFuKSB7XG4gICAgaWYgKGNvbGxhcHNlZCAmJiAhdGhpcy4jY29sbGFwc2VkKSB7XG4gICAgICAvLyMgQW5pbWF0aW9uXG4gICAgICB0aGlzLiNjb2xsYXBzZV9idXR0b24ucmVwbGFjZUNoaWxkcmVuKFxuICAgICAgICB0aGlzLiNjbG9zZV90ZXh0LFxuICAgICAgICBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkKCksXG4gICAgICApO1xuICAgICAgaWYgKEFOSU1BVElPTl9MRVZFTC5nZXQoKS52YWx1ZSA9PT0gQW5pbWF0aW9uTGV2ZWxzLkFsbCkge1xuICAgICAgICB0aGlzLiNncm91cC5zdHlsZS5vdmVyZmxvd1kgPSBcImF1dG9cIjtcbiAgICAgICAgY29uc3QgZnVsbF9oZWlnaHQgPSB0aGlzLiNncm91cC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgKyBcInB4XCI7XG4gICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHRoaXMuI2dyb3VwLmFuaW1hdGUoXG4gICAgICAgICAgW1xuICAgICAgICAgICAgeyBtYXhIZWlnaHQ6IGZ1bGxfaGVpZ2h0IH0sXG4gICAgICAgICAgICB7IG1heEhlaWdodDogXCIwcHhcIiwgcGFkZGluZ0Jsb2NrOiBcIjBweFwiIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBkdXJhdGlvbjogQU5JTUFUSU9OX1NQRUVELmdldCgpLnZhbHVlLFxuICAgICAgICAgICAgZWFzaW5nOiBcImVhc2UtaW4tb3V0XCIsXG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgICAgYW5pbWF0aW9uLm9uZmluaXNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcImNvbGxhcHNlZFwiKTtcbiAgICAgICAgICB0aGlzLiNncm91cC5zdHlsZS5vdmVyZmxvd1kgPSBcIlwiO1xuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKFwiY29sbGFwc2VkXCIpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoIWNvbGxhcHNlZCAmJiB0aGlzLiNjb2xsYXBzZWQpIHtcbiAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZShcImNvbGxhcHNlZFwiKTtcbiAgICAgIHRoaXMuI2NvbGxhcHNlX2J1dHRvbi5yZXBsYWNlQ2hpbGRyZW4oXG4gICAgICAgIHRoaXMuI29wZW5fdGV4dCxcbiAgICAgICAgbWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpLFxuICAgICAgKTtcbiAgICAgIC8vIyBBbmltYXRpb25cbiAgICAgIGlmIChBTklNQVRJT05fTEVWRUwuZ2V0KCkudmFsdWUgPT09IEFuaW1hdGlvbkxldmVscy5BbGwpIHtcbiAgICAgICAgdGhpcy4jZ3JvdXAuc3R5bGUub3ZlcmZsb3dZID0gXCJhdXRvXCI7XG4gICAgICAgIGNvbnN0IGZ1bGxfaGVpZ2h0ID0gdGhpcy4jZ3JvdXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICBjb25zdCBhbmltYXRpb24gPSB0aGlzLiNncm91cC5hbmltYXRlKFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHsgbWF4SGVpZ2h0OiBcIjBweFwiLCBwYWRkaW5nQmxvY2s6IFwiMHB4XCIgfSxcbiAgICAgICAgICAgIHsgbWF4SGVpZ2h0OiBmdWxsX2hlaWdodCB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgZHVyYXRpb246IEFOSU1BVElPTl9TUEVFRC5nZXQoKS52YWx1ZSxcbiAgICAgICAgICAgIGVhc2luZzogXCJlYXNlLWluLW91dFwiLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIGFuaW1hdGlvbi5vbmZpbmlzaCA9ICgpID0+ICh0aGlzLiNncm91cC5zdHlsZS5vdmVyZmxvd1kgPSBcIlwiKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy4jY29sbGFwc2VkID0gY29sbGFwc2VkO1xuICB9XG4gIGdldCBjb2xsYXBzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2NvbGxhcHNlZDtcbiAgfVxuXG4gIHNldCBvcGVuX3RleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy4jb3Blbl90ZXh0LnRleHRDb250ZW50ID0gdGV4dDtcbiAgfVxuXG4gIHNldCBjbG9zZV90ZXh0KHRleHQ6IHN0cmluZykge1xuICAgIHRoaXMuI2Nsb3NlX3RleHQudGV4dENvbnRlbnQgPSB0ZXh0O1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtR3JvdXBDb2xsYXBzZXIpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9ncm91cF9jb2xsYXBzZXIoXG4gIGdyb3VwOiBGb3JtR3JvdXBCYXNlPGFueSwgYW55PixcbiAgb3B0aW9ucz86IEZvcm1Hcm91cENvbGxhcHNlck9wdGlvbnMsXG4pOiBGb3JtR3JvdXBDb2xsYXBzZXIge1xuICBjb25zdCBzbGlkZSA9IG5ldyBGb3JtR3JvdXBDb2xsYXBzZXIoZ3JvdXAsIG9wdGlvbnM/LmNvbGxhcHNlZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMub3Blbl90ZXh0KSBzbGlkZS5vcGVuX3RleHQgPSBvcHRpb25zLm9wZW5fdGV4dDtcbiAgICBpZiAob3B0aW9ucy5jbG9zZV90ZXh0KSBzbGlkZS5jbG9zZV90ZXh0ID0gb3B0aW9ucy5jbG9zZV90ZXh0O1xuICAgIEZvcm1FbGVtZW50LmFwcGx5X29wdGlvbnMoc2xpZGUsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBzbGlkZTtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgTGlzdEZpZWxkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbGlzdFwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi9saXN0X2ZpZWxkLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIExpc3RGb3JtRmllbGQ8VCBleHRlbmRzIEZvcm1FbGVtZW50PiBleHRlbmRzIExpc3RGaWVsZCB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwibGlzdGZpZWxkXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gIHNldCBlbGVtZW50KGNvbXBvbmVudDogVCkge1xuICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKGNvbXBvbmVudCk7XG4gIH1cblxuICBnZXQgZWxlbWVudCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5maXJzdEVsZW1lbnRDaGlsZCBhcyBUO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChMaXN0Rm9ybUZpZWxkKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fbGlzdF9maWVsZDxUIGV4dGVuZHMgRm9ybUVsZW1lbnQ+KGVsZW1lbnQ6IFQpIHtcbiAgY29uc3QgZmllbGQgPSBuZXcgTGlzdEZvcm1GaWVsZDxUPigpO1xuICBmaWVsZC5lbGVtZW50ID0gZWxlbWVudDtcbiAgcmV0dXJuIGZpZWxkO1xufVxuIiwiaW1wb3J0IHsgbm9uZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTdGF0ZU51bWJlclJlbGF0ZWQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdGF0ZVwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vbnVtYmVyX2Jhc2Uuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1OdW1iZXJPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBudW1iZXIsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqTG93ZXIgbGltaXQgZm9yIHNsaWRlciB2YWx1ZSovXG4gIG1pbj86IG51bWJlcjtcbiAgLyoqVXBwZXIgbGltaXQgZm9yIHNsaWRlciB2YWx1ZSovXG4gIG1heD86IG51bWJlcjtcbiAgLyoqQW1vdW50IG9mIGRlY2ltYWxzIHRvIHNob3cqL1xuICBkZWNpbWFscz86IG51bWJlcjtcbiAgLyoqVW5pdCB0byB1c2UgZm9yIHNsaWRlciovXG4gIHVuaXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybU51bWJlcldyaXRlT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1OdW1iZXJPcHRpb25zPElELCBSVD4ge1xuICAvKipTdGVwIHNpemUsIHVzZSAwIGZvciBhdXRvbWF0aWMgc3RlcCBzaXplKi9cbiAgc3RlcD86IG51bWJlcjtcbiAgLyoqU3RhcnQgZm9yIHN0ZXAsIHVzZSAwIGZvciBhdXRvbWF0aWMgKi9cbiAgc3RhcnQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQsIFJUPiB7XG4gIC8qKndldGhlciB0aGUgZXZlbnRzIGFyZSBsaXZlIGFzIHRoZSBzbGlkZXIgaXMgbW92ZWQgb3Igb25seSB3aGVuIG1vdmluZyBzdG9wcyAqL1xuICBsaXZlPzogYm9vbGVhbjtcbiAgLyoqSWNvbiB0byB1c2UgZm9yIGRlY3JlYXNpbmcgdmFsdWUqL1xuICBpY29uX2RlY3JlYXNlPzogU1ZHRnVuYztcbiAgLyoqSWNvbiB0byB1c2UgZm9yIGluY3JlYXNpbmcgdmFsdWUqL1xuICBpY29uX2luY3JlYXNlPzogU1ZHRnVuYztcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gbnVtYmVyLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgYXBwbHlfb3B0aW9uczxSVCwgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICAgIGVsZW1lbnQ6IEZvcm1OdW1iZXJXcml0ZTxJRCwgUlQ+LFxuICAgIG9wdGlvbnM6IEZvcm1OdW1iZXJXcml0ZU9wdGlvbnM8SUQsIFJUPixcbiAgKSB7XG4gICAgaWYgKG9wdGlvbnMudW5pdCkgZWxlbWVudC51bml0ID0gb3B0aW9ucy51bml0O1xuICAgIGlmIChvcHRpb25zLmRlY2ltYWxzKSBlbGVtZW50LmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBpZiAob3B0aW9ucy5taW4gIT09IHVuZGVmaW5lZCkgZWxlbWVudC5taW4gPSBvcHRpb25zLm1pbjtcbiAgICBpZiAob3B0aW9ucy5tYXggIT09IHVuZGVmaW5lZCkgZWxlbWVudC5tYXggPSBvcHRpb25zLm1heDtcbiAgICBpZiAob3B0aW9ucy5zdGVwKSBlbGVtZW50LnN0ZXAgPSBvcHRpb25zLnN0ZXA7XG4gICAgaWYgKG9wdGlvbnMuc3RhcnQpIGVsZW1lbnQuc3RhcnQgPSBvcHRpb25zLnN0YXJ0O1xuICAgIHN1cGVyLmFwcGx5X29wdGlvbnMoZWxlbWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipTZXQgdGhlIG1pbmltdW0gdmFsdWUqL1xuICBhYnN0cmFjdCBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXQgdGhlIG1pbmltdW0gdmFsdWUqL1xuICBhYnN0cmFjdCBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSBzaXplIG9mIG51bWJlciBjaGFuZ2Ugc3RlcHMqL1xuICBhYnN0cmFjdCBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpO1xuXG4gIC8qKlNldHMgdGhlIHN0YXJ0IG9mZnNldCBmb3IgbnVtYmVyIHN0ZXBzKi9cbiAgYWJzdHJhY3Qgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCk7XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgYWJzdHJhY3Qgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKTtcblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgYWJzdHJhY3Qgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKTtcblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChyZWxhdGVkOiBQYXJ0aWFsPFN0YXRlTnVtYmVyUmVsYXRlZD4pOiB2b2lkIHtcbiAgICBpZiAocmVsYXRlZC5taW4pXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWluXCIsIHJlbGF0ZWQubWluLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWluXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhcIiwgcmVsYXRlZC5tYXgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhcIik7XG4gICAgaWYgKHJlbGF0ZWQuc3RlcClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJzdGVwXCIsIHJlbGF0ZWQuc3RlcCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInN0ZXBcIik7XG4gICAgaWYgKHJlbGF0ZWQuc3RhcnQpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwic3RhcnRcIiwgcmVsYXRlZC5zdGFydCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInN0YXJ0XCIpO1xuICAgIGlmIChyZWxhdGVkLmRlY2ltYWxzKVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcImRlY2ltYWxzXCIsIHJlbGF0ZWQuZGVjaW1hbHMsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJkZWNpbWFsc1wiKTtcbiAgICBpZiAocmVsYXRlZC51bml0KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcInVuaXRcIiwgcmVsYXRlZC51bml0LCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwidW5pdFwiKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQge1xuICBnZXRfY3Vyc29yX3Bvc2l0aW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X2N1cnNvcl9wb3NpdGlvbixcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHN5bmNfcmVzb2x2ZSxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbWF0aFwiO1xuaW1wb3J0IHsgZXJyLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1OdW1iZXJXcml0ZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vbnVtYmVyX2lucHV0LnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmNsYXNzIE51bWJlcklucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcIm51bWJlcmlucHV0XCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNzZWxlY3RlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAjdW5pdDogc3RyaW5nID0gXCJcIjtcbiAgI21pbjogbnVtYmVyID0gLUluZmluaXR5O1xuICAjbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuXG4gICN2YWx1ZV9ib3ggPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXRfYm94ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAjbWF4X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNtaW5fbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGlmIChlLnRhcmdldCAhPT0gdGhpcy4jdmFsdWVfYm94KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jdmFsdWVfYm94KTtcbiAgICAgIH0gZWxzZSB0aGlzLiN2YWx1ZV9ib3guZm9jdXMoKTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNpblwiLCAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgaWYgKHRoaXMuI3NlbGVjdGVkKSByZXR1cm47XG4gICAgICBzZXRfc2VsZWN0aW9uX2FsbCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJsdXIgPSAoKSA9PiB7XG4gICAgICB0aGlzLiNzZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuI3NldChmYWxzZSk7XG4gICAgICB9LCAwKTtcbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFbnRlclwiKSB0aGlzLiNzZXQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiKSB0aGlzLiNzdGVwX3ZhbHVlKHRydWUpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dEb3duXCIpIHRoaXMuI3N0ZXBfdmFsdWUoZmFsc2UpO1xuICAgICAgZWxzZSByZXR1cm47XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH07XG4gICAgdGhpcy5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmlucHV0VHlwZSA9PT0gXCJpbnNlcnRQYXJhZ3JhcGhcIikgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZWxzZSBpZiAoZS5kYXRhKSB7XG4gICAgICAgIGlmICghL1tcXGQsLi1dL2cudGVzdChlLmRhdGEpKSBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGVsc2UgaWYgKC9bLC5dL2cudGVzdChlLmRhdGEpICYmIHRoaXMuI2RlY2ltYWxzID09PSAwKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAodGhpcy4jbWluID49IDAgJiYgLy0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldChjdXI6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBzZWwgPSBnZXRfY3Vyc29yX3Bvc2l0aW9uKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChcbiAgICAgIGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKFxuICAgICAgICBwYXJzZUZsb2F0KHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudD8ucmVwbGFjZShcIixcIiwgXCIuXCIpIHx8IFwiXCIpIHx8IDAsXG4gICAgICApXG4gICAgKVxuICAgICAgLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IE1hdGgubWF4KE1hdGgubWluKDAsIHRoaXMuI21heCksIHRoaXMuI21pbikpO1xuICAgICAgICBzZXRfY3Vyc29yX2VuZCh0aGlzLiN2YWx1ZV9ib3gpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKCkgPT4ge1xuICAgICAgICBpZiAoIWN1cikgcmV0dXJuO1xuICAgICAgICBzZXRfY3Vyc29yX3Bvc2l0aW9uKHRoaXMuI3ZhbHVlX2JveCwgc2VsKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgZm9jdXMob3B0aW9ucz86IEZvY3VzT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC5mb2N1cyhvcHRpb25zKTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgZGVjaW1hbHMoZGVjOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWNpbWFscyA9IGRlYyB8fCAwO1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZW5nZW5kKCk7XG4gIH1cblxuICBzZXQgbWluKG1pbjogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWluID0gbWluID8/IC1JbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWluX2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNtaW5fbGVnZW5kLnRleHRDb250ZW50ID1cbiAgICAgIHRoaXMuI21pbiA9PT0gLUluZmluaXR5ID8gXCJcIiA6IFwiTWluOlwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgc2V0IG1heChtYXg6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heCA9IG1heCA/PyBJbmZpbml0eTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21heF9sZW5nZW5kKCkge1xuICAgIHRoaXMuI21heF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWF4ID09PSBJbmZpbml0eSA/IFwiXCIgOiBcIk1heDpcIiArIHRoaXMuI21heC50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHNldCBzdGVwKHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0ZXAgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBzZXQgc3RhcnQoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RhcnQgPSBzdGVwIHx8IDA7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBsaW1pdF92YWx1ZSh2YWw6IG51bWJlcik6IFByb21pc2VMaWtlPFJlc3VsdDxudW1iZXIsIHN0cmluZz4+IHtcbiAgICBsZXQgbGltID0gbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbChcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KHZhbCwgdGhpcy4jbWluKSwgdGhpcy4jbWF4KSxcbiAgICAgIHRoaXMuI3N0ZXAsXG4gICAgICB0aGlzLiNzdGFydCxcbiAgICAgIHRoaXMuI2RlY2ltYWxzLFxuICAgICk7XG4gICAgaWYgKGxpbSA8IHRoaXMuI21pbikgbGltICs9IHRoaXMuI3N0ZXA7XG4gICAgaWYgKGxpbSA+IHRoaXMuI21heCkgbGltIC09IHRoaXMuI3N0ZXA7XG4gICAgcmV0dXJuIHN1cGVyLmxpbWl0X3ZhbHVlKGxpbSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2hlY2tfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgaWYgKHZhbCA8IHRoaXMuI21pbilcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1pbmltdW0gdmFsdWUgXCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgaWYgKHZhbCA+IHRoaXMuI21heClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihcIk1heGltdW0gdmFsdWUgXCIgKyB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyB0aGlzLiN1bml0KSxcbiAgICAgICk7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICB2YWwsXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZShsaW0pO1xuICB9XG5cbiAgI3N0ZXBfdmFsdWUoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc3RlcCA9XG4gICAgICB0aGlzLiNzdGVwIHx8XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgdGhpcy4jZGVjaW1hbHMgPyAxIC8gdGhpcy4jZGVjaW1hbHMgOiAxLFxuICAgICAgICBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuYnVmZmVyIHx8IDApIC8gMTUwKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCh0aGlzLmJ1ZmZlciB8fCAwKSArIChkaXIgPyBzdGVwIDogLXN0ZXApKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoTnVtYmVySW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9udW1iZXJfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybU51bWJlcldyaXRlT3B0aW9uczxJRD4sXG4pOiBOdW1iZXJJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBOdW1iZXJJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIEZvcm1OdW1iZXJXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IG5vbmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVOdW1iZXJSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZSB9IGZyb20gXCIuLi8uLi9iYXNlXCI7XG5pbXBvcnQgeyB0eXBlIEZvcm1OdW1iZXJPcHRpb25zIH0gZnJvbSBcIi4uL251bWJlcl9iYXNlXCI7XG5pbXBvcnQgXCIuL3Byb2dyZXNzLnNjc3NcIjtcblxuZXhwb3J0IGNsYXNzIEZvcm1Qcm9ncmVzczxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWU8XG4gIG51bWJlcixcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInByb2dyZXNzXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtaW46IG51bWJlciA9IDA7XG4gICNtYXg6IG51bWJlciA9IDEwMDtcbiAgI3NwYW46IG51bWJlciA9IDEwMDtcbiAgI2RlY2ltYWxzOiBudW1iZXIgPSAwO1xuICAjYmFyOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICN2YWw6IEhUTUxTcGFuRWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjdW5pdDogSFRNTFNwYW5FbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1pbihtaW46IG51bWJlcikge1xuICAgIHRoaXMuI21pbiA9IG1pbjtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0IHRoZSBtaW5pbXVtIHZhbHVlKi9cbiAgc2V0IG1heChtYXg6IG51bWJlcikge1xuICAgIHRoaXMuI21heCA9IG1heDtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgYW1vdW50IG9mIGRlY2ltYWxzIHRoZSBlbGVtZW50IGNhbiBoYXZlKi9cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBNYXRoLm1heChkZWMgPz8gMCwgMCk7XG4gIH1cblxuICAvKipTZXRzIHRoZSB1bml0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdC50ZXh0Q29udGVudCA9IHVuaXQgPz8gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuI2Jhci5zdHlsZS53aWR0aCA9XG4gICAgICBNYXRoLm1pbihNYXRoLm1heCgoKHZhbHVlIC0gdGhpcy4jbWluKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSArXG4gICAgICBcIiVcIjtcbiAgICB0aGlzLiN2YWwudGV4dENvbnRlbnQgPSB2YWx1ZS50b0ZpeGVkKHRoaXMuI2RlY2ltYWxzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLiNiYXIuc3R5bGUud2lkdGggPSBcIjAlXCI7XG4gICAgdGhpcy4jdmFsLnRleHRDb250ZW50ID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoZXJyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zb2xlLmVycm9yKGVycik7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVOdW1iZXJSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1pbilcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtaW5cIiwgcmVsYXRlZC5taW4sICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtaW5cIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4KVxuICAgICAgdGhpcy5hdHRhY2hfc3RhdGVfdG9fcHJvcChcIm1heFwiLCByZWxhdGVkLm1heCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heFwiKTtcbiAgICBpZiAocmVsYXRlZC5kZWNpbWFscylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJkZWNpbWFsc1wiLCByZWxhdGVkLmRlY2ltYWxzLCAoKSA9PiBub25lKCkpO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwiZGVjaW1hbHNcIik7XG4gICAgaWYgKHJlbGF0ZWQudW5pdClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJ1bml0XCIsIHJlbGF0ZWQudW5pdCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcInVuaXRcIik7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Qcm9ncmVzcyk7XG5cbi8qKkNyZWF0ZXMgYSBwcm9ncmVzcyBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3Byb2dyZXNzPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1OdW1iZXJPcHRpb25zPElEPixcbik6IEZvcm1Qcm9ncmVzczxJRD4ge1xuICBjb25zdCBwcm9nID0gbmV3IEZvcm1Qcm9ncmVzczxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5taW4gIT09IFwidW5kZWZpbmVkXCIpIHByb2cubWluID0gb3B0aW9ucy5taW47XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLm1heCAhPT0gXCJ1bmRlZmluZWRcIikgcHJvZy5tYXggPSBvcHRpb25zLm1heDtcbiAgICBwcm9nLmRlY2ltYWxzID0gb3B0aW9ucy5kZWNpbWFscztcbiAgICBwcm9nLnVuaXQgPSBvcHRpb25zLnVuaXQ7XG4gICAgRm9ybVZhbHVlLmFwcGx5X29wdGlvbnMocHJvZywgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHByb2c7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHN5bmNfcmVzb2x2ZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWNvbW1vblwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfYWRkX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3JlbW92ZV9yb3VuZGVkLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1pY29uc1wiO1xuaW1wb3J0IHsgbnVtYmVyX3N0ZXBfc3RhcnRfZGVjaW1hbCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLW1hdGhcIjtcbmltcG9ydCB7IGVyciwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU1ZHRnVuYyB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN2Z1wiO1xuaW1wb3J0IHsgRm9ybU51bWJlcldyaXRlLCB0eXBlIEZvcm1TdGVwcGVyQmFzZU9wdGlvbnMgfSBmcm9tIFwiLi4vbnVtYmVyX2Jhc2VcIjtcbmltcG9ydCBcIi4vc2xpZGVyLnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtU2xpZGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPiBleHRlbmRzIEZvcm1OdW1iZXJXcml0ZTxcbiAgSUQsXG4gIG51bWJlclxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwic2xpZGVyXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICN1bml0OiBzdHJpbmcgPSBcIlwiO1xuICAjZGVjaW1hbHM6IG51bWJlciA9IDA7XG4gICNtaW46IG51bWJlciA9IC1JbmZpbml0eTtcbiAgI21heDogbnVtYmVyID0gSW5maW5pdHk7XG4gICNzcGFuOiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2ljb25fZGVjID0gdGhpcy4jc3RlcHBlcl9mdW5jKFxuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICNzbGlkZSA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI2xlZnRfbGVnZW5kID0gdGhpcy4jbGVnZW5kLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3JpZ2h0X2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICNzbGlkZXIgPSB0aGlzLiNzbGlkZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3ZhbHVlX2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICN1bml0X2JveCA9IHRoaXMuI3NsaWRlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLiNzbGlkZXIuc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCIwXCIpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcblxuICAgIHRoaXMub25wb2ludGVyZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5idXR0b24gIT09IDApIHJldHVybjtcbiAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcIm1vdXNlXCIgJiYgIXRoaXMuI3NsaWRlci5jb250YWlucyhlLnRhcmdldCBhcyBOb2RlKSlcbiAgICAgICAgcmV0dXJuO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIHRoaXMuI3NsaWRlci5jbGFzc0xpc3QuYWRkKFwiYWN0aXZlXCIpO1xuICAgICAgY29uc3QgYm94ID0gdGhpcy4jc2xpZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy4jc2xpZGVyLmNvbnRhaW5zKGUudGFyZ2V0IGFzIE5vZGUpXG4gICAgICAgID8gZS5jbGllbnRYID49IGJveC54XG4gICAgICAgICAgPyBlLmNsaWVudFggPD0gYm94LnggKyBib3gud2lkdGhcbiAgICAgICAgICAgID8gYm94LnggLSBlLmNsaWVudFhcbiAgICAgICAgICAgIDogLWJveC53aWR0aFxuICAgICAgICAgIDogMFxuICAgICAgICA6IC1ib3gud2lkdGggLyAyO1xuICAgICAgaWYgKHRoaXMuI21pbiA9PT0gLUluZmluaXR5IHx8IHRoaXMuI21heCA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgbGV0IHZhbHVlID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgdmFsID0gKHZhbHVlICs9IGRpZmYgLyA1MCk7XG4gICAgICAgICAgaWYgKHRoaXMuI2xpdmUpXG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsKSkubWFwKCh2KSA9PiAodmFsdWUgPSB2KSk7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAoYXdhaXQgdGhpcy5saW1pdF92YWx1ZSh2YWwpKS5tYXAoKHYpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy4jbW92ZV92YWx1ZSh2KTtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgICAgICBsZXQgZGlmZiA9IHRoaXMuI3hfdG9fcGVyYyhlLmNsaWVudFggKyBvZmZzZXQpIC0gNTA7XG4gICAgICAgIHRoaXMuI21vdmVfc2xpZGUodGhpcy4jeF90b19wZXJjKGUuY2xpZW50WCArIG9mZnNldCkpO1xuICAgICAgICB0aGlzLiNzbGlkZXIuc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICB0aGlzLiNzbGlkZXIub25wb2ludGVybW92ZSA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoZXYuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgICAgZGlmZiA9ICh0aGlzLiNzdGVwIHx8IDEpICogKChwZXJjIC0gNTApICogMik7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZShwZXJjKTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgaWYgKCF0aGlzLiNsaXZlKSB0aGlzLnNldF92YWx1ZV9saW1pdCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmJ1ZmZlciB8fCAwO1xuICAgICAgICB0aGlzLiNtb3ZlX2Fic29sdXRlKGUuY2xpZW50WCArIG9mZnNldCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0KTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgICAgdGhpcy4jc2xpZGVyLm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbnBvaW50ZXJ1cCA9IChldikgPT4ge1xuICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgdGhpcy4jbW92ZV9hYnNvbHV0ZShldi5jbGllbnRYICsgb2Zmc2V0LCB2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuI3NsaWRlci5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHJlc2V0KCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jc2xpZGUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpIHRoaXMuI3N0ZXBfdmFsdWUodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc3RlcF92YWx1ZShmYWxzZSk7XG4gICAgICBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCB1bml0KHVuaXQ6IHN0cmluZyB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3VuaXQgPSB1bml0IHx8IFwiXCI7XG4gICAgdGhpcy4jdW5pdF9ib3gudGV4dENvbnRlbnQgPSB0aGlzLiN1bml0O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgfVxuICAjdXBkYXRlX21pbl9sZWdlbmQoKSB7XG4gICAgdGhpcy4jbGVmdF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHkgPyBcIlwiIDogXCJNaW46XCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbWF4KCk7XG4gICAgdGhpcy4jdXBkYXRlX21heF9sZWdlbmQoKTtcbiAgfVxuXG4gICN1cGRhdGVfbWF4X2xlZ2VuZCgpIHtcbiAgICB0aGlzLiNyaWdodF9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWF4ID09PSBJbmZpbml0eSA/IFwiXCIgOiB0aGlzLiNtYXgudG9GaXhlZCh0aGlzLiNkZWNpbWFscykgKyBcIjpNYXhcIjtcbiAgfVxuXG4gICN1cGRhdGVfbWluX21heCgpIHtcbiAgICB0aGlzLiNzcGFuID0gdGhpcy4jbWF4IC0gdGhpcy4jbWluO1xuICAgIGlmICh0aGlzLiNzcGFuID09PSBJbmZpbml0eSkgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gICAgZWxzZSBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICB9XG5cbiAgc2V0IGRlY2ltYWxzKGRlYzogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZGVjaW1hbHMgPSBkZWMgfHwgMDtcbiAgICB0aGlzLiN1cGRhdGVfbWluX2xlZ2VuZCgpO1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVnZW5kKCk7XG4gIH1cblxuICBzZXQgc3RlcChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGVwID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgc2V0IHN0YXJ0KHN0ZXA6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI3N0YXJ0ID0gc3RlcCB8fCAwO1xuICB9XG5cbiAgLyoqU2V0IHdldGhlciB0aGUgc2xpZGVyIGlzIGluIGxpdmUgbW9kZSovXG4gIHNldCBsaXZlKGxpdmU6IGJvb2xlYW4gfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNsaXZlID0gbGl2ZSB8fCBmYWxzZTtcbiAgfVxuXG4gIHNldCBpY29uX2RlY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25fZGVjLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9yZW1vdmVfcm91bmRlZCgpLCBmYWxzZSksXG4gICAgKTtcbiAgfVxuXG4gIHNldCBpY29uX2luY3JlYXNlKGljb246IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZChcbiAgICAgIHRoaXMuI2ljb25faW5jLFxuICAgICAgdGhpcy4jc3RlcHBlcl9mdW5jKGljb24gPyBpY29uKCkgOiBtYXRlcmlhbF9hZGRfcm91bmRlZCgpLCB0cnVlKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy4jbW92ZV92YWx1ZSh2YWx1ZSk7XG4gICAgdGhpcy4jbW92ZV9zbGlkZShcbiAgICAgIE1hdGgubWluKE1hdGgubWF4KCgoLXRoaXMuI21pbiArIHZhbHVlKSAvIHRoaXMuI3NwYW4pICogMTAwLCAwKSwgMTAwKSxcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgdGhpcy4jbW92ZV9zbGlkZSg1MCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gIGFzeW5jICNtb3ZlX2Fic29sdXRlKHg6IG51bWJlciwgbGFzdD86IG51bWJlcikge1xuICAgIGNvbnN0IHBlcmMgPSB0aGlzLiN4X3RvX3BlcmMoeCk7XG4gICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHRoaXMuI3BlcmNfdG9fdmFsdWUocGVyYykpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGxhc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHRoaXMubGltaXRfdmFsdWUodGhpcy4jcGVyY190b192YWx1ZShwZXJjKSk7XG4gICAgICAgIGlmICh2YWx1ZS5vaykge1xuICAgICAgICAgIHRoaXMuI21vdmVfc2xpZGUoKCgtdGhpcy4jbWluICsgdmFsdWUudmFsdWUpIC8gdGhpcy4jc3BhbikgKiAxMDApO1xuICAgICAgICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNldF92YWx1ZV9saW1pdCh0aGlzLiNwZXJjX3RvX3ZhbHVlKHBlcmMpKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAjeF90b19wZXJjKHg6IG51bWJlcikge1xuICAgIGNvbnN0IGJveCA9IHRoaXMuI3NsaWRlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHJldHVybiBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsICgoeCAtIGJveC54KSAvIGJveC53aWR0aCkgKiAxMDApKTtcbiAgfVxuXG4gICNwZXJjX3RvX3ZhbHVlKHBlcmM6IG51bWJlcikge1xuICAgIHJldHVybiAocGVyYyAvIDEwMCkgKiB0aGlzLiNzcGFuICsgdGhpcy4jbWluO1xuICB9XG5cbiAgLyoqQXR0YWNoZXMgY2xpY2sgYWN0aW9uIHRvIG92ZXIgdGltZSBpbmNyZWFzZSBzcGVlZCBvZiBzdGVwcGluZyB3aGVuIGhvbGRpbmcgc3RlcCBidXR0b25zICovXG4gICNzdGVwcGVyX2Z1bmMoaWNvbjogU1ZHU1ZHRWxlbWVudCwgZGlyOiBib29sZWFuKSB7XG4gICAgaWNvbi5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmJ1dHRvbiA9PT0gMCkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBsZXQgaW50ZXJ2YWwgPSAwO1xuICAgICAgICBsZXQgc2NhbGVyX2ludGVydmFsID0gMDtcbiAgICAgICAgbGV0IHNjYWxlciA9IDI1MDtcbiAgICAgICAgY29uc3QgcmVsZWFzZSA9ICgpID0+IHtcbiAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICBjbGVhckludGVydmFsKHNjYWxlcl9pbnRlcnZhbCk7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIGljb24ub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICAgIGljb24ucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgICBpY29uLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgIH07XG4gICAgICAgIGljb24uc2V0UG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICBpY29uLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLiNzdGVwX3ZhbHVlKGRpcik7XG4gICAgICAgICAgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLiNzdGVwX3ZhbHVlKGRpciksIHNjYWxlcik7XG4gICAgICAgICAgc2NhbGVyX2ludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHNjYWxlciA+IDIwKSBzY2FsZXIgLz0gMS4xO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuI3N0ZXBfdmFsdWUoZGlyKSwgc2NhbGVyKTtcbiAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgaWNvbi5vbnBvaW50ZXJ1cCA9ICgpID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJ2YWwgPT09IDApIHRoaXMuI3N0ZXBfdmFsdWUoZGlyKTtcbiAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfTtcbiAgICByZXR1cm4gaWNvbjtcbiAgfVxuXG4gICNzdGVwX3ZhbHVlKGRpcjogYm9vbGVhbikge1xuICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgdGhpcy4jc3RlcCB8fFxuICAgICAgTWF0aC5tYXgoXG4gICAgICAgIHRoaXMuI2RlY2ltYWxzID8gMSAvIHRoaXMuI2RlY2ltYWxzIDogMSxcbiAgICAgICAgTWF0aC5mbG9vcihNYXRoLmFicyh0aGlzLmJ1ZmZlciB8fCAwKSAvIDE1MCksXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLnNldF92YWx1ZV9jaGVjaygodGhpcy5idWZmZXIgfHwgMCkgKyAoZGlyID8gc3RlcCA6IC1zdGVwKSk7XG4gIH1cblxuICAjbW92ZV9zbGlkZShwZXJjOiBudW1iZXIpIHtcbiAgICB0aGlzLiNzbGlkZXIuc3R5bGUubGVmdCA9IHBlcmMgKyBcIiVcIjtcbiAgfVxuICAjbW92ZV92YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TbGlkZXIpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9zbGlkZXI8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVN0ZXBwZXJCYXNlT3B0aW9uczxJRD4sXG4pOiBGb3JtU2xpZGVyPElEPiB7XG4gIGNvbnN0IHNsaWRlID0gbmV3IEZvcm1TbGlkZXI8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBzbGlkZS5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIGlmIChvcHRpb25zLmljb25fZGVjcmVhc2UpIHNsaWRlLmljb25fZGVjcmVhc2UgPSBvcHRpb25zLmljb25fZGVjcmVhc2U7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9pbmNyZWFzZSkgc2xpZGUuaWNvbl9pbmNyZWFzZSA9IG9wdGlvbnMuaWNvbl9pbmNyZWFzZTtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzbGVlcCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQge1xuICBtYXRlcmlhbF9hZGRfcm91bmRlZCxcbiAgbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgeyBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItbWF0aFwiO1xuaW1wb3J0IHsgZXJyLCB0eXBlIFJlc3VsdCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHR5cGUgeyBTVkdGdW5jIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3ZnXCI7XG5pbXBvcnQgeyBGb3JtTnVtYmVyV3JpdGUsIHR5cGUgRm9ybVN0ZXBwZXJCYXNlT3B0aW9ucyB9IGZyb20gXCIuLi9udW1iZXJfYmFzZVwiO1xuaW1wb3J0IFwiLi9zdGVwcGVyLnNjc3NcIjtcblxuLyoqU2xpZGUgU2VsZWN0b3IsIGRpc3BsYXlzIGFsbCBvcHRpb25zIGluIGEgc2xpZGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtU3RlcHBlcjxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtTnVtYmVyV3JpdGU8XG4gIElELFxuICBudW1iZXJcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInN0ZXBwZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3VuaXQ6IHN0cmluZyA9IFwiXCI7XG4gICNkZWNpbWFsczogbnVtYmVyID0gMDtcbiAgI21pbjogbnVtYmVyID0gLUluZmluaXR5O1xuICAjbWF4OiBudW1iZXIgPSBJbmZpbml0eTtcbiAgI3N0ZXA6IG51bWJlciA9IDA7XG4gICNzdGFydDogbnVtYmVyID0gMDtcbiAgI2xpdmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgI2ljb25fZGVjID0gdGhpcy4jc3RlcHBlcl9mdW5jKFxuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSksXG4gICAgZmFsc2UsXG4gICk7XG4gICN0ZXh0ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNpY29uX2luYyA9IHRoaXMuI3N0ZXBwZXJfZnVuYyhcbiAgICB0aGlzLmFwcGVuZENoaWxkKG1hdGVyaWFsX2FkZF9yb3VuZGVkKCkpLFxuICAgIHRydWUsXG4gICk7XG4gICN2YWx1ZV9ib3ggPSB0aGlzLiN0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI3VuaXRfYm94ID0gdGhpcy4jdGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG4gICNsZWdlbmQgPSB0aGlzLiN0ZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgI21heF9sZWdlbmQgPSB0aGlzLiNsZWdlbmQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIikpO1xuICAjbWluX2xlZ2VuZCA9IHRoaXMuI2xlZ2VuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKSk7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLnNldEF0dHJpYnV0ZShcInRhYmluZGV4XCIsIFwiMFwiKTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG5cbiAgICB0aGlzLiN2YWx1ZV9ib3guc2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIiwgXCItMVwiKTtcbiAgICB0aGlzLiN2YWx1ZV9ib3guY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgbGV0IGRyYWdfYmxvY2tlciA9IGZhbHNlO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmZvY3VzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgZHJhZ19ibG9ja2VyID0gdHJ1ZTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJsdXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICBkcmFnX2Jsb2NrZXIgPSBmYWxzZTtcbiAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2soXG4gICAgICAgIHBhcnNlRmxvYXQodGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50Py5yZXBsYWNlKFwiLFwiLCBcIi5cIikgfHwgXCJcIikgfHwgMCxcbiAgICAgICk7XG4gICAgfTtcbiAgICBsZXQgcmVzZXQgPSAoKSA9PiB7fTtcbiAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuYnV0dG9uID09PSAwICYmIChlLnRhcmdldCAhPT0gdGhpcy4jdmFsdWVfYm94IHx8ICFkcmFnX2Jsb2NrZXIpKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGNvbnN0IGluaXRpYWxfdmFsID0gdGhpcy5idWZmZXIgfHwgMDtcbiAgICAgICAgbGV0IG1vdmluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLiN0ZXh0LnNldFBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgdGhpcy4jdGV4dC5vbnBvaW50ZXJtb3ZlID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgaWYgKG1vdmluZykge1xuICAgICAgICAgICAgdGhpcy4jbW92ZV9kaWZmKFxuICAgICAgICAgICAgICBpbml0aWFsX3ZhbCArICgoZXYuY2xpZW50WCAtIGUuY2xpZW50WCkgLyAxMCkgKiAodGhpcy4jc3RlcCB8fCAxKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIGlmIChNYXRoLmFicyhlLmNsaWVudFggLSBldi5jbGllbnRYKSA+IDUpIHtcbiAgICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC5jb250ZW50RWRpdGFibGUgPSBcImZhbHNlXCI7XG4gICAgICAgICAgICBtb3ZpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgcmVzZXQgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmNvbnRlbnRFZGl0YWJsZSA9IFwidHJ1ZVwiO1xuICAgICAgICAgIHRoaXMuI3RleHQucmVsZWFzZVBvaW50ZXJDYXB0dXJlKGUucG9pbnRlcklkKTtcbiAgICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcm1vdmUgPSBudWxsO1xuICAgICAgICAgIHRoaXMuI3RleHQub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLiN0ZXh0Lm9ucG9pbnRlcnVwID0gKGV2KSA9PiB7XG4gICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgcmVzZXQoKTtcbiAgICAgICAgICBpZiAoIW1vdmluZyAmJiBlLnRhcmdldCAhPT0gdGhpcy4jdmFsdWVfYm94KSB7XG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3guZm9jdXMoKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtcbiAgICAgICAgICAgIHJhbmdlLnNldFN0YXJ0QWZ0ZXIodGhpcy4jdmFsdWVfYm94LmZpcnN0Q2hpbGQhKTtcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbiA9IHRoaXMub3duZXJEb2N1bWVudD8uZGVmYXVsdFZpZXc/LmdldFNlbGVjdGlvbigpO1xuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbikge1xuICAgICAgICAgICAgICBzZWxlY3Rpb24ucmVtb3ZlQWxsUmFuZ2VzKCk7XG4gICAgICAgICAgICAgIHNlbGVjdGlvbi5hZGRSYW5nZShyYW5nZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChtb3ZpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuI21vdmVfZGlmZihcbiAgICAgICAgICAgICAgaW5pdGlhbF92YWwgKyAoKGV2LmNsaWVudFggLSBlLmNsaWVudFgpIC8gMTApICogKHRoaXMuI3N0ZXAgfHwgMSksXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbW92aW5nID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiIHx8IGUua2V5ID09PSBcIkFycm93TGVmdFwiKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgdGhpcy4jc3RlcF92YWx1ZShlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmIChyZXNldCkgcmVzZXQoKTtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgdGhpcy5vd25lckRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuI3ZhbHVlX2JveCAmJlxuICAgICAgICAgIC9bXFxkLC4tXS9nLnRlc3QoZS5rZXkpXG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gICAgICAgICAgdGhpcy4jdmFsdWVfYm94LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuI3ZhbHVlX2JveC5ibHVyKCk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlciAhPT0gdW5kZWZpbmVkKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd1JpZ2h0XCIgfHwgZS5rZXkgPT09IFwiQXJyb3dMZWZ0XCIpXG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICB0aGlzLiN2YWx1ZV9ib3gub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGlmIChlLmRhdGEpIHtcbiAgICAgICAgaWYgKCEvW1xcZCwuLV0vZy50ZXN0KGUuZGF0YSkpIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZWxzZSBpZiAoL1ssLl0vZy50ZXN0KGUuZGF0YSkgJiYgdGhpcy4jZGVjaW1hbHMgPT09IDApXG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAodGhpcy4jbWluID49IDAgJiYgLy0vZy50ZXN0KGUuZGF0YSkpIHx8XG4gICAgICAgICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50Py5pbmNsdWRlcyhcIi1cIilcbiAgICAgICAgKVxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgc2V0IHVuaXQodW5pdDogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jdW5pdCA9IHVuaXQgfHwgXCJcIjtcbiAgICB0aGlzLiN1bml0X2JveC50ZXh0Q29udGVudCA9IHRoaXMuI3VuaXQ7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBkZWNpbWFscyhkZWM6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI2RlY2ltYWxzID0gZGVjIHx8IDA7XG4gICAgdGhpcy4jdXBkYXRlX21pbl9sZWdlbmQoKTtcbiAgICB0aGlzLiN1cGRhdGVfbWF4X2xlbmdlbmQoKTtcbiAgfVxuXG4gIHNldCBtaW4obWluOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNtaW4gPSBtaW4gPz8gLUluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9taW5fbGVnZW5kKCk7XG4gIH1cbiAgI3VwZGF0ZV9taW5fbGVnZW5kKCkge1xuICAgIHRoaXMuI21pbl9sZWdlbmQudGV4dENvbnRlbnQgPVxuICAgICAgdGhpcy4jbWluID09PSAtSW5maW5pdHkgPyBcIlwiIDogXCJNaW46XCIgKyB0aGlzLiNtaW4udG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICBzZXQgbWF4KG1heDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4ID0gbWF4ID8/IEluZmluaXR5O1xuICAgIHRoaXMuI3VwZGF0ZV9tYXhfbGVuZ2VuZCgpO1xuICB9XG4gICN1cGRhdGVfbWF4X2xlbmdlbmQoKSB7XG4gICAgdGhpcy4jbWF4X2xlZ2VuZC50ZXh0Q29udGVudCA9XG4gICAgICB0aGlzLiNtYXggPT09IEluZmluaXR5ID8gXCJcIiA6IFwiTWF4OlwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpO1xuICB9XG5cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jc3RlcCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIHNldCBzdGFydChzdGVwOiBudW1iZXIgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNzdGFydCA9IHN0ZXAgfHwgMDtcbiAgfVxuXG4gIC8qKlNldCB3ZXRoZXIgdGhlIHNsaWRlciBpcyBpbiBsaXZlIG1vZGUqL1xuICBzZXQgbGl2ZShsaXZlOiBib29sZWFuIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbGl2ZSA9IGxpdmUgfHwgZmFsc2U7XG4gIH1cblxuICBzZXQgaWNvbl9kZWNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2RlYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfcmVtb3ZlX3JvdW5kZWQoKSwgZmFsc2UpLFxuICAgICk7XG4gIH1cblxuICBzZXQgaWNvbl9pbmNyZWFzZShpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5yZXBsYWNlQ2hpbGQoXG4gICAgICB0aGlzLiNpY29uX2luYyxcbiAgICAgIHRoaXMuI3N0ZXBwZXJfZnVuYyhpY29uID8gaWNvbigpIDogbWF0ZXJpYWxfYWRkX3JvdW5kZWQoKSwgdHJ1ZSksXG4gICAgKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMuI21vdmVfdmFsdWUodmFsdWUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3ZhbHVlX2JveC50ZXh0Q29udGVudCA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKGVycjogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc29sZS5lcnJvcihlcnIpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBudW1iZXIpOiBQcm9taXNlTGlrZTxSZXN1bHQ8bnVtYmVyLCBzdHJpbmc+PiB7XG4gICAgbGV0IGxpbSA9IG51bWJlcl9zdGVwX3N0YXJ0X2RlY2ltYWwoXG4gICAgICBNYXRoLm1pbihNYXRoLm1heCh2YWwsIHRoaXMuI21pbiksIHRoaXMuI21heCksXG4gICAgICB0aGlzLiNzdGVwLFxuICAgICAgdGhpcy4jc3RhcnQsXG4gICAgICB0aGlzLiNkZWNpbWFscyxcbiAgICApO1xuICAgIGlmIChsaW0gPCB0aGlzLiNtaW4pIGxpbSArPSB0aGlzLiNzdGVwO1xuICAgIGlmIChsaW0gPiB0aGlzLiNtYXgpIGxpbSAtPSB0aGlzLiNzdGVwO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZShsaW0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogbnVtYmVyKTogUHJvbWlzZUxpa2U8UmVzdWx0PG51bWJlciwgc3RyaW5nPj4ge1xuICAgIGlmICh2YWwgPCB0aGlzLiNtaW4pXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNaW5pbXVtIHZhbHVlIFwiICsgdGhpcy4jbWluLnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGlmICh2YWwgPiB0aGlzLiNtYXgpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoXCJNYXhpbXVtIHZhbHVlIFwiICsgdGhpcy4jbWF4LnRvRml4ZWQodGhpcy4jZGVjaW1hbHMpICsgdGhpcy4jdW5pdCksXG4gICAgICApO1xuICAgIGxldCBsaW0gPSBudW1iZXJfc3RlcF9zdGFydF9kZWNpbWFsKFxuICAgICAgdmFsLFxuICAgICAgdGhpcy4jc3RlcCxcbiAgICAgIHRoaXMuI3N0YXJ0LFxuICAgICAgdGhpcy4jZGVjaW1hbHMsXG4gICAgKTtcbiAgICBpZiAobGltIDwgdGhpcy4jbWluKSBsaW0gKz0gdGhpcy4jc3RlcDtcbiAgICBpZiAobGltID4gdGhpcy4jbWF4KSBsaW0gLT0gdGhpcy4jc3RlcDtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUobGltKTtcbiAgfVxuXG4gIC8qKk1vdmVzIHRoZSB2YWx1ZSB0byBhIHBvc2l0aW9uIGJ5IHRoZSBtb3VzZSB4IGNvb3JkaW5hdGVzKi9cbiAgYXN5bmMgI21vdmVfZGlmZih2YWx1ZTogbnVtYmVyLCBsYXN0OiBib29sZWFuID0gZmFsc2UpIHtcbiAgICBpZiAodGhpcy4jbGl2ZSkgdGhpcy5zZXRfdmFsdWVfbGltaXQodmFsdWUpO1xuICAgIGVsc2Uge1xuICAgICAgaWYgKGxhc3QpIHRoaXMuc2V0X3ZhbHVlX2xpbWl0KHZhbHVlKTtcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBsaW0gPSBhd2FpdCB0aGlzLmxpbWl0X3ZhbHVlKHZhbHVlKTtcbiAgICAgICAgaWYgKGxpbS5vaykgdGhpcy4jbW92ZV92YWx1ZShsaW0udmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKk1vdmVzIHRoZSBzbGlkZXIgdG8gdGhlIGdpdmVuIHBlcmNlbnQgcG9zaXRpb24qL1xuICAjbW92ZV92YWx1ZSh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnRleHRDb250ZW50ID0gdmFsdWUudG9GaXhlZCh0aGlzLiNkZWNpbWFscyk7XG4gIH1cblxuICAvKipBdHRhY2hlcyBjbGljayBhY3Rpb24gdG8gb3ZlciB0aW1lIGluY3JlYXNlIHNwZWVkIG9mIHN0ZXBwaW5nIHdoZW4gaG9sZGluZyBzdGVwIGJ1dHRvbnMgKi9cbiAgI3N0ZXBwZXJfZnVuYyhpY29uOiBTVkdTVkdFbGVtZW50LCBkaXI6IGJvb2xlYW4pIHtcbiAgICBpY29uLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUuYnV0dG9uID09PSAwKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGxldCBpbnRlcnZhbCA9IDA7XG4gICAgICAgIGxldCBzY2FsZXJfaW50ZXJ2YWwgPSAwO1xuICAgICAgICBsZXQgc2NhbGVyID0gMjUwO1xuICAgICAgICBjb25zdCByZWxlYXNlID0gKCkgPT4ge1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwpO1xuICAgICAgICAgIGNsZWFySW50ZXJ2YWwoc2NhbGVyX2ludGVydmFsKTtcbiAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dCk7XG4gICAgICAgICAgaWNvbi5vbnBvaW50ZXJ1cCA9IG51bGw7XG4gICAgICAgICAgaWNvbi5yZWxlYXNlUG9pbnRlckNhcHR1cmUoZS5wb2ludGVySWQpO1xuICAgICAgICAgIGljb24uY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWNvbi5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIGljb24uY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgY29uc3QgdGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuI3N0ZXBfdmFsdWUoZGlyKTtcbiAgICAgICAgICBpbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHRoaXMuI3N0ZXBfdmFsdWUoZGlyKSwgc2NhbGVyKTtcbiAgICAgICAgICBzY2FsZXJfaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoc2NhbGVyID4gMjApIHNjYWxlciAvPSAxLjE7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsKTtcbiAgICAgICAgICAgIGludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy4jc3RlcF92YWx1ZShkaXIpLCBzY2FsZXIpO1xuICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICB9LCA1MDApO1xuICAgICAgICBpY29uLm9ucG9pbnRlcnVwID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChpbnRlcnZhbCA9PT0gMCkgdGhpcy4jc3RlcF92YWx1ZShkaXIpO1xuICAgICAgICAgIHJlbGVhc2UoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHJldHVybiBpY29uO1xuICB9XG5cbiAgI3N0ZXBfdmFsdWUoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc3RlcCA9XG4gICAgICB0aGlzLiNzdGVwIHx8XG4gICAgICBNYXRoLm1heChcbiAgICAgICAgdGhpcy4jZGVjaW1hbHMgPyAxIC8gdGhpcy4jZGVjaW1hbHMgOiAxLFxuICAgICAgICBNYXRoLmZsb29yKE1hdGguYWJzKHRoaXMuYnVmZmVyIHx8IDApIC8gMTUwKSxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKCh0aGlzLmJ1ZmZlciB8fCAwKSArIChkaXIgPyBzdGVwIDogLXN0ZXApKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVN0ZXBwZXIpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9zdGVwcGVyPElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1TdGVwcGVyQmFzZU9wdGlvbnM8SUQ+LFxuKTogRm9ybVN0ZXBwZXI8SUQ+IHtcbiAgY29uc3Qgc2xpZGUgPSBuZXcgRm9ybVN0ZXBwZXI8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBzbGlkZS5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIGlmIChvcHRpb25zLmljb25fZGVjcmVhc2UpIHNsaWRlLmljb25fZGVjcmVhc2UgPSBvcHRpb25zLmljb25fZGVjcmVhc2U7XG4gICAgaWYgKG9wdGlvbnMuaWNvbl9pbmNyZWFzZSkgc2xpZGUuaWNvbl9pbmNyZWFzZSA9IG9wdGlvbnMuaWNvbl9pbmNyZWFzZTtcbiAgICBGb3JtTnVtYmVyV3JpdGUuYXBwbHlfb3B0aW9ucyhzbGlkZSwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIHNsaWRlO1xufVxuIiwiaW1wb3J0IHsgc29tZSB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHN0YXRlLCB7IHR5cGUgU3RhdGVFbnVtUmVsYXRlZCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXN0YXRlXCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vYmFzZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZWxlY3Rvck9wdGlvbjxSVD4ge1xuICAvKipWYWx1ZSB0byBzZXQgd2hlbiBvcHRpb24gaXMgc2VsZWN0ZWQgKi9cbiAgdmFsdWU6IFJUO1xuICAvKipUZXh0IGZvciBzZWxlY3Rpb24gKi9cbiAgdGV4dDogc3RyaW5nO1xuICAvKipJY29uIHRvIGRpc3BsYXkgZm9yIG9wdGlvbiovXG4gIGljb24/OiBTVkdGdW5jO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zPFxuICBULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPFQsIElEPiB7XG4gIC8qKk9wdGlvbnMgZm9yIHNlbGVjdG9yKi9cbiAgc2VsZWN0aW9ucz86IEZvcm1TZWxlY3Rvck9wdGlvbjxUPltdO1xufVxuXG4vKipCYXNlIGZvciBudW1iZXIgZWxlbWVudHMgZWxlbWVudHMqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEZvcm1TZWxlY3RvckJhc2U8XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxSVCwgSUQ+IHtcbiAgLyoqU2V0cyB0aGUgc2VsZWN0aW9uIG9wdGlvbnMgZm9yIHRoZSBzZWxlY3RvciAqL1xuICBhYnN0cmFjdCBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpO1xuXG4gIHN0YXRpYyBhcHBseV9vcHRpb25zPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gICAgZWxlbWVudDogRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+LFxuICAgIG9wdGlvbnM6IEZvcm1TZWxlY3RvckJhc2VPcHRpb25zPFJULCBJRD4sXG4gICkge1xuICAgIGlmIChvcHRpb25zLnNlbGVjdGlvbnMpIGVsZW1lbnQuc2VsZWN0aW9ucyA9IG9wdGlvbnMuc2VsZWN0aW9ucztcbiAgICBzdXBlci5hcHBseV9vcHRpb25zKGVsZW1lbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZUVudW1SZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLmxpc3QpIHtcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3BfbWFwKFxuICAgICAgICBcInNlbGVjdGlvbnNcIixcbiAgICAgICAgcmVsYXRlZC5saXN0LFxuICAgICAgICAoKSA9PiBzb21lKFtdKSxcbiAgICAgICAgKHZhbCkgPT4ge1xuICAgICAgICAgIHJldHVybiBzb21lKFxuICAgICAgICAgICAgc3RhdGUuZS5tYXAodmFsLCAoa2V5LCB2YWwpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiB2YWwubmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZToga2V5IGFzIFJULFxuICAgICAgICAgICAgICAgIGljb246IHZhbC5pY29uLFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBCYXNlLCBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIG1hdGVyaWFsX2Nsb3NlX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3VuZm9sZF9sZXNzX3JvdW5kZWQsXG4gIG1hdGVyaWFsX3VuZm9sZF9tb3JlX3JvdW5kZWQsXG59IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWljb25zXCI7XG5pbXBvcnQgdHlwZSB7IFNWR0Z1bmMgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdmdcIjtcbmltcG9ydCB7XG4gIEZvcm1TZWxlY3RvckJhc2UsXG4gIHR5cGUgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnMsXG4gIHR5cGUgRm9ybVNlbGVjdG9yT3B0aW9uLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JfYmFzZVwiO1xuaW1wb3J0IFwiLi9kcm9wX2Rvd24uc2Nzc1wiO1xuXG5pbnRlcmZhY2UgU2VsT3B0aW9ucyB7XG4gIHRleHQ6IHN0cmluZztcbiAgaWNvbj86IFNWR0Z1bmM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybURyb3BEb3duT3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1TZWxlY3RvckJhc2VPcHRpb25zPFJULCBJRD4ge1xuICAvKipEZWZhdWx0IHRleHQgZGlzcGxheWVkKi9cbiAgZGVmYXVsdD86IHN0cmluZztcbiAgLyoqRGVmYXVsdCBpY29uIGRpc3BsYXllZCovXG4gIGRlZmF1bHRfaWNvbj86IFNWR0Z1bmM7XG59XG5cbi8qKkRyb3Bkb3duIGJveCBmb3Igc2VsZWN0aW5nIGJldHdlZW4gbXVsdGlwbGUgY2hvaWNlcyBpbiBhIHNtYWxsIHNwYWNlKi9cbmV4cG9ydCBjbGFzcyBGb3JtRHJvcGRvd248XG4gIFJULFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtU2VsZWN0b3JCYXNlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRyb3Bkb3duXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtYXA6IE1hcDxSVCwgU2VsT3B0aW9ucz4gPSBuZXcgTWFwKCk7XG4gICN2YWx1ZXM6IFJUW10gPSBbXTtcbiAgI3NlbGVjdGVkOiBudW1iZXIgPSAtMTtcblxuICAjaWNvbj86IFNWR1NWR0VsZW1lbnQ7XG4gICN0ZXh0OiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICNvcGVuOiBTVkdTVkdFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkKCkpO1xuICAjZGVmYXVsdDogVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiU2VsZWN0IHNvbWV0aGluZ1wiKTtcbiAgI2RlZmF1bHRfaWNvbj86IFNWR0Z1bmM7XG4gIHByaXZhdGUgaXNfb3BlbjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy4jdGV4dC5hcHBlbmQodGhpcy4jZGVmYXVsdCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMudGFiSW5kZXggPSAwO1xuICAgIHRoaXMub25jbGljayA9ICgpID0+ICh0aGlzLm9wZW4gPSB0cnVlKTtcbiAgICB0aGlzLm9ucG9pbnRlcmRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUucG9pbnRlclR5cGUgPT09IFwibW91c2VcIikge1xuICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgIGNhc2UgXCIgXCI6XG4gICAgICAgIGNhc2UgXCJFbnRlclwiOlxuICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm9wZW4gPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwiQXJyb3dEb3duXCI6XG4gICAgICAgIGNhc2UgXCJBcnJvd1VwXCI6XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgdGhpcy4jc2VsZWN0X2FkamFjZW50KGUua2V5ID09PSBcIkFycm93RG93blwiKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgLyoqR2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIGdldCBkZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLiNkZWZhdWx0Lm5vZGVWYWx1ZSB8fCBcIlwiO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGVmYXVsdCB0ZXh0IGRpc3BsYXllZCB3aGVuIG5vdGhpbmcgaGFzIGJlZW4gc2VsZWN0ZWQgeWV0ICovXG4gIHNldCBkZWZhdWx0KGRlZjogc3RyaW5nKSB7XG4gICAgdGhpcy4jZGVmYXVsdC5ub2RlVmFsdWUgPSBkZWY7XG4gIH1cblxuICAvKipTZXRzIHRoZSBkZWZhdWx0IHRleHQgZGlzcGxheWVkIHdoZW4gbm90aGluZyBoYXMgYmVlbiBzZWxlY3RlZCB5ZXQgKi9cbiAgc2V0IGRlZmF1bHRfaWNvbihkZWY6IFNWR0Z1bmMgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNkZWZhdWx0X2ljb24gPSBkZWY7XG4gICAgaWYgKGRlZiAmJiB0aGlzLiNzZWxlY3RlZCA9PT0gLTEpIHRoaXMuI3NldF9pY29uID0gZGVmO1xuICB9XG5cbiAgc2V0IHNlbGVjdGlvbnMoc2VsZWN0aW9uczogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPltdIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuI21hcC5zaXplID4gMCkge1xuICAgICAgdGhpcy4jbWFwLmNsZWFyKCk7XG4gICAgICB0aGlzLiN2YWx1ZXMgPSBbXTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gLTE7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlLCB0ZXh0LCBpY29uIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgeyB0ZXh0LCBpY29uIH0pO1xuICAgICAgdGhpcy4jdmFsdWVzLnB1c2godmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5idWZmZXIgIT09IHVuZGVmaW5lZCkgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICB9XG5cbiAgc2V0IG9wZW4ob3BlbjogYm9vbGVhbikge1xuICAgIGlmIChvcGVuICYmICF0aGlzLmlzX29wZW4pIHtcbiAgICAgIGNvbnN0IG9sZCA9IHRoaXMuI29wZW47XG4gICAgICB0aGlzLiNvcGVuID0gbWF0ZXJpYWxfdW5mb2xkX2xlc3Nfcm91bmRlZCgpO1xuICAgICAgb2xkLnJlcGxhY2VXaXRoKHRoaXMuI29wZW4pO1xuICAgICAgYm94Lm9wZW5fbWVudSh0aGlzLiNtYXAsIHRoaXMsIHRoaXMuYnVmZmVyKTtcbiAgICB9IGVsc2UgaWYgKCFvcGVuICYmIHRoaXMuaXNfb3Blbikge1xuICAgICAgY29uc3Qgb2xkID0gdGhpcy4jb3BlbjtcbiAgICAgIHRoaXMuI29wZW4gPSBtYXRlcmlhbF91bmZvbGRfbW9yZV9yb3VuZGVkKCk7XG4gICAgICBvbGQucmVwbGFjZVdpdGgodGhpcy4jb3Blbik7XG4gICAgICBib3guY2xvc2VfbWVudSgpO1xuICAgIH1cbiAgICB0aGlzLmlzX29wZW4gPSBvcGVuO1xuICB9XG5cbiAgLyoqQ2hhbmdlcyB0aGUgaWNvbiBvZiB0aGUgYnV0dG9uKi9cbiAgc2V0ICNzZXRfaWNvbihpY29uOiBTVkdGdW5jIHwgdW5kZWZpbmVkKSB7XG4gICAgaWYgKGljb24pIHtcbiAgICAgIGNvbnN0IGkgPSBpY29uKCk7XG4gICAgICBpZiAodGhpcy4jaWNvbikgdGhpcy5yZXBsYWNlQ2hpbGQoaSwgdGhpcy4jaWNvbik7XG4gICAgICBlbHNlIHRoaXMuaW5zZXJ0QmVmb3JlKGksIHRoaXMuI3RleHQpO1xuICAgICAgdGhpcy4jaWNvbiA9IGk7XG4gICAgfSBlbHNlIGlmICh0aGlzLiNpY29uKSB7XG4gICAgICB0aGlzLnJlbW92ZUNoaWxkKHRoaXMuI2ljb24pO1xuICAgICAgdGhpcy4jaWNvbiA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgI2NsZWFyKCkge1xuICAgIHRoaXMuZGVmYXVsdF9pY29uID0gdGhpcy4jZGVmYXVsdF9pY29uXG4gICAgICA/ICh0aGlzLiNzZXRfaWNvbiA9IHRoaXMuI2RlZmF1bHRfaWNvbilcbiAgICAgIDogKHRoaXMuI3NldF9pY29uID0gdW5kZWZpbmVkKTtcbiAgICB0aGlzLiN0ZXh0LnJlcGxhY2VDaGlsZHJlbih0aGlzLiNkZWZhdWx0KTtcbiAgfVxuXG4gIC8qKkNhbGxlZCB3aGVuIFZhbHVlIGlzIGNoYW5nZWQgKi9cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpIHtcbiAgICBpZiAoIXRoaXMuI21hcC5oYXModmFsdWUpKSB7XG4gICAgICB0aGlzLiNjbGVhcigpO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgb3B0ID0gdGhpcy4jbWFwLmdldCh2YWx1ZSkhO1xuICAgIHRoaXMuI3RleHQuaW5uZXJUZXh0ID0gb3B0LnRleHQ7XG4gICAgdGhpcy4jc2VsZWN0ZWQgPSB0aGlzLiN2YWx1ZXMuaW5kZXhPZih2YWx1ZSk7XG4gICAgaWYgKG9wdC5pY29uKSB0aGlzLiNzZXRfaWNvbiA9IG9wdC5pY29uO1xuICAgIGVsc2UgdGhpcy4jc2V0X2ljb24gPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgd2FybihtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHN1cGVyLndhcm4obWVzc2FnZSk7XG4gICAgfSwgMCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Ecm9wZG93bik7XG5cbi8qKkNyZWF0ZXMgYSBkcm9wZG93biBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2Ryb3Bkb3duPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtRHJvcERvd25PcHRpb25zPFJULCBJRD4sXG4pOiBGb3JtRHJvcGRvd248UlQsIElEPiB7XG4gIGNvbnN0IGRyb3AgPSBuZXcgRm9ybURyb3Bkb3duPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmRlZmF1bHQpIGRyb3AuZGVmYXVsdCA9IG9wdGlvbnMuZGVmYXVsdDtcbiAgICBpZiAob3B0aW9ucy5kZWZhdWx0X2ljb24pIGRyb3AuZGVmYXVsdF9pY29uID0gb3B0aW9ucy5kZWZhdWx0X2ljb247XG4gICAgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKGRyb3AsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBkcm9wO1xufVxuXG4vLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjI1xuY2xhc3MgRHJvcERvd25Cb3ggZXh0ZW5kcyBCYXNlIHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJkcm9wZG93bmJveFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjY2xvc2VyOiBIVE1MRGl2RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICNjb250YWluZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcbiAgI3Njcm9sbDogSFRNTERpdkVsZW1lbnQgPSB0aGlzLiNjb250YWluZXIuYXBwZW5kQ2hpbGQoXG4gICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSxcbiAgKTtcbiAgI3RhYmxlOiBIVE1MRGl2RWxlbWVudCA9IHRoaXMuI3Njcm9sbC5hcHBlbmRDaGlsZChcbiAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLFxuICApO1xuICAjZHJvcGRvd246IEZvcm1Ecm9wZG93bjxhbnksIGFueT4gfCB1bmRlZmluZWQ7XG4gICNmb2N1c19vdXRfaGFuZGxlciA9IChlOiBGb2N1c0V2ZW50KSA9PiB7XG4gICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgaWYgKCFlLnJlbGF0ZWRUYXJnZXQgfHwgIXRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0IGFzIE5vZGUpKVxuICAgICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH07XG4gICN3aW5kb3dfcmVzaXplX2hhbmRsZXIgPSAoKSA9PiB0aGlzLmNsb3NlX21lbnUoKTtcbiAgI2lzX29wZW46IGJvb2xlYW4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuI2NvbnRhaW5lci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY29udGFpbmVyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dVcFwiIHx8IChlLnNoaWZ0S2V5ICYmIGUua2V5ID09PSBcIlRhYlwiKSkge1xuICAgICAgICBjb25zdCBlbGVtID1cbiAgICAgICAgICBlLnRhcmdldCA9PT0gdGhpcy4jY29udGFpbmVyXG4gICAgICAgICAgICA/IHRoaXMuI3RhYmxlLmxhc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICBpZiAoZWxlbSkgKGVsZW0gYXMgSFRNTEVsZW1lbnQpLmZvY3VzKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkFycm93RG93blwiIHx8IGUua2V5ID09PSBcIlRhYlwiKSB7XG4gICAgICAgIGNvbnN0IGVsZW0gPVxuICAgICAgICAgIGUudGFyZ2V0ID09PSB0aGlzLiNjb250YWluZXJcbiAgICAgICAgICAgID8gdGhpcy4jdGFibGUuZmlyc3RFbGVtZW50Q2hpbGRcbiAgICAgICAgICAgIDogKGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICAgIGlmIChlbGVtKSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfTtcblxuICAgIHRoaXMuI2Nsb3NlclxuICAgICAgLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpXG4gICAgICAuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2xvc2Vfcm91bmRlZCgpKTtcbiAgICB0aGlzLiNjbG9zZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSkuaW5uZXJIVE1MID0gXCJDbG9zZVwiO1xuICAgIHRoaXMuI2Nsb3Nlci50YWJJbmRleCA9IDA7XG4gICAgdGhpcy4jY2xvc2VyLm9uY2xpY2sgPSAoZSkgPT4ge1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuY2xvc2VfbWVudSgpO1xuICAgIH07XG4gICAgdGhpcy4jY2xvc2VyLm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmNsb3NlX21lbnUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKFwiZm9jdXNvdXRcIiwgdGhpcy4jZm9jdXNfb3V0X2hhbmRsZXIsIHtcbiAgICAgIGNhcHR1cmU6IHRydWUsXG4gICAgfSk7XG4gIH1cblxuICAjc2V0X3ZhbHVlKHZhbHVlOiB1bmtub3duKSB7XG4gICAgLy9AdHMtZXhwZWN0LWVycm9yIENhbGwgcHJpdmF0ZSBtZXRob2QgZnJvbSBzaXN0ZXIgY2xhc3NcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHRoaXMuI2Ryb3Bkb3duLnNldF92YWx1ZV9jaGVjayh2YWx1ZSk7XG4gICAgdGhpcy5jbG9zZV9tZW51KCk7XG4gIH1cblxuICBvcGVuX21lbnUoXG4gICAgbWFwOiBNYXA8YW55LCBTZWxPcHRpb25zPixcbiAgICBwYXJlbnQ6IEZvcm1Ecm9wZG93bjxhbnksIGFueT4sXG4gICAgdmFsdWU6IGFueSxcbiAgKSB7XG4gICAgY29uc3QgaW5uZXJfaGVpZ2h0ID0gdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5pbm5lckhlaWdodCB8fCAwO1xuICAgIHRoaXMuY2xhc3NMaXN0LmFkZChcIm9wZW5cIik7XG4gICAgY29uc3QgYm91bmRzID0gcGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGlmIChib3VuZHMueSArIGJvdW5kcy5oZWlnaHQgLyAyIDwgaW5uZXJfaGVpZ2h0IC8gMikge1xuICAgICAgY29uc3QgdG9wID0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLnRvcCA9IHRvcCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5ib3R0b20gPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9IGlubmVyX2hlaWdodCAtIHRvcCAtIDEwICsgXCJweFwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmZsZXhEaXJlY3Rpb24gPSBcImNvbHVtblwiO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBib3R0b20gPSBpbm5lcl9oZWlnaHQgLSBib3VuZHMueTtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS50b3AgPSBcIlwiO1xuICAgICAgdGhpcy4jY29udGFpbmVyLnN0eWxlLmJvdHRvbSA9IGJvdHRvbSArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5tYXhIZWlnaHQgPSBpbm5lcl9oZWlnaHQgLSBib3R0b20gLSAxMCArIFwicHhcIjtcbiAgICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS5mbGV4RGlyZWN0aW9uID0gXCJjb2x1bW4tcmV2ZXJzZVwiO1xuICAgIH1cbiAgICB0aGlzLiNjb250YWluZXIuc3R5bGUubGVmdCA9IGJvdW5kcy54ICsgXCJweFwiO1xuICAgIHRoaXMuI2NvbnRhaW5lci5zdHlsZS53aWR0aCA9IGJvdW5kcy53aWR0aCArIFwicHhcIjtcbiAgICB0aGlzLiNkcm9wZG93biA9IHBhcmVudDtcblxuICAgIGlmICh0aGlzLiNzY3JvbGwuc2Nyb2xsSGVpZ2h0ID4gdGhpcy4jc2Nyb2xsLmNsaWVudEhlaWdodClcbiAgICAgIHRoaXMuI3Njcm9sbC5jbGFzc0xpc3QuYWRkKFwic2Nyb2xsXCIpO1xuICAgIGVsc2UgdGhpcy4jc2Nyb2xsLmNsYXNzTGlzdC5yZW1vdmUoXCJzY3JvbGxcIik7XG5cbiAgICBsZXQgZm9jdXM6IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkIGFzIEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLkFycmF5LmZyb20obWFwKS5tYXAoKFt2YWwsIG9wdF0pID0+IHtcbiAgICAgICAgY29uc3QgbGluZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7XG4gICAgICAgIGNvbnN0IGljb24gPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICBpZiAob3B0Lmljb24pIGljb24uYXBwZW5kQ2hpbGQob3B0Lmljb24oKSk7XG4gICAgICAgIGNvbnN0IHRleHQgPSBsaW5lLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgICAgICB0ZXh0LnRleHRDb250ZW50ID0gb3B0LnRleHQ7XG4gICAgICAgIGxpbmUub25wb2ludGVydXAgPSAoZSkgPT4ge1xuICAgICAgICAgIGlmIChlLnBvaW50ZXJUeXBlICE9PSBcInRvdWNoXCIpIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICB9O1xuICAgICAgICBsaW5lLm9uY2xpY2sgPSAoKSA9PiB0aGlzLiNzZXRfdmFsdWUodmFsKTtcbiAgICAgICAgbGluZS50YWJJbmRleCA9IDA7XG4gICAgICAgIGxpbmUub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgICAgICBpZiAoZS5rZXkgPT09IFwiIFwiIHx8IGUua2V5ID09PSBcIkVudGVyXCIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuI3NldF92YWx1ZSh2YWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKHZhbCA9PT0gdmFsdWUpIGZvY3VzID0gbGluZTtcbiAgICAgICAgcmV0dXJuIGxpbmU7XG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgLy9TaG93IGNsb3NlciBvciBub3RcbiAgICBjb25zdCBib3ggPSB0aGlzLiNzY3JvbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgYm94X2FyZWEgPSBib3gud2lkdGggKiBib3guaGVpZ2h0O1xuICAgIGNvbnN0IGh0bWwgPSB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIGNvbnN0IGh0bWxfYXJlYSA9IGh0bWwuY2xpZW50V2lkdGggKiBodG1sLmNsaWVudEhlaWdodDtcbiAgICBpZiAoYm94X2FyZWEgPiBodG1sX2FyZWEgKiAwLjUpIHtcbiAgICAgIHRoaXMuI3RhYmxlLnByZXBlbmQodGhpcy4jY2xvc2VyKTtcbiAgICB9XG5cbiAgICBpZiAoZm9jdXMpIHtcbiAgICAgIGZvY3VzLmZvY3VzKCk7XG4gICAgICBmb2N1cy5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgfSBlbHNlIHRoaXMuI2NvbnRhaW5lci5mb2N1cygpO1xuXG4gICAgdGhpcy5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3Py5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgXCJyZXNpemVcIixcbiAgICAgIHRoaXMuI3dpbmRvd19yZXNpemVfaGFuZGxlcixcbiAgICAgIHsgcGFzc2l2ZTogdHJ1ZSB9LFxuICAgICk7XG4gICAgdGhpcy4jaXNfb3BlbiA9IHRydWU7XG4gIH1cblxuICBjbG9zZV9tZW51KCkge1xuICAgIGlmICghdGhpcy4jaXNfb3BlbikgcmV0dXJuO1xuICAgIHRoaXMuI2lzX29wZW4gPSBmYWxzZTtcbiAgICBpZiAodGhpcy4jZHJvcGRvd24pIHRoaXMuI2Ryb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmNsYXNzTGlzdC5yZW1vdmUoXCJvcGVuXCIpO1xuICAgIHRoaXMuI3RhYmxlLnJlcGxhY2VDaGlsZHJlbigpO1xuICAgIGlmICh0aGlzLiNkcm9wZG93bikge1xuICAgICAgdGhpcy4jZHJvcGRvd24uZm9jdXMoKTtcbiAgICAgIC8vQHRzLWV4cGVjdC1lcnJvciBPdmVyd3JpdGUgcHJpdmF0ZSBwcm9wZXJ0eSBmcm9tIHNpc3RlciBjbGFzc1xuICAgICAgdGhpcy4jZHJvcGRvd24uaXNfb3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc/LnJlbW92ZUV2ZW50TGlzdGVuZXIoXG4gICAgICBcInJlc2l6ZVwiLFxuICAgICAgdGhpcy4jd2luZG93X3Jlc2l6ZV9oYW5kbGVyLFxuICAgICk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KERyb3BEb3duQm94KTtcbmNvbnN0IGJveCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZChuZXcgRHJvcERvd25Cb3goKSk7XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIEZvcm1TZWxlY3RvckJhc2UsXG4gIHR5cGUgRm9ybVNlbGVjdG9yQmFzZU9wdGlvbnMsXG4gIHR5cGUgRm9ybVNlbGVjdG9yT3B0aW9uLFxufSBmcm9tIFwiLi4vc2VsZWN0b3JfYmFzZVwiO1xuaW1wb3J0IFwiLi90b2dnbGVfYnV0dG9uLnNjc3NcIjtcblxuaW50ZXJmYWNlIFNlbE9wdGlvbnMge1xuICB0b3A6IEhUTUxEaXZFbGVtZW50O1xuICBib3Q6IEhUTUxEaXZFbGVtZW50O1xufVxuXG4vKipUb2dnbGUgYnV0dG9ucywgZGlzcGxheXMgYWxsIG9wdGlvbnMgaW4gYSBtdWx0aSB0b2dnbGVyKi9cbmV4cG9ydCBjbGFzcyBGb3JtVG9nZ2xlQnV0dG9uPFxuICBSVCxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVNlbGVjdG9yQmFzZTxSVCwgSUQ+IHtcbiAgLyoqUmV0dXJucyB0aGUgbmFtZSB1c2VkIHRvIGRlZmluZSB0aGUgZWxlbWVudCovXG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwidG9nZ2xlYnV0dG9uXCI7XG4gIH1cbiAgc3RhdGljIGVsZW1lbnRfbmFtZV9zcGFjZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBcImZvcm1cIjtcbiAgfVxuXG4gICNtYXA6IE1hcDxSVCwgU2VsT3B0aW9ucz4gPSBuZXcgTWFwKCk7XG4gICN2YWx1ZXM6IFJUW10gPSBbXTtcbiAgI3NlbGVjdGVkOiBudW1iZXIgPSAtMTtcblxuICBzZXQgc2VsZWN0aW9ucyhzZWxlY3Rpb25zOiBGb3JtU2VsZWN0b3JPcHRpb248UlQ+W10gfCB1bmRlZmluZWQpIHtcbiAgICBpZiAodGhpcy4jbWFwLnNpemUgPiAwKSB7XG4gICAgICB0aGlzLiNtYXAuY2xlYXIoKTtcbiAgICAgIHRoaXMuI3ZhbHVlcyA9IFtdO1xuICAgICAgdGhpcy4jc2VsZWN0ZWQgPSAtMTtcbiAgICAgIHRoaXMucmVwbGFjZUNoaWxkcmVuKCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBzZWxlY3Rpb25zICYmIGkgPCBzZWxlY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBzZWxlY3Rpb25zW2ldO1xuICAgICAgdGhpcy4jbWFwLnNldCh2YWx1ZSwgdGhpcy4jYWRkX3NlbGVjdGlvbihzZWxlY3Rpb25zW2ldKSk7XG4gICAgICB0aGlzLiN2YWx1ZXMucHVzaChzZWxlY3Rpb25zW2ldLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYnVmZmVyICE9PSB1bmRlZmluZWQpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgfVxuXG4gICNhZGRfc2VsZWN0aW9uKHNlbGVjdGlvbjogRm9ybVNlbGVjdG9yT3B0aW9uPFJUPikge1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgdG9wLnRhYkluZGV4ID0gMDtcbiAgICBjb25zdCBib3QgPSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpO1xuICAgIGlmIChzZWxlY3Rpb24uaWNvbikge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHNlbGVjdGlvbi5pY29uKCkpO1xuICAgICAgYm90LnRleHRDb250ZW50ID0gc2VsZWN0aW9uLnRleHQ7XG4gICAgfSBlbHNlIHRvcC50ZXh0Q29udGVudCA9IHNlbGVjdGlvbi50ZXh0O1xuICAgIGNvbnN0IGNsaWNrID0gKCkgPT4ge1xuICAgICAgdG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhzZWxlY3Rpb24udmFsdWUpO1xuICAgIH07XG4gICAgdG9wLm9uY2xpY2sgPSBjbGljaztcbiAgICBib3Qub25jbGljayA9IGNsaWNrO1xuICAgIHRvcC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIiBcIiB8fCBlLmtleSA9PT0gXCJFbnRlclwiKSBjbGljaygpO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiKSB0aGlzLiNzZWxlY3RfYWRqYWNlbnQodHJ1ZSk7XG4gICAgICBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIikgdGhpcy4jc2VsZWN0X2FkamFjZW50KGZhbHNlKTtcbiAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9O1xuICAgIHJldHVybiB7IHRvcCwgYm90IH07XG4gIH1cblxuICAvKipTZWxlY3RzIHRoZSBwcmV2aW91cyBvciBuZXh0IHNlbGVjdGlvbiBpbiB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gZGlyIGZhbHNlIGlzIG5leHQgdHJ1ZSBpcyBwcmV2aW91cyovXG4gICNzZWxlY3RfYWRqYWNlbnQoZGlyOiBib29sZWFuKSB7XG4gICAgY29uc3Qgc2VsID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAoc2VsKSBzZWwudG9wLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgY29uc3QgeSA9IE1hdGgubWluKFxuICAgICAgdGhpcy4jdmFsdWVzLmxlbmd0aCAtIDEsXG4gICAgICBNYXRoLm1heCgwLCBkaXIgPyB0aGlzLiNzZWxlY3RlZCArIDEgOiB0aGlzLiNzZWxlY3RlZCAtIDEpLFxuICAgICk7XG4gICAgaWYgKHkgIT09IHRoaXMuI3NlbGVjdGVkKSB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZXNbeV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWx1ZTogUlQpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgICBjb25zdCBvcHQgPSB0aGlzLiNtYXAuZ2V0KHZhbHVlKSE7XG4gICAgaWYgKG9wdCkge1xuICAgICAgb3B0LnRvcC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRcIik7XG4gICAgICBvcHQuYm90LmNsYXNzTGlzdC5hZGQoXCJzZWxlY3RlZFwiKTtcbiAgICAgIHRoaXMuI3NlbGVjdGVkID0gdGhpcy4jdmFsdWVzLmluZGV4T2YodmFsdWUpO1xuICAgICAgaWYgKHRoaXMuY29udGFpbnMoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgb3B0LnRvcC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2ID0gdGhpcy4jbWFwLmdldCh0aGlzLiN2YWx1ZXNbdGhpcy4jc2VsZWN0ZWRdKTtcbiAgICBpZiAocHJldikge1xuICAgICAgcHJldi50b3AuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgICAgcHJldi5ib3QuY2xhc3NMaXN0LnJlbW92ZShcInNlbGVjdGVkXCIpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVG9nZ2xlQnV0dG9uKTtcblxuLyoqQ3JlYXRlcyBhIHRvZ2dsZSBidXR0b24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90b2dnbGVfYnV0dG9uPFJULCBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtU2VsZWN0b3JCYXNlT3B0aW9uczxSVCwgSUQ+LFxuKTogRm9ybVRvZ2dsZUJ1dHRvbjxSVCwgSUQ+IHtcbiAgY29uc3QgdG9nZyA9IG5ldyBGb3JtVG9nZ2xlQnV0dG9uPFJULCBJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykgRm9ybVNlbGVjdG9yQmFzZS5hcHBseV9vcHRpb25zKHRvZ2csIG9wdGlvbnMpO1xuICByZXR1cm4gdG9nZztcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHsgRm9ybUVsZW1lbnQgfSBmcm9tIFwiLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi4vc2hhcmVkXCI7XG5pbXBvcnQgXCIuL3NwYWNlci5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtU3BhY2VyT3B0aW9ucyB7XG4gIC8qKlNwYWNpbmcgYW1vdW50ICAqL1xuICBzcGFjZT86IG51bWJlcjtcbn1cblxuY2xhc3MgRm9ybVNwYWNlciBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgc3RhdGljIGVsZW1lbnRfbmFtZSgpIHtcbiAgICByZXR1cm4gXCJzcGFjZXJcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIC8qKlNldHMgdGhlIGFtb3VudCBvZiBzcGFjZSwgaW4gcmVtICovXG4gIHNldCBzcGFjZShzcGFjZTogbnVtYmVyKSB7XG4gICAgdGhpcy5zdHlsZS5oZWlnaHQgPSBgJHtzcGFjZX1yZW1gO1xuICB9XG4gIGdldCBzcGFjZSgpIHtcbiAgICByZXR1cm4gcGFyc2VGbG9hdCh0aGlzLnN0eWxlLmhlaWdodCk7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1TcGFjZXIpO1xuXG4vKipDcmVhdGVzIGEgc3BhY2VyIGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fc3BhY2VyKG9wdGlvbnM/OiBGb3JtU3BhY2VyT3B0aW9ucyk6IEZvcm1TcGFjZXIge1xuICBjb25zdCBzcGFjZXIgPSBuZXcgRm9ybVNwYWNlcigpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLnNwYWNlKSBzcGFjZXIuc3BhY2UgPSBvcHRpb25zLnNwYWNlO1xuICB9XG4gIHJldHVybiBzcGFjZXI7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vY29sb3JfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1Db2xvcklucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKldoZXRoZXIgdGhlIGNvbG9yIGlucHV0IHNob3VsZCB1cGRhdGUgbGl2ZSovXG4gIGxpdmU/OiBib29sZWFuO1xufVxuXG5jbGFzcyBGb3JtQ29sb3JJbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4gZXh0ZW5kcyBGb3JtVmFsdWVXcml0ZTxcbiAgc3RyaW5nLFxuICBJRFxuPiB7XG4gIHN0YXRpYyBlbGVtZW50X25hbWUoKSB7XG4gICAgcmV0dXJuIFwiY29sb3JpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjbGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJjb2xvclwiO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmlucHV0ID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuI2xpdmUpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSk7XG4gICAgfTtcbiAgfVxuXG4gIHNldCBsaXZlKHZhbDogYm9vbGVhbikge1xuICAgIHRoaXMuI2xpdmUgPSB2YWw7XG4gIH1cbiAgZ2V0IGxpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuI2xpdmU7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiIzAwMDAwMFwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1Db2xvcklucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fY29sb3JfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybUNvbG9ySW5wdXRPcHRpb25zPElELCBzdHJpbmc+LFxuKTogRm9ybUNvbG9ySW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybUNvbG9ySW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5saXZlKSBpbnB1dC5saXZlID0gb3B0aW9ucy5saXZlO1xuICAgIEZvcm1WYWx1ZVdyaXRlLmFwcGx5X29wdGlvbnMoaW5wdXQsIG9wdGlvbnMpO1xuICB9XG4gIHJldHVybiBpbnB1dDtcbn1cbiIsImltcG9ydCB7IGRlZmluZV9lbGVtZW50IH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItYmFzZVwiO1xuaW1wb3J0IHtcbiAgbWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCxcbiAgbWF0ZXJpYWxfc2NoZWR1bGVfcm91bmRlZCxcbn0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vZGF0ZV90aW1lX2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRlVGltZUlucHV0T3B0aW9uczxcbiAgUlQsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlR5cGUgb2YgZGF0ZSB0aW1lKi9cbiAgdHlwZT86IEZvcm1EYXRlVGltZVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGb3JtRGF0ZVRpbWVUeXBlID0ge1xuICBEQVRFOiBcImRhdGVcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIERBVEVUSU1FOiBcImRhdGV0aW1lXCIsXG59IGFzIGNvbnN0O1xuZXhwb3J0IHR5cGUgRm9ybURhdGVUaW1lVHlwZSA9XG4gICh0eXBlb2YgRm9ybURhdGVUaW1lVHlwZSlba2V5b2YgdHlwZW9mIEZvcm1EYXRlVGltZVR5cGVdO1xuXG5jb25zdCBEYXRlVGltZU1vZGUgPSB7XG4gIERBVEU6IFwiZGF0ZVwiLFxuICBTVFJJTkc6IFwic3RyaW5nXCIsXG4gIE5VTUJFUjogXCJudW1iZXJcIixcbn0gYXMgY29uc3Q7XG5cbmNsYXNzIEZvcm1EYXRlVGltZUlucHV0PFxuICBSVCBleHRlbmRzIERhdGUgfCBzdHJpbmcgfCBudW1iZXIsXG4gIElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkLFxuPiBleHRlbmRzIEZvcm1WYWx1ZVdyaXRlPFJULCBJRD4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImRhdGV0aW1laW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IEZvcm1EYXRlVGltZVR5cGUgPSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FO1xuICAjbW9kZTogc3RyaW5nID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG5cbiAgY29uc3RydWN0b3IoaWQ/OiBJRCkge1xuICAgIHN1cGVyKGlkKTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwiZGF0ZXRpbWUtbG9jYWxcIjtcbiAgICB0aGlzLndhcm5faW5wdXQubGFuZyA9IFwiZGEtREtcIjtcbiAgICB0aGlzLndhcm5faW5wdXQuc3RlcCA9IFwiMC4xXCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQobWF0ZXJpYWxfY2FsZW5kYXJfbW9udGhfcm91bmRlZCgpKS5vbmNsaWNrID0gKCkgPT5cbiAgICAgIHRoaXMud2Fybl9pbnB1dC5zaG93UGlja2VyKCk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChtYXRlcmlhbF9zY2hlZHVsZV9yb3VuZGVkKCkpLm9uY2xpY2sgPSAoKSA9PlxuICAgICAgdGhpcy53YXJuX2lucHV0LnNob3dQaWNrZXIoKTtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICBpZiAodGhpcy53YXJuX2lucHV0LnZhbHVlKSB7XG4gICAgICAgIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuREFURSlcbiAgICAgICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXcgRGF0ZSh0aGlzLndhcm5faW5wdXQudmFsdWVBc051bWJlcikgYXMgUlQpO1xuICAgICAgICBlbHNlIGlmICh0aGlzLiNtb2RlID09PSBEYXRlVGltZU1vZGUuU1RSSU5HKVxuICAgICAgICAgIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSBhcyBSVCk7XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuI21vZGUgPT09IERhdGVUaW1lTW9kZS5OVU1CRVIpXG4gICAgICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy53YXJuX2lucHV0LnZhbHVlQXNOdW1iZXIgYXMgUlQpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCB0eXBlKCkge1xuICAgIHJldHVybiB0aGlzLiN0eXBlO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgZGF0ZSB0aW1lIHR5cGUqL1xuICBzZXQgdHlwZSh0eXBlOiBGb3JtRGF0ZVRpbWVUeXBlKSB7XG4gICAgaWYgKHR5cGUgPT09IEZvcm1EYXRlVGltZVR5cGUuREFURSkgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGVcIjtcbiAgICBpZiAodHlwZSA9PT0gRm9ybURhdGVUaW1lVHlwZS5USU1FKSB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwidGltZVwiO1xuICAgIGlmICh0eXBlID09PSBGb3JtRGF0ZVRpbWVUeXBlLkRBVEVUSU1FKVxuICAgICAgdGhpcy53YXJuX2lucHV0LnR5cGUgPSBcImRhdGV0aW1lLWxvY2FsXCI7XG4gICAgdGhpcy4jdHlwZSA9IHR5cGU7XG4gIH1cblxuICAvKipSZXR1cm5zIHRoZSBkYXRlIHRpbWUgdHlwZSovXG4gIGdldCBzdGVwKCkge1xuICAgIHJldHVybiBOdW1iZXIodGhpcy53YXJuX2lucHV0LnN0ZXApO1xuICB9XG4gIC8qKlNldHMgdGhlIGRhdGUgdGltZSB0eXBlKi9cbiAgc2V0IHN0ZXAoc3RlcDogbnVtYmVyKSB7XG4gICAgdGhpcy53YXJuX2lucHV0LnN0ZXAgPSBTdHJpbmcoc3RlcCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbHVlOiBSVCk6IHZvaWQge1xuICAgIGlmICghdGhpcy4jbW9kZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGhpcy4jbW9kZSA9IERhdGVUaW1lTW9kZS5OVU1CRVI7XG4gICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIpIHRoaXMuI21vZGUgPSBEYXRlVGltZU1vZGUuU1RSSU5HO1xuICAgICAgZWxzZSB0aGlzLiNtb2RlID0gRGF0ZVRpbWVNb2RlLkRBVEU7XG4gICAgfVxuICAgIGxldCB0aW1lOiBudW1iZXI7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIikgdGltZSA9IHZhbHVlO1xuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIikgdGltZSA9IG5ldyBEYXRlKHZhbHVlKS5nZXRUaW1lKCk7XG4gICAgZWxzZSB0aW1lID0gdmFsdWUuZ2V0VGltZSgpO1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZUFzTnVtYmVyID0gdGltZTtcbiAgfVxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQoX3JlbGF0ZWQ6IE9wdGlvbjx7fT4pOiB2b2lkIHt9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtRGF0ZVRpbWVJbnB1dCk7XG5cbi8qKkNyZWF0ZXMgYSBjb2xvciBpbnB1dCBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX2RhdGVfdGltZV9pbnB1dDxcbiAgUlQgZXh0ZW5kcyBEYXRlIHwgc3RyaW5nIHwgbnVtYmVyLFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4ob3B0aW9ucz86IERhdGVUaW1lSW5wdXRPcHRpb25zPFJULCBJRD4pOiBGb3JtRGF0ZVRpbWVJbnB1dDxSVCwgSUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybURhdGVUaW1lSW5wdXQ8UlQsIElEPihvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMudHlwZSkgaW5wdXQudHlwZSA9IG9wdGlvbnMudHlwZTtcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7XG4gIGdldF9jdXJzb3JfcG9zaXRpb24sXG4gIElQQWRkcmVzcyxcbiAgSVBWZXJzaW9uLFxuICBzZXRfY3Vyc29yX2VuZCxcbiAgc2V0X3NlbGVjdGlvbl9hbGwsXG4gIHNsZWVwLFxufSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB0eXBlIHsgT3B0aW9uIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItcmVzdWx0XCI7XG5pbXBvcnQgeyBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vaXBfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElwSW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbj4gZXh0ZW5kcyBGb3JtVmFsdWVPcHRpb25zPElQQWRkcmVzcywgSUQ+IHtcbiAgLyoqSXAgYWRkcmVzcyB0eXBlLCB0aGlzIGlzIG92ZXJ3cml0dGVuIGlmIHN1cHBsaWVkIHdpdGggYW4gaXBhZGRyZXNzIHdpdGggYSBkaWZmZXJlbnQgdHlwZSovXG4gIHR5cGU6IElQVmVyc2lvbjtcbn1cblxuY2xhc3MgRm9ybUlwSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIElQQWRkcmVzcyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcImlwaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI3R5cGU6IElQVmVyc2lvbjtcbiAgI3BhcnRzOiBIVE1MRGl2RWxlbWVudFtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogOCB9LCAoXywgaSkgPT4ge1xuICAgIGNvbnN0IGlucCA9IHRoaXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSk7XG4gICAgaWYgKGkgPCA3KSB0aGlzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpKTtcbiAgICBpbnAuY29udGVudEVkaXRhYmxlID0gXCJ0cnVlXCI7XG4gICAgaW5wLm9uYmVmb3JlaW5wdXQgPSBhc3luYyAoZXYpID0+IHtcbiAgICAgIGlmIChldi5pbnB1dFR5cGUgPT09IFwiaW5zZXJ0UGFyYWdyYXBoXCIpIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAvL0JhY2tzcGFjZVxuICAgICAgZWxzZSBpZiAoZXYuaW5wdXRUeXBlID09PSBcImRlbGV0ZUNvbnRlbnRCYWNrd2FyZFwiKSB7XG4gICAgICAgIGlmIChpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwICYmIGkgPiAwKSB7XG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIERlbGV0ZVxuICAgICAgfSBlbHNlIGlmIChldi5pbnB1dFR5cGUgPT09IFwiZGVsZXRlQ29udGVudEZvcndhcmRcIikge1xuICAgICAgICBpZiAoaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gMCAmJiBpIDwgbGVuZ3RoIC0gMSkge1xuICAgICAgICAgIGF3YWl0IHNsZWVwKDApO1xuICAgICAgICAgIChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KT8uZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChldi5kYXRhKSB7XG4gICAgICAgIC8vQ2hlY2sgZm9yIC4gb3IgOlxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV2LmRhdGEgPT09IFwiLlwiIHx8IGV2LmRhdGEgPT09IFwiOlwiIHx8IGV2LmRhdGEgPT09IFwiLFwiKSAmJlxuICAgICAgICAgIGkgPCBsZW5ndGggLSAxXG4gICAgICAgICkge1xuICAgICAgICAgIHNldF9zZWxlY3Rpb25fYWxsKGlucC5uZXh0RWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICAgICAgLy9DaGVjayBmb3IgdmFsaWQgY2hhcmFjdGVyc1xuICAgICAgICBlbHNlIGlmIChcbiAgICAgICAgICAhZXYuZGF0YS5tYXRjaChcbiAgICAgICAgICAgIHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IC9eW1xcZF0qJC8gOiAvXltcXGRBLUZhLWZdKiQvLFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIC8vUHJldmVudCB0b28gbG9uZyB2YWx1ZXNcbiAgICAgICAgZWxzZSBpZiAoXG4gICAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA+PSAodGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDQpXG4gICAgICAgICkge1xuICAgICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgLy9QcmV2ZW50IHRvbyBiaWcgdmFsdWVzXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcG9zID0gZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApO1xuICAgICAgICAgIGNvbnN0IHBvdGVudGlhbCA9XG4gICAgICAgICAgICBpbnAudGV4dENvbnRlbnQuc2xpY2UoMCwgcG9zKSArXG4gICAgICAgICAgICBldi5kYXRhICtcbiAgICAgICAgICAgIGlucC50ZXh0Q29udGVudC5zbGljZShwb3MpO1xuICAgICAgICAgIGNvbnN0IG51bSA9XG4gICAgICAgICAgICB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjRcbiAgICAgICAgICAgICAgPyBwYXJzZUludChwb3RlbnRpYWwsIDEwKVxuICAgICAgICAgICAgICA6IHBhcnNlSW50KHBvdGVudGlhbCwgMTYpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICh0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgJiYgbnVtID4gMjU1KSB8fFxuICAgICAgICAgICAgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNiAmJiBudW0gPiA2NTUzNSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpIDwgdGhpcy4jcGFydHMubGVuZ3RoIC0gMSlcbiAgICAgICAgICAgICAgc2V0X3NlbGVjdGlvbl9hbGwoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICBlbHNlIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgICBpbnAub25pbnB1dCA9ICgpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgaW5wLnRleHRDb250ZW50Lmxlbmd0aCA9PT0gKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDMgOiA0KSAmJlxuICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggJiZcbiAgICAgICAgaSA8IHRoaXMuI3BhcnRzLmxlbmd0aCAtIDFcbiAgICAgICkge1xuICAgICAgICBzZXRfc2VsZWN0aW9uX2FsbChpbnAubmV4dEVsZW1lbnRTaWJsaW5nIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGlucC5vbmtleWRvd24gPSBhc3luYyAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkFycm93VXBcIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0Rvd25cIikge1xuICAgICAgfSBlbHNlIGlmIChlLmtleSA9PT0gXCJBcnJvd0xlZnRcIiAmJiBpID4gMCkge1xuICAgICAgICBpZiAoZ2V0X2N1cnNvcl9wb3NpdGlvbihpbnApID09PSAwIHx8IGlucC50ZXh0Q29udGVudC5sZW5ndGggPT09IDApXG4gICAgICAgICAgc2V0X2N1cnNvcl9lbmQoaW5wLnByZXZpb3VzRWxlbWVudFNpYmxpbmcgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICBlbHNlIHJldHVybjtcbiAgICAgIH0gZWxzZSBpZiAoZS5rZXkgPT09IFwiQXJyb3dSaWdodFwiICYmIGkgPCB0aGlzLiNwYXJ0cy5sZW5ndGggLSAxKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBnZXRfY3Vyc29yX3Bvc2l0aW9uKGlucCkgPT09IGlucC50ZXh0Q29udGVudC5sZW5ndGggfHxcbiAgICAgICAgICBpbnAudGV4dENvbnRlbnQubGVuZ3RoID09PSAwXG4gICAgICAgIClcbiAgICAgICAgICAoaW5wLm5leHRFbGVtZW50U2libGluZyBhcyBIVE1MRWxlbWVudCk/LmZvY3VzKCk7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuICAgICAgfSBlbHNlIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgfTtcbiAgICByZXR1cm4gaW5wO1xuICB9KTtcblxuICBjb25zdHJ1Y3Rvcih0eXBlOiBJUFZlcnNpb24sIGlkPzogSUQpIHtcbiAgICBzdXBlcihpZCk7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLiN0eXBlID0gdHlwZTtcbiAgICB0aGlzLmFwcGVuZENoaWxkKHRoaXMud2Fybl9pbnB1dCk7XG4gICAgdGhpcy5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGlmICghdGhpcy4jcGFydHMuaW5jbHVkZXMoZS50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQpKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy4jcGFydHNbdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gMyA6IDddKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25kYmxjbGljayA9IChlKSA9PiB7XG4gICAgICBpZiAoZS50YXJnZXQgIT09IHRoaXMpIHJldHVybjtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHNldF9zZWxlY3Rpb25fYWxsKHRoaXMuI3BhcnRzWzBdKTtcbiAgICB9O1xuICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihcImZvY3VzaW5cIiwgKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9KTtcbiAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoXCJmb2N1c291dFwiLCAoZSkgPT4ge1xuICAgICAgaWYgKGUucmVsYXRlZFRhcmdldCAmJiB0aGlzLmNvbnRhaW5zKGUucmVsYXRlZFRhcmdldCBhcyBOb2RlKSkgcmV0dXJuO1xuICAgICAgdGhpcy5zZXRfdmFsdWVfY2hlY2sodGhpcy52YWx1ZV9hc19pcCk7XG4gICAgfSk7XG4gICAgdGhpcy5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIpIHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMudmFsdWVfYXNfaXApO1xuICAgICAgZWxzZSBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgaWYgKHRoaXMuYnVmZmVyKSB0aGlzLm5ld192YWx1ZSh0aGlzLmJ1ZmZlcik7XG4gICAgICAgIGVsc2UgdGhpcy5jbGVhcl92YWx1ZSgpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5vbmNvcHkgPSAoZSkgPT4ge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZS5jbGlwYm9hcmREYXRhPy5zZXREYXRhKFwidGV4dC9wbGFpblwiLCB0aGlzLnZhbHVlX2FzX2lwLnRvX3N0cmluZygpKTtcbiAgICB9O1xuICAgIHRoaXMub25wYXN0ZSA9IChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCBwYXN0ZSA9IGUuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YShcInRleHQvcGxhaW5cIikgfHwgXCJcIjtcbiAgICAgIGNvbnN0IG5ld19pcCA9IG5ldyBJUEFkZHJlc3MocGFzdGUpO1xuICAgICAgaWYgKG5ld19pcC52ZXJzaW9uICE9PSB0aGlzLiN0eXBlKSByZXR1cm47XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayhuZXdfaXApO1xuICAgIH07XG4gIH1cblxuICBnZXQgdmFsdWVfYXNfaXAoKTogSVBBZGRyZXNzIHtcbiAgICByZXR1cm4gbmV3IElQQWRkcmVzcyhcbiAgICAgIHRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB0aGlzLiN0eXBlID09PSBJUFZlcnNpb24uVjQgPyA0IDogOClcbiAgICAgICAgLnJlZHVjZSgoYWNjLCBwYXJ0LCBpKSA9PiB7XG4gICAgICAgICAgYWNjICs9IHBhcnQuaW5uZXJUZXh0O1xuICAgICAgICAgIGlmIChpIDwgKHRoaXMuI3R5cGUgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KSAtIDEpXG4gICAgICAgICAgICBhY2MgKz0gdGhpcy4jdHlwZSA9PT0gSVBWZXJzaW9uLlY0ID8gXCIuXCIgOiBcIjpcIjtcbiAgICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgICB9LCBcIlwiKSxcbiAgICApO1xuICB9XG5cbiAgc2V0IHR5cGUodmFsOiBJUFZlcnNpb24pIHtcbiAgICBpZiAodGhpcy4jdHlwZSA9PT0gdmFsKSByZXR1cm47XG4gICAgdGhpcy4jdHlwZSA9IHZhbDtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY0XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY0KTtcbiAgICB0aGlzLmNsYXNzTGlzdC50b2dnbGUoXCJpcHY2XCIsIHZhbCA9PT0gSVBWZXJzaW9uLlY2KTtcbiAgICB0aGlzLnJlcGxhY2VDaGlsZHJlbihcbiAgICAgIC4uLnRoaXMuI3BhcnRzXG4gICAgICAgIC5zbGljZSgwLCB2YWwgPT09IElQVmVyc2lvbi5WNCA/IDQgOiA4KVxuICAgICAgICAuZmxhdE1hcCgodiwgaSkgPT5cbiAgICAgICAgICBpIDwgKHZhbCA9PT0gSVBWZXJzaW9uLlY0ID8gNCA6IDgpIC0gMVxuICAgICAgICAgICAgPyBbdiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodmFsID09PSBJUFZlcnNpb24uVjQgPyBcIi5cIiA6IFwiOlwiKV1cbiAgICAgICAgICAgIDogW3ZdLFxuICAgICAgICApLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogSVBBZGRyZXNzKTogdm9pZCB7XG4gICAgdGhpcy50eXBlID0gdmFsLnZlcnNpb247XG4gICAgdmFsLmFzX2FycmF5LmZvckVhY2goKHBhcnQsIGkpID0+IHtcbiAgICAgIHRoaXMuI3BhcnRzW2ldLnRleHRDb250ZW50ID1cbiAgICAgICAgdmFsLnZlcnNpb24gPT09IElQVmVyc2lvbi5WNCA/IHBhcnQudG9TdHJpbmcoKSA6IHBhcnQudG9TdHJpbmcoMTYpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMuI3BhcnRzLmZvckVhY2goKHBhcnQpID0+IHtcbiAgICAgIHBhcnQudGV4dENvbnRlbnQgPSBcIlwiO1xuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgc3RhdGVfcmVsYXRlZChfcmVsYXRlZDogT3B0aW9uPHt9Pik6IHZvaWQge31cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1JcElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIGNvbG9yIGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1faXBfaW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zOiBJcElucHV0T3B0aW9uczxJRD4sXG4pOiBGb3JtSXBJbnB1dDxJRD4ge1xuICBjb25zdCBpbnB1dCA9IG5ldyBGb3JtSXBJbnB1dDxJRD4ob3B0aW9ucy50eXBlLCBvcHRpb25zPy5pZCk7XG4gIGlmIChvcHRpb25zKSB7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbiB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLXJlc3VsdFwiO1xuaW1wb3J0IHsgRm9ybVZhbHVlLCBGb3JtVmFsdWVXcml0ZSwgdHlwZSBGb3JtVmFsdWVPcHRpb25zIH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vcGFzc3dvcmRfaW5wdXQuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1QYXNzd29yZElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxzdHJpbmcsIElEPiB7XG4gIC8qKkFsbG93ZWQgY2hhcmFjdGVycyBmb3IgdGhlIHBhc3N3b3JkIGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVBhc3N3b3JkSW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInBhc3N3b3JkaW5wdXRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLndhcm5faW5wdXQudHlwZSA9IFwicGFzc3dvcmRcIjtcbiAgICB0aGlzLndhcm5faW5wdXQub25jaGFuZ2UgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLndhcm5faW5wdXQudmFsdWUpO1xuICAgIH07XG4gICAgdGhpcy53YXJuX2lucHV0Lm9uYmVmb3JlaW5wdXQgPSAoZXYpID0+IHtcbiAgICAgIGlmIChldi5kYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGV2LmRhdGEpKSB7XG4gICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLndhcm4oXCJJbnZhbGlkIGNoYXJhY3RlciBlbnRlcmVkXCIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X3ZhbHVlKHZhbDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy53YXJuX2lucHV0LnZhbHVlID0gdmFsO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX3ZhbHVlKCk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IFwiXCI7XG4gIH1cblxuICBwcm90ZWN0ZWQgbmV3X2Vycm9yKF92YWw6IHN0cmluZyk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgY2xlYXJfZXJyb3IoKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKF9yZWxhdGVkOiBPcHRpb248e30+KTogdm9pZCB7fVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVBhc3N3b3JkSW5wdXQpO1xuXG4vKipDcmVhdGVzIGEgZHJvcGRvd24gZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV9wYXNzd29yZF9pbnB1dDxJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZD4oXG4gIG9wdGlvbnM/OiBGb3JtUGFzc3dvcmRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVBhc3N3b3JkSW5wdXQ8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5maWx0ZXIpIGlucHV0LmZpbHRlciA9IG9wdGlvbnMuZmlsdGVyO1xuICAgIEZvcm1WYWx1ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IHNldF9jdXJzb3JfZW5kLCBzeW5jX3Jlc29sdmUgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1jb21tb25cIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X2lucHV0LnNjc3NcIjtcblxuZXhwb3J0IGludGVyZmFjZSBGb3JtVGV4dElucHV0T3B0aW9uczxcbiAgSUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIFJUID0gc3RyaW5nLFxuPiBleHRlbmRzIEZvcm1WYWx1ZU9wdGlvbnM8UlQsIElEPiB7XG4gIC8qKlBsYWNlaG9sZGVyIHRleHQgd2hlbiBpbnB1dCBpcyBlbXB0eSAqL1xuICBwbGFjZWhvbGRlcj86IHN0cmluZztcbiAgLyoqTWF4aW11bSBsZW5ndGggb2YgdGhlIGlucHV0ICovXG4gIG1heF9sZW5ndGg/OiBudW1iZXI7XG4gIC8qKk1heGltdW0gYnl0ZXMgb2YgdGhlIGlucHV0ICovXG4gIG1heF9ieXRlcz86IG51bWJlcjtcbiAgLyoqQWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgdGV4dCBpbnB1dCAqL1xuICBmaWx0ZXI/OiBSZWdFeHA7XG59XG5cbmNsYXNzIEZvcm1UZXh0SW5wdXQ8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRpbnB1dFwiO1xuICB9XG4gIHN0YXRpYyBlbGVtZW50X25hbWVfc3BhY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gXCJmb3JtXCI7XG4gIH1cblxuICAjZmlsdGVyPzogUmVnRXhwO1xuICAjbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgI21heF9ieXRlcz86IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC50eXBlID0gXCJ0ZXh0XCI7XG4gICAgdGhpcy5hcHBlbmRDaGlsZCh0aGlzLndhcm5faW5wdXQpO1xuICAgIHRoaXMud2Fybl9pbnB1dC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMub25iZWZvcmVpbnB1dCA9IChlKSA9PiB7XG4gICAgICB0aGlzLndhcm4oXCJcIik7XG4gICAgICBjb25zdCBkYXRhID0gZS5kYXRhIHx8IGUuZGF0YVRyYW5zZmVyPy5nZXREYXRhKFwidGV4dC9wbGFpblwiKTtcbiAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgIGlmICh0aGlzLiNmaWx0ZXIgJiYgIXRoaXMuI2ZpbHRlci50ZXN0KGRhdGEpKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMud2FybihcIkludmFsaWQgY2hhcmFjdGVyIGVudGVyZWRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2xlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy53YXJuX2lucHV0LnZhbHVlLmxlbmd0aCArIGRhdGEubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzICYmXG4gICAgICAgICAgICBzdHJpbmdfYnl0ZV9sZW5ndGgodGhpcy53YXJuX2lucHV0LnZhbHVlKSArXG4gICAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aChkYXRhKSA+XG4gICAgICAgICAgICAgIHRoaXMuI21heF9ieXRlc1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy53YXJuKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfYnl0ZXN9IGJ5dGVzIGlzIGFsbG93ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMub25rZXlkb3duID0gKGUpID0+IHtcbiAgICAgIGlmIChlLmtleSA9PT0gXCJFc2NhcGVcIikge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGlmICh0aGlzLmJ1ZmZlcikgdGhpcy5uZXdfdmFsdWUodGhpcy5idWZmZXIpO1xuICAgICAgICBlbHNlIHRoaXMuY2xlYXJfdmFsdWUoKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgI3NldCgpIHtcbiAgICBjb25zdCBidWZmID0gdGhpcy5idWZmZXI7XG4gICAgKGF3YWl0IHRoaXMuc2V0X3ZhbHVlX2NoZWNrKHRoaXMud2Fybl9pbnB1dC52YWx1ZSB8fCBcIlwiKSkubWFwX2VycigoKSA9PiB7XG4gICAgICB0aGlzLm5ld192YWx1ZShidWZmIHx8IFwiXCIpO1xuICAgICAgc2V0X2N1cnNvcl9lbmQodGhpcy53YXJuX2lucHV0KTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldCBmaWx0ZXIodmFsOiBSZWdFeHAgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLiNmaWx0ZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IGZpbHRlcigpOiBSZWdFeHAgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNmaWx0ZXI7XG4gIH1cblxuICBzZXQgcGxhY2Vob2xkZXIodmFsOiBzdHJpbmcpIHtcbiAgICB0aGlzLndhcm5faW5wdXQucGxhY2Vob2xkZXIgPSB2YWw7XG4gIH1cbiAgZ2V0IHBsYWNlaG9sZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMud2Fybl9pbnB1dC5wbGFjZWhvbGRlcjtcbiAgfVxuXG4gIHNldCBtYXhfbGVuZ3RoKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2xlbmd0aCA9IHZhbDtcbiAgICB0aGlzLndhcm5faW5wdXQubWF4TGVuZ3RoID0gdmFsID8/IC0xO1xuICB9XG4gIGdldCBtYXhfbGVuZ3RoKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9sZW5ndGg7XG4gIH1cblxuICBzZXQgbWF4X2J5dGVzKHZhbDogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jbWF4X2J5dGVzID0gdmFsO1xuICB9XG4gIGdldCBtYXhfYnl0ZXMoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jbWF4X2J5dGVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld192YWx1ZSh2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMud2Fybl9pbnB1dC52YWx1ZSA9IHZhbDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhcl92YWx1ZSgpOiB2b2lkIHtcbiAgICB0aGlzLndhcm5faW5wdXQudmFsdWUgPSBcIlwiO1xuICB9XG5cbiAgcHJvdGVjdGVkIG5ld19lcnJvcihfdmFsOiBzdHJpbmcpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGNsZWFyX2Vycm9yKCk6IHZvaWQge31cblxuICBwcm90ZWN0ZWQgbGltaXRfdmFsdWUodmFsOiBzdHJpbmcpOiBQcm9taXNlTGlrZTxSZXN1bHQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gICAgaWYgKHRoaXMuI21heF9sZW5ndGggJiYgdmFsLmxlbmd0aCA+IHRoaXMuI21heF9sZW5ndGgpXG4gICAgICB2YWwgPSB2YWwuc2xpY2UoMCwgdGhpcy4jbWF4X2xlbmd0aCk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcykgdmFsID0gc3RyaW5nX2J5dGVfbGltaXQodmFsLCB0aGlzLiNtYXhfYnl0ZXMpO1xuICAgIHJldHVybiBzdXBlci5saW1pdF92YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNoZWNrX3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgcmV0dXJuIHN5bmNfcmVzb2x2ZShcbiAgICAgICAgZXJyKGBBIG1heGltdW0gb2YgJHt0aGlzLiNtYXhfbGVuZ3RofSBjaGFyYWN0ZXJzIGlzIGFsbG93ZWRgKSxcbiAgICAgICk7XG4gICAgaWYgKHRoaXMuI21heF9ieXRlcyAmJiBzdHJpbmdfYnl0ZV9sZW5ndGgodmFsKSA+IHRoaXMuI21heF9ieXRlcylcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2J5dGVzfSBieXRlcyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIHJldHVybiBzdXBlci5jaGVja192YWx1ZSh2YWwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRlX3JlbGF0ZWQocmVsYXRlZDogUGFydGlhbDxTdGF0ZVN0cmluZ1JlbGF0ZWQ+KTogdm9pZCB7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aClcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfbGVuZ3RoXCIsIHJlbGF0ZWQubWF4X2xlbmd0aCwgKCkgPT4gbm9uZSgpKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9sZW5ndGhcIik7XG4gICAgaWYgKHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcylcbiAgICAgIHRoaXMuYXR0YWNoX3N0YXRlX3RvX3Byb3AoXCJtYXhfYnl0ZXNcIiwgcmVsYXRlZC5tYXhfbGVuZ3RoX2J5dGVzLCAoKSA9PlxuICAgICAgICBub25lKCksXG4gICAgICApO1xuICAgIGVsc2UgdGhpcy5kZXRhY2hfc3RhdGVfZnJvbV9wcm9wKFwibWF4X2J5dGVzXCIpO1xuICB9XG59XG5kZWZpbmVfZWxlbWVudChGb3JtVGV4dElucHV0KTtcblxuLyoqQ3JlYXRlcyBhIHNpbmdsZSBsaW5lIHRleHQgaW5wdXQgZm9ybSBlbGVtZW50ICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybV90ZXh0X2lucHV0PElEIGV4dGVuZHMgc3RyaW5nIHwgdW5kZWZpbmVkPihcbiAgb3B0aW9ucz86IEZvcm1UZXh0SW5wdXRPcHRpb25zPElEPixcbik6IEZvcm1UZXh0SW5wdXQ8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRJbnB1dDxJRD4ob3B0aW9ucz8uaWQpO1xuICBpZiAob3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmZpbHRlcikgaW5wdXQuZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgaWYgKG9wdGlvbnMucGxhY2Vob2xkZXIpIGlucHV0LnBsYWNlaG9sZGVyID0gb3B0aW9ucy5wbGFjZWhvbGRlcjtcbiAgICBpZiAob3B0aW9ucy5tYXhfbGVuZ3RoKSBpbnB1dC5tYXhfbGVuZ3RoID0gb3B0aW9ucy5tYXhfbGVuZ3RoO1xuICAgIGlmIChvcHRpb25zLm1heF9ieXRlcykgaW5wdXQubWF4X2J5dGVzID0gb3B0aW9ucy5tYXhfYnl0ZXM7XG4gICAgRm9ybVZhbHVlV3JpdGUuYXBwbHlfb3B0aW9ucyhpbnB1dCwgb3B0aW9ucyk7XG4gIH1cbiAgcmV0dXJuIGlucHV0O1xufVxuIiwiaW1wb3J0IHsgZGVmaW5lX2VsZW1lbnQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1iYXNlXCI7XG5pbXBvcnQgeyBzZXRfY3Vyc29yX2VuZCwgc3luY19yZXNvbHZlIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItY29tbW9uXCI7XG5pbXBvcnQgeyBtYXRlcmlhbF9kcmFnX2hhbmRsZV9yb3VuZGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItaWNvbnNcIjtcbmltcG9ydCB7IGVyciwgbm9uZSwgdHlwZSBSZXN1bHQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1yZXN1bHRcIjtcbmltcG9ydCB0eXBlIHsgU3RhdGVTdHJpbmdSZWxhdGVkIH0gZnJvbSBcIkBjaG9jYml0ZS90cy1saWItc3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ19ieXRlX2xlbmd0aCwgc3RyaW5nX2J5dGVfbGltaXQgfSBmcm9tIFwiQGNob2NiaXRlL3RzLWxpYi1zdHJpbmdcIjtcbmltcG9ydCB7IEZvcm1WYWx1ZVdyaXRlLCB0eXBlIEZvcm1WYWx1ZU9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vYmFzZVwiO1xuaW1wb3J0IFwiLi90ZXh0X211bHRpX2xpbmUuc2Nzc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1UZXh0SW5wdXRPcHRpb25zPFxuICBJRCBleHRlbmRzIHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgUlQgPSBzdHJpbmcsXG4+IGV4dGVuZHMgRm9ybVZhbHVlT3B0aW9uczxSVCwgSUQ+IHtcbiAgLyoqUGxhY2Vob2xkZXIgdGV4dCB3aGVuIGlucHV0IGlzIGVtcHR5ICovXG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICAvKipNYXhpbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2xlbmd0aD86IG51bWJlcjtcbiAgLyoqTWF4aW11bSBieXRlcyBvZiB0aGUgaW5wdXQgKi9cbiAgbWF4X2J5dGVzPzogbnVtYmVyO1xuICAvKipBbGxvd2VkIGNoYXJhY3RlcnMgZm9yIHRoZSB0ZXh0IGlucHV0ICovXG4gIGZpbHRlcj86IFJlZ0V4cDtcbn1cblxuY2xhc3MgRm9ybVRleHRNdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+IGV4dGVuZHMgRm9ybVZhbHVlV3JpdGU8XG4gIHN0cmluZyxcbiAgSURcbj4ge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRtdWx0aWxpbmVcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgI2ZpbHRlcj86IFJlZ0V4cDtcbiAgI21heF9sZW5ndGg/OiBudW1iZXI7XG4gICNtYXhfYnl0ZXM/OiBudW1iZXI7XG4gICN2YWx1ZV9ib3g6IEhUTUxUZXh0QXJlYUVsZW1lbnQgPSB0aGlzLmFwcGVuZENoaWxkKFxuICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJ0ZXh0YXJlYVwiKSxcbiAgKTtcbiAgI3Jlc2l6ZXI6IEhUTUxEaXZFbGVtZW50ID0gdGhpcy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKTtcblxuICBjb25zdHJ1Y3RvcihpZD86IElEKSB7XG4gICAgc3VwZXIoaWQpO1xuICAgIHRoaXMuYXBwZW5kQ2hpbGQodGhpcy53YXJuX2lucHV0KTtcbiAgICB0aGlzLiNyZXNpemVyLmFwcGVuZENoaWxkKG1hdGVyaWFsX2RyYWdfaGFuZGxlX3JvdW5kZWQoKSk7XG4gICAgdGhpcy4jcmVzaXplci5vbnBvaW50ZXJkb3duID0gKGUpID0+IHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuI3ZhbHVlX2JveC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgICBjb25zdCBzdGFydF95ID0gZS5jbGllbnRZO1xuICAgICAgdGhpcy4jcmVzaXplci5zZXRQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcm1vdmUgPSAoZXYpID0+IHtcbiAgICAgICAgY29uc3QgZHkgPSBldi5jbGllbnRZIC0gc3RhcnRfeTtcbiAgICAgICAgdGhpcy4jdmFsdWVfYm94LnN0eWxlLmhlaWdodCA9IGAke2hlaWdodCArIGR5fXB4YDtcbiAgICAgIH07XG4gICAgICB0aGlzLiNyZXNpemVyLm9ucG9pbnRlcnVwID0gKF9ldikgPT4ge1xuICAgICAgICB0aGlzLiNyZXNpemVyLnJlbGVhc2VQb2ludGVyQ2FwdHVyZShlLnBvaW50ZXJJZCk7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVybW92ZSA9IG51bGw7XG4gICAgICAgIHRoaXMuI3Jlc2l6ZXIub25wb2ludGVydXAgPSBudWxsO1xuICAgICAgfTtcbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmtleWRvd24gPSAoZSkgPT4ge1xuICAgICAgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmNoYW5nZSA9ICgpID0+IHRoaXMuI3NldCgpO1xuICAgIHRoaXMuI3ZhbHVlX2JveC5vbmJlZm9yZWlucHV0ID0gKGUpID0+IHtcbiAgICAgIHRoaXMud2FybihcIlwiKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBlLmRhdGEgfHwgZS5kYXRhVHJhbnNmZXI/LmdldERhdGEoXCJ0ZXh0L3BsYWluXCIpO1xuICAgICAgaWYgKGRhdGEpIHtcbiAgICAgICAgaWYgKHRoaXMuI2ZpbHRlciAmJiAhdGhpcy4jZmlsdGVyLnRlc3QoZGF0YSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy53YXJuKFwiSW52YWxpZCBjaGFyYWN0ZXIgZW50ZXJlZFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfbGVuZ3RoICYmXG4gICAgICAgICAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUubGVuZ3RoICsgZGF0YS5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9sZW5ndGh9IGNoYXJhY3RlcnMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLiNtYXhfYnl0ZXMgJiZcbiAgICAgICAgICAgIHN0cmluZ19ieXRlX2xlbmd0aCh0aGlzLiN2YWx1ZV9ib3gudmFsdWUpICtcbiAgICAgICAgICAgICAgc3RyaW5nX2J5dGVfbGVuZ3RoKGRhdGEpID5cbiAgICAgICAgICAgICAgdGhpcy4jbWF4X2J5dGVzXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLndhcm4oYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy4jdmFsdWVfYm94Lm9ua2V5ZG93biA9IChlKSA9PiB7XG4gICAgICBpZiAoZS5rZXkgPT09IFwiRXNjYXBlXCIpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBpZiAodGhpcy5idWZmZXIpIHRoaXMubmV3X3ZhbHVlKHRoaXMuYnVmZmVyKTtcbiAgICAgICAgZWxzZSB0aGlzLmNsZWFyX3ZhbHVlKCk7XG4gICAgICB9IGVsc2UgaWYgKGUua2V5ID09PSBcIkVudGVyXCIgJiYgZS5jdHJsS2V5KSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy4jc2V0KCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGFzeW5jICNzZXQoKSB7XG4gICAgY29uc3QgYnVmZiA9IHRoaXMuYnVmZmVyO1xuICAgIChhd2FpdCB0aGlzLnNldF92YWx1ZV9jaGVjayh0aGlzLiN2YWx1ZV9ib3gudmFsdWUgfHwgXCJcIikpLm1hcF9lcnIoKCkgPT4ge1xuICAgICAgdGhpcy5uZXdfdmFsdWUoYnVmZiB8fCBcIlwiKTtcbiAgICAgIHNldF9jdXJzb3JfZW5kKHRoaXMuI3ZhbHVlX2JveCk7XG4gICAgfSk7XG4gIH1cblxuICBzZXQgZmlsdGVyKHZhbDogUmVnRXhwIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy4jZmlsdGVyID0gdmFsO1xuICB9XG4gIGdldCBmaWx0ZXIoKTogUmVnRXhwIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy4jZmlsdGVyO1xuICB9XG5cbiAgc2V0IHBsYWNlaG9sZGVyKHZhbDogc3RyaW5nKSB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnBsYWNlaG9sZGVyID0gdmFsO1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLiN2YWx1ZV9ib3gucGxhY2Vob2xkZXI7XG4gIH1cblxuICBzZXQgbWF4X2xlbmd0aCh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9sZW5ndGggPSB2YWw7XG4gICAgdGhpcy4jdmFsdWVfYm94Lm1heExlbmd0aCA9IHZhbCA/PyAtMTtcbiAgfVxuICBnZXQgbWF4X2xlbmd0aCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLiNtYXhfbGVuZ3RoO1xuICB9XG5cbiAgc2V0IG1heF9ieXRlcyh2YWw6IG51bWJlciB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuI21heF9ieXRlcyA9IHZhbDtcbiAgfVxuICBnZXQgbWF4X2J5dGVzKCk6IG51bWJlciB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuI21heF9ieXRlcztcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfdmFsdWUodmFsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLiN2YWx1ZV9ib3gudmFsdWUgPSB2YWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xlYXJfdmFsdWUoKTogdm9pZCB7XG4gICAgdGhpcy4jdmFsdWVfYm94LnZhbHVlID0gXCJcIjtcbiAgfVxuXG4gIHByb3RlY3RlZCBuZXdfZXJyb3IoX3ZhbDogc3RyaW5nKTogdm9pZCB7fVxuXG4gIHByb3RlY3RlZCBjbGVhcl9lcnJvcigpOiB2b2lkIHt9XG5cbiAgcHJvdGVjdGVkIGxpbWl0X3ZhbHVlKHZhbDogc3RyaW5nKTogUHJvbWlzZUxpa2U8UmVzdWx0PHN0cmluZywgc3RyaW5nPj4ge1xuICAgIGlmICh0aGlzLiNtYXhfbGVuZ3RoICYmIHZhbC5sZW5ndGggPiB0aGlzLiNtYXhfbGVuZ3RoKVxuICAgICAgdmFsID0gdmFsLnNsaWNlKDAsIHRoaXMuI21heF9sZW5ndGgpO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMpIHZhbCA9IHN0cmluZ19ieXRlX2xpbWl0KHZhbCwgdGhpcy4jbWF4X2J5dGVzKTtcbiAgICByZXR1cm4gc3VwZXIubGltaXRfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBjaGVja192YWx1ZSh2YWw6IHN0cmluZyk6IFByb21pc2VMaWtlPFJlc3VsdDxzdHJpbmcsIHN0cmluZz4+IHtcbiAgICBpZiAodGhpcy4jbWF4X2xlbmd0aCAmJiB2YWwubGVuZ3RoID4gdGhpcy4jbWF4X2xlbmd0aClcbiAgICAgIHJldHVybiBzeW5jX3Jlc29sdmUoXG4gICAgICAgIGVycihgQSBtYXhpbXVtIG9mICR7dGhpcy4jbWF4X2xlbmd0aH0gY2hhcmFjdGVycyBpcyBhbGxvd2VkYCksXG4gICAgICApO1xuICAgIGlmICh0aGlzLiNtYXhfYnl0ZXMgJiYgc3RyaW5nX2J5dGVfbGVuZ3RoKHZhbCkgPiB0aGlzLiNtYXhfYnl0ZXMpXG4gICAgICByZXR1cm4gc3luY19yZXNvbHZlKFxuICAgICAgICBlcnIoYEEgbWF4aW11bSBvZiAke3RoaXMuI21heF9ieXRlc30gYnl0ZXMgaXMgYWxsb3dlZGApLFxuICAgICAgKTtcbiAgICByZXR1cm4gc3VwZXIuY2hlY2tfdmFsdWUodmFsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGF0ZV9yZWxhdGVkKHJlbGF0ZWQ6IFBhcnRpYWw8U3RhdGVTdHJpbmdSZWxhdGVkPik6IHZvaWQge1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGgpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2xlbmd0aFwiLCByZWxhdGVkLm1heF9sZW5ndGgsICgpID0+IG5vbmUoKSk7XG4gICAgZWxzZSB0aGlzLmRldGFjaF9zdGF0ZV9mcm9tX3Byb3AoXCJtYXhfbGVuZ3RoXCIpO1xuICAgIGlmIChyZWxhdGVkLm1heF9sZW5ndGhfYnl0ZXMpXG4gICAgICB0aGlzLmF0dGFjaF9zdGF0ZV90b19wcm9wKFwibWF4X2J5dGVzXCIsIHJlbGF0ZWQubWF4X2xlbmd0aF9ieXRlcywgKCkgPT5cbiAgICAgICAgbm9uZSgpLFxuICAgICAgKTtcbiAgICBlbHNlIHRoaXMuZGV0YWNoX3N0YXRlX2Zyb21fcHJvcChcIm1heF9ieXRlc1wiKTtcbiAgfVxufVxuZGVmaW5lX2VsZW1lbnQoRm9ybVRleHRNdWx0aWxpbmUpO1xuXG4vKipDcmVhdGVzIGEgbXVsdGkgbGluZSB0ZXh0IGlucHV0IGZvcm0gZWxlbWVudCAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1fdGV4dF9tdWx0aWxpbmU8SUQgZXh0ZW5kcyBzdHJpbmcgfCB1bmRlZmluZWQ+KFxuICBvcHRpb25zPzogRm9ybVRleHRJbnB1dE9wdGlvbnM8SUQ+LFxuKTogRm9ybVRleHRNdWx0aWxpbmU8SUQ+IHtcbiAgY29uc3QgaW5wdXQgPSBuZXcgRm9ybVRleHRNdWx0aWxpbmU8SUQ+KG9wdGlvbnM/LmlkKTtcbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucy5wbGFjZWhvbGRlcikgaW5wdXQucGxhY2Vob2xkZXIgPSBvcHRpb25zLnBsYWNlaG9sZGVyO1xuICAgIGlmIChvcHRpb25zLm1heF9sZW5ndGgpIGlucHV0Lm1heF9sZW5ndGggPSBvcHRpb25zLm1heF9sZW5ndGg7XG4gICAgaWYgKG9wdGlvbnMubWF4X2J5dGVzKSBpbnB1dC5tYXhfYnl0ZXMgPSBvcHRpb25zLm1heF9ieXRlcztcbiAgICBGb3JtVmFsdWVXcml0ZS5hcHBseV9vcHRpb25zKGlucHV0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gaW5wdXQ7XG59XG4iLCJpbXBvcnQgeyBkZWZpbmVfZWxlbWVudCB9IGZyb20gXCJAY2hvY2JpdGUvdHMtbGliLWJhc2VcIjtcbmltcG9ydCB7IEZvcm1FbGVtZW50IH0gZnJvbSBcIi4uLy4uL2Jhc2VcIjtcbmltcG9ydCBcIi4vdGV4dC5zY3NzXCI7XG5cbmludGVyZmFjZSBGb3JtVGV4dE9wdGlvbnMge1xuICAvKipCdXR0b25zIHRleHQgKi9cbiAgdGV4dD86IHN0cmluZztcbiAgLyoqVGV4dCBzaXplICovXG4gIHNpemU/OiBudW1iZXI7XG59XG5cbi8qKkNvbXBvbmVudCBmb3Igc2ltcGxlIHRleHQgKi9cbmNsYXNzIEZvcm1UZXh0IGV4dGVuZHMgRm9ybUVsZW1lbnQge1xuICBzdGF0aWMgZWxlbWVudF9uYW1lKCkge1xuICAgIHJldHVybiBcInRleHRcIjtcbiAgfVxuICBzdGF0aWMgZWxlbWVudF9uYW1lX3NwYWNlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFwiZm9ybVwiO1xuICB9XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogRm9ybVRleHRPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAob3B0aW9ucy50ZXh0KSB0aGlzLnRleHQgPSBvcHRpb25zLnRleHQ7XG4gICAgaWYgKG9wdGlvbnMuc2l6ZSkgdGhpcy5zaXplID0gb3B0aW9ucy5zaXplO1xuICB9XG5cbiAgLyoqU2V0cyB0aGUgY3VycmVudCB0ZXh0IG9mIHRoZSBlbGVtZW50Ki9cbiAgc2V0IHRleHQodGV4dDogc3RyaW5nKSB7XG4gICAgdGhpcy50ZXh0Q29udGVudCA9IHRleHQ7XG4gIH1cbiAgZ2V0IHRleHQoKSB7XG4gICAgcmV0dXJuIHRoaXMudGV4dENvbnRlbnQ7XG4gIH1cblxuICAvKipTZXRzIHRoZSBjdXJyZW50IHRleHQgb2YgdGhlIGVsZW1lbnQqL1xuICBzZXQgc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICB0aGlzLnN0eWxlLmZvbnRTaXplID0gc2l6ZSArIFwicmVtXCI7XG4gICAgdGhpcy5zdHlsZS5saW5lSGVpZ2h0ID0gc2l6ZSArIFwicmVtXCI7XG4gIH1cbn1cbmRlZmluZV9lbGVtZW50KEZvcm1UZXh0KTtcblxuLyoqQ3JlYXRlcyBhIGJ1dHRvbiBmb3JtIGVsZW1lbnQgKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtX3RleHQob3B0aW9uczogRm9ybVRleHRPcHRpb25zKTogRm9ybVRleHQge1xuICByZXR1cm4gbmV3IEZvcm1UZXh0KG9wdGlvbnMpO1xufVxuIiwiaW1wb3J0IHsgRm9ybUNvbG9ycyB9IGZyb20gXCIuL2Jhc2VcIjtcbmltcG9ydCB7IGZvcm1fYnV0dG9uIH0gZnJvbSBcIi4vYm9vbGVhbi9idXR0b24vYnV0dG9uXCI7XG5pbXBvcnQgeyBmb3JtX2xhbXAgfSBmcm9tIFwiLi9ib29sZWFuL2xhbXAvbGFtcFwiO1xuaW1wb3J0IHsgZm9ybV9zd2l0Y2ggfSBmcm9tIFwiLi9ib29sZWFuL3N3aXRjaC9zd2l0Y2hcIjtcbmltcG9ydCB7IGZvcm1fZ3JvdXAgfSBmcm9tIFwiLi9ncm91cC9ncm91cFwiO1xuaW1wb3J0IHsgZm9ybV9ncm91cF9jb2xsYXBzZXIgfSBmcm9tIFwiLi9ncm91cC9ncm91cF9jb2xsYXBzZXJcIjtcbmltcG9ydCB7IGZvcm1fbGlzdF9maWVsZCB9IGZyb20gXCIuL2xpc3QvbGlzdF9maWVsZFwiO1xuaW1wb3J0IHsgZm9ybV9udW1iZXJfaW5wdXQgfSBmcm9tIFwiLi9udW1iZXIvbnVtYmVyX2lucHV0L251bWJlcl9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9wcm9ncmVzcyB9IGZyb20gXCIuL251bWJlci9wcm9ncmVzcy9wcm9ncmVzc1wiO1xuaW1wb3J0IHsgZm9ybV9zbGlkZXIgfSBmcm9tIFwiLi9udW1iZXIvc2xpZGVyL3NsaWRlclwiO1xuaW1wb3J0IHsgZm9ybV9zdGVwcGVyIH0gZnJvbSBcIi4vbnVtYmVyL3N0ZXBwZXIvc3RlcHBlclwiO1xuaW1wb3J0IHsgZm9ybV9kcm9wZG93biB9IGZyb20gXCIuL3NlbGVjdG9ycy9kcm9wX2Rvd24vZHJvcF9kb3duXCI7XG5pbXBvcnQgeyBmb3JtX3RvZ2dsZV9idXR0b24gfSBmcm9tIFwiLi9zZWxlY3RvcnMvdG9nZ2xlX2J1dHRvbi90b2dnbGVfYnV0dG9uXCI7XG5pbXBvcnQgeyBmb3JtX3NwYWNlciB9IGZyb20gXCIuL3NwYWNpbmcvc3BhY2VyXCI7XG5pbXBvcnQgeyBmb3JtX2NvbG9yX2lucHV0IH0gZnJvbSBcIi4vc3BlY2lhbC9jb2xvci9jb2xvcl9pbnB1dFwiO1xuaW1wb3J0IHtcbiAgZm9ybV9kYXRlX3RpbWVfaW5wdXQsXG4gIEZvcm1EYXRlVGltZVR5cGUsXG59IGZyb20gXCIuL3NwZWNpYWwvZGF0ZV90aW1lL2RhdGVfdGltZV9pbnB1dFwiO1xuaW1wb3J0IHsgZm9ybV9pcF9pbnB1dCB9IGZyb20gXCIuL3NwZWNpYWwvaXAvaXBfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fcGFzc3dvcmRfaW5wdXQgfSBmcm9tIFwiLi9zcGVjaWFsL3Bhc3N3b3JkL3Bhc3N3b3JkX2lucHV0XCI7XG5pbXBvcnQgeyBmb3JtX3RleHRfaW5wdXQgfSBmcm9tIFwiLi90ZXh0L2lucHV0L3RleHRfaW5wdXRcIjtcbmltcG9ydCB7IGZvcm1fdGV4dF9tdWx0aWxpbmUgfSBmcm9tIFwiLi90ZXh0L211bHRpX2xpbmUvdGV4dF9tdWx0aV9saW5lXCI7XG5pbXBvcnQgeyBmb3JtX3RleHQgfSBmcm9tIFwiLi90ZXh0L3RleHQvdGV4dFwiO1xuXG4vKipGb3JtIGVsZW1lbnRzIHdpdGggbGFiZWwgKi9cbmV4cG9ydCBjb25zdCBmb3JtID0ge1xuICBGb3JtQ29sb3JzLFxuXG4gIC8vQm9vbGVhblxuICBidXR0b246IGZvcm1fYnV0dG9uLFxuICBzd2l0Y2g6IGZvcm1fc3dpdGNoLFxuICBsYW1wOiBmb3JtX2xhbXAsXG5cbiAgLy9Hcm91cFxuICBncm91cDogZm9ybV9ncm91cCxcbiAgZ3JvdXBfY29sbGFwc2VyOiBmb3JtX2dyb3VwX2NvbGxhcHNlcixcblxuICAvL1NwZWNpYWxcbiAgY29sb3JfaW5wdXQ6IGZvcm1fY29sb3JfaW5wdXQsXG4gIGRhdGVfdGltZV9pbnB1dDogZm9ybV9kYXRlX3RpbWVfaW5wdXQsXG4gIEZvcm1EYXRlVGltZVR5cGUsXG4gIGlwX2lucHV0OiBmb3JtX2lwX2lucHV0LFxuICBwYXNzd29yZF9pbnB1dDogZm9ybV9wYXNzd29yZF9pbnB1dCxcblxuICAvL051bWJlclxuICBwcm9ncmVzczogZm9ybV9wcm9ncmVzcyxcbiAgaW5wdXRfbnVtYmVyOiBmb3JtX251bWJlcl9pbnB1dCxcbiAgc2xpZGVyOiBmb3JtX3NsaWRlcixcbiAgc3RlcHBlcjogZm9ybV9zdGVwcGVyLFxuXG4gIC8vU2VsZWN0b3JzXG4gIGRyb3Bkb3duOiBmb3JtX2Ryb3Bkb3duLFxuICB0b2dnbGVfYnV0dG9uOiBmb3JtX3RvZ2dsZV9idXR0b24sXG5cbiAgLy9TcGFjaW5nXG4gIHNwYWNlcjogZm9ybV9zcGFjZXIsXG5cbiAgLy9UZXh0XG4gIHRleHQ6IGZvcm1fdGV4dCxcbiAgaW5wdXRfdGV4dDogZm9ybV90ZXh0X2lucHV0LFxuICBtdWx0aWxpbmVfdGV4dDogZm9ybV90ZXh0X211bHRpbGluZSxcblxuICAvL0xpc3RcbiAgbGlzdF9maWVsZDogZm9ybV9saXN0X2ZpZWxkLFxufTtcbmV4cG9ydCBkZWZhdWx0IGZvcm07XG5cbmV4cG9ydCB7IEZvcm1Db2xvcnMgfSBmcm9tIFwiLi9iYXNlXCI7XG5leHBvcnQgeyBGb3JtRGF0ZVRpbWVUeXBlIH0gZnJvbSBcIi4vc3BlY2lhbC9kYXRlX3RpbWUvZGF0ZV90aW1lX2lucHV0XCI7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQVVBLE1BQU0sYUFB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