@esfaenza/es-table 13.3.2 → 14.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/esm2020/lib/components/es-table/es_table.component.loc.mjs +7 -5
  2. package/esm2020/lib/components/es-table/es_table.component.mjs +309 -76
  3. package/esm2020/lib/components/es-table-template/es_table_template.component.mjs +21 -0
  4. package/esm2020/lib/components/es-td/es_td.component.mjs +21 -9
  5. package/esm2020/lib/components/es-th/es_th.component.mjs +4 -4
  6. package/esm2020/lib/components/pager/table_pager.component.loc.mjs +4 -4
  7. package/esm2020/lib/components/pager/table_pager.component.mjs +9 -9
  8. package/esm2020/lib/core/CopyPasteDetector.mjs +25 -0
  9. package/esm2020/lib/core/handlers/ColumnMetadataHandler.mjs +34 -15
  10. package/esm2020/lib/core/handlers/ExportHandler.mjs +12 -3
  11. package/esm2020/lib/core/handlers/ItemsHandler.mjs +13 -5
  12. package/esm2020/lib/core/handlers/ReportModeHandler.mjs +10 -1
  13. package/esm2020/lib/core/handlers/SelectionHandler.mjs +263 -1
  14. package/esm2020/lib/core/handlers/UtilitiesHandler.mjs +6 -4
  15. package/esm2020/lib/directives/es_td.directive.mjs +10 -6
  16. package/esm2020/lib/directives/es_td_editor.directive.mjs +24 -0
  17. package/esm2020/lib/directives/es_th.directive.mjs +19 -9
  18. package/esm2020/lib/domain/externals/EsTableColumnsDefinition.mjs +34 -22
  19. package/esm2020/lib/domain/externals/EsTableModelChange.mjs +19 -0
  20. package/esm2020/lib/domain/externals/ItemPropEditableReference.mjs +4 -0
  21. package/esm2020/lib/domain/externals/appsearch/AppSearch.mjs +32 -14
  22. package/esm2020/lib/domain/internals/EsTableColumn.mjs +2 -1
  23. package/esm2020/lib/domain/internals/GroupPager.mjs +4 -3
  24. package/esm2020/lib/domain/internals/TdElement.mjs +1 -1
  25. package/esm2020/lib/domain/internals/ThElement.mjs +1 -1
  26. package/esm2020/lib/domain/types.mjs +2 -0
  27. package/esm2020/lib/es-table.module.mjs +27 -21
  28. package/esm2020/public-api.mjs +6 -1
  29. package/fesm2015/esfaenza-es-table.mjs +892 -193
  30. package/fesm2015/esfaenza-es-table.mjs.map +1 -1
  31. package/fesm2020/esfaenza-es-table.mjs +878 -192
  32. package/fesm2020/esfaenza-es-table.mjs.map +1 -1
  33. package/{esfaenza-es-table.d.ts → index.d.ts} +0 -0
  34. package/lib/components/es-table/es_table.component.d.ts +103 -30
  35. package/lib/components/es-table-template/es_table_template.component.d.ts +18 -0
  36. package/lib/components/es-td/es_td.component.d.ts +12 -4
  37. package/lib/components/es-th/es_th.component.d.ts +1 -1
  38. package/lib/components/pager/table_pager.component.d.ts +1 -1
  39. package/lib/core/CopyPasteDetector.d.ts +13 -0
  40. package/lib/core/handlers/ColumnMetadataHandler.d.ts +7 -0
  41. package/lib/core/handlers/ItemsHandler.d.ts +1 -1
  42. package/lib/core/handlers/ReportModeHandler.d.ts +9 -0
  43. package/lib/core/handlers/SelectionHandler.d.ts +77 -0
  44. package/lib/directives/es_td.directive.d.ts +4 -2
  45. package/lib/directives/es_td_editor.directive.d.ts +14 -0
  46. package/lib/directives/es_th.directive.d.ts +12 -11
  47. package/lib/domain/externals/EsTableColumnsDefinition.d.ts +43 -21
  48. package/lib/domain/externals/EsTableModelChange.d.ts +17 -0
  49. package/lib/domain/externals/ItemPropEditableReference.d.ts +30 -0
  50. package/lib/domain/externals/appsearch/AppSearch.d.ts +15 -2
  51. package/lib/domain/internals/EsTableColumn.d.ts +1 -0
  52. package/lib/domain/internals/GroupPager.d.ts +3 -2
  53. package/lib/domain/internals/TdElement.d.ts +10 -5
  54. package/lib/domain/internals/ThElement.d.ts +5 -0
  55. package/lib/domain/types.d.ts +2 -0
  56. package/lib/es-table.module.d.ts +17 -14
  57. package/package.json +14 -14
  58. package/public-api.d.ts +5 -0
@@ -54,6 +54,12 @@ export class ColumnMetadataHandler {
54
54
  this.est.arrayOrders = [new AppOrdering(id, order)];
55
55
  }
56
56
  }
57
+ //Salvo le preferences di questa view
58
+ //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI
59
+ if (this.est.SavePreferences) {
60
+ let castedView = this.est.viewMode ? (this.est.MainGroupView || this.est.View) : null;
61
+ this.registerViewPreferences(castedView);
62
+ }
57
63
  this.est.onOrderChanged.emit({ id, order });
58
64
  if (this.est.viewMode) {
59
65
  if (this.est.groupSearchRequestsCache.length > 0)
@@ -64,6 +70,30 @@ export class ColumnMetadataHandler {
64
70
  else if (this.est.arrayMode)
65
71
  this.est.internalWriteValue();
66
72
  }
73
+ /**
74
+ * Registra le preference relative alla view passata come parametro
75
+ *
76
+ * @param {any} castedView View di cui salvare colonne e ordinamento colonne
77
+ */
78
+ registerViewPreferences(castedView) {
79
+ if (!this.est.ngControl.name) {
80
+ console.error("Non posso utilizzare le preference senza avere un 'name' per la tabella");
81
+ return false;
82
+ }
83
+ if (!this.prefService) {
84
+ console.error("Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato");
85
+ return false;
86
+ }
87
+ let columns = this.est.arrayMode ? this.est.arrayColumns : castedView.columns;
88
+ let columnsOrderings = this.est.arrayMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
89
+ let columnOrders = this.est.arrayMode ? [] : castedView.orders;
90
+ var toStore = {
91
+ columns: JSON.parse(JSON.stringify(columns)),
92
+ column_ordering: JSON.parse(JSON.stringify(columnsOrderings)),
93
+ orders: JSON.parse(JSON.stringify(columnOrders))
94
+ };
95
+ this.prefService.setItem(this.est.ngControl.name, toStore, 'preference').subscribe();
96
+ }
67
97
  /**
68
98
  * Partendo dagli **EsThs** estrappolo la lista di **EsTableColumn** che questa tabella dovrà eventualmente gestire per Visibilità e Ordine
69
99
  *
@@ -95,6 +125,7 @@ export class ColumnMetadataHandler {
95
125
  this.est.ColumnsList = [];
96
126
  this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });
97
127
  }
128
+ /** In caso siano configurati dei th "Multi" (vedere la descrizione del campo **thMulti** di **EsThDirective**) questo metodo li "srotola" in tutti i th/td che devono effettivamente diventare */
98
129
  expandMultiThsAndTds(ths, tds, items) {
99
130
  // Registro le info sui multiprovider
100
131
  let multiDefs = {};
@@ -720,20 +751,8 @@ export class ColumnMetadataHandler {
720
751
  this.refreshColumnsVisibility(null, null, castedView);
721
752
  //Salvo le preferences di questa view
722
753
  //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI
723
- if (this.est.SavePreferences) {
724
- if (!this.est.ngControl.name) {
725
- console.error("Non posso utilizzare le preference senza avere un 'name' per la tabella");
726
- return false;
727
- }
728
- if (!this.prefService) {
729
- console.error("Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato");
730
- return false;
731
- }
732
- let columns = this.est.arrayMode ? this.est.arrayColumns : castedView.columns;
733
- let columnsOrderings = this.est.arrayMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
734
- var toStore = { columns: JSON.parse(JSON.stringify(columns)), column_ordering: JSON.parse(JSON.stringify(columnsOrderings)) };
735
- this.prefService.setItem(this.est.ngControl.name, toStore, 'preference').subscribe();
736
- }
754
+ if (this.est.SavePreferences)
755
+ this.registerViewPreferences(castedView);
737
756
  // Rieseguo l'ultima ricerca bindata alla tabella
738
757
  // Mi assicuro di farlo dopo l'espansione del changed o rischio che la ricerca mi ridia colonne che in realtà non esistono
739
758
  if (this.est.viewMode)
@@ -774,4 +793,4 @@ export class ColumnMetadataHandler {
774
793
  });
775
794
  }
776
795
  }
777
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sdW1uTWV0YWRhdGFIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb3JlL2hhbmRsZXJzL0NvbHVtbk1ldGFkYXRhSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTWpFLFVBQVU7QUFDVixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBR3JFLDZIQUE2SDtBQUM3SCxNQUFNLE9BQU8scUJBQXFCO0lBRTlCLHlCQUF5QjtJQUN6QixZQUFvQixHQUFxQixFQUFVLFNBQTJCLEVBQVUsT0FBdUIsRUFBVSxXQUErQixFQUFVLEdBQXVCO1FBQXJLLFFBQUcsR0FBSCxHQUFHLENBQWtCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW9CO0lBQUksQ0FBQztJQUU5TDs7Ozs7T0FLRztJQUNJLG1CQUFtQixDQUFDLEVBQVUsRUFBRSxLQUFxQjtRQUN4RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDakcsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksYUFBYSxHQUFXLElBQUksQ0FBQztRQUVqQyxtRkFBbUY7UUFDbkYsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVE7WUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUF1QixDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7YUFDN0MsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVM7WUFDbEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBRTlCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQixJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUNaLElBQUksS0FBSyxFQUFFO29CQUNQLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUNoQixVQUFVLEdBQUcsS0FBSyxDQUFDO2lCQUN0Qjs7b0JBRUcsYUFBYSxHQUFHLENBQUMsQ0FBQzthQUN6QjtTQUNKO1FBRUQsSUFBSSxhQUFhLElBQUksSUFBSSxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ25DO2FBQ0ksSUFBSSxVQUFVLEVBQUU7WUFDakIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLDBCQUEwQjtnQkFDbkMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztpQkFDdkM7Z0JBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVE7b0JBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBdUIsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztxQkFDdkUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVM7b0JBQ3ZCLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxXQUFXLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDM0Q7U0FDSjtRQUVELElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUU7WUFDbkIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLHVCQUF1QixDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQzs7Z0JBRTdDLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDekM7YUFDSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUztZQUN2QixJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDdEMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGlCQUFpQixDQUFDLEdBQW9CO1FBQ3pDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEVBQUUsQ0FBQztRQUM3QixJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNmLE9BQU87UUFFWCxrRUFBa0U7UUFDbEUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBRWhCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDbkIsNkNBQTZDO1lBQzdDLElBQUksQ0FBQyxNQUFNO2dCQUNQLFNBQVM7WUFFYixxSEFBcUg7WUFDckgsNkRBQTZEO1lBQzdELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRTtnQkFDckQsSUFBSSxnQkFBZ0IsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUM7Z0JBQ2pKLElBQUksS0FBSyxHQUFHLElBQUksYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO2dCQUNqUSxJQUFJLGdCQUFnQjtvQkFDaEIsS0FBSyxDQUFDLFVBQVUsR0FBRyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN2QztTQUNKO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVNLG9CQUFvQixDQUFDLEdBQW9CLEVBQUUsR0FBb0IsRUFBRSxLQUFZO1FBRWhGLHFDQUFxQztRQUNyQyxJQUFJLFNBQVMsR0FBa0ssRUFBRyxDQUFDO1FBRW5MLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU87Z0JBQ1gsU0FBUztZQUViLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUM7U0FDbEY7UUFFRCw4QkFBOEI7UUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0IsSUFBRyxFQUFFLENBQUMsTUFBTTtnQkFDUixTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7U0FDbkM7UUFFRCxzQ0FBc0M7UUFDdEMsNkpBQTZKO1FBQzdKLEdBQUcsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbEMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVqQyxJQUFJLFNBQVMsR0FBK0IsRUFBRyxDQUFDO1FBQ2hELElBQUksWUFBWSxHQUErQixFQUFHLENBQUM7UUFDbkQsSUFBSSxRQUFRLEdBQW9DLEVBQUcsQ0FBQztRQUNwRCxJQUFJLFFBQVEsR0FBb0IsRUFBRSxDQUFDO1FBRW5DLDhFQUE4RTtRQUM5RSxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBQztZQUNqQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFbkIsS0FBSyxJQUFJLElBQUksSUFBSSxTQUFTLEVBQUU7Z0JBQ3hCLG9FQUFvRTtnQkFDcEUsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDL0IsSUFBSSxRQUFRLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO29CQUMvQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUMzQixJQUFJLEtBQUssR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDO29CQUUzQixLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRTt3QkFFMUMsMEVBQTBFO3dCQUMxRSxJQUFJLEtBQUssR0FBc0IsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUM3QyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQjs0QkFDeEIsS0FBSyxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBRXpHLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7d0JBQy9CLElBQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDO3dCQUN4QyxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7d0JBRTFDLElBQUksWUFBWSxDQUFDLEdBQUcsTUFBTSxJQUFJLFdBQVcsRUFBRSxDQUFDOzRCQUN4QyxTQUFTOzs0QkFFVCxZQUFZLENBQUMsR0FBRyxNQUFNLElBQUksV0FBVyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBRXBELHNJQUFzSTt3QkFDdEksSUFBSSxLQUFLLEdBQUcsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUM5QyxLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQzt3QkFDcEIsS0FBSyxDQUFDLGNBQWMsR0FBRyxXQUFXLENBQUM7d0JBQ25DLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQzNCLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDOUIsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUN4QixLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7d0JBQ2xDLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQzt3QkFDNUIsdURBQXVEO3dCQUN2RCxLQUFLLENBQUMsUUFBUSxHQUFHLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNyRCxLQUFLLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQzt3QkFFMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7NEJBQ3pDLElBQUksR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7Z0NBQ2YsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs7Z0NBRXRCLFNBQVM7NEJBRWIsSUFBSSxRQUFRLEdBQUcsSUFBSSxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3ZDLFFBQVEsQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDOzRCQUNsQixRQUFRLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQzs0QkFDOUIsUUFBUSxDQUFDLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7NEJBQ3RELFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQzNCO3dCQUVELFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBRXJCLElBQUksS0FBSyxHQUFHLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQzt3QkFDOUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7d0JBQ3BCLEtBQUssQ0FBQyxFQUFFLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUM7d0JBQzNCLEtBQUssQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQzt3QkFDOUIsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO3dCQUN4QixLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxTQUFTLENBQUM7d0JBQ2xDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDO3FCQUM5QjtpQkFDSjthQUNKO1NBQ0o7UUFFRCwrSkFBK0o7UUFDL0osSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXBCLDBHQUEwRztRQUMxRyxLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBQztZQUNwQyxJQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7Z0JBQ3BCLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxLQUFJLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBQztZQUN0QixLQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBQztnQkFDcEMsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNyQixJQUFHLEVBQUUsQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDLFFBQVEsSUFBSSxJQUFJO29CQUNqQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzNCO1NBQ0o7UUFFRCxHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUcsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO1FBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RDLDRGQUE0RjtZQUM1RixJQUFJLEVBQUUsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLElBQUksRUFBRTtnQkFDRixHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3BCO1FBRUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNJLDhCQUE4QixDQUFDLEdBQW9CLEVBQUUsR0FBb0I7UUFFNUUsSUFBSSxRQUFRLEdBQThCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQztRQUM1QixJQUFJLFlBQVksR0FBd0MsRUFBRSxDQUFDO1FBQzNELElBQUksaUJBQWlCLEdBQWlDLEVBQUUsQ0FBQztRQUV6RCw4QkFBOEI7UUFDOUIsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUMzRCxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNyQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUUzQixtRUFBbUU7WUFDbkUsSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUNaLElBQUksSUFBSSxJQUFJLE9BQU87b0JBQ2YsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dCQUNsRSxPQUFPLEVBQUUsQ0FBQzthQUNiO1lBRUQsMEVBQTBFO1lBQzFFLElBQUksR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCLElBQUksSUFBSSxJQUFJLE9BQU8sR0FBRyxNQUFNO29CQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDMUQsTUFBTSxFQUFFLENBQUM7YUFDWjtTQUNKO1FBRUQsT0FBTyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFFckIsb0RBQW9EO1FBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQixpR0FBaUc7WUFDakcsRUFBRSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0csSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFO2dCQUNiLElBQUksQ0FBQyxJQUFJLE9BQU87b0JBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxFQUFFLENBQUM7YUFDYjtZQUVELGlIQUFpSDtZQUNqSCxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFO2dCQUM1QyxJQUFJLENBQUMsSUFBSSxPQUFPLEdBQUcsTUFBTTtvQkFDckIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZELE1BQU0sRUFBRSxDQUFDO2FBQ1o7U0FDSjtRQUVELHNEQUFzRDtRQUN0RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDL0IsaUJBQWlCLENBQWlCLEdBQUcsQ0FBQyxDQUFDLENBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFdEQsb0VBQW9FO1FBQ3BFLElBQUksTUFBTSxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVuQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFrQixDQUFDO1lBQ25DLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDN0M7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELDJGQUEyRjtJQUNwRiwwQkFBMEI7UUFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCO1lBQzFCLE9BQU87UUFFWCxJQUFJLENBQUMsR0FBRyxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUNsQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLElBQUksR0FBRyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsT0FBTztnQkFDekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxHQUFHLENBQUMsV0FBVyxDQUFDO1NBQ3hEO1FBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksd0JBQXdCLENBQUMsSUFBb0I7UUFDaEQsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUN2RCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFFbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDO1lBQ3pELE9BQU87UUFFWCxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUM7UUFDdkUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzdCLGdHQUFnRztZQUNoRyxJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFckYsNkRBQTZEO1lBQzdELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDO2dCQUNoQixDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFdkMsa0lBQWtJO1lBQ2xJLElBQUksQ0FBQyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUM7Z0JBQ2hDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBRXpCLDRGQUE0RjtpQkFDdkYsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPO2dCQUNuQyxDQUFDLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUVyQixpRUFBaUU7aUJBQzVELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU87Z0JBQ2xDLENBQUMsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsc0VBQXNFO1FBQ3RFLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVE7Z0JBQ2pCLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDOztnQkFFekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1NBQ3pDO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDdkcsa0ZBQWtGO1lBQ2xGLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtnQkFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUM3QixJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRTt3QkFDVixVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUMsQ0FBQyxDQUFDO1lBRUgsb0pBQW9KO1lBQ3BKLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDN0IsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQztvQkFDaEMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQixDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztTQUNyQztRQUVELHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTtZQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUU1QixJQUFJLFdBQVc7WUFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNJLHdCQUF3QixDQUFDLEdBQW9CLEVBQUUsR0FBb0IsRUFBRSxJQUFvQjtRQUM1RixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxRQUFRLEdBQStCLEVBQUUsQ0FBQztRQUM5QyxJQUFJLFlBQVksR0FBd0MsRUFBRSxDQUFDO1FBQzNELEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDM0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDM0IsSUFBSSxHQUFHLENBQUMsT0FBTztnQkFDWCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDeEQ7UUFDRCxJQUFJLElBQUk7WUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQzs7WUFHekIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsU0FBUyxDQUFDO1FBRXRDLGlKQUFpSjtRQUNqSixJQUFJLEdBQUcsRUFBRTtZQUNMLDZGQUE2RjtZQUM3RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoQixFQUFFLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNoRyxJQUFJLEVBQUUsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLE9BQU87b0JBQ3hCLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO2FBQzlCO1NBQ0o7UUFFRCxJQUFJLEdBQUcsRUFBRTtZQUNMLDJGQUEyRjtZQUMzRixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixFQUFFLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2FBQ3hHO1NBQ0o7UUFFRCxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLG9CQUFvQixDQUFDLEdBQW9CLEVBQUUsSUFBb0I7UUFDbEUsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQztRQUN2RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEIsRUFBRSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3BDLElBQUksRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFO29CQUNkLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQzthQUM3QjtTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSw0QkFBNEIsQ0FBQyxHQUFvQjtRQUNwRCwrQkFBK0I7UUFDL0IsSUFBSSxZQUFZLEdBQWtDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLFFBQVEsR0FBd0MsRUFBRSxDQUFDO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2pDLElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVoQixRQUFRLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLEVBQUUsQ0FBQyxRQUFRLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDekMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxJQUFJLENBQUM7U0FDeEM7UUFFRCxxRkFBcUY7UUFDckYsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLElBQUksS0FBSyxHQUFVLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEIsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNmLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBQ2hELFNBQVMsR0FBRyxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQzthQUNqRDtTQUNKO1FBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztJQUN0RyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLG9CQUFvQixDQUFDLEtBQXdIO1FBQ2hKLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxDQUFDO1lBQ3hCLE9BQU87UUFFWCxzSEFBc0g7UUFDdEgsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksb0JBQW9CLEdBQTRCLEtBQUssQ0FBQyxLQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBZ0IsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQyxjQUFjLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUNoRCxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsMERBQTBEO1FBQzFELElBQUksWUFBWSxHQUFHLEVBQUUsQ0FBQztRQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3RELElBQUksSUFBSSxHQUFrQixLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7Z0JBQ2hDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7UUFFRCx1RUFBdUU7UUFDdkUsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksS0FBSyxHQUFrQixZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0MsSUFBSSxNQUFNLEdBQWtCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFFcEUsZ0dBQWdHO1lBQ2hHLDJKQUEySjtZQUNySixLQUFNLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDO1lBQ2hELEtBQU0sQ0FBQyxNQUFNLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDM0QsSUFBSSxNQUFNO2dCQUNBLE1BQU8sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsSUFBSSxhQUFhLENBQUM7WUFFM0QsYUFBYSxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUM7WUFFL0IscUVBQXFFO1lBQ3JFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMxQyxJQUFJLE1BQU0sR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUM1QixJQUFJLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUU7b0JBQzNCLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7b0JBQzlCLEtBQUssR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lCQUNsQzthQUNKO1NBQ0o7UUFFRCxtRUFBbUU7UUFDbkUsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLFdBQVcsR0FBRyxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQzdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVDLElBQUksVUFBVSxHQUEyRyxFQUFFLENBQUM7WUFDNUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBRXpDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0I7Z0JBQy9DLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1lBRXBGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUMvQyxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hDLElBQUksSUFBSSxJQUFJLGFBQWE7b0JBQ3JCLFdBQVcsRUFBRSxDQUFDO3FCQUNiO29CQUNELElBQUksV0FBVyxHQUFHLENBQUM7d0JBQ2YsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQztvQkFDNU4sV0FBVyxHQUFHLENBQUMsQ0FBQztvQkFDaEIsYUFBYSxHQUFHLElBQUksQ0FBQztpQkFDeEI7YUFDSjtZQUVELHdEQUF3RDtZQUN4RCxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO1lBRXpOLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPO2dCQUNoQixVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVqRCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsaUJBQWlCO2dCQUNuRyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUVqRCxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLGFBQWEsR0FBRyxFQUFFLENBQUM7U0FDdEI7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxrQkFBa0IsQ0FBQyxFQUFpQixFQUFFLFFBQTZDO1FBQ3ZGLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztRQUFDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksY0FBYyxHQUFvRCxFQUFFLENBQUM7UUFDM0csSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLEdBQUc7WUFDQyxNQUFNLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNyQixJQUFJLE1BQU0sRUFBRTtnQkFDUixFQUFFLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUN0QixJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjO29CQUNqQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO3FCQUM3QyxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsY0FBYztvQkFDckMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztnQkFDM0QsS0FBSyxFQUFFLENBQUM7YUFDWDtTQUNKLFFBQVEsTUFBTSxFQUFFO1FBQ2pCLFNBQVMsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDO1FBQ3RDLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksb0JBQW9CLENBQUMsR0FBb0IsRUFBRSxJQUFvQjtRQUNsRSxJQUFJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQztZQUNmLE9BQU87UUFFWCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQztRQUN4RixtR0FBbUc7UUFDbkcsSUFBSSxDQUFDLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRTtZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDeEM7U0FDSjthQUNJO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFDO1lBQ3JDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2hCLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO29CQUM5QyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDM0M7U0FDSjtJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxhQUFhLENBQUMsSUFBb0IsRUFBRSxRQUFpQjtRQUN4RCxvQ0FBb0M7UUFDcEMsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBRXBCLDBEQUEwRDtRQUMxRCxJQUFJLFFBQVEsRUFBRTtZQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDakMsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxVQUFVO29CQUNWLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDcEMsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFFaEMsa0NBQWtDO1lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xELElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzFELElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztnQkFFcEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNqQyxJQUFJLFdBQVcsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEQsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDakMsQ0FBQyxDQUFDLENBQUM7Z0JBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUM7YUFDNUQ7U0FDSjtRQUVELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRO1lBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7O1lBR2hELElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7UUFFNUQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7Ozs7SUFJQTtJQUNPLE1BQU0sQ0FBQyxVQUF5QjtRQUNuQyxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNO1lBQzdGLE9BQU87UUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXJFLHdHQUF3RztRQUN4RyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxHQUFHLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxRQUFRLENBQUMsVUFBeUI7UUFDckMsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFFckUsd0dBQXdHO1FBQ3hHLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFFLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLEdBQUcsQ0FBQztJQUNsQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGdCQUFnQixDQUFDLFVBQXlCO1FBQzdDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRTtZQUNwQixVQUFVLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztZQUVsQyxxSEFBcUg7WUFDckgsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDckQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRTtvQkFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUNoRSxNQUFNO2lCQUNUO2FBQ0o7U0FDSjthQUNJO1lBQ0Qsb0lBQW9JO1lBQ3BJLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxTQUFTO2dCQUNuRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUNuRjtnQkFDRCw4SEFBOEg7Z0JBQzlILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7b0JBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUU7d0JBQ3pFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLE1BQU07cUJBQ1Q7aUJBQ0o7YUFDSjtTQUNKO1FBRUQsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxhQUFhLENBQUMsSUFBbUI7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSztZQUNyQyxPQUFPO1FBRVgsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0IsSUFBSSxDQUFDLHVCQUF1QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVELCtIQUErSDtJQUN4SCx1QkFBdUI7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsRUFBRSxDQUFDO1FBQzdCLHdHQUF3RztRQUN4RyxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxFQUFFLENBQUM7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRixJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUUxQixJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDakMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0QscUdBQXFHO2dCQUNyRyxJQUFJLE1BQU07b0JBQ04sZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3RDLENBQUMsQ0FBQyxDQUFDO1lBRUgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsZ0JBQWdCLENBQUM7U0FDOUM7UUFFRCxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztJQUNuQyxDQUFDO0lBRUQsZ0ZBQWdGO0lBQ3hFLHFCQUFxQjtRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFFOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFRCx1SkFBdUo7SUFDaEosdUJBQXVCO1FBQzFCLDZHQUE2RztRQUM3RyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGVBQWUsQ0FBQyxLQUFtQztRQUN0RCxlQUFlLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxhQUFhLENBQUMsS0FBYSxFQUFFLElBQTRCO1FBQzVELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzlDLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDL0YsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLGdDQUFnQztRQUNuQyx3Q0FBd0M7UUFDeEMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7WUFDOUMsT0FBTyxLQUFLLENBQUM7UUFFakIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUN4RyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUzRixJQUFJLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV0QyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUV0RCxxQ0FBcUM7UUFDckMsNEZBQTRGO1FBQzVGLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUU7WUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5RUFBeUUsQ0FBQyxDQUFDO2dCQUN6RixPQUFPLEtBQUssQ0FBQzthQUNoQjtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLGdHQUFnRyxDQUFDLENBQUM7Z0JBQ2hILE9BQU8sS0FBSyxDQUFDO2FBQ2hCO1lBRUQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDO1lBQzlFLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUM7WUFDdEcsSUFBSSxPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQVksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFZLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsSixJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBUyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO1NBQ2hHO1FBRUQsaURBQWlEO1FBQ2pELDBIQUEwSDtRQUMxSCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUTtZQUNqQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7b0JBQ3hCLG1EQUFtRDtvQkFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsd0JBQXdCLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO3dCQUMvRCxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDckQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUM7d0JBQzlDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDO3dCQUM5RCxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUMvRTtpQkFDSjs7b0JBR0csSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQzthQUNGLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTO1lBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RCx3Q0FBd0M7UUFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7UUFDbkMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxXQUFXLENBQUMsRUFBVTtRQUN6QixJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztRQUMvQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxnQ0FBZ0MsRUFBRSxDQUFDO0lBQzVDLENBQUM7SUFFRCw4SEFBOEg7SUFDdkgsd0JBQXdCO1FBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUs7Z0JBQ1IsQ0FBQyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDO1FBQy9DLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9kcmFnLWRyb3BcIjtcclxuaW1wb3J0IHsgVGVtcGxhdGVSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuLy8gTGlic1xyXG5pbXBvcnQgeyBVdGlsaXR5U2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5pbXBvcnQgeyBQcmVmZXJlbmNlc1NlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL3ByZWZlcmVuY2VzXCI7XHJcblxyXG4vLyBDb21wb25lbnRpIC8gRGlyZXR0aXZlXHJcbmltcG9ydCB7IEVzVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnRcIlxyXG5pbXBvcnQgeyBFc1RkRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvZXNfdGQuZGlyZWN0aXZlXCI7XHJcbmltcG9ydCB7IEVzVGhEaXJlY3RpdmUgfSBmcm9tIFwiLi4vLi4vZGlyZWN0aXZlcy9lc190aC5kaXJlY3RpdmVcIjtcclxuXHJcbi8vIEhhbmRsZXJzXHJcbmltcG9ydCB7IFV0aWxpdGllc0hhbmRsZXIgfSBmcm9tIFwiLi9VdGlsaXRpZXNIYW5kbGVyXCI7XHJcbmltcG9ydCB7IFJvd0dyb3VwaW5nSGFuZGxlciB9IGZyb20gXCIuL1Jvd0dyb3VwaW5nSGFuZGxlclwiO1xyXG5cclxuLy8gTW9kZWxsaVxyXG5pbXBvcnQgeyBBcHBPcmRlcmluZyB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9BcHBPcmRlcmluZ1wiO1xyXG5pbXBvcnQgeyBBcHBTZWFyY2ggfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwU2VhcmNoXCI7XHJcbmltcG9ydCB7IEVzVGFibGVDb2x1bW4gfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9Fc1RhYmxlQ29sdW1uXCI7XHJcbmltcG9ydCB7IEVzVGFibGVNdWx0aVZhbHVlIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0VzVGFibGVNdWx0aVZhbHVlXCI7XHJcblxyXG4vKiogQ2xhc3NlIGNoZSBnZXN0aXNjZSB0dXR0ZSBsZSBpbmZvcm1haXpvbmkgcmVsYXRpdmUgYWxsZSBjb2xvbm5lOiB2aXNpYmlsaXTDoCwgcG9zaXppb25lLCBzdGF0byBkaSBwaW4vdW5waW4sIGVjYyBlY2MuLi4gKi9cclxuZXhwb3J0IGNsYXNzIENvbHVtbk1ldGFkYXRhSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlc3Q6IEVzVGFibGVDb21wb25lbnQsIHByaXZhdGUgdXRpbGl0aWVzOiBVdGlsaXRpZXNIYW5kbGVyLCBwcml2YXRlIHV0aUV4dHM6IFV0aWxpdHlTZXJ2aWNlLCBwcml2YXRlIHByZWZTZXJ2aWNlOiBQcmVmZXJlbmNlc1NlcnZpY2UsIHByaXZhdGUgcmdIOiBSb3dHcm91cGluZ0hhbmRsZXIpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZXN0aXNjZSBpbCBjYW1iaW8gZGkgT3JkaW5hbWVudG8gZGkgdW5hIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaWQgSUQgZGVsbGEgY29sb25uYSBpbCBjdWkgb3JpZG5hbWVudG8gw6ggY2FtYmlhdG9cclxuICAgICAqIEBwYXJhbSB7J0RFU0MnIHwgJ0FTQyd9IG9yZGVyIE51b3ZvIG9yZGluZSBzZWxlemlvbmF0byBwZXIgbGEgY29sb25uYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlVEhPcmRlckNoYW5nZShpZDogc3RyaW5nLCBvcmRlcjogJ0RFU0MnIHwgJ0FTQycpIHtcclxuICAgICAgICBsZXQgb3JkZXJzID0gdGhpcy5lc3Qudmlld01vZGUgPyAodGhpcy5lc3QuVmlldyBhcyBBcHBTZWFyY2g8YW55Pikub3JkZXJzIDogdGhpcy5lc3QuYXJyYXlPcmRlcnM7XHJcbiAgICAgICAgbGV0IG9yZGVyVG9BZGQgPSB0cnVlO1xyXG4gICAgICAgIGxldCBvcmRlclRvUmVtb3ZlOiBudW1iZXIgPSBudWxsO1xyXG5cclxuICAgICAgICAvLyBTZSBwZXIgcXVhbGNoZSBtb3Rpdm8gaWwgY29zdHJ1dHRvcmUgbm9uIMOoIHBhc3NhdG8gKGNhY2hlIHRhcnBhdGUgbyBzaW1pbGEpIGZpeG9cclxuICAgICAgICBpZiAoIW9yZGVycyAmJiB0aGlzLmVzdC52aWV3TW9kZSlcclxuICAgICAgICAgICAgKHRoaXMuZXN0LlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pLm9yZGVycyA9IFtdO1xyXG4gICAgICAgIGVsc2UgaWYgKCFvcmRlcnMgJiYgdGhpcy5lc3QuYXJyYXlNb2RlKVxyXG4gICAgICAgICAgICB0aGlzLmVzdC5hcnJheU9yZGVycyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVycy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdCA9IG9yZGVyc1tpXTtcclxuICAgICAgICAgICAgaWYgKHQuaWQgPT0gaWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChvcmRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHQub3JkZXIgPSBvcmRlcjtcclxuICAgICAgICAgICAgICAgICAgICBvcmRlclRvQWRkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJUb1JlbW92ZSA9IGk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChvcmRlclRvUmVtb3ZlICE9IG51bGwpIHtcclxuICAgICAgICAgICAgb3JkZXJzLnNwbGljZShvcmRlclRvUmVtb3ZlLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAob3JkZXJUb0FkZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lc3QuTXVsdGlwbGVPcmRlcmluZ0RpcmVjdGl2ZXMpXHJcbiAgICAgICAgICAgICAgICBvcmRlcnMucHVzaChuZXcgQXBwT3JkZXJpbmcoaWQsIG9yZGVyKSk7XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXN0LnZpZXdNb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgICh0aGlzLmVzdC5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5vcmRlcnMgPSBbbmV3IEFwcE9yZGVyaW5nKGlkLCBvcmRlcildO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5lc3QuYXJyYXlNb2RlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LmFycmF5T3JkZXJzID0gW25ldyBBcHBPcmRlcmluZyhpZCwgb3JkZXIpXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lc3Qub25PcmRlckNoYW5nZWQuZW1pdCh7IGlkLCBvcmRlciB9KTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LnZpZXdNb2RlKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVzdC5ncm91cFNlYXJjaFJlcXVlc3RzQ2FjaGUubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgIHRoaXMucmdILmVtaXRSb3dHcm91cGluZ1NlYXJjaGVzKGlkLCBvcmRlcnMpO1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5lbWl0U2VhcmNoUmVxdWVzdChmYWxzZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKHRoaXMuZXN0LmFycmF5TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5lc3QuaW50ZXJuYWxXcml0ZVZhbHVlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQYXJ0ZW5kbyBkYWdsaSAqKkVzVGhzKiogZXN0cmFwcG9sbyBsYSBsaXN0YSBkaSAqKkVzVGFibGVDb2x1bW4qKiBjaGUgcXVlc3RhIHRhYmVsbGEgZG92csOgIGV2ZW50dWFsbWVudGUgZ2VzdGlyZSBwZXIgVmlzaWJpbGl0w6AgZSBPcmRpbmVcclxuICAgICAqXHJcbiAgICAgKiBDb3N0bzogMSBzY2FuIEVzVGhzXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJldmlld0NvbHVtbnNMaXN0KHRoczogRXNUaERpcmVjdGl2ZVtdKSB7XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QgPSBbXTtcclxuICAgICAgICBpZiAodGhzLmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIEFwcGVuYSBpbCBjb250ZW50Q2hpbGRyZW4gw6ggdmFsb3JpenphdG8gc2NvcnJvIHR1dHRpIGdsaSBoZWFkZXJcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcblxyXG4gICAgICAgICAgICBsZXQgY29sdW1uID0gdGgudGg7XHJcbiAgICAgICAgICAgIC8vIFNlIG5vbiBobyB1biBpZCBpbCB0aCDDqCBjb25zaWRlcmF0byBpbmVydGVcclxuICAgICAgICAgICAgaWYgKCFjb2x1bW4pXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNhbHZvIGxlIGluZm9ybWF6aW9uaSBkZWxsJ2hlYWRlciBwZXIgZmFyIHBhcnRlIGRlbGxhIGxpc3RhIGRhIGN1aSBzY2VnbGllcmUgcXVhbGkgY29sb25uZSB2aXN1YWxpenphcmUvbmFzY29uZGVyZVxyXG4gICAgICAgICAgICAvLyBEaSBkZWZhdWx0IGxhIHZpc2liaWxpdMOgIMOoIHF1ZWxsYSBpbXBvc3RhdGEgbmVsIGNvbXBvbmVudGVcclxuICAgICAgICAgICAgaWYgKCh0aGlzLmVzdC5IaWRkZW5Db2x1bW5zIHx8IHRoLnRoVmlzaWJsZSkgJiYgdGgudGhJZikge1xyXG4gICAgICAgICAgICAgICAgbGV0IHByZXZpb3VzbHlQaW5uZWQgPSAhdGhpcy5lc3QuQ29sdW1uc0xpc3QgfHwgdGhpcy5lc3QuQ29sdW1uc0xpc3QubGVuZ3RoID09IDAgPyBudWxsIDogdGhpcy5lc3QuQ29sdW1uc0xpc3QuZmluZCh0ID0+IHQuaWQgPT0gY29sdW1uKSB8fCBudWxsO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRvQWRkID0gbmV3IEVzVGFibGVDb2x1bW4oY29sdW1uLCB0aC50aFN0YXRpY0NvbnRlbnQsIHRoLnRoVmlzaWJsZSwgKHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCksIHByZXZpb3VzbHlQaW5uZWQgPT0gbnVsbCA/IHRoLnRoUGlubmVkIDogcHJldmlvdXNseVBpbm5lZC5waW5uZWQsIHRoLnRoUGlubmFibGUsIHRoLnRoUGlubmVkV2lkdGgsIHRoLlRlbXBsYXRlLCB0aC5fdGhQYXJlbnRzLCB0aC5fbXVsdGksIHRoLl9tdWx0aV9jb250ZW50KTtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c2x5UGlubmVkKVxyXG4gICAgICAgICAgICAgICAgICAgIHRvQWRkLnByZXZfaW5kZXggPSBwcmV2aW91c2x5UGlubmVkLnByZXZfaW5kZXg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5wdXNoKHRvQWRkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLmVzdC5Db2x1bW5zTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmZvckVhY2goYyA9PiB7IHRoaXMuZXN0LkNvbHVtbnNMaXN0LnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYykpOyB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgZXhwYW5kTXVsdGlUaHNBbmRUZHModGhzOiBFc1RoRGlyZWN0aXZlW10sIHRkczogRXNUZERpcmVjdGl2ZVtdLCBpdGVtczogYW55W10pOiB7ZXhwVGhzOiBFc1RoRGlyZWN0aXZlW10sIGV4cFRkczogRXNUZERpcmVjdGl2ZVtdfSB7XHJcblxyXG4gICAgICAgIC8vIFJlZ2lzdHJvIGxlIGluZm8gc3VpIG11bHRpcHJvdmlkZXJcclxuICAgICAgICBsZXQgbXVsdGlEZWZzOiB7IFtpZDogc3RyaW5nXTogeyBPbj86IHN0cmluZywgdGhyZWY6IEVzVGhEaXJlY3RpdmUsIHRkcmVmOiBFc1RkRGlyZWN0aXZlLCB0aGdlbjogeyBbaWQ6IHN0cmluZ106IEVzVGhEaXJlY3RpdmUgfSwgdGRnZW46IHsgW2lkOiBzdHJpbmddOiBFc1RkRGlyZWN0aXZlIH0gfSB9ID0geyB9O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgaWYgKCF0aC50aE11bHRpKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBtdWx0aURlZnNbdGgudGhdID0geyBPbjogdGgudGgsIHRkcmVmOiBudWxsLCB0aHJlZjogdGgsIHRoZ2VuOiB7fSwgdGRnZW46IHt9IH07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBBc3NlZ25vIGxlIGluZm8gYW5jaGUgYWkgdGRcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGQgPSB0ZHNbaV07XHJcbiAgICAgICAgICAgIHRkLl9tdWx0aSA9ICEhbXVsdGlEZWZzW3RkLnRkXTtcclxuICAgICAgICAgICAgaWYodGQuX211bHRpKVxyXG4gICAgICAgICAgICAgICAgbXVsdGlEZWZzW3RkLnRkXS50ZHJlZiA9IHRkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUmltdW92byBpIG11bHRpdGVtcGxhdGUgZGFsbGUgYmFsbGVcclxuICAgICAgICAvLyBOLkI6IERhdG8gY2hlIGxhIHByaW1hIG9wZXJhemlvbmUgc3UgdGggZSB0ZCDDqCBxdWVzdGEgaWwgcmlmZXJpbWVudG8gb3JpZ2luYWxlIHZpZW5lIHNvdnJhc2NyaXR0bywgcXVlc3RvIHNpZ25pZmljYSBjaGUgZGV2byByaS1lbWV0dGVyZSBpIGR1ZSBudW92aSBhcnJheVxyXG4gICAgICAgIHRocyA9IHRocy5maWx0ZXIodCA9PiAhdC50aE11bHRpKTtcclxuICAgICAgICB0ZHMgPSB0ZHMuZmlsdGVyKHQgPT4gIXQuX211bHRpKTtcclxuXHJcbiAgICAgICAgbGV0IHBhcmVudFRoczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW47IH0gPSB7IH07XHJcbiAgICAgICAgbGV0IGFkZGVkSGVhZGVyczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW47IH0gPSB7IH07XHJcbiAgICAgICAgbGV0IHRkc1RvQWRkOiB7IFtpZDogc3RyaW5nXSA6IEVzVGREaXJlY3RpdmV9ID0geyB9O1xyXG4gICAgICAgIGxldCB0aHNUb0FkZDogRXNUaERpcmVjdGl2ZVtdID0gW107XHJcblxyXG4gICAgICAgIC8vIFBlciBvZ25pIGl0ZW0gdmVkbyBzZSBjaSBzb25vIGRlaSBtdWx0aSBwZXIgbGUgcHJvcHJpZXTDoCBjaGUgbGkgZGVmaW5pc2Nvbm9cclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBsZXQgaXRtID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIG11bHRpRGVmcykge1xyXG4gICAgICAgICAgICAgICAgLy8gU2UgbGEgcHJvcHJpZXTDoCBkZWwgbXVsdGkgZXNpc3RlIG5lbGwnb2dnZXR0byBlZCBoYSB1bmEgbHVuZ2hlenphXHJcbiAgICAgICAgICAgICAgICBpZiAoaXRtW3Byb3BdICYmIGl0bVtwcm9wXS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbXVsdGlSZWYgPSBtdWx0aURlZnNbcHJvcF07XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZnRkID0gbXVsdGlSZWYudGRyZWY7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZnRoID0gbXVsdGlSZWYudGhyZWY7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGlpID0gMDsgaWkgPCBpdG1bcHJvcF0ubGVuZ3RoOyBpaSsrKSB7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBIZWFkZXIgZ2nDoCBhZ2dpdW50bywgbm9uIGRldm8gaW5zZXJpcmUgYWx0cmkgdGVtcGxhdGUgZGkgaGVhZGVyL2NvbG9ubmFcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVzdG12ID0gPEVzVGFibGVNdWx0aVZhbHVlPml0bVtwcm9wXVtpaV07XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZXN0bXYuX2hlYWRlcnNIaWVyYXJjaHkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3Rtdi5faGVhZGVyc0hpZXJhcmNoeSA9IGVzdG12LmhlYWRlcl9ncm91cCA/IGVzdG12LmhlYWRlcl9ncm91cC5zcGxpdChcIj5cIikubWFwKHQgPT4gdC50cmltKCkpIDogW107XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGVhZGVyVmFsdWUgPSBlc3Rtdi5oZWFkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBlc3Rtdi5oZWFkZXJfZ3JvdXAgfHwgbnVsbDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudHNIaWVyID0gZXN0bXYuX2hlYWRlcnNIaWVyYXJjaHk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWRkZWRIZWFkZXJzW2Ake3BhcmVudH1fJHtoZWFkZXJWYWx1ZX1gXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEhlYWRlcnNbYCR7cGFyZW50fV8ke2hlYWRlclZhbHVlfWBdID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBlciBvZ25pIHZhbG9yZSBkaXZlcnNvIGRlbGxlIHByb3ByaWV0w6AgZGV2byBhZ2dpdW5nZXJlIHVuIHRkIGUgdW4gdGgsIHF1ZXN0J3VsdGltbyBkZXYnZXNzZXJlIGV2ZW50dWFsbWVudGUgY29sbGVnYXRvIGFkIHVuIGhlYWRlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3dEggPSBuZXcgRXNUaERpcmVjdGl2ZShyZWZ0aC5UZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3RILl9tdWx0aSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3RILl9tdWx0aV9jb250ZW50ID0gaGVhZGVyVmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3RILnRoID0gYCR7cHJvcH1fJHtpaX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC50aENsYXNzID0gcmVmdGgudGhDbGFzcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3dEgudGhJZiA9IHJlZnRoLnRoSWY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3RILnRoVmlzaWJsZSA9IHJlZnRoLnRoVmlzaWJsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3dEgudGhXcmFwID0gcmVmdGgudGhXcmFwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbCBwYXJlbnQgw6ggc2VtcHJlIGwndWx0aW1vIG5lbGxhIGdlcmFyY2hpYSBkaSBwYWRyaVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC50aFBhcmVudCA9IHBhcmVudHNIaWVyW3BhcmVudHNIaWVyLmxlbmd0aCAtIDFdO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC50aE9yZGVyYWJsZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJlbnRzSGllci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhciA9IHBhcmVudHNIaWVyW2ldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnRUaHNbcGFyXSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRUaHNbcGFyXSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoUGFyZW50ID0gbmV3IEVzVGhEaXJlY3RpdmUobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aFBhcmVudC50aCA9IHBhcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoUGFyZW50Ll9tdWx0aV9jb250ZW50ID0gcGFyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhQYXJlbnQudGhQYXJlbnQgPSBpID4gMCA/IHBhcmVudHNIaWVyW2kgLSAxXSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHNUb0FkZC5wdXNoKHRoUGFyZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhzVG9BZGQucHVzaChuZXd0SCk7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VGQgPSBuZXcgRXNUZERpcmVjdGl2ZShyZWZ0ZC5UZW1wbGF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RkLl9tdWx0aSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RkLnRkID0gYCR7cHJvcH1fJHtpaX1gO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdUZC50ZENsYXNzID0gcmVmdGQudGRDbGFzcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGQudGRJZiA9IHJlZnRkLnRkSWY7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RkLnRkVmlzaWJsZSA9IHJlZnRkLnRkVmlzaWJsZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGRzVG9BZGRbbmV3VGQudGRdID0gbmV3VGQ7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBPcmRpbm8gZ2xpIGhlYWRlciBhZ2dpdW50aSBpbiBiYXNlIGFsIFBhcmVudCwgc2UgcHJlc2VudGUsIGUgbGkgYWdnaXVuZ28gYWxsYSBsaXN0YSBkZWkgdGgsIGRvcG9kaWNow6kgaW4gYmFzZSBhbGxvIHN0ZXNzbyBvcmRpbmFtZW50byBhZ2dpdW5nbyBpIHJlbGF0aXZpIHRkXHJcbiAgICAgICAgbGV0IG9yZGVyZWRUaHMgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gUHJpbWEgbWV0dG8gdHV0dGkgaSB0aCBzZW56YSBwYXJlbnQsIHBvaSBwZXIgb2duaSBwYXJlbnQgcHJlbmRvIGkgdGggb3JkaW5hdGkgY29tZSBsaSB0cm92byBuZWxsYSBsaXN0YVxyXG4gICAgICAgIGZvcihsZXQgaSA9IDA7IGkgPCB0aHNUb0FkZC5sZW5ndGg7IGkrKyl7XHJcbiAgICAgICAgICAgIGlmKCF0aHNUb0FkZFtpXS50aFBhcmVudClcclxuICAgICAgICAgICAgICAgIG9yZGVyZWRUaHMucHVzaCh0aHNUb0FkZFtpXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZvcihsZXQgcHJvcCBpbiBwYXJlbnRUaHMpe1xyXG4gICAgICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhzVG9BZGQubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzVG9BZGRbaV07XHJcbiAgICAgICAgICAgICAgICBpZih0aC50aFBhcmVudCAmJiB0aC50aFBhcmVudCA9PSBwcm9wKVxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyZWRUaHMucHVzaCh0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocyA9IFsuLi50aHMsIC4uLnRoc1RvQWRkXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoc1RvQWRkLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIFNlIGlsIHRoIMOoIHVuIGhlYWRlciB0ZCB2ZXJyZWJiZSB1bmRlZmluZWQuIExvIGFnZ2l1bmdvIHNvbG8gc2Ugw6ggZWZmZXR0aXZhbWVudGUgcHJlc2VudGVcclxuICAgICAgICAgICAgbGV0IHRkID0gdGRzVG9BZGRbdGhzVG9BZGRbaV0udGhdO1xyXG4gICAgICAgICAgICBpZiAodGQpXHJcbiAgICAgICAgICAgICAgICB0ZHMucHVzaCh0ZCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBleHBUZHM6IHRkcywgZXhwVGhzOiB0aHMgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZW5kZSBpIHRoIGUgaSB0ZCBpbiBtb2RhbGl0w6AgZGlyZXRpdmUgZSBsaSBvcmRpbmEgaW4gYmFzZSBhIHNlIGNpIHNvbm8gY29sb25uZSBmaXhlZCBvIG1lbm9cclxuICAgICAqL1xyXG4gICAgcHVibGljIG1vdmVGaXhlZENvbHVtbnNBdFRoZUJlZ2lubmluZyh0aHM6IEVzVGhEaXJlY3RpdmVbXSwgdGRzOiBFc1RkRGlyZWN0aXZlW10pIHtcclxuXHJcbiAgICAgICAgbGV0IHRoc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogYW55OyB9ID0ge307XHJcbiAgICAgICAgbGV0IGZpeGVkcyA9IDAsIHBpbm5lZHMgPSAwO1xyXG4gICAgICAgIGxldCBjb2x1bW5zQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RhYmxlQ29sdW1uOyB9ID0ge307XHJcbiAgICAgICAgbGV0IGNvbHVtbnNJbmRleENhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyOyB9ID0ge307XHJcblxyXG4gICAgICAgIC8vIENyZW8gbGEgY2FjaGUgZGVsbGUgY29sb25uZVxyXG4gICAgICAgIGZvciAobGV0IGNvbGkgPSAwOyBjb2xpIDwgdGhpcy5lc3QuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuZXN0LkNvbHVtbnNMaXN0W2NvbGldO1xyXG4gICAgICAgICAgICBjb2x1bW5zQ2FjaGVbY29sLmlkXSA9IGNvbDtcclxuXHJcbiAgICAgICAgICAgIC8vIEFuY2hlIHBlciBsZSBjb2x1bW5zbGlzdCBzcG9zdG8gbGUgcGlubmF0ZSBvIGxlIGZpeGVkIGFsbCdpbml6aW9cclxuICAgICAgICAgICAgaWYgKGNvbC5waW5uZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xpICE9IHBpbm5lZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuYXJyYXlNb3ZlKHRoaXMuZXN0LkNvbHVtbnNMaXN0LCBjb2xpLCBwaW5uZWRzKTtcclxuICAgICAgICAgICAgICAgIHBpbm5lZHMrKztcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gU2UgdW5hIGNvbG9ubmEgw6ggc2lhIHBpbm5hdGEgY2hlIGZpeGF0YSBsYSBjb25zaWRlcm8gdW5pY2FtZW50ZSBwaW5uYXRhXHJcbiAgICAgICAgICAgIGlmIChjb2wuZml4ZWQgJiYgIWNvbC5waW5uZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChjb2xpICE9IHBpbm5lZHMgKyBmaXhlZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuYXJyYXlNb3ZlKHRocywgY29saSwgcGlubmVkcyArIGZpeGVkcyk7XHJcbiAgICAgICAgICAgICAgICBmaXhlZHMrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcGlubmVkcyA9IGZpeGVkcyA9IDA7XHJcblxyXG4gICAgICAgIC8vIFNwb3N0byB0dXR0aSBnbGkgaGVhZGVyIGZpeGVkIG8gcGlubmVkIGFsbCdpbml6aW9cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcblxyXG4gICAgICAgICAgICB0aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICAgICAgLy8gUmlhc3NlZ25vIHNlbXByZSBwZXIgcmlwdWxpcmUgdmFsb3JpIGRpIHBhcnRlbnphIG8gcGVyIGFnZ2lvcm5hcmxpIGluIGNhc28gZGkgbW9kaWZpY2hlIHV0ZW50ZVxyXG4gICAgICAgICAgICB0aC50aFBpbm5lZCA9ICghY29sdW1uc0NhY2hlW3RoLnRoXSAmJiB0aC50aFBpbm5lZCkgfHwgKGNvbHVtbnNDYWNoZVt0aC50aF0gJiYgY29sdW1uc0NhY2hlW3RoLnRoXS5waW5uZWQpO1xyXG4gICAgICAgICAgICBpZiAodGgudGhQaW5uZWQpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpICE9IHBpbm5lZHMpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuYXJyYXlNb3ZlKHRocywgaSwgcGlubmVkcyk7XHJcbiAgICAgICAgICAgICAgICBwaW5uZWRzKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vSW4gcXVlc3RvIGNhc28gc29ubyBpbmZvcm1hemlvbmkgc3RhdGljaGUgaW52ZWNlLCBub24gbW9kaWZpY2FiaWxpIGRhbGwndXRlbnRlLCBxdWluZGkgbm9uIG1pIGTDsiBwcmVvY2N1cGF6aW9uaVxyXG4gICAgICAgICAgICBpZiAoKHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cCkgJiYgIXRoLnRoUGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSAhPSBwaW5uZWRzICsgZml4ZWRzKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmFycmF5TW92ZSh0aHMsIGksIHBpbm5lZHMgKyBmaXhlZHMpO1xyXG4gICAgICAgICAgICAgICAgZml4ZWRzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIENhY2hlIGRlZ2xpIGluZGljaSBwZXIgcmlwb3NpemlvbmFyZSBpIHRkIGNvbWUgaSB0aFxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICBjb2x1bW5zSW5kZXhDYWNoZVsoPEVzVGhEaXJlY3RpdmU+dGhzW2ldKS50aF0gPSBpO1xyXG5cclxuICAgICAgICAvLyBSaW9yZGlubyBsZSBjZWxsZSBwZXIgZmFyZ2xpIG1hbnRlbmVyZSBsYSBzdGVzc2Egc3RydXR0dXJhIGRlaSB0aFxyXG4gICAgICAgIGxldCBuZXdUZHMgPSBuZXcgQXJyYXkodGhzLmxlbmd0aCk7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGRzW2ldIGFzIEVzVGREaXJlY3RpdmU7XHJcbiAgICAgICAgICAgIG5ld1Rkc1tjb2x1bW5zSW5kZXhDYWNoZVtpdGVtLnRkXV0gPSBpdGVtO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lc3QuSGFzUGlubmVkQ29sdW1ucyA9IHBpbm5lZHMgPiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbiBiYXNlIGFsbGEgY29uZmlndXJhemlvbmUgZGVsbGUgY29sb25uZSBjYWxjb2xhIGxlIGRpbWVuaW9uaSBkZWxsZSBjb2xvbm5lIHBpbm5hdGUgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZVBpbm5lZENvbHVtbnNXaWR0aCgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuZXN0Lkhhc1Bpbm5lZENvbHVtbnMpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5lc3QuUGlubmVkQ29udGFpbmVyV2lkdGggPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lc3QuQ29sdW1uc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuZXN0LkNvbHVtbnNMaXN0W2ldO1xyXG4gICAgICAgICAgICBpZiAoY29sLnBpbm5lZCAmJiBjb2wudmlzaWJsZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0LlBpbm5lZENvbnRhaW5lcldpZHRoICs9IGNvbC5waW5uZWRXaWR0aDtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5lc3QuUGlubmVkQ29udGFpbmVyV2lkdGggKz0gdGhpcy5lc3QuU2VsZWN0aW9uID8gMjUgOiAwO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVGVybWluYXRvIGlsIGJpbmRpbmcgZGVsbGUgY29sb25uZSBkYSAqKnJldmlld0NvbHVtbnNMaXN0KiogZSBkZWxsYSAqKlZpZXcqKiBkYWwgKip3cml0ZVZhbHVlKiogcXVlc3RvIG1ldG9kbyBzaSBvY2N1cGFcclxuICAgICAqIGRlbGwnYWxsaW5lYW1lbnRvIGRlbGxlIGluZm9ybWF6aW9uaSBmcmEgbGUgY29sb25uZSBjYWxjb2xhdGUgaW50ZXJuYW1lbnRlIGUgbGUgaW5mb3JtYXppb25pIHN1bGxlIGNvbG9ubmUgY2hlIGFycml2YW5vIGRhbGwnQXBwU2VhcmNoXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcHBTZWFyY2g8YW55Pn0gdmlldyBBcHBTZWFyY2ggZGEgdXRpbGl6emFyZSBwZXIgcXVlc3RhIG9wZXJhemlvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFsaWduQ29sdW1uc0lmTG9hZGVkVmlldyh2aWV3OiBBcHBTZWFyY2g8YW55Pikge1xyXG4gICAgICAgIGxldCBlbWl0Q2hhbmdlZCA9IHRoaXMuZXN0LnZpZXdNb2RlICYmIHZpZXcuc2F2ZWRzdGF0ZTtcclxuICAgICAgICBsZXQgbmV3Q29sc2V0ID0gW107XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5lc3QuQ29sdW1uc0xpc3QgfHwgdGhpcy5lc3QuQ29sdW1uc0xpc3QubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLmVzdC52aWV3TW9kZSA/IHZpZXcuY29sdW1ucyA6IHRoaXMuZXN0LmFycmF5Q29sdW1ucztcclxuICAgICAgICB0aGlzLmVzdC5Db2x1bW5zTGlzdC5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICAvLyBTZSBsYSBjb2xvbm5hIMOoIHBpbm5hdGEgbWkgYXJyaXZhIGNvbCBzaW1vbGVvbiwgbWEgYW5jaGUgc2Ugw6ggdW5hIGNvbXBvc2l6aW9uZSBkaSBwacO5IGNvbG9ubmVcclxuICAgICAgICAgICAgbGV0IGV4Q2wgPSBjb2x1bW5zLmZpbHRlcihjYyA9PiAoY2Muc3RhcnRzV2l0aCgnwqcnKSA/IGNjLnN1YnN0cmluZygxKSA6IGNjKSA9PSBjLmlkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGxhIGNvbG9ubmEgw6ggcGlubmF0YSBhZ2dpb3JubyBsJ2luZm9ybWF6aW9uZSBuZWxsYSB2aWV3XHJcbiAgICAgICAgICAgIGlmIChleENsLmxlbmd0aCA9PSAxKVxyXG4gICAgICAgICAgICAgICAgYy5waW5uZWQgPSBleENsWzBdLnN0YXJ0c1dpdGgoJ8KnJyk7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBsJ2FwcHNlYXJjaCB2aWVuZSBkYSB1bm8gc3RhdG8gcHJlY2VkZW50ZSwgdXNvIGxlIGluZm9ybWF6aW9uaSBzdWxsZSBjb2xvbm5lIGNoZSBoYSBkZW50cm8sIGFsdHJpbWVudGkgc292cmFzY3Jpdm8gdHV0dG8gICoqXHJcbiAgICAgICAgICAgIGlmIChjLnZpc2libGUgJiYgY29sdW1ucy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgICAgIG5ld0NvbHNldC5wdXNoKGMuaWQpO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgaG8gdW5hIGNvbG9ubmEgbGF0byBBcHBTZWFyY2ggZSBuZWxsYSBDb2x1bW5MaXN0IG5vbiDDqCB2aXNpYmlsZSwgYWxsaW5lbyBhbGwnQXBwU2VhcmNoXHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGV4Q2wubGVuZ3RoID09IDEgJiYgIWMudmlzaWJsZSlcclxuICAgICAgICAgICAgICAgIGMudmlzaWJsZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAvLyBBbGxpbmVhbWVudG8gc3VsbCdBcHBTZWFyY2ggcGVyIGNhc2lzdGljaGUgaW52ZXJzZSBhbCBkaSBzb3ByYVxyXG4gICAgICAgICAgICBlbHNlIGlmIChleENsLmxlbmd0aCA9PSAwICYmIGMudmlzaWJsZSlcclxuICAgICAgICAgICAgICAgIGMudmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICAvLyBOb24gaG8gY29sb25uZSBuZWxsYSBhcHBzZWFyY2gsIHZ1b2wgZGlyZSBjaGUgc29ubyBhbCBwcmltbyBiaW5kaW5nXHJcbiAgICAgICAgaWYgKGNvbHVtbnMubGVuZ3RoID09IDApIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZXN0LnZpZXdNb2RlKVxyXG4gICAgICAgICAgICAgICAgdmlldy5jb2x1bW5zID0gbmV3Q29sc2V0O1xyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5hcnJheUNvbHVtbnMgPSBuZXdDb2xzZXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoKHRoaXMuZXN0LnZpZXdNb2RlICYmIHZpZXcuc2F2ZWRzdGF0ZSkgJiYgdGhpcy5lc3QuQ29sdW1uc09yZGVyaW5nICYmIHZpZXcuY29sdW1uX29yZGVyaW5nLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gU2NvcnJvIGdsaSBvcmRpbmFtZW50aSBjaGUgYXZldm8gc2FsdmF0byBlIHJpY3JlbyBsYSBDb2x1bW5zTGlzdCBpbiBiYXNlIGEgbG9yb1xyXG4gICAgICAgICAgICBsZXQgbmV3Q29sTGlzdCA9IFtdO1xyXG4gICAgICAgICAgICB2aWV3LmNvbHVtbl9vcmRlcmluZy5mb3JFYWNoKGNvID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0LkNvbHVtbnNMaXN0LmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGMuaWQgPT0gY28pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbExpc3QucHVzaChjKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJlY3VwZXJvIGFuY2hlIGNhbXBpIG51b3ZpIGNoZSBuZWxsJ2l0ZXJhemlvbmUgdmVjY2hpYSBub24gYydlcmFubyAoc2VydmUgZHVyYW50ZSBsbyBzdmlsdXBwbyBpbiBtb2RvIGRhIG5vbiBwZXJkZXJzaSBmcmEgdW4gRURJVCArIEY1IGUgbCdhbHRybylcclxuICAgICAgICAgICAgdGhpcy5lc3QuQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghbmV3Q29sTGlzdC5maW5kKHQgPT4gdCA9PSBjLmlkKSlcclxuICAgICAgICAgICAgICAgICAgICBuZXdDb2xMaXN0LnB1c2goYyk7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lc3QuQ29sdW1uc0xpc3QgPSBuZXdDb2xMaXN0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gSW4gb2duaSBjYXNvIHF1ZXN0byBub24gbWkgc2VydmUgcGnDuSwgbG8gcmVzZXR0byAgKipcclxuICAgICAgICBpZiAodGhpcy5lc3Qudmlld01vZGUpXHJcbiAgICAgICAgICAgIHZpZXcuc2F2ZWRzdGF0ZSA9IGZhbHNlO1xyXG5cclxuICAgICAgICBpZiAoZW1pdENoYW5nZWQpXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEluIGJhc2UgYWxsYSB2aXNpYmlsaXTDoCByZWdpc3RyYXRhIG5lbGxlICoqQ29sdW1uc0xpc3QqKiBxdWVzdG8gbWV0b2RvIHNpIG9jY3VwYSBkaSBwcmVuZGVyZSB0dXR0aSBpICoqRXNUaERpcmVjdGl2ZSoqIGVkICoqRXNUZERpcmVjdGl2ZSoqIHJlbGF0aXZpIGUgbmFzb25kZXJsaS9tb3N0cmFybGlcclxuICAgICAqXHJcbiAgICAgKiBDb3N0bzogMSBzY2FuIENvbHVtbnNMaXN0LCAxIHNjYW4gRXNUaERpcmVjdGl2ZXMsIDEgc2NhbiBFc1RkRGlyZWN0aXZlc1xyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgSGVhZGVyIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7RXNUZERpcmVjdGl2ZVtdfSB0ZHMgQ2VsbGUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICogQHBhcmFtIHtBcHBTZWFyY2g8YW55Pn0gdmlldyBBcHBTZWFyY2ggZGEgdXRpbGl6emFyZSBwZXIgcXVlc3RhIG9wZXJhemlvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHJlZnJlc2hDb2x1bW5zVmlzaWJpbGl0eSh0aHM6IEVzVGhEaXJlY3RpdmVbXSwgdGRzOiBFc1RkRGlyZWN0aXZlW10sIHZpZXc6IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgbGV0IG5ld0NvbHNldCA9IFtdO1xyXG4gICAgICAgIGxldCBmaXhlZFRoczogeyBbaWQ6IHN0cmluZ106IGJvb2xlYW47IH0gPSB7fTtcclxuICAgICAgICBsZXQgY29sdW1uc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUYWJsZUNvbHVtbjsgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGNvbGkgPSAwOyBjb2xpIDwgdGhpcy5lc3QuQ29sdW1uc0xpc3QubGVuZ3RoOyBjb2xpKyspIHtcclxuICAgICAgICAgICAgbGV0IGNvbCA9IHRoaXMuZXN0LkNvbHVtbnNMaXN0W2NvbGldO1xyXG4gICAgICAgICAgICBjb2x1bW5zQ2FjaGVbY29sLmlkXSA9IGNvbDtcclxuICAgICAgICAgICAgaWYgKGNvbC52aXNpYmxlKVxyXG4gICAgICAgICAgICAgICAgbmV3Q29sc2V0LnB1c2goKGNvbC5waW5uZWQgPyBcIsKnXCIgOiBcIlwiKSArIGNvbC5pZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2aWV3KVxyXG4gICAgICAgICAgICB2aWV3LmNvbHVtbnMgPSBuZXdDb2xzZXQ7XHJcblxyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgdGhpcy5lc3QuYXJyYXlDb2x1bW5zID0gbmV3Q29sc2V0O1xyXG5cclxuICAgICAgICAvLyBEYSBxdWkgaW4gcG9pIGRldm9ubyBlc3NlcmUgZXNlZ3VpdGkgU09MTyBpbiBmYXNlIGRpIHdyaXRlVmFsdWUgcXVpbmRpIGRldm8gYXNzaWN1cmFybWkgZGkgcGFzc2FybGkgbnVsbCBpbiB0dXR0aSBpIHBhc3NhZ2dpIGRpdmVyc2kgZGEgcXVlbGxvXHJcbiAgICAgICAgaWYgKHRocykge1xyXG4gICAgICAgICAgICAvLyBEZWZpbmlzY28gc2UgbGEgY29sb25uYSDDqCB2aXNpYmlsZSBpbiBiYXNlIGFsbGEgc3VhIHJhcHByZXNlbnRhemlvbmUgbG9jYWxlIGluIENvbHVtbnNMaXN0XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcblxyXG4gICAgICAgICAgICAgICAgdGgudGhWaXNpYmxlID0gdGgudGhGaXhlZCB8fCAoY29sdW1uc0NhY2hlW3RoLnRoXSA/IGNvbHVtbnNDYWNoZVt0aC50aF0udmlzaWJsZSA6IHRoLnRoVmlzaWJsZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAodGgudGhGaXhlZCB8fCB0aC50aEdyb3VwKVxyXG4gICAgICAgICAgICAgICAgICAgIGZpeGVkVGhzW3RoLnRoXSA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0ZHMpIHtcclxuICAgICAgICAgICAgLy8gRGVmaW5pc2NvIHNlIGxhIGNlbGxhIMOoIHZpc2liaWxlIGluIGJhc2UgYWxsYSBzdWEgcmFwcHJlc2VudGF6aW9uZSBsb2NhbGUgaW4gQ29sdW1uc0xpc3RcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0ZCA9IHRkc1tpXTtcclxuICAgICAgICAgICAgICAgIHRkLnRkVmlzaWJsZSA9IGZpeGVkVGhzW3RkLnRkXSB8fCAoY29sdW1uc0NhY2hlW3RkLnRkXSA/IGNvbHVtbnNDYWNoZVt0ZC50ZF0udmlzaWJsZSA6IHRkLnRkVmlzaWJsZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZXN0LmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbGluZWEgZ2xpIG9yZGluYW1lbnRpIGRhdGkgZnJhIGxlICoqRXNUaHMqKiBlIGxlIGluZm9ybWF6aW9uaSBhbGwnaW50ZXJubyBkZWxsYSBWaWV3IGJpbmRhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3IEFwcFNlYXJjaCBkYSB1dGlsaXp6YXJlIHBlciBxdWVzdGEgb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtFc1RoRGlyZWN0aXZlW119IHRocyBDb2xvbm5lIGRlbGxhIHRhYmVsbGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGFsaWduSGVhZGVyc09yZGVyaW5nKHRoczogRXNUaERpcmVjdGl2ZVtdLCB2aWV3OiBBcHBTZWFyY2g8YW55Pikge1xyXG4gICAgICAgIGxldCBvcmRlcnMgPSB2aWV3ID8gdmlldy5vcmRlcnMgOiB0aGlzLmVzdC5hcnJheU9yZGVycztcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcblxyXG4gICAgICAgICAgICB0aC50aE9yZGVyID0gbnVsbDtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBvciA9IG9yZGVyc1tpXTtcclxuICAgICAgICAgICAgICAgIGlmIChvci5pZCA9PSB0aC50aClcclxuICAgICAgICAgICAgICAgICAgICB0aC50aE9yZGVyID0gb3Iub3JkZXI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBHZW5lcmEgdHV0dGUgbGUgaW5mb3JtYXppb25pIGNoZSBzZXJ2b25vIHBlciBnZXN0aXJlIGlsIHJhZ2dydXBwYW1lbnRvIGRlZ2xpIGhlYWRlclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgQ29sb25uZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge3sgbGVhZnM6IEVzVGhEaXJlY3RpdmVbXSwgZ3JvdXBpbmdMZXZlbDogbnVtYmVyLCBwYXJlbnRzQ2FjaGU6IGFueSwgdGhzQ2FjaGU6IGFueSB9fSBPZ2dldHRvIGNvbnRlbmVudGUgbGEgbGlzdGEgZGVsbGUgZm9nbGllIChoZWFkZXIgYmFzZSksIGlsIGxpdmVsbG9cclxuICAgICAqIG1hc3NpbW8gZGkgcmFnZ3J1cHBhbWVudG8gcmFnZ2l1bnRvLCB1bmEgY2FjaGUgaW4gY3VpIHZlbmdvbm8gaW5kaWNhdGkgdHV0dGkgaSBncnVwcGkgY2hlIHNvbm8gXCJwYXJlbnRcIiAocXVpbmRpIGNoZSByYWdncnVwcGFubyBhbG1lbm8gMSBoZWFkZXIpIGUgbGEgY2FjaGUgZGVnbGkgaGVhZGVyXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZUhlYWRlcnNHcm91cGluZ0luZm9zKHRoczogRXNUaERpcmVjdGl2ZVtdKTogeyBsZWFmczogRXNUaERpcmVjdGl2ZVtdOyBncm91cGluZ0xldmVsOiBudW1iZXI7IHBhcmVudHNDYWNoZTogYW55OyB0aHNDYWNoZTogYW55OyB9IHtcclxuICAgICAgICAvLyBQcmVnaXJvIHBlciB0cm92YXJlIGkgcGFyZW50XHJcbiAgICAgICAgbGV0IHBhcmVudHNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IGJvb2xlYW47IH0gPSB7fTtcclxuICAgICAgICBsZXQgdGhzQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBFc1RoRGlyZWN0aXZlOyB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICB0aHNDYWNoZVt0aC50aF0gPSB0aDtcclxuICAgICAgICAgICAgaWYgKHRoLnRoUGFyZW50ICYmICFwYXJlbnRzQ2FjaGVbdGgudGhQYXJlbnRdKVxyXG4gICAgICAgICAgICAgICAgcGFyZW50c0NhY2hlW3RoLnRoUGFyZW50XSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBTZWNvbmRvIGdpcm8gcGVyIGJlY2NhcmUgaWwgbGl2ZWxsbyBtYXNzaW1vIGUgbGEgbGlzdGEgZGkgZm9nbGllICh0aCBzZW56YSBwYXJlbnQpXHJcbiAgICAgICAgbGV0IGhNYXhMZXZlbCA9IDA7XHJcbiAgICAgICAgbGV0IGxlYWZzOiBhbnlbXSA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIHNvbm8gdW5hIGZvZ2xpYSB2ZWRvIHF1YW50aSBsaXZlbGxpIGNpIHNvbm8gc29wcmFcclxuICAgICAgICAgICAgaWYgKCFwYXJlbnRzQ2FjaGVbdGgudGhdKSB7XHJcbiAgICAgICAgICAgICAgICBsZWFmcy5wdXNoKHRoKTtcclxuICAgICAgICAgICAgICAgIGxldCB0bXAgPSB0aGlzLmp1bXBzVG9GaW5hbFBhcmVudCh0aCwgdGhzQ2FjaGUpO1xyXG4gICAgICAgICAgICAgICAgaE1heExldmVsID0gdG1wID4gaE1heExldmVsID8gdG1wIDogaE1heExldmVsO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4geyBsZWFmczogbGVhZnMsIGdyb3VwaW5nTGV2ZWw6IGhNYXhMZXZlbCwgcGFyZW50c0NhY2hlOiBwYXJlbnRzQ2FjaGUsIHRoc0NhY2hlOiB0aHNDYWNoZSB9O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIGdsaSBoZWFkZXIgZ3JvdXBzIGRhIHVuYSBsaXN0YSBkaSBpbmZvIHN1aSB0aCBhbGwnaW50ZXJubyBkZWxsYSB2YXJpYWJpbGUgKipUTVBSb3dUaEdyb3VwcyoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHt7IGxlYWZzOiBFc1RoRGlyZWN0aXZlW10sIGdyb3VwaW5nTGV2ZWw6IG51bWJlciwgcGFyZW50c0NhY2hlOiBhbnksIHRoc0NhY2hlOiBhbnkgfX0gaW5mb3MgSW5mb3JtYXppb25pIGRpIHJhZ2dydXBwYW1lbnRvIHZhbHV0YXRlIHByZWNlZGVudGVtZW50ZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXZhbHVhdGVIZWFkZXJHcm91cHMoaW5mb3M6IHsgbGVhZnM6IEVzVGhEaXJlY3RpdmVbXTsgZ3JvdXBpbmdMZXZlbDogbnVtYmVyOyBwYXJlbnRzQ2FjaGU6IGFueTsgdGhzQ2FjaGU6IHsgW2luZGV4OnN0cmluZ106IEVzVGhEaXJlY3RpdmV9OyB9KSB7XHJcbiAgICAgICAgaWYgKGluZm9zLmdyb3VwaW5nTGV2ZWwgPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICAvLyBHaXJvIDIuNSwgY3JlbyBsJ291dHB1dCBkZWkgcmFnZ3J1cHBhbWVudGkgcGVyIGhlYWRlciBpbiBtb2RvIGRhIG5vbiBkb3Zlcm1pIHByZW9jY3VwYXJlIGRpIGNlbGxlIG5vbiBpbml6aWFsaXp6YXRlXHJcbiAgICAgICAgbGV0IGV4cGFuZGVkR3JvdXBzID0gW107XHJcbiAgICAgICAgbGV0IHZpc2libGVVbnBpbm5lZExlYWZzOiBFc1RoRGlyZWN0aXZlW10gPSAoPGFueVtdPmluZm9zLmxlYWZzKS5maWx0ZXIoKHQ6IEVzVGhEaXJlY3RpdmUpID0+IHQudGhWaXNpYmxlICYmICF0LnRoUGlubmVkKTtcclxuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGluZm9zLmdyb3VwaW5nTGV2ZWw7IGwrKykge1xyXG4gICAgICAgICAgICBleHBhbmRlZEdyb3Vwcy5wdXNoKFtdKTtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aXNpYmxlVW5waW5uZWRMZWFmcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBzW2xdLnB1c2goXCJcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBPcmRpbm8gbGUgZm9nbGllIGluIGJhc2UgYWdsaSBvcmRpbmFtZW50aSBkZWxsZSBjb2xvbm5lXHJcbiAgICAgICAgbGV0IG9yZGVyZWRMZWFmcyA9IFtdO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBsZWFmOiBFc1RoRGlyZWN0aXZlID0gaW5mb3MudGhzQ2FjaGVbdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzW2ldXTtcclxuICAgICAgICAgICAgaWYgKGxlYWYudGhWaXNpYmxlICYmICFsZWFmLnRoUGlubmVkKVxyXG4gICAgICAgICAgICAgICAgb3JkZXJlZExlYWZzLnB1c2gobGVhZik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBUZXJ6byBnaXJvIHBlciBjcmVhcmUgbCdhcnJheSBncm91cCBjb24gdHV0dGkgaSByaWZlcmltZW50aSBkZWwgY2Fzb1xyXG4gICAgICAgIGxldCBjdXJyZW50UGFyZW50ID0gXCJcIjtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyZWRMZWFmcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgcmVmVGg6IEVzVGhEaXJlY3RpdmUgPSBvcmRlcmVkTGVhZnNbaV07XHJcbiAgICAgICAgICAgIGxldCBwcmV2VGg6IEVzVGhEaXJlY3RpdmUgPSBpIC0gMSA+PSAwID8gb3JkZXJlZExlYWZzW2kgLSAxXSA6IG51bGw7XHJcblxyXG4gICAgICAgICAgICAvLyBQYXJlbnQgZGl2ZXJzbyBkYSBwcmltYSwgbWV0dG8gaWwgYm9yZG8gYSBzaW5pc3RyYSBlIGEgZGVzdHJhIGRlbGxhIGNlbGxhIHByZWNlZGVudGUgKHNlIGMnw6gpXHJcbiAgICAgICAgICAgIC8vIEFsbCd1bHRpbW8gZ2lybyBtZXR0byBpbCBib3JkbyBhIGRlc3RyYS4gVHV0dG8gcXVlc3RvIGxvIHJpZXNlZ3VvIHBlciBvZ25pIGNlbGxhIGluIG1vZG8gZGEgcmlwdWxpcmUgZXZlbnR1YWxpIGEgY3VpIGF2ZXZvIGFzc2VnbmF0byB0YWcgcHJlY2VkZW50ZW1lbnRlXHJcbiAgICAgICAgICAgICg8YW55PnJlZlRoKS5fbGJvcmQgPSByZWZUaC50aFBhcmVudCAhPSBjdXJyZW50UGFyZW50O1xyXG4gICAgICAgICAgICAoPGFueT5yZWZUaCkuX3Jib3JkID0gdmlzaWJsZVVucGlubmVkTGVhZnMubGVuZ3RoID09IGkgKyAxO1xyXG4gICAgICAgICAgICBpZiAocHJldlRoKVxyXG4gICAgICAgICAgICAgICAgKDxhbnk+cHJldlRoKS5fcmJvcmQgPSByZWZUaC50aFBhcmVudCAhPSBjdXJyZW50UGFyZW50O1xyXG5cclxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IHJlZlRoLnRoUGFyZW50O1xyXG5cclxuICAgICAgICAgICAgLy8gUGVyIG9nbmkgZ3J1cHBvIHNyb3RvbG8gaWwgcGFyZW50IG5lbGxhIG1hdHJpY2UgZGVpIHJhZ2dydXBwYW1lbnRpXHJcbiAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgaW5mb3MuZ3JvdXBpbmdMZXZlbDsgbCsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gcmVmVGgudGhQYXJlbnQ7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50ICYmICFyZWZUaC50aFBpbm5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBzW2xdW2ldID0gcGFyZW50O1xyXG4gICAgICAgICAgICAgICAgICAgIHJlZlRoID0gaW5mb3MudGhzQ2FjaGVbcGFyZW50XTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gUXVhcnRvIGdpcm8gcGVyIGNvbXBhdHRhcmxvIG5lbGwnZWxlbWVudG8gZmluYWxlIHN1IGN1aSBiaW5kYXJtaVxyXG4gICAgICAgIGN1cnJlbnRQYXJlbnQgPSBcIlwiO1xyXG4gICAgICAgIGxldCBjdXJyZW50U3BhbiA9IDA7XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QUm93VGhHcm91cHMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGV4cGFuZGVkR3JvdXBzLmxlbmd0aDsgbCsrKSB7XHJcbiAgICAgICAgICAgIGxldCBsZXZlbEFycmF5OiB7IFNwYW46IG51bWJlcjsgVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47IENvbnRlbnQ/OiBzdHJpbmcsIFBpbm5lZD86IGJvb2xlYW47IEJvcmRlcnM/OiBib29sZWFuOyB9W10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuVE1QUm93VGhHcm91cHMucHVzaChsZXZlbEFycmF5KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVzdC5TZWxlY3Rpb24gfHwgdGhpcy5lc3QuSGFzUGlubmVkQ29sdW1ucylcclxuICAgICAgICAgICAgICAgIGxldmVsQXJyYXkucHVzaCh7IFNwYW46IDEsIFRlbXBsYXRlOiBudWxsLCBQaW5uZWQ6IHRoaXMuZXN0Lkhhc1Bpbm5lZENvbHVtbnMgfSk7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGV4cGFuZGVkR3JvdXBzW2xdLmxlbmd0aDsgaCsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IGV4cGFuZGVkR3JvdXBzW2xdW2hdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gY3VycmVudFBhcmVudClcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3BhbisrO1xyXG4gICAgICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTcGFuID4gMClcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxBcnJheS5wdXNoKHsgU3BhbjogY3VycmVudFNwYW4sIFRlbXBsYXRlOiBjdXJyZW50UGFyZW50ID8gaW5mb3MudGhzQ2FjaGVbY3VycmVudFBhcmVudF0uVGVtcGxhdGUgOiBudWxsLCBDb250ZW50OiBjdXJyZW50UGFyZW50ID8gaW5mb3MudGhzQ2FjaGVbY3VycmVudFBhcmVudF0uX211bHRpX2NvbnRlbnQgOiBudWxsLCBCb3JkZXJzOiAhIWN1cnJlbnRQYXJlbnQgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNwYW4gPSAxO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSBpdGVtO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBVbHRpbWEgYWdnaXVudGEgY2hlIGFsdHJpbWVudGkgbWkgcmltYXJyZWJiZSBpbiBjYWNoZVxyXG4gICAgICAgICAgICBsZXZlbEFycmF5LnB1c2goeyBTcGFuOiBjdXJyZW50U3BhbiwgVGVtcGxhdGU6IGN1cnJlbnRQYXJlbnQgPyBpbmZvcy50aHNDYWNoZVtjdXJyZW50UGFyZW50XS5UZW1wbGF0ZSA6IG51bGwsIENvbnRlbnQ6IGN1cnJlbnRQYXJlbnQgPyBpbmZvcy50aHNDYWNoZVtjdXJyZW50UGFyZW50XS5fbXVsdGlfY29udGVudCA6IG51bGwgLCBCb3JkZXJzOiAhIWN1cnJlbnRQYXJlbnQgfSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5lc3QuUmVtb3ZhbClcclxuICAgICAgICAgICAgICAgIGxldmVsQXJyYXkucHVzaCh7IFNwYW46IDEsIFRlbXBsYXRlOiBudWxsIH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZXN0LkV4cG9ydCB8fCB0aGlzLmVzdC5IaWRkZW5Db2x1bW5zIHx8IHRoaXMuZXN0LkNvbHVtbnNPcmRlcmluZyB8fCB0aGlzLmVzdC5Db3JuZXJNZW51T3B0aW9ucylcclxuICAgICAgICAgICAgICAgIGxldmVsQXJyYXkucHVzaCh7IFNwYW46IDEsIFRlbXBsYXRlOiBudWxsIH0pO1xyXG5cclxuICAgICAgICAgICAgY3VycmVudFNwYW4gPSAwO1xyXG4gICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDYWxjb2xhIGlsIG51bWVybyBkaSBzYWx0aSBkYSB1biBoZWFkZXIgZm9nbGlhIGFsbCd1bHRpbW8gcGFyZW50IGRlbGxhIGNhdGVuYVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZX0gdGggSGVhZGVyIGRhIGN1aSBzY29ycmVyZSBpIHBhZHJpIHBlciBjYXBpcmUgcXVhbnRpIGxpdmVsbGkgY2kgc29ubyBzb3ByYVxyXG4gICAgICogQHBhcmFtIHt7IFtpbmRleDogc3RyaW5nXTogRXNUaERpcmVjdGl2ZSB9fSB0aHNDYWNoZSBDYWNoZSBkZWdsaSBoZWFkZXJcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBqdW1wc1RvRmluYWxQYXJlbnQodGg6IEVzVGhEaXJlY3RpdmUsIHRoc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUaERpcmVjdGl2ZTsgfSkge1xyXG4gICAgICAgIGxldCBqdW1wcyA9IDA7IGxldCBwYXJlbnQgPSBudWxsOyBsZXQgcGFyZW50c1ByZXBlbmQ6IHsgdG1wbD86IFRlbXBsYXRlUmVmPGFueT4sIGNvbnRlbnQ/OiBzdHJpbmcgfVtdID0gW107XHJcbiAgICAgICAgbGV0IGJhc2VUaFJlZiA9IHRoO1xyXG4gICAgICAgIGRvIHtcclxuICAgICAgICAgICAgcGFyZW50ID0gdGgudGhQYXJlbnQ7XHJcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoID0gdGhzQ2FjaGVbcGFyZW50XTtcclxuICAgICAgICAgICAgICAgIGlmICghdGgudGhFbXB0eSAmJiAhdGguX211bHRpX2NvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50c1ByZXBlbmQudW5zaGlmdCh7IHRtcGw6IHRoLlRlbXBsYXRlIH0pO1xyXG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoLnRoRW1wdHkgJiYgdGguX211bHRpX2NvbnRlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50c1ByZXBlbmQudW5zaGlmdCh7IGNvbnRlbnQ6IHRoLl9tdWx0aV9jb250ZW50IH0pO1xyXG4gICAgICAgICAgICAgICAganVtcHMrKztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gd2hpbGUgKHBhcmVudCk7XHJcbiAgICAgICAgYmFzZVRoUmVmLl90aFBhcmVudHMgPSBwYXJlbnRzUHJlcGVuZDtcclxuICAgICAgICByZXR1cm4ganVtcHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNZXRvZG8gY2hlIGdlbmVyYSBsJ29yZGluZSBkaSBkZWZhdWx0IGRlbGxlIGNvbG9ubmVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3IEFwcFNlYXJjaCBkYSB1dGlsaXp6YXJlIHBlciBxdWVzdGEgb3BlcmF6aW9uZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2VuZXJhdGVEZWZhdWx0T3JkZXIodGhzOiBFc1RoRGlyZWN0aXZlW10sIHZpZXc6IEFwcFNlYXJjaDxhbnk+KSB7XHJcbiAgICAgICAgaWYgKHRocy5sZW5ndGggPT0gMClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgb3JkZXJpbmdzID0gdGhpcy5lc3Qudmlld01vZGUgPyB2aWV3LmNvbHVtbl9vcmRlcmluZyA6IHRoaXMuZXN0LmFycmF5Q29sdW1uT3JkZXJpbmc7XHJcbiAgICAgICAgLy8gR2VuZXJvIG9yZGluYW1lbnRvIGRpIGRlZmF1bHQgZGEgMCBmaW5vIGEgZG92ZSBkZXZlIGFycml2YXJlLiBTaXR1YXppb25lIGF0dHVhbGUgc2VuemEgaG90cG90YXRvXHJcbiAgICAgICAgaWYgKCFvcmRlcmluZ3MgfHwgb3JkZXJpbmdzLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgICAgICBsZXQgb3JkZXIgPSB0aC50aDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcy5wdXNoKG9yZGVyKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzID0gb3JkZXJpbmdzO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoSWQgPSB0aC50aDtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzLmZpbmQobyA9PiBvID09IHRoSWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcy5wdXNoKHRoSWQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXBwbGljYSBsJ29yZGluZSBzcGVjaWZpY2F0byBhbGxlIHZhcmllIGNvbG9ubmVcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0FwcFNlYXJjaDxhbnk+fSB2aWV3IEFwcFNlYXJjaCBkYSB1dGlsaXp6YXJlIHBlciBxdWVzdGEgb3BlcmF6aW9uZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmaW5hbGl6ZSBTZSAqKnRydWUqKiBzaWduaWZpY2EgY2hlIG5vbiBtaSBhc3BldHRvIGRpIGRvdmVyIGVmZmV0dHVhcmUgYWx0cmUgb3BlcmF6aW9uaSBlIHBvc3NvIHJlbmRlcml6emFyZSBsYSBzaXR1YXppb25lIGluIGJhc2UgYWkgUm93Q29udGV4dFxyXG4gICAgICogU2VuemEgZmluYWxpemUgc2lnbmlmaWNhIGNoZSBtaSBhc3BldHRvIGFsdHJlIG9wZXJhemlvbmkgY2hlIHByaW1hIG8gcG9pIHJpY2hpYW1lcmFubm8gcXVlc3RhIGZ1bnppb25lIGNvbCBmaW5hbGl6ZS5cclxuICAgICAqXHJcbiAgICAgKiBBZCBlc2VtcGlvLCB1bmEgdm9sdGEgc2VsZXppb25hdG8gb3JkaW5hbWVudG8gZmlzaWNvL2xvZ2ljbyBkZWxsZSBjb2xvbm5lIHNvIGNoZSBwYXJ0ZSB1biBhbHRyYSByaWNlcmNhIGNoZSBtaSByaXZhbG9yaXp6ZXLDoCBkYSBcIndyaXRlVmFsdWVcIiwgY2hlIGdpw6AgY2hpYW1hIHF1ZXN0YSBmdW56aW9uZS5cclxuICAgICAqIE1ldHRlbmRvIHNvbG8gbGEgY2hpYW1hdGEgZGEgXCJ3cml0ZVZhbHVlXCIgY29tZSBcImZpbmFsaXp6YW50ZVwiIG1pIGFzc2ljdXJvIGNoZSBzbWFuYXR0YW1lbnRpIGEgZnJvbnRlbmQgbm9uIGNhdXNpbm8gZmxpY2tlcmluZyBmaW5vIGEgcXVhbmRvIG5vbiBzZXJ2b25vXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhcHBseU9yZGVyaW5nKHZpZXc6IEFwcFNlYXJjaDxhbnk+LCBmaW5hbGl6ZTogYm9vbGVhbikge1xyXG4gICAgICAgIC8vIEdlbmVybyBvcmRpbmFtZW50byBwZXIgZ2xpIGhlYWRlclxyXG4gICAgICAgIGxldCBuZXdIZWFkZXJzID0gW107XHJcblxyXG4gICAgICAgIC8vIFNlIGRldm8gZmluYWxpenphcmUgYWdnYW5jaW8gdHV0dGUgbGUgdmFyaWFiaWxpIGRpIGJpbmRcclxuICAgICAgICBpZiAoZmluYWxpemUpIHtcclxuICAgICAgICAgICAgdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzLmZvckVhY2gobyA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaGVhZWRySXRlbSA9IHRoaXMuZXN0LlRNUFJvd1RIcy5maWx0ZXIodCA9PiB0LklEID09IG8pWzBdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGhlYWVkckl0ZW0pXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3SGVhZGVycy5wdXNoKGhlYWVkckl0ZW0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuVE1QUm93VEhzID0gbmV3SGVhZGVycztcclxuXHJcbiAgICAgICAgICAgIC8vIEdlbmVybyBvcmRpbmFtZW50byBwZXIgbGUgY2VsbGVcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVzdC5Sb3dDb250ZXh0cy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbnRleHQgPSB0aGlzLmVzdC5UTVBSb3dURHNbdGhpcy5lc3QuUm93Q29udGV4dHNbaV1dO1xyXG4gICAgICAgICAgICAgICAgbGV0IG5ld0NvbnRleHQgPSBbXTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXMuZm9yRWFjaChvID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGV4dEl0ZW0gPSBjb250ZXh0LmZpbHRlcih0ID0+IHQuSUQgPT0gbylbMF07XHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29udGV4dC5wdXNoKGNvbnRleHRJdGVtKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0LlRNUFJvd1REc1t0aGlzLmVzdC5Sb3dDb250ZXh0c1tpXV0gPSBuZXdDb250ZXh0O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5lc3Qudmlld01vZGUpXHJcbiAgICAgICAgICAgIHZpZXcuY29sdW1uX29yZGVyaW5nID0gdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzO1xyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmFycmF5Q29sdW1uT3JkZXJpbmcgPSB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXM7XHJcblxyXG4gICAgICAgIHRoaXMuZXN0LmNoYW5nZWQoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAqIEFsbCdpbnRlcm5vIGRlbGxhIGRpYWxvZyBcIk9yZGluYW1lbnRvIGUgVmlzaWJpbGl0w6AgQ29sb25uZVwiIG1ldHRlIGxhIGNvbG9ubmEgc3BlY2lmaWNhdGEgcHJpbWEgZGVsbGEgY29sb25uYSBwcmVjZWRlbnRlXHJcbiAgKlxyXG4gICogQHBhcmFtIHtFc1RhYmxlQ29sdW1ufSBjb2x1bW5JdGVtIENvbG9ubmEgZGEgc3Bvc3RhcmVcclxuICAqL1xyXG4gICAgcHVibGljIHNlbmRVcChjb2x1bW5JdGVtOiBFc1RhYmxlQ29sdW1uKSB7XHJcbiAgICAgICAgbGV0IGl0ZW1JbmRleCA9IHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmluZGV4T2YoY29sdW1uSXRlbSk7XHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0W2l0ZW1JbmRleCAtIDFdLmZpeGVkIHx8IHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0W2l0ZW1JbmRleCAtIDFdLnBpbm5lZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMudXRpRXh0cy5zd2FwKHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LCBpdGVtSW5kZXgsIGl0ZW1JbmRleCAtIDEpO1xyXG5cclxuICAgICAgICAvLyBOb24gcG9zc28gZmFyZSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuQ29sdW1uc0xpc3QpKSBwZXJjaMOpIGNvbnRpZW5lIHJpZmVyaW1lbnRpIGEgVGVtcGxhdGVSZWZcclxuICAgICAgICBsZXQgdG1wID0gW107XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHsgdG1wLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYykpOyB9KTtcclxuICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCA9IHRtcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbCdpbnRlcm5vIGRlbGxhIGRpYWxvZyBcIk9yZGluYW1lbnRvIGUgVmlzaWJpbGl0w6AgQ29sb25uZVwiIG1ldHRlIGxhIGNvbG9ubmEgc3BlY2lmaWNhdGEgZG9wbyBsYSBjb2xvbm5hIHN1Y2Nlc3NpdmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGFibGVDb2x1bW59IGNvbHVtbkl0ZW0gQ29sb25uYSBkYSBzcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2VuZERvd24oY29sdW1uSXRlbTogRXNUYWJsZUNvbHVtbikge1xyXG4gICAgICAgIGxldCBpdGVtSW5kZXggPSB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5pbmRleE9mKGNvbHVtbkl0ZW0pO1xyXG4gICAgICAgIHRoaXMudXRpRXh0cy5zd2FwKHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LCBpdGVtSW5kZXgsIGl0ZW1JbmRleCArIDEpO1xyXG5cclxuICAgICAgICAvLyBOb24gcG9zc28gZmFyZSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuQ29sdW1uc0xpc3QpKSBwZXJjaMOpIGNvbnRpZW5lIHJpZmVyaW1lbnRpIGEgVGVtcGxhdGVSZWZcclxuICAgICAgICBsZXQgdG1wID0gW107XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHsgdG1wLnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYykpOyB9KTtcclxuICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCA9IHRtcDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbCdpbnRlcm5vIGRlbGxhIGRpYWxvZyBcIk9yZGluYW1lbnRvIGUgVmlzaWJpbGl0w6AgQ29sb25uZVwiIHBpbm5hIGxhIGNvbG9ubmEgc3BlY2lmaWNhdGFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGFibGVDb2x1bW59IGNvbHVtbkl0ZW0gQ29sb25uYSBkYSBzcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcGluT3JVbnBpbkNvbHVtbihjb2x1bW5JdGVtOiBFc1RhYmxlQ29sdW1uKSB7XHJcbiAgICAgICAgbGV0IGl0ZW1JbmRleCA9IHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmluZGV4T2YoY29sdW1uSXRlbSk7XHJcbiAgICAgICAgaWYgKCFjb2x1bW5JdGVtLnBpbm5lZCkge1xyXG4gICAgICAgICAgICBjb2x1bW5JdGVtLnByZXZfaW5kZXggPSBpdGVtSW5kZXg7XHJcblxyXG4gICAgICAgICAgICAvL1F1YW5kbyBwaW5ubyBkZXZvIHNwb3N0YXJlIGwnZWxlbWVudG8gY29tZSB1bHRpbWEgY29sb25uYSBwaW5uYXRhIG8gY29tZSBwcmltYSBjb2xvbm5hIHNlIG5vbiBjZSBuZSBzb25vIGRpIHBpbm5hdGVcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdFtpXS5waW5uZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWxpdGllcy5hcnJheU1vdmUodGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QsIGl0ZW1JbmRleCwgaSk7XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIC8vUXVhbmRvIHNwaW5ubyByaXBvcnRvIGwnZWxlbWVudG8gYWxsbyBzdGVzc28gaW5kaWNlIGluIGN1aSBlcmEgcHJpbWEgKHNlIHNvbm8gc3RhdGkgZmF0dGkgc3Bvc3RhbWVudGkgbmVsIG1lenpvIGNhenppIGRlbGwndXRlbnRlKVxyXG4gICAgICAgICAgICBpZiAoY29sdW1uSXRlbS5wcmV2X2luZGV4ICE9IG51bGwgJiYgY29sdW1uSXRlbS5wcmV2X2luZGV4ICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmFycmF5TW92ZSh0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCwgaXRlbUluZGV4LCBjb2x1bW5JdGVtLnByZXZfaW5kZXgpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIC8vIFNlIHNwaW5ubyBzZW56YSB1biBwcmV2X2luZGV4IHZ1b2wgZGlyZSBjaGUgbGEgY29sb25uYSBlcmEgcGlubmF0YSBkYSBjb25maWd1cmF6aW9uZS4gTGEgc3Bvc3RvIG5lbCBwcmltbyBwdW50byBkaXNwb25pYmlsZVxyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3RbaV0ucGlubmVkICYmICF0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdFtpXS5maXhlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWxpdGllcy5hcnJheU1vdmUodGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QsIGl0ZW1JbmRleCwgaSAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbHVtbkl0ZW0ucGlubmVkID0gIWNvbHVtbkl0ZW0ucGlubmVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQWxsJ2ludGVybm8gZGVsbGEgZGlhbG9nIFwiT3JkaW5hbWVudG8gZSBWaXNpYmlsaXTDoCBDb2xvbm5lXCIgaW52ZXJ0ZSBsZSBpbXBvc3RhemlvbmkgZGkgdmlzaWJpbGl0w6AgZGVsbGEgY29sb25uYVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7RXNUYWJsZUNvbHVtbn0gY29sdW1uSXRlbSBDb2xvbm5hIGRhIHNwb3N0YXJlXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2x1bW5DbGlja2VkKGl0ZW06IEVzVGFibGVDb2x1bW4pIHtcclxuICAgICAgICB0aGlzLmVzdC5sYXN0U2VsZWN0ZWRJdGVtSUQgPSBpdGVtLmlkO1xyXG4gICAgICAgIGlmICghdGhpcy5lc3QuSGlkZGVuQ29sdW1ucyB8fCBpdGVtLmZpeGVkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGl0ZW0udmlzaWJsZSA9ICFpdGVtLnZpc2libGU7XHJcbiAgICAgICAgdGhpcy51cGRhdGVHbG9iYWxDb2xWaXNDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBBbGwnYXBlcnR1cmEgZGVsbGEgZGlhbG9nIFwiT3JkaW5hbWVudG8gZSBWaXNpYmlsaXTDoCBDb2xvbm5lXCIgcmljYXJpY2EgbGUgaW5mb3JtYXppb25pIGF0dHVhbGkgcGVyIHBlcm1ldHRlcmUgbGEgbW9kaWZpY2EgKi9cclxuICAgIHB1YmxpYyByZXNldENvbHVtblZpc1NlbGVjdGlvbigpIHtcclxuICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCA9IFtdO1xyXG4gICAgICAgIC8vIE5vbiBwb3NzbyBmYXJlIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5Db2x1bW5zTGlzdCkpIHBlcmNow6kgY29udGllbmUgcmlmZXJpbWVudGkgYSBUZW1wbGF0ZVJlZlxyXG4gICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5lc3QuQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHsgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QucHVzaChPYmplY3QuYXNzaWduKHt9LCBjKSk7IH0pO1xyXG5cclxuICAgICAgICBsZXQgcmVvcmRlcmVkQ29sTGlzdCA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lc3QuQ29sdW1uc09yZGVyaW5nKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcy5mb3JFYWNoKG8gPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGNvbHVtbiA9IHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmZpbHRlcih0ID0+IHQuaWQgPT0gbylbMF07XHJcbiAgICAgICAgICAgICAgICAvLyBQb3RyZWkgbm9uIGF2ZXJuZSBuZWwgY2FzbyBjaSBzaWEgaWwgZmxhZyBIaWRkZW5Db2x1bW5zIGEgZmFsc2UsIGV2aXRvIGRpIGluc2VyaXJlIGRlZ2xpIHVuZGVmaW5lZFxyXG4gICAgICAgICAgICAgICAgaWYgKGNvbHVtbilcclxuICAgICAgICAgICAgICAgICAgICByZW9yZGVyZWRDb2xMaXN0LnB1c2goY29sdW1uKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCA9IHJlb3JkZXJlZENvbExpc3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnVwZGF0ZUdsb2JhbENvbFZpc0NoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFJpYWdnaW9ybmEgbGUgKipPcmRlckRpcmVjdGl2ZXMqKiBjb24gbGUgaW5mb3JtYXppb25pIGluICAqKkNvbHVtbnNMaXN0KiogKi9cclxuICAgIHByaXZhdGUgcmVmcmVzaENvbHVtbk9yZGVyaW5nKCkge1xyXG4gICAgICAgIHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcyA9IFtdO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IHRoaXMuZXN0LkNvbHVtbnNMaXN0Lmxlbmd0aDsgYysrKVxyXG4gICAgICAgICAgICB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXMucHVzaCh0aGlzLmVzdC5Db2x1bW5zTGlzdFtjXS5pZCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEVmZmV0dHVhIGxhIHNlbGV6aW9uZSBvIG1lbm8gZGVsIGNoZWNrIGdsb2JhbGUgKCoqZ2xvYmFsQ29sVmlzQ2hlY2sqKikgZGkgdmlzaWJpbGl0w6AgaW4gYmFzZSBhIHNlIHR1dHRlIGxlICoqVE1QQ29sdW1uc0xpc3QqKiBzb25vIHZpc2liaWxpIG8gbm8gKi9cclxuICAgIHB1YmxpYyB1cGRhdGVHbG9iYWxDb2xWaXNDaGVjaygpIHtcclxuICAgICAgICAvLyBUTVBDb2xMaXN0IHZpZW5lIHJpZW1waXRhIGRpIHVuZGVmaW5lZCBuZWwgY2FzbyBpbiBjdWkgc2lhIGRpc2F0dGl2YXRhIGxhIHNlbGV6aW9uZSBkZWxsZSBjb2xvbm5lIG5hc2Nvc3RlXHJcbiAgICAgICAgdGhpcy5lc3QuZ2xvYmFsQ29sVmlzQ2hlY2sgPSB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5ldmVyeSh0ID0+IHQudmlzaWJsZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGlhbWF0byBxdWFuZG8gdW5hIGNvbG9ubmEgdmllbmUgcmlvcmRpbmF0YSBhbGwnaW50ZXJubyBkZWxsYSBsaXN0YSBkZWxsZSB2aXNpYmlsaXTDoC9wb3NpemlvbmkgY29sb25uZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge0Nka0RyYWdEcm9wPEVzVGFibGVDb2x1bW5bXT59IGV2ZW50IEV2ZW50byBkaSBkcm9wIGRlbGxhIGxpc3RhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb2x1bW5SZW9yZGVyZWQoZXZlbnQ6IENka0RyYWdEcm9wPEVzVGFibGVDb2x1bW5bXT4pIHtcclxuICAgICAgICBtb3ZlSXRlbUluQXJyYXkoZXZlbnQuY29udGFpbmVyLmRhdGEsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGlhbWF0byBxdWFuZG8gdW5hIGNvbG9ubmEgdmllbmUgcmlvcmRpbmF0YSBhbGwnaW50ZXJubyBkZWxsYSBsaXN0YSBkZWxsZSB2aXNpYmlsaXTDoC9wb3NpemlvbmkgY29sb25uZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kaWNlIGluIGN1aSB2b2dsaW8gZHJvcHBhcmUgbCdlbGVtZW50byBkcmFnZ2F0b1xyXG4gICAgICogQHBhcmFtIHtDZGtEcmFnPEVzVGFibGVDb2x1bW4+fSBpdGVtIE9nZ2V0dG8gY2hlIHN0byBkcmFnZ2FuZG9cclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIGxhIGNvbG9ubmEgcHXDsiBlc3NlcmUgc3Bvc3RhdGEgc3VsbCdpbmRpY2UgKippbmRleCoqLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc29ydFByZWRpY2F0ZShpbmRleDogbnVtYmVyLCBpdGVtOiBDZGtEcmFnPEVzVGFibGVDb2x1bW4+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IGl0ZW1BdEluZGV4ID0gdGhpcy5lc3QuQ29sdW1uc0xpc3RbaW5kZXhdO1xyXG4gICAgICAgIHJldHVybiAhaXRlbUF0SW5kZXguZml4ZWQgJiYgIWl0ZW1BdEluZGV4LnBpbm5lZCAmJiAhaXRlbS5kYXRhLnBpbm5lZCAmJiAhaXRlbS5kYXRhLnBpbm5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBlZmZldHR1YSBsYSBjb25mZXJtYSBkZWxsYSB2aXNpYmlsaXTDoCBlIGRlbGwnb3JkaW5lIGRlbGxlIGNvbG9ubmUuXHJcbiAgICAgKlxyXG4gICAgICogUXVlc3RhIHNlbGV6aW9uZSB2aWVuZSBpbm9sdHJlIHNhbHZhdGEgbmVsbGUgcHJlZmVyZW56ZSAoKipAZXNmYWVuemEvcHJlZmVyZW5jZXMqKiksIHF1YWxvcmEgbCdJbnB1dCAqKlNhdmVQcmVmZXJlbmNlcyoqIGZvc3NlIHZhbG9yaXp6YXRvXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59ICoqdHJ1ZSoqIHNlIG5vbiBjaSBzb25vIHByb2JsZW1pLCAqKmZhbHNlKiogYWx0cmltZW50aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29uZmlybUNvbHVtblZpc2liaWxpdHlTZWxlY3Rpb24oKTogYm9vbGVhbiB7XHJcbiAgICAgICAgLy8gTm9uIHBlcm1ldHRvIGRpIG5vbiBzZWxlemlvbmFyZSBudWxsYVxyXG4gICAgICAgIGlmICh0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5ldmVyeSh0ID0+ICF0LnZpc2libGUpKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGxldCBjYXN0ZWRWaWV3ID0gdGhpcy5lc3Qudmlld01vZGUgPyAodGhpcy5lc3QuTWFpbkdyb3VwVmlldyB8fCB0aGlzLmVzdC5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KSA6IG51bGw7XHJcbiAgICAgICAgdGhpcy5lc3QuQ29sdW1uc0xpc3QgPSBbXTtcclxuICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5mb3JFYWNoKGMgPT4geyB0aGlzLmVzdC5Db2x1bW5zTGlzdC5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGMpKTsgfSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaENvbHVtbk9yZGVyaW5nKCk7XHJcbiAgICAgICAgdGhpcy5hcHBseU9yZGVyaW5nKGNhc3RlZFZpZXcsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkobnVsbCwgbnVsbCwgY2FzdGVkVmlldyk7XHJcblxyXG4gICAgICAgIC8vU2Fsdm8gbGUgcHJlZmVyZW5jZXMgZGkgcXVlc3RhIHZpZXdcclxuICAgICAgICAvL0RpIGRlZmF1bHQgcmVnaXN0cm8gb3JkaW5hbWVudG8gZSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIG5lbGxhIHZpc3RhLiBTb2xvIGxlIGNvc2UgZGkgVUlcclxuICAgICAgICBpZiAodGhpcy5lc3QuU2F2ZVByZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lc3QubmdDb250cm9sLm5hbWUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJOb24gcG9zc28gdXRpbGl6emFyZSBsZSBwcmVmZXJlbmNlIHNlbnphIGF2ZXJlIHVuICduYW1lJyBwZXIgbGEgdGFiZWxsYVwiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLnByZWZTZXJ2aWNlKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiTm9uIHBvc3NvIHV0aWxpenphcmUgbGUgcHJlZmVyZW5jZSBzZW56YSBjaGUgaWwgcGFjY2hldHRvIEBlc2ZhZW56YS9wcmVmZXJlbmNlcyBzaWEgaW5zdGFsbGF0b1wiKTtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgbGV0IGNvbHVtbnMgPSB0aGlzLmVzdC5hcnJheU1vZGUgPyB0aGlzLmVzdC5hcnJheUNvbHVtbnMgOiBjYXN0ZWRWaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW5zT3JkZXJpbmdzID0gdGhpcy5lc3QuYXJyYXlNb2RlID8gdGhpcy5lc3QuYXJyYXlDb2x1bW5PcmRlcmluZyA6IGNhc3RlZFZpZXcuY29sdW1uX29yZGVyaW5nO1xyXG4gICAgICAgICAgICB2YXIgdG9TdG9yZSA9IHsgY29sdW1uczogPHN0cmluZ1tdPkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29sdW1ucykpLCBjb2x1bW5fb3JkZXJpbmc6IDxzdHJpbmdbXT5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbHVtbnNPcmRlcmluZ3MpKSB9O1xyXG4gICAgICAgICAgICB0aGlzLnByZWZTZXJ2aWNlLnNldEl0ZW0oPHN0cmluZz50aGlzLmVzdC5uZ0NvbnRyb2wubmFtZSwgdG9TdG9yZSwgJ3ByZWZlcmVuY2UnKS5zdWJzY3JpYmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJpZXNlZ3VvIGwndWx0aW1hIHJpY2VyY2EgYmluZGF0YSBhbGxhIHRhYmVsbGFcclxuICAgICAgICAvLyBNaSBhc3NpY3VybyBkaSBmYXJsbyBkb3BvIGwnZXNwYW5zaW9uZSBkZWwgY2hhbmdlZCBvIHJpc2NoaW8gY2hlIGxhIHJpY2VyY2EgbWkgcmlkaWEgY29sb25uZSBjaGUgaW4gcmVhbHTDoCBub24gZXNpc3Rvbm9cclxuICAgICAgICBpZiAodGhpcy5lc3Qudmlld01vZGUpXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXN0Lk1haW5Hcm91cFZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlldyA9IHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZVtpXS52aWV3O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmNvbHVtbnMgPSB0aGlzLmVzdC5NYWluR3JvdXBWaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuY29sdW1uX29yZGVyaW5nID0gdGhpcy5lc3QuTWFpbkdyb3VwVmlldy5jb2x1bW5fb3JkZXJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUsIHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZVtpXS52aWV3KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLmVzdC5hcnJheU1vZGUpXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmVzdC5pbnRlcm5hbFdyaXRlVmFsdWUoKTsgfSk7XHJcblxyXG4gICAgICAgIC8vIExvIHZvcnJlaSBtZXR0ZXJlIGxhdG8gdGVtcGxhdGUgbWEgbm9cclxuICAgICAgICB0aGlzLmVzdC5sYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dW8gbCd1bnBpbm5pbmcgZGkgdW5hIGNvbG9ubmEgaW4gbWFuaWVyYSBwcm9ncmFtbWF0aWNhIHNlbXBsaWNlbWVudGUgZXNlZ3VlbmRvIHVuYSBwZXIgdW5hIGxlIG9wZXJhemlvbmkgY2hlIHZlcnJlYmJlcm8gZXNlZ3VpdGUgYWx0cmltZW50aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBDb2RpY2UgZGVsbGEgY29sb25uYSBkYSBzcGlubmFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdW5waW5Db2x1bW4oaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5WaXNTZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLnBpbk9yVW5waW5Db2x1bW4odGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZmluZCh0ID0+IHQuaWQgPT0gaWQpKTtcclxuICAgICAgICB0aGlzLmNvbmZpcm1Db2x1bW5WaXNpYmlsaXR5U2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFN1bCBjbGljayBuZWxsYSBjaGVja2JveCBkaSBzZWxlemlvbmUgZ2xvYmFsZSBzaSBzY29ycm9ubyB0dXR0ZSBsZSBjb2xvbm5lIGUgc2kgaW1wb3N0YW5vIGFsIHZhbG9yZSBkZWxsYSBjaGVjayBnbG9iYWxlICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ29sVmlzQ2hlY2tDaGFuZ2VkKCkge1xyXG4gICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdC5maXhlZClcclxuICAgICAgICAgICAgICAgIHQudmlzaWJsZSA9IHRoaXMuZXN0Lmdsb2JhbENvbFZpc0NoZWNrO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
796
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29sdW1uTWV0YWRhdGFIYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9jb3JlL2hhbmRsZXJzL0NvbHVtbk1ldGFkYXRhSGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxVQUFVO0FBQ1YsT0FBTyxFQUF3QixlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQVMvRSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBTWpFLFVBQVU7QUFDVixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOENBQThDLENBQUM7QUFFM0UsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBR3JFLDZIQUE2SDtBQUM3SCxNQUFNLE9BQU8scUJBQXFCO0lBRTlCLHlCQUF5QjtJQUN6QixZQUFvQixHQUFxQixFQUFVLFNBQTJCLEVBQVUsT0FBdUIsRUFBVSxXQUErQixFQUFVLEdBQXVCO1FBQXJLLFFBQUcsR0FBSCxHQUFHLENBQWtCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBa0I7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFnQjtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFvQjtRQUFVLFFBQUcsR0FBSCxHQUFHLENBQW9CO0lBQUksQ0FBQztJQUU5TDs7Ozs7T0FLRztJQUNJLG1CQUFtQixDQUFDLEVBQVUsRUFBRSxLQUFxQjtRQUN4RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUF1QixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7UUFDakcsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElB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LEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXJcclxuaW1wb3J0IHsgQ2RrRHJhZywgQ2RrRHJhZ0Ryb3AsIG1vdmVJdGVtSW5BcnJheSB9IGZyb20gXCJAYW5ndWxhci9jZGsvZHJhZy1kcm9wXCI7XHJcbmltcG9ydCB7IFRlbXBsYXRlUmVmIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIExpYnNcclxuaW1wb3J0IHsgVXRpbGl0eVNlcnZpY2UgfSBmcm9tIFwiQGVzZmFlbnphL2V4dGVuc2lvbnNcIjtcclxuaW1wb3J0IHsgUHJlZmVyZW5jZXNTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9wcmVmZXJlbmNlc1wiO1xyXG5cclxuLy8gQ29tcG9uZW50aSAvIERpcmV0dGl2ZVxyXG5pbXBvcnQgeyBFc1RhYmxlQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uL2NvbXBvbmVudHMvZXMtdGFibGUvZXNfdGFibGUuY29tcG9uZW50XCJcclxuaW1wb3J0IHsgRXNUZERpcmVjdGl2ZSB9IGZyb20gXCIuLi8uLi9kaXJlY3RpdmVzL2VzX3RkLmRpcmVjdGl2ZVwiO1xyXG5pbXBvcnQgeyBFc1RoRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvZXNfdGguZGlyZWN0aXZlXCI7XHJcblxyXG4vLyBIYW5kbGVyc1xyXG5pbXBvcnQgeyBVdGlsaXRpZXNIYW5kbGVyIH0gZnJvbSBcIi4vVXRpbGl0aWVzSGFuZGxlclwiO1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuXHJcbi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQXBwT3JkZXJpbmcgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2V4dGVybmFscy9hcHBzZWFyY2gvQXBwT3JkZXJpbmdcIjtcclxuaW1wb3J0IHsgQXBwU2VhcmNoIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcFNlYXJjaFwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlQ29sdW1uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9pbnRlcm5hbHMvRXNUYWJsZUNvbHVtblwiO1xyXG5pbXBvcnQgeyBFc1RhYmxlTXVsdGlWYWx1ZSB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9Fc1RhYmxlTXVsdGlWYWx1ZVwiO1xyXG5cclxuLyoqIENsYXNzZSBjaGUgZ2VzdGlzY2UgdHV0dGUgbGUgaW5mb3JtYWl6b25pIHJlbGF0aXZlIGFsbGUgY29sb25uZTogdmlzaWJpbGl0w6AsIHBvc2l6aW9uZSwgc3RhdG8gZGkgcGluL3VucGluLCBlY2MgZWNjLi4uICovXHJcbmV4cG9ydCBjbGFzcyBDb2x1bW5NZXRhZGF0YUhhbmRsZXIge1xyXG5cclxuICAgIC8qKiBAaWdub3JlIENvc3RydXR0b3JlKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZXN0OiBFc1RhYmxlQ29tcG9uZW50LCBwcml2YXRlIHV0aWxpdGllczogVXRpbGl0aWVzSGFuZGxlciwgcHJpdmF0ZSB1dGlFeHRzOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSBwcmVmU2VydmljZTogUHJlZmVyZW5jZXNTZXJ2aWNlLCBwcml2YXRlIHJnSDogUm93R3JvdXBpbmdIYW5kbGVyKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1ldG9kbyBjaGUgZ2VzdGlzY2UgaWwgY2FtYmlvIGRpIE9yZGluYW1lbnRvIGRpIHVuYSBjb2xvbm5hXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElEIGRlbGxhIGNvbG9ubmEgaWwgY3VpIG9yaWRuYW1lbnRvIMOoIGNhbWJpYXRvXHJcbiAgICAgKiBAcGFyYW0geydERVNDJyB8ICdBU0MnfSBvcmRlciBOdW92byBvcmRpbmUgc2VsZXppb25hdG8gcGVyIGxhIGNvbG9ubmFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZVRIT3JkZXJDaGFuZ2UoaWQ6IHN0cmluZywgb3JkZXI6ICdERVNDJyB8ICdBU0MnKSB7XHJcbiAgICAgICAgbGV0IG9yZGVycyA9IHRoaXMuZXN0LnZpZXdNb2RlID8gKHRoaXMuZXN0LlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pLm9yZGVycyA6IHRoaXMuZXN0LmFycmF5T3JkZXJzO1xyXG4gICAgICAgIGxldCBvcmRlclRvQWRkID0gdHJ1ZTtcclxuICAgICAgICBsZXQgb3JkZXJUb1JlbW92ZTogbnVtYmVyID0gbnVsbDtcclxuXHJcbiAgICAgICAgLy8gU2UgcGVyIHF1YWxjaGUgbW90aXZvIGlsIGNvc3RydXR0b3JlIG5vbiDDqCBwYXNzYXRvIChjYWNoZSB0YXJwYXRlIG8gc2ltaWxhKSBmaXhvXHJcbiAgICAgICAgaWYgKCFvcmRlcnMgJiYgdGhpcy5lc3Qudmlld01vZGUpXHJcbiAgICAgICAgICAgICh0aGlzLmVzdC5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KS5vcmRlcnMgPSBbXTtcclxuICAgICAgICBlbHNlIGlmICghb3JkZXJzICYmIHRoaXMuZXN0LmFycmF5TW9kZSlcclxuICAgICAgICAgICAgdGhpcy5lc3QuYXJyYXlPcmRlcnMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHQgPSBvcmRlcnNbaV07XHJcbiAgICAgICAgICAgIGlmICh0LmlkID09IGlkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAob3JkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICB0Lm9yZGVyID0gb3JkZXI7XHJcbiAgICAgICAgICAgICAgICAgICAgb3JkZXJUb0FkZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIG9yZGVyVG9SZW1vdmUgPSBpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAob3JkZXJUb1JlbW92ZSAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIG9yZGVycy5zcGxpY2Uob3JkZXJUb1JlbW92ZSwgMSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKG9yZGVyVG9BZGQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZXN0Lk11bHRpcGxlT3JkZXJpbmdEaXJlY3RpdmVzKVxyXG4gICAgICAgICAgICAgICAgb3JkZXJzLnB1c2gobmV3IEFwcE9yZGVyaW5nKGlkLCBvcmRlcikpO1xyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVzdC52aWV3TW9kZSlcclxuICAgICAgICAgICAgICAgICAgICAodGhpcy5lc3QuVmlldyBhcyBBcHBTZWFyY2g8YW55Pikub3JkZXJzID0gW25ldyBBcHBPcmRlcmluZyhpZCwgb3JkZXIpXTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZXN0LmFycmF5TW9kZSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVzdC5hcnJheU9yZGVycyA9IFtuZXcgQXBwT3JkZXJpbmcoaWQsIG9yZGVyKV07XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vU2Fsdm8gbGUgcHJlZmVyZW5jZXMgZGkgcXVlc3RhIHZpZXdcclxuICAgICAgICAvL0RpIGRlZmF1bHQgcmVnaXN0cm8gb3JkaW5hbWVudG8gZSB2aXNpYmlsaXTDoCBkZWxsZSBjb2xvbm5lIG5lbGxhIHZpc3RhLiBTb2xvIGxlIGNvc2UgZGkgVUlcclxuICAgICAgICBpZiAodGhpcy5lc3QuU2F2ZVByZWZlcmVuY2VzKSB7XHJcbiAgICAgICAgICAgIGxldCBjYXN0ZWRWaWV3ID0gdGhpcy5lc3Qudmlld01vZGUgPyAodGhpcy5lc3QuTWFpbkdyb3VwVmlldyB8fCB0aGlzLmVzdC5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KSA6IG51bGw7XHJcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3UHJlZmVyZW5jZXMoY2FzdGVkVmlldyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVzdC5vbk9yZGVyQ2hhbmdlZC5lbWl0KHsgaWQsIG9yZGVyIH0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5lc3Qudmlld01vZGUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5yZ0guZW1pdFJvd0dyb3VwaW5nU2VhcmNoZXMoaWQsIG9yZGVycyk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0LmVtaXRTZWFyY2hSZXF1ZXN0KGZhbHNlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5lc3QuYXJyYXlNb2RlKVxyXG4gICAgICAgICAgICB0aGlzLmVzdC5pbnRlcm5hbFdyaXRlVmFsdWUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFJlZ2lzdHJhIGxlIHByZWZlcmVuY2UgcmVsYXRpdmUgYWxsYSB2aWV3IHBhc3NhdGEgY29tZSBwYXJhbWV0cm9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGNhc3RlZFZpZXcgVmlldyBkaSBjdWkgc2FsdmFyZSBjb2xvbm5lIGUgb3JkaW5hbWVudG8gY29sb25uZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmVnaXN0ZXJWaWV3UHJlZmVyZW5jZXMoY2FzdGVkVmlldzogQXBwU2VhcmNoPGFueT4pe1xyXG4gICAgICAgIGlmICghdGhpcy5lc3QubmdDb250cm9sLm5hbWUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgYXZlcmUgdW4gJ25hbWUnIHBlciBsYSB0YWJlbGxhXCIpO1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMucHJlZlNlcnZpY2UpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIk5vbiBwb3NzbyB1dGlsaXp6YXJlIGxlIHByZWZlcmVuY2Ugc2VuemEgY2hlIGlsIHBhY2NoZXR0byBAZXNmYWVuemEvcHJlZmVyZW5jZXMgc2lhIGluc3RhbGxhdG9cIik7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zID0gdGhpcy5lc3QuYXJyYXlNb2RlID8gdGhpcy5lc3QuYXJyYXlDb2x1bW5zIDogY2FzdGVkVmlldy5jb2x1bW5zO1xyXG4gICAgICAgIGxldCBjb2x1bW5zT3JkZXJpbmdzID0gdGhpcy5lc3QuYXJyYXlNb2RlID8gdGhpcy5lc3QuYXJyYXlDb2x1bW5PcmRlcmluZyA6IGNhc3RlZFZpZXcuY29sdW1uX29yZGVyaW5nO1xyXG4gICAgICAgIGxldCBjb2x1bW5PcmRlcnMgPSB0aGlzLmVzdC5hcnJheU1vZGUgPyBbXSA6IGNhc3RlZFZpZXcub3JkZXJzO1xyXG4gICAgICAgIHZhciB0b1N0b3JlID0ge1xyXG4gICAgICAgICAgICBjb2x1bW5zOiA8c3RyaW5nW10+SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjb2x1bW5zKSksXHJcbiAgICAgICAgICAgIGNvbHVtbl9vcmRlcmluZzogPHN0cmluZ1tdPkpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY29sdW1uc09yZGVyaW5ncykpLFxyXG4gICAgICAgICAgICBvcmRlcnM6IDxzdHJpbmdbXT5KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGNvbHVtbk9yZGVycykpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLnByZWZTZXJ2aWNlLnNldEl0ZW0oPHN0cmluZz50aGlzLmVzdC5uZ0NvbnRyb2wubmFtZSwgdG9TdG9yZSwgJ3ByZWZlcmVuY2UnKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFBhcnRlbmRvIGRhZ2xpICoqRXNUaHMqKiBlc3RyYXBwb2xvIGxhIGxpc3RhIGRpICoqRXNUYWJsZUNvbHVtbioqIGNoZSBxdWVzdGEgdGFiZWxsYSBkb3Zyw6AgZXZlbnR1YWxtZW50ZSBnZXN0aXJlIHBlciBWaXNpYmlsaXTDoCBlIE9yZGluZVxyXG4gICAgICpcclxuICAgICAqIENvc3RvOiAxIHNjYW4gRXNUaHNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgcmV2aWV3Q29sdW1uc0xpc3QodGhzOiBFc1RoRGlyZWN0aXZlW10pIHtcclxuICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCA9IFtdO1xyXG4gICAgICAgIGlmICh0aHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gQXBwZW5hIGlsIGNvbnRlbnRDaGlsZHJlbiDDqCB2YWxvcml6emF0byBzY29ycm8gdHV0dGkgZ2xpIGhlYWRlclxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuXHJcbiAgICAgICAgICAgIGxldCBjb2x1bW4gPSB0aC50aDtcclxuICAgICAgICAgICAgLy8gU2Ugbm9uIGhvIHVuIGlkIGlsIHRoIMOoIGNvbnNpZGVyYXRvIGluZXJ0ZVxyXG4gICAgICAgICAgICBpZiAoIWNvbHVtbilcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gU2Fsdm8gbGUgaW5mb3JtYXppb25pIGRlbGwnaGVhZGVyIHBlciBmYXIgcGFydGUgZGVsbGEgbGlzdGEgZGEgY3VpIHNjZWdsaWVyZSBxdWFsaSBjb2xvbm5lIHZpc3VhbGl6emFyZS9uYXNjb25kZXJlXHJcbiAgICAgICAgICAgIC8vIERpIGRlZmF1bHQgbGEgdmlzaWJpbGl0w6Agw6ggcXVlbGxhIGltcG9zdGF0YSBuZWwgY29tcG9uZW50ZVxyXG4gICAgICAgICAgICBpZiAoKHRoaXMuZXN0LkhpZGRlbkNvbHVtbnMgfHwgdGgudGhWaXNpYmxlKSAmJiB0aC50aElmKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldmlvdXNseVBpbm5lZCA9ICF0aGlzLmVzdC5Db2x1bW5zTGlzdCB8fCB0aGlzLmVzdC5Db2x1bW5zTGlzdC5sZW5ndGggPT0gMCA/IG51bGwgOiB0aGlzLmVzdC5Db2x1bW5zTGlzdC5maW5kKHQgPT4gdC5pZCA9PSBjb2x1bW4pIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG9BZGQgPSBuZXcgRXNUYWJsZUNvbHVtbihjb2x1bW4sIHRoLnRoU3RhdGljQ29udGVudCwgdGgudGhWaXNpYmxlLCAodGgudGhGaXhlZCB8fCB0aC50aEdyb3VwKSwgcHJldmlvdXNseVBpbm5lZCA9PSBudWxsID8gdGgudGhQaW5uZWQgOiBwcmV2aW91c2x5UGlubmVkLnBpbm5lZCwgdGgudGhQaW5uYWJsZSwgdGgudGhQaW5uZWRXaWR0aCwgdGguVGVtcGxhdGUsIHRoLl90aFBhcmVudHMsIHRoLl9tdWx0aSwgdGguX211bHRpX2NvbnRlbnQpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzbHlQaW5uZWQpXHJcbiAgICAgICAgICAgICAgICAgICAgdG9BZGQucHJldl9pbmRleCA9IHByZXZpb3VzbHlQaW5uZWQucHJldl9pbmRleDtcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LnB1c2godG9BZGQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXN0LkNvbHVtbnNMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHsgdGhpcy5lc3QuQ29sdW1uc0xpc3QucHVzaChPYmplY3QuYXNzaWduKHt9LCBjKSk7IH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBJbiBjYXNvIHNpYW5vIGNvbmZpZ3VyYXRpIGRlaSB0aCBcIk11bHRpXCIgKHZlZGVyZSBsYSBkZXNjcml6aW9uZSBkZWwgY2FtcG8gKip0aE11bHRpKiogZGkgKipFc1RoRGlyZWN0aXZlKiopIHF1ZXN0byBtZXRvZG8gbGkgXCJzcm90b2xhXCIgaW4gdHV0dGkgaSB0aC90ZCBjaGUgZGV2b25vIGVmZmV0dGl2YW1lbnRlIGRpdmVudGFyZSAqL1xyXG4gICAgcHVibGljIGV4cGFuZE11bHRpVGhzQW5kVGRzKHRoczogRXNUaERpcmVjdGl2ZVtdLCB0ZHM6IEVzVGREaXJlY3RpdmVbXSwgaXRlbXM6IGFueVtdKToge2V4cFRoczogRXNUaERpcmVjdGl2ZVtdLCBleHBUZHM6IEVzVGREaXJlY3RpdmVbXX0ge1xyXG5cclxuICAgICAgICAvLyBSZWdpc3RybyBsZSBpbmZvIHN1aSBtdWx0aXByb3ZpZGVyXHJcbiAgICAgICAgbGV0IG11bHRpRGVmczogeyBbaWQ6IHN0cmluZ106IHsgT24/OiBzdHJpbmcsIHRocmVmOiBFc1RoRGlyZWN0aXZlLCB0ZHJlZjogRXNUZERpcmVjdGl2ZSwgdGhnZW46IHsgW2lkOiBzdHJpbmddOiBFc1RoRGlyZWN0aXZlIH0sIHRkZ2VuOiB7IFtpZDogc3RyaW5nXTogRXNUZERpcmVjdGl2ZSB9IH0gfSA9IHsgfTtcclxuICAgICAgICBcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcbiAgICAgICAgICAgIGlmICghdGgudGhNdWx0aSlcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgbXVsdGlEZWZzW3RoLnRoXSA9IHsgT246IHRoLnRoLCB0ZHJlZjogbnVsbCwgdGhyZWY6IHRoLCB0aGdlbjoge30sIHRkZ2VuOiB7fSB9O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQXNzZWdubyBsZSBpbmZvIGFuY2hlIGFpIHRkXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRkID0gdGRzW2ldO1xyXG4gICAgICAgICAgICB0ZC5fbXVsdGkgPSAhIW11bHRpRGVmc1t0ZC50ZF07XHJcbiAgICAgICAgICAgIGlmKHRkLl9tdWx0aSlcclxuICAgICAgICAgICAgICAgIG11bHRpRGVmc1t0ZC50ZF0udGRyZWYgPSB0ZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFJpbXVvdm8gaSBtdWx0aXRlbXBsYXRlIGRhbGxlIGJhbGxlXHJcbiAgICAgICAgLy8gTi5COiBEYXRvIGNoZSBsYSBwcmltYSBvcGVyYXppb25lIHN1IHRoIGUgdGQgw6ggcXVlc3RhIGlsIHJpZmVyaW1lbnRvIG9yaWdpbmFsZSB2aWVuZSBzb3ZyYXNjcml0dG8sIHF1ZXN0byBzaWduaWZpY2EgY2hlIGRldm8gcmktZW1ldHRlcmUgaSBkdWUgbnVvdmkgYXJyYXlcclxuICAgICAgICB0aHMgPSB0aHMuZmlsdGVyKHQgPT4gIXQudGhNdWx0aSk7XHJcbiAgICAgICAgdGRzID0gdGRzLmZpbHRlcih0ID0+ICF0Ll9tdWx0aSk7XHJcblxyXG4gICAgICAgIGxldCBwYXJlbnRUaHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuOyB9ID0geyB9O1xyXG4gICAgICAgIGxldCBhZGRlZEhlYWRlcnM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuOyB9ID0geyB9O1xyXG4gICAgICAgIGxldCB0ZHNUb0FkZDogeyBbaWQ6IHN0cmluZ10gOiBFc1RkRGlyZWN0aXZlfSA9IHsgfTtcclxuICAgICAgICBsZXQgdGhzVG9BZGQ6IEVzVGhEaXJlY3RpdmVbXSA9IFtdO1xyXG5cclxuICAgICAgICAvLyBQZXIgb2duaSBpdGVtIHZlZG8gc2UgY2kgc29ubyBkZWkgbXVsdGkgcGVyIGxlIHByb3ByaWV0w6AgY2hlIGxpIGRlZmluaXNjb25vXHJcbiAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgbGV0IGl0bSA9IGl0ZW1zW2ldO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBtdWx0aURlZnMpIHtcclxuICAgICAgICAgICAgICAgIC8vIFNlIGxhIHByb3ByaWV0w6AgZGVsIG11bHRpIGVzaXN0ZSBuZWxsJ29nZ2V0dG8gZWQgaGEgdW5hIGx1bmdoZXp6YVxyXG4gICAgICAgICAgICAgICAgaWYgKGl0bVtwcm9wXSAmJiBpdG1bcHJvcF0ubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG11bHRpUmVmID0gbXVsdGlEZWZzW3Byb3BdO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZ0ZCA9IG11bHRpUmVmLnRkcmVmO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWZ0aCA9IG11bHRpUmVmLnRocmVmO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpaSA9IDA7IGlpIDwgaXRtW3Byb3BdLmxlbmd0aDsgaWkrKykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVyIGdpw6AgYWdnaXVudG8sIG5vbiBkZXZvIGluc2VyaXJlIGFsdHJpIHRlbXBsYXRlIGRpIGhlYWRlci9jb2xvbm5hXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlc3RtdiA9IDxFc1RhYmxlTXVsdGlWYWx1ZT5pdG1bcHJvcF1baWldO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWVzdG12Ll9oZWFkZXJzSGllcmFyY2h5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0bXYuX2hlYWRlcnNIaWVyYXJjaHkgPSBlc3Rtdi5oZWFkZXJfZ3JvdXAgPyBlc3Rtdi5oZWFkZXJfZ3JvdXAuc3BsaXQoXCI+XCIpLm1hcCh0ID0+IHQudHJpbSgpKSA6IFtdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhlYWRlclZhbHVlID0gZXN0bXYuaGVhZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gZXN0bXYuaGVhZGVyX2dyb3VwIHx8IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRzSGllciA9IGVzdG12Ll9oZWFkZXJzSGllcmFyY2h5O1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGVkSGVhZGVyc1tgJHtwYXJlbnR9XyR7aGVhZGVyVmFsdWV9YF0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkZWRIZWFkZXJzW2Ake3BhcmVudH1fJHtoZWFkZXJWYWx1ZX1gXSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBQZXIgb2duaSB2YWxvcmUgZGl2ZXJzbyBkZWxsZSBwcm9wcmlldMOgIGRldm8gYWdnaXVuZ2VyZSB1biB0ZCBlIHVuIHRoLCBxdWVzdCd1bHRpbW8gZGV2J2Vzc2VyZSBldmVudHVhbG1lbnRlIGNvbGxlZ2F0byBhZCB1biBoZWFkZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld3RIID0gbmV3IEVzVGhEaXJlY3RpdmUocmVmdGguVGVtcGxhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC5fbXVsdGkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC5fbXVsdGlfY29udGVudCA9IGhlYWRlclZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC50aCA9IGAke3Byb3B9XyR7aWl9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3dEgudGhDbGFzcyA9IHJlZnRoLnRoQ2xhc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3RILnRoSWYgPSByZWZ0aC50aElmO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXd0SC50aFZpc2libGUgPSByZWZ0aC50aFZpc2libGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld3RILnRoV3JhcCA9IHJlZnRoLnRoV3JhcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWwgcGFyZW50IMOoIHNlbXByZSBsJ3VsdGltbyBuZWxsYSBnZXJhcmNoaWEgZGkgcGFkcmlcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3dEgudGhQYXJlbnQgPSBwYXJlbnRzSGllcltwYXJlbnRzSGllci5sZW5ndGggLSAxXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3dEgudGhPcmRlcmFibGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50c0hpZXIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXIgPSBwYXJlbnRzSGllcltpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50VGhzW3Bhcl0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50VGhzW3Bhcl0gPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aFBhcmVudCA9IG5ldyBFc1RoRGlyZWN0aXZlKG51bGwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhQYXJlbnQudGggPSBwYXI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aFBhcmVudC5fbXVsdGlfY29udGVudCA9IHBhcjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoUGFyZW50LnRoUGFyZW50ID0gaSA+IDAgPyBwYXJlbnRzSGllcltpIC0gMV0gOiBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhzVG9BZGQucHVzaCh0aFBhcmVudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoc1RvQWRkLnB1c2gobmV3dEgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1RkID0gbmV3IEVzVGREaXJlY3RpdmUocmVmdGQuVGVtcGxhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdUZC5fbXVsdGkgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdUZC50ZCA9IGAke3Byb3B9XyR7aWl9YDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGQudGRDbGFzcyA9IHJlZnRkLnRkQ2xhc3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RkLnRkSWYgPSByZWZ0ZC50ZElmO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdUZC50ZFZpc2libGUgPSByZWZ0ZC50ZFZpc2libGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRkc1RvQWRkW25ld1RkLnRkXSA9IG5ld1RkO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gT3JkaW5vIGdsaSBoZWFkZXIgYWdnaXVudGkgaW4gYmFzZSBhbCBQYXJlbnQsIHNlIHByZXNlbnRlLCBlIGxpIGFnZ2l1bmdvIGFsbGEgbGlzdGEgZGVpIHRoLCBkb3BvZGljaMOpIGluIGJhc2UgYWxsbyBzdGVzc28gb3JkaW5hbWVudG8gYWdnaXVuZ28gaSByZWxhdGl2aSB0ZFxyXG4gICAgICAgIGxldCBvcmRlcmVkVGhzID0gW107XHJcblxyXG4gICAgICAgIC8vIFByaW1hIG1ldHRvIHR1dHRpIGkgdGggc2VuemEgcGFyZW50LCBwb2kgcGVyIG9nbmkgcGFyZW50IHByZW5kbyBpIHRoIG9yZGluYXRpIGNvbWUgbGkgdHJvdm8gbmVsbGEgbGlzdGFcclxuICAgICAgICBmb3IobGV0IGkgPSAwOyBpIDwgdGhzVG9BZGQubGVuZ3RoOyBpKyspe1xyXG4gICAgICAgICAgICBpZighdGhzVG9BZGRbaV0udGhQYXJlbnQpXHJcbiAgICAgICAgICAgICAgICBvcmRlcmVkVGhzLnB1c2godGhzVG9BZGRbaV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBmb3IobGV0IHByb3AgaW4gcGFyZW50VGhzKXtcclxuICAgICAgICAgICAgZm9yKGxldCBpID0gMDsgaSA8IHRoc1RvQWRkLmxlbmd0aDsgaSsrKXtcclxuICAgICAgICAgICAgICAgIGxldCB0aCA9IHRoc1RvQWRkW2ldO1xyXG4gICAgICAgICAgICAgICAgaWYodGgudGhQYXJlbnQgJiYgdGgudGhQYXJlbnQgPT0gcHJvcClcclxuICAgICAgICAgICAgICAgICAgICBvcmRlcmVkVGhzLnB1c2godGgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aHMgPSBbLi4udGhzLCAuLi50aHNUb0FkZF07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHNUb0FkZC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAvLyBTZSBpbCB0aCDDqCB1biBoZWFkZXIgdGQgdmVycmViYmUgdW5kZWZpbmVkLiBMbyBhZ2dpdW5nbyBzb2xvIHNlIMOoIGVmZmV0dGl2YW1lbnRlIHByZXNlbnRlXHJcbiAgICAgICAgICAgIGxldCB0ZCA9IHRkc1RvQWRkW3Roc1RvQWRkW2ldLnRoXTtcclxuICAgICAgICAgICAgaWYgKHRkKVxyXG4gICAgICAgICAgICAgICAgdGRzLnB1c2godGQpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgZXhwVGRzOiB0ZHMsIGV4cFRoczogdGhzIH07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBQcmVuZGUgaSB0aCBlIGkgdGQgaW4gbW9kYWxpdMOgIGRpcmV0aXZlIGUgbGkgb3JkaW5hIGluIGJhc2UgYSBzZSBjaSBzb25vIGNvbG9ubmUgZml4ZWQgbyBtZW5vXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtb3ZlRml4ZWRDb2x1bW5zQXRUaGVCZWdpbm5pbmcodGhzOiBFc1RoRGlyZWN0aXZlW10sIHRkczogRXNUZERpcmVjdGl2ZVtdKSB7XHJcblxyXG4gICAgICAgIGxldCB0aHNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IGFueTsgfSA9IHt9O1xyXG4gICAgICAgIGxldCBmaXhlZHMgPSAwLCBwaW5uZWRzID0gMDtcclxuICAgICAgICBsZXQgY29sdW1uc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUYWJsZUNvbHVtbjsgfSA9IHt9O1xyXG4gICAgICAgIGxldCBjb2x1bW5zSW5kZXhDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IG51bWJlcjsgfSA9IHt9O1xyXG5cclxuICAgICAgICAvLyBDcmVvIGxhIGNhY2hlIGRlbGxlIGNvbG9ubmVcclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuZXN0LkNvbHVtbnNMaXN0Lmxlbmd0aDsgY29saSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2wgPSB0aGlzLmVzdC5Db2x1bW5zTGlzdFtjb2xpXTtcclxuICAgICAgICAgICAgY29sdW1uc0NhY2hlW2NvbC5pZF0gPSBjb2w7XHJcblxyXG4gICAgICAgICAgICAvLyBBbmNoZSBwZXIgbGUgY29sdW1uc2xpc3Qgc3Bvc3RvIGxlIHBpbm5hdGUgbyBsZSBmaXhlZCBhbGwnaW5pemlvXHJcbiAgICAgICAgICAgIGlmIChjb2wucGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29saSAhPSBwaW5uZWRzKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmFycmF5TW92ZSh0aGlzLmVzdC5Db2x1bW5zTGlzdCwgY29saSwgcGlubmVkcyk7XHJcbiAgICAgICAgICAgICAgICBwaW5uZWRzKys7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFNlIHVuYSBjb2xvbm5hIMOoIHNpYSBwaW5uYXRhIGNoZSBmaXhhdGEgbGEgY29uc2lkZXJvIHVuaWNhbWVudGUgcGlubmF0YVxyXG4gICAgICAgICAgICBpZiAoY29sLmZpeGVkICYmICFjb2wucGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoY29saSAhPSBwaW5uZWRzICsgZml4ZWRzKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmFycmF5TW92ZSh0aHMsIGNvbGksIHBpbm5lZHMgKyBmaXhlZHMpO1xyXG4gICAgICAgICAgICAgICAgZml4ZWRzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBpbm5lZHMgPSBmaXhlZHMgPSAwO1xyXG5cclxuICAgICAgICAvLyBTcG9zdG8gdHV0dGkgZ2xpIGhlYWRlciBmaXhlZCBvIHBpbm5lZCBhbGwnaW5pemlvXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG5cclxuICAgICAgICAgICAgdGhzQ2FjaGVbdGgudGhdID0gdGg7XHJcbiAgICAgICAgICAgIC8vIFJpYXNzZWdubyBzZW1wcmUgcGVyIHJpcHVsaXJlIHZhbG9yaSBkaSBwYXJ0ZW56YSBvIHBlciBhZ2dpb3JuYXJsaSBpbiBjYXNvIGRpIG1vZGlmaWNoZSB1dGVudGVcclxuICAgICAgICAgICAgdGgudGhQaW5uZWQgPSAoIWNvbHVtbnNDYWNoZVt0aC50aF0gJiYgdGgudGhQaW5uZWQpIHx8IChjb2x1bW5zQ2FjaGVbdGgudGhdICYmIGNvbHVtbnNDYWNoZVt0aC50aF0ucGlubmVkKTtcclxuICAgICAgICAgICAgaWYgKHRoLnRoUGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoaSAhPSBwaW5uZWRzKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXRpbGl0aWVzLmFycmF5TW92ZSh0aHMsIGksIHBpbm5lZHMpO1xyXG4gICAgICAgICAgICAgICAgcGlubmVkcysrO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL0luIHF1ZXN0byBjYXNvIHNvbm8gaW5mb3JtYXppb25pIHN0YXRpY2hlIGludmVjZSwgbm9uIG1vZGlmaWNhYmlsaSBkYWxsJ3V0ZW50ZSwgcXVpbmRpIG5vbiBtaSBkw7IgcHJlb2NjdXBhemlvbmlcclxuICAgICAgICAgICAgaWYgKCh0aC50aEZpeGVkIHx8IHRoLnRoR3JvdXApICYmICF0aC50aFBpbm5lZCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKGkgIT0gcGlubmVkcyArIGZpeGVkcylcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnV0aWxpdGllcy5hcnJheU1vdmUodGhzLCBpLCBwaW5uZWRzICsgZml4ZWRzKTtcclxuICAgICAgICAgICAgICAgIGZpeGVkcysrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBDYWNoZSBkZWdsaSBpbmRpY2kgcGVyIHJpcG9zaXppb25hcmUgaSB0ZCBjb21lIGkgdGhcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgY29sdW1uc0luZGV4Q2FjaGVbKDxFc1RoRGlyZWN0aXZlPnRoc1tpXSkudGhdID0gaTtcclxuXHJcbiAgICAgICAgLy8gUmlvcmRpbm8gbGUgY2VsbGUgcGVyIGZhcmdsaSBtYW50ZW5lcmUgbGEgc3Rlc3NhIHN0cnV0dHVyYSBkZWkgdGhcclxuICAgICAgICBsZXQgbmV3VGRzID0gbmV3IEFycmF5KHRocy5sZW5ndGgpO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRkcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRlbSA9IHRkc1tpXSBhcyBFc1RkRGlyZWN0aXZlO1xyXG4gICAgICAgICAgICBuZXdUZHNbY29sdW1uc0luZGV4Q2FjaGVbaXRlbS50ZF1dID0gaXRlbTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZXN0Lkhhc1Bpbm5lZENvbHVtbnMgPSBwaW5uZWRzID4gMDtcclxuICAgIH1cclxuXHJcbiAgICAvKiogSW4gYmFzZSBhbGxhIGNvbmZpZ3VyYXppb25lIGRlbGxlIGNvbG9ubmUgY2FsY29sYSBsZSBkaW1lbmlvbmkgZGVsbGUgY29sb25uZSBwaW5uYXRlICovXHJcbiAgICBwdWJsaWMgZXZhbHVhdGVQaW5uZWRDb2x1bW5zV2lkdGgoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmVzdC5IYXNQaW5uZWRDb2x1bW5zKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRoaXMuZXN0LlBpbm5lZENvbnRhaW5lcldpZHRoID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXN0LkNvbHVtbnNMaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2wgPSB0aGlzLmVzdC5Db2x1bW5zTGlzdFtpXTtcclxuICAgICAgICAgICAgaWYgKGNvbC5waW5uZWQgJiYgY29sLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5QaW5uZWRDb250YWluZXJXaWR0aCArPSBjb2wucGlubmVkV2lkdGg7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZXN0LlBpbm5lZENvbnRhaW5lcldpZHRoICs9IHRoaXMuZXN0LlNlbGVjdGlvbiA/IDI1IDogMDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFRlcm1pbmF0byBpbCBiaW5kaW5nIGRlbGxlIGNvbG9ubmUgZGEgKipyZXZpZXdDb2x1bW5zTGlzdCoqIGUgZGVsbGEgKipWaWV3KiogZGFsICoqd3JpdGVWYWx1ZSoqIHF1ZXN0byBtZXRvZG8gc2kgb2NjdXBhXHJcbiAgICAgKiBkZWxsJ2FsbGluZWFtZW50byBkZWxsZSBpbmZvcm1hemlvbmkgZnJhIGxlIGNvbG9ubmUgY2FsY29sYXRlIGludGVybmFtZW50ZSBlIGxlIGluZm9ybWF6aW9uaSBzdWxsZSBjb2xvbm5lIGNoZSBhcnJpdmFubyBkYWxsJ0FwcFNlYXJjaFxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7QXBwU2VhcmNoPGFueT59IHZpZXcgQXBwU2VhcmNoIGRhIHV0aWxpenphcmUgcGVyIHF1ZXN0YSBvcGVyYXppb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhbGlnbkNvbHVtbnNJZkxvYWRlZFZpZXcodmlldzogQXBwU2VhcmNoPGFueT4pIHtcclxuICAgICAgICBsZXQgZW1pdENoYW5nZWQgPSB0aGlzLmVzdC52aWV3TW9kZSAmJiB2aWV3LnNhdmVkc3RhdGU7XHJcbiAgICAgICAgbGV0IG5ld0NvbHNldCA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuZXN0LkNvbHVtbnNMaXN0IHx8IHRoaXMuZXN0LkNvbHVtbnNMaXN0Lmxlbmd0aCA9PSAwKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBjb2x1bW5zID0gdGhpcy5lc3Qudmlld01vZGUgPyB2aWV3LmNvbHVtbnMgOiB0aGlzLmVzdC5hcnJheUNvbHVtbnM7XHJcbiAgICAgICAgdGhpcy5lc3QuQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHtcclxuICAgICAgICAgICAgLy8gU2UgbGEgY29sb25uYSDDqCBwaW5uYXRhIG1pIGFycml2YSBjb2wgc2ltb2xlb24sIG1hIGFuY2hlIHNlIMOoIHVuYSBjb21wb3NpemlvbmUgZGkgcGnDuSBjb2xvbm5lXHJcbiAgICAgICAgICAgIGxldCBleENsID0gY29sdW1ucy5maWx0ZXIoY2MgPT4gKGNjLnN0YXJ0c1dpdGgoJ8KnJykgPyBjYy5zdWJzdHJpbmcoMSkgOiBjYykgPT0gYy5pZCk7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBsYSBjb2xvbm5hIMOoIHBpbm5hdGEgYWdnaW9ybm8gbCdpbmZvcm1hemlvbmUgbmVsbGEgdmlld1xyXG4gICAgICAgICAgICBpZiAoZXhDbC5sZW5ndGggPT0gMSlcclxuICAgICAgICAgICAgICAgIGMucGlubmVkID0gZXhDbFswXS5zdGFydHNXaXRoKCfCpycpO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgbCdhcHBzZWFyY2ggdmllbmUgZGEgdW5vIHN0YXRvIHByZWNlZGVudGUsIHVzbyBsZSBpbmZvcm1hemlvbmkgc3VsbGUgY29sb25uZSBjaGUgaGEgZGVudHJvLCBhbHRyaW1lbnRpIHNvdnJhc2NyaXZvIHR1dHRvICAqKlxyXG4gICAgICAgICAgICBpZiAoYy52aXNpYmxlICYmIGNvbHVtbnMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgICAgICBuZXdDb2xzZXQucHVzaChjLmlkKTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGhvIHVuYSBjb2xvbm5hIGxhdG8gQXBwU2VhcmNoIGUgbmVsbGEgQ29sdW1uTGlzdCBub24gw6ggdmlzaWJpbGUsIGFsbGluZW8gYWxsJ0FwcFNlYXJjaFxyXG4gICAgICAgICAgICBlbHNlIGlmIChleENsLmxlbmd0aCA9PSAxICYmICFjLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICBjLnZpc2libGUgPSB0cnVlO1xyXG5cclxuICAgICAgICAgICAgLy8gQWxsaW5lYW1lbnRvIHN1bGwnQXBwU2VhcmNoIHBlciBjYXNpc3RpY2hlIGludmVyc2UgYWwgZGkgc29wcmFcclxuICAgICAgICAgICAgZWxzZSBpZiAoZXhDbC5sZW5ndGggPT0gMCAmJiBjLnZpc2libGUpXHJcbiAgICAgICAgICAgICAgICBjLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8gTm9uIGhvIGNvbG9ubmUgbmVsbGEgYXBwc2VhcmNoLCB2dW9sIGRpcmUgY2hlIHNvbm8gYWwgcHJpbW8gYmluZGluZ1xyXG4gICAgICAgIGlmIChjb2x1bW5zLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVzdC52aWV3TW9kZSlcclxuICAgICAgICAgICAgICAgIHZpZXcuY29sdW1ucyA9IG5ld0NvbHNldDtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuYXJyYXlDb2x1bW5zID0gbmV3Q29sc2V0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCh0aGlzLmVzdC52aWV3TW9kZSAmJiB2aWV3LnNhdmVkc3RhdGUpICYmIHRoaXMuZXN0LkNvbHVtbnNPcmRlcmluZyAmJiB2aWV3LmNvbHVtbl9vcmRlcmluZy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIC8vIFNjb3JybyBnbGkgb3JkaW5hbWVudGkgY2hlIGF2ZXZvIHNhbHZhdG8gZSByaWNyZW8gbGEgQ29sdW1uc0xpc3QgaW4gYmFzZSBhIGxvcm9cclxuICAgICAgICAgICAgbGV0IG5ld0NvbExpc3QgPSBbXTtcclxuICAgICAgICAgICAgdmlldy5jb2x1bW5fb3JkZXJpbmcuZm9yRWFjaChjbyA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5Db2x1bW5zTGlzdC5mb3JFYWNoKGMgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjLmlkID09IGNvKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2xMaXN0LnB1c2goYyk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgICAgICAvLyBSZWN1cGVybyBhbmNoZSBjYW1waSBudW92aSBjaGUgbmVsbCdpdGVyYXppb25lIHZlY2NoaWEgbm9uIGMnZXJhbm8gKHNlcnZlIGR1cmFudGUgbG8gc3ZpbHVwcG8gaW4gbW9kbyBkYSBub24gcGVyZGVyc2kgZnJhIHVuIEVESVQgKyBGNSBlIGwnYWx0cm8pXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LkNvbHVtbnNMaXN0LmZvckVhY2goYyA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIW5ld0NvbExpc3QuZmluZCh0ID0+IHQgPT0gYy5pZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29sTGlzdC5wdXNoKGMpO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LkNvbHVtbnNMaXN0ID0gbmV3Q29sTGlzdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEluIG9nbmkgY2FzbyBxdWVzdG8gbm9uIG1pIHNlcnZlIHBpw7ksIGxvIHJlc2V0dG8gICoqXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LnZpZXdNb2RlKVxyXG4gICAgICAgICAgICB2aWV3LnNhdmVkc3RhdGUgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgaWYgKGVtaXRDaGFuZ2VkKVxyXG4gICAgICAgICAgICB0aGlzLmVzdC5jaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbiBiYXNlIGFsbGEgdmlzaWJpbGl0w6AgcmVnaXN0cmF0YSBuZWxsZSAqKkNvbHVtbnNMaXN0KiogcXVlc3RvIG1ldG9kbyBzaSBvY2N1cGEgZGkgcHJlbmRlcmUgdHV0dGkgaSAqKkVzVGhEaXJlY3RpdmUqKiBlZCAqKkVzVGREaXJlY3RpdmUqKiByZWxhdGl2aSBlIG5hc29uZGVybGkvbW9zdHJhcmxpXHJcbiAgICAgKlxyXG4gICAgICogQ29zdG86IDEgc2NhbiBDb2x1bW5zTGlzdCwgMSBzY2FuIEVzVGhEaXJlY3RpdmVzLCAxIHNjYW4gRXNUZERpcmVjdGl2ZXNcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIEhlYWRlciBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKiBAcGFyYW0ge0VzVGREaXJlY3RpdmVbXX0gdGRzIENlbGxlIGRlbGxhIHRhYmVsbGFcclxuICAgICAqIEBwYXJhbSB7QXBwU2VhcmNoPGFueT59IHZpZXcgQXBwU2VhcmNoIGRhIHV0aWxpenphcmUgcGVyIHF1ZXN0YSBvcGVyYXppb25lXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZWZyZXNoQ29sdW1uc1Zpc2liaWxpdHkodGhzOiBFc1RoRGlyZWN0aXZlW10sIHRkczogRXNUZERpcmVjdGl2ZVtdLCB2aWV3OiBBcHBTZWFyY2g8YW55Pikge1xyXG4gICAgICAgIGxldCBuZXdDb2xzZXQgPSBbXTtcclxuICAgICAgICBsZXQgZml4ZWRUaHM6IHsgW2lkOiBzdHJpbmddOiBib29sZWFuOyB9ID0ge307XHJcbiAgICAgICAgbGV0IGNvbHVtbnNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGFibGVDb2x1bW47IH0gPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBjb2xpID0gMDsgY29saSA8IHRoaXMuZXN0LkNvbHVtbnNMaXN0Lmxlbmd0aDsgY29saSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBjb2wgPSB0aGlzLmVzdC5Db2x1bW5zTGlzdFtjb2xpXTtcclxuICAgICAgICAgICAgY29sdW1uc0NhY2hlW2NvbC5pZF0gPSBjb2w7XHJcbiAgICAgICAgICAgIGlmIChjb2wudmlzaWJsZSlcclxuICAgICAgICAgICAgICAgIG5ld0NvbHNldC5wdXNoKChjb2wucGlubmVkID8gXCLCp1wiIDogXCJcIikgKyBjb2wuaWQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmlldylcclxuICAgICAgICAgICAgdmlldy5jb2x1bW5zID0gbmV3Q29sc2V0O1xyXG5cclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LmFycmF5Q29sdW1ucyA9IG5ld0NvbHNldDtcclxuXHJcbiAgICAgICAgLy8gRGEgcXVpIGluIHBvaSBkZXZvbm8gZXNzZXJlIGVzZWd1aXRpIFNPTE8gaW4gZmFzZSBkaSB3cml0ZVZhbHVlIHF1aW5kaSBkZXZvIGFzc2ljdXJhcm1pIGRpIHBhc3NhcmxpIG51bGwgaW4gdHV0dGkgaSBwYXNzYWdnaSBkaXZlcnNpIGRhIHF1ZWxsb1xyXG4gICAgICAgIGlmICh0aHMpIHtcclxuICAgICAgICAgICAgLy8gRGVmaW5pc2NvIHNlIGxhIGNvbG9ubmEgw6ggdmlzaWJpbGUgaW4gYmFzZSBhbGxhIHN1YSByYXBwcmVzZW50YXppb25lIGxvY2FsZSBpbiBDb2x1bW5zTGlzdFxyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG5cclxuICAgICAgICAgICAgICAgIHRoLnRoVmlzaWJsZSA9IHRoLnRoRml4ZWQgfHwgKGNvbHVtbnNDYWNoZVt0aC50aF0gPyBjb2x1bW5zQ2FjaGVbdGgudGhdLnZpc2libGUgOiB0aC50aFZpc2libGUpO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoLnRoRml4ZWQgfHwgdGgudGhHcm91cClcclxuICAgICAgICAgICAgICAgICAgICBmaXhlZFRoc1t0aC50aF0gPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGRzKSB7XHJcbiAgICAgICAgICAgIC8vIERlZmluaXNjbyBzZSBsYSBjZWxsYSDDqCB2aXNpYmlsZSBpbiBiYXNlIGFsbGEgc3VhIHJhcHByZXNlbnRhemlvbmUgbG9jYWxlIGluIENvbHVtbnNMaXN0XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGQgPSB0ZHNbaV07XHJcbiAgICAgICAgICAgICAgICB0ZC50ZFZpc2libGUgPSBmaXhlZFRoc1t0ZC50ZF0gfHwgKGNvbHVtbnNDYWNoZVt0ZC50ZF0gPyBjb2x1bW5zQ2FjaGVbdGQudGRdLnZpc2libGUgOiB0ZC50ZFZpc2libGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmVzdC5jaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxpbmVhIGdsaSBvcmRpbmFtZW50aSBkYXRpIGZyYSBsZSAqKkVzVGhzKiogZSBsZSBpbmZvcm1hemlvbmkgYWxsJ2ludGVybm8gZGVsbGEgVmlldyBiaW5kYXRhXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcHBTZWFyY2g8YW55Pn0gdmlldyBBcHBTZWFyY2ggZGEgdXRpbGl6emFyZSBwZXIgcXVlc3RhIG9wZXJhemlvbmVcclxuICAgICAqIEBwYXJhbSB7RXNUaERpcmVjdGl2ZVtdfSB0aHMgQ29sb25uZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhbGlnbkhlYWRlcnNPcmRlcmluZyh0aHM6IEVzVGhEaXJlY3RpdmVbXSwgdmlldzogQXBwU2VhcmNoPGFueT4pIHtcclxuICAgICAgICBsZXQgb3JkZXJzID0gdmlldyA/IHZpZXcub3JkZXJzIDogdGhpcy5lc3QuYXJyYXlPcmRlcnM7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG5cclxuICAgICAgICAgICAgdGgudGhPcmRlciA9IG51bGw7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgb3IgPSBvcmRlcnNbaV07XHJcbiAgICAgICAgICAgICAgICBpZiAob3IuaWQgPT0gdGgudGgpXHJcbiAgICAgICAgICAgICAgICAgICAgdGgudGhPcmRlciA9IG9yLm9yZGVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhIHR1dHRlIGxlIGluZm9ybWF6aW9uaSBjaGUgc2Vydm9ubyBwZXIgZ2VzdGlyZSBpbCByYWdncnVwcGFtZW50byBkZWdsaSBoZWFkZXJcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgZGVsbGEgdGFiZWxsYVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHt7IGxlYWZzOiBFc1RoRGlyZWN0aXZlW10sIGdyb3VwaW5nTGV2ZWw6IG51bWJlciwgcGFyZW50c0NhY2hlOiBhbnksIHRoc0NhY2hlOiBhbnkgfX0gT2dnZXR0byBjb250ZW5lbnRlIGxhIGxpc3RhIGRlbGxlIGZvZ2xpZSAoaGVhZGVyIGJhc2UpLCBpbCBsaXZlbGxvXHJcbiAgICAgKiBtYXNzaW1vIGRpIHJhZ2dydXBwYW1lbnRvIHJhZ2dpdW50bywgdW5hIGNhY2hlIGluIGN1aSB2ZW5nb25vIGluZGljYXRpIHR1dHRpIGkgZ3J1cHBpIGNoZSBzb25vIFwicGFyZW50XCIgKHF1aW5kaSBjaGUgcmFnZ3J1cHBhbm8gYWxtZW5vIDEgaGVhZGVyKSBlIGxhIGNhY2hlIGRlZ2xpIGhlYWRlclxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXZhbHVhdGVIZWFkZXJzR3JvdXBpbmdJbmZvcyh0aHM6IEVzVGhEaXJlY3RpdmVbXSk6IHsgbGVhZnM6IEVzVGhEaXJlY3RpdmVbXTsgZ3JvdXBpbmdMZXZlbDogbnVtYmVyOyBwYXJlbnRzQ2FjaGU6IGFueTsgdGhzQ2FjaGU6IGFueTsgfSB7XHJcbiAgICAgICAgLy8gUHJlZ2lybyBwZXIgdHJvdmFyZSBpIHBhcmVudFxyXG4gICAgICAgIGxldCBwYXJlbnRzQ2FjaGU6IHsgW2luZGV4OiBzdHJpbmddOiBib29sZWFuOyB9ID0ge307XHJcbiAgICAgICAgbGV0IHRoc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogRXNUaERpcmVjdGl2ZTsgfSA9IHt9O1xyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhzQ2FjaGVbdGgudGhdID0gdGg7XHJcbiAgICAgICAgICAgIGlmICh0aC50aFBhcmVudCAmJiAhcGFyZW50c0NhY2hlW3RoLnRoUGFyZW50XSlcclxuICAgICAgICAgICAgICAgIHBhcmVudHNDYWNoZVt0aC50aFBhcmVudF0gPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2Vjb25kbyBnaXJvIHBlciBiZWNjYXJlIGlsIGxpdmVsbG8gbWFzc2ltbyBlIGxhIGxpc3RhIGRpIGZvZ2xpZSAodGggc2VuemEgcGFyZW50KVxyXG4gICAgICAgIGxldCBoTWF4TGV2ZWwgPSAwO1xyXG4gICAgICAgIGxldCBsZWFmczogYW55W10gPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBzb25vIHVuYSBmb2dsaWEgdmVkbyBxdWFudGkgbGl2ZWxsaSBjaSBzb25vIHNvcHJhXHJcbiAgICAgICAgICAgIGlmICghcGFyZW50c0NhY2hlW3RoLnRoXSkge1xyXG4gICAgICAgICAgICAgICAgbGVhZnMucHVzaCh0aCk7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG1wID0gdGhpcy5qdW1wc1RvRmluYWxQYXJlbnQodGgsIHRoc0NhY2hlKTtcclxuICAgICAgICAgICAgICAgIGhNYXhMZXZlbCA9IHRtcCA+IGhNYXhMZXZlbCA/IHRtcCA6IGhNYXhMZXZlbDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHsgbGVhZnM6IGxlYWZzLCBncm91cGluZ0xldmVsOiBoTWF4TGV2ZWwsIHBhcmVudHNDYWNoZTogcGFyZW50c0NhY2hlLCB0aHNDYWNoZTogdGhzQ2FjaGUgfTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEdlbmVyYSBnbGkgaGVhZGVyIGdyb3VwcyBkYSB1bmEgbGlzdGEgZGkgaW5mbyBzdWkgdGggYWxsJ2ludGVybm8gZGVsbGEgdmFyaWFiaWxlICoqVE1QUm93VGhHcm91cHMqKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7eyBsZWFmczogRXNUaERpcmVjdGl2ZVtdLCBncm91cGluZ0xldmVsOiBudW1iZXIsIHBhcmVudHNDYWNoZTogYW55LCB0aHNDYWNoZTogYW55IH19IGluZm9zIEluZm9ybWF6aW9uaSBkaSByYWdncnVwcGFtZW50byB2YWx1dGF0ZSBwcmVjZWRlbnRlbWVudGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGV2YWx1YXRlSGVhZGVyR3JvdXBzKGluZm9zOiB7IGxlYWZzOiBFc1RoRGlyZWN0aXZlW107IGdyb3VwaW5nTGV2ZWw6IG51bWJlcjsgcGFyZW50c0NhY2hlOiBhbnk7IHRoc0NhY2hlOiB7IFtpbmRleDpzdHJpbmddOiBFc1RoRGlyZWN0aXZlfTsgfSkge1xyXG4gICAgICAgIGlmIChpbmZvcy5ncm91cGluZ0xldmVsID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy8gR2lybyAyLjUsIGNyZW8gbCdvdXRwdXQgZGVpIHJhZ2dydXBwYW1lbnRpIHBlciBoZWFkZXIgaW4gbW9kbyBkYSBub24gZG92ZXJtaSBwcmVvY2N1cGFyZSBkaSBjZWxsZSBub24gaW5pemlhbGl6emF0ZVxyXG4gICAgICAgIGxldCBleHBhbmRlZEdyb3VwcyA9IFtdO1xyXG4gICAgICAgIGxldCB2aXNpYmxlVW5waW5uZWRMZWFmczogRXNUaERpcmVjdGl2ZVtdID0gKDxhbnlbXT5pbmZvcy5sZWFmcykuZmlsdGVyKCh0OiBFc1RoRGlyZWN0aXZlKSA9PiB0LnRoVmlzaWJsZSAmJiAhdC50aFBpbm5lZCk7XHJcbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBpbmZvcy5ncm91cGluZ0xldmVsOyBsKyspIHtcclxuICAgICAgICAgICAgZXhwYW5kZWRHcm91cHMucHVzaChbXSk7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlzaWJsZVVucGlubmVkTGVhZnMubGVuZ3RoOyBpKyspXHJcbiAgICAgICAgICAgICAgICBleHBhbmRlZEdyb3Vwc1tsXS5wdXNoKFwiXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gT3JkaW5vIGxlIGZvZ2xpZSBpbiBiYXNlIGFnbGkgb3JkaW5hbWVudGkgZGVsbGUgY29sb25uZVxyXG4gICAgICAgIGxldCBvcmRlcmVkTGVhZnMgPSBbXTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgbGVhZjogRXNUaERpcmVjdGl2ZSA9IGluZm9zLnRoc0NhY2hlW3RoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlc1tpXV07XHJcbiAgICAgICAgICAgIGlmIChsZWFmLnRoVmlzaWJsZSAmJiAhbGVhZi50aFBpbm5lZClcclxuICAgICAgICAgICAgICAgIG9yZGVyZWRMZWFmcy5wdXNoKGxlYWYpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gVGVyem8gZ2lybyBwZXIgY3JlYXJlIGwnYXJyYXkgZ3JvdXAgY29uIHR1dHRpIGkgcmlmZXJpbWVudGkgZGVsIGNhc29cclxuICAgICAgICBsZXQgY3VycmVudFBhcmVudCA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlcmVkTGVhZnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IHJlZlRoOiBFc1RoRGlyZWN0aXZlID0gb3JkZXJlZExlYWZzW2ldO1xyXG4gICAgICAgICAgICBsZXQgcHJldlRoOiBFc1RoRGlyZWN0aXZlID0gaSAtIDEgPj0gMCA/IG9yZGVyZWRMZWFmc1tpIC0gMV0gOiBudWxsO1xyXG5cclxuICAgICAgICAgICAgLy8gUGFyZW50IGRpdmVyc28gZGEgcHJpbWEsIG1ldHRvIGlsIGJvcmRvIGEgc2luaXN0cmEgZSBhIGRlc3RyYSBkZWxsYSBjZWxsYSBwcmVjZWRlbnRlIChzZSBjJ8OoKVxyXG4gICAgICAgICAgICAvLyBBbGwndWx0aW1vIGdpcm8gbWV0dG8gaWwgYm9yZG8gYSBkZXN0cmEuIFR1dHRvIHF1ZXN0byBsbyByaWVzZWd1byBwZXIgb2duaSBjZWxsYSBpbiBtb2RvIGRhIHJpcHVsaXJlIGV2ZW50dWFsaSBhIGN1aSBhdmV2byBhc3NlZ25hdG8gdGFnIHByZWNlZGVudGVtZW50ZVxyXG4gICAgICAgICAgICAoPGFueT5yZWZUaCkuX2xib3JkID0gcmVmVGgudGhQYXJlbnQgIT0gY3VycmVudFBhcmVudDtcclxuICAgICAgICAgICAgKDxhbnk+cmVmVGgpLl9yYm9yZCA9IHZpc2libGVVbnBpbm5lZExlYWZzLmxlbmd0aCA9PSBpICsgMTtcclxuICAgICAgICAgICAgaWYgKHByZXZUaClcclxuICAgICAgICAgICAgICAgICg8YW55PnByZXZUaCkuX3Jib3JkID0gcmVmVGgudGhQYXJlbnQgIT0gY3VycmVudFBhcmVudDtcclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRQYXJlbnQgPSByZWZUaC50aFBhcmVudDtcclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBvZ25pIGdydXBwbyBzcm90b2xvIGlsIHBhcmVudCBuZWxsYSBtYXRyaWNlIGRlaSByYWdncnVwcGFtZW50aVxyXG4gICAgICAgICAgICBmb3IgKGxldCBsID0gMDsgbCA8IGluZm9zLmdyb3VwaW5nTGV2ZWw7IGwrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IHJlZlRoLnRoUGFyZW50O1xyXG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudCAmJiAhcmVmVGgudGhQaW5uZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICBleHBhbmRlZEdyb3Vwc1tsXVtpXSA9IHBhcmVudDtcclxuICAgICAgICAgICAgICAgICAgICByZWZUaCA9IGluZm9zLnRoc0NhY2hlW3BhcmVudF07XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFF1YXJ0byBnaXJvIHBlciBjb21wYXR0YXJsbyBuZWxsJ2VsZW1lbnRvIGZpbmFsZSBzdSBjdWkgYmluZGFybWlcclxuICAgICAgICBjdXJyZW50UGFyZW50ID0gXCJcIjtcclxuICAgICAgICBsZXQgY3VycmVudFNwYW4gPSAwO1xyXG4gICAgICAgIHRoaXMuZXN0LlRNUFJvd1RoR3JvdXBzID0gW107XHJcbiAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCBleHBhbmRlZEdyb3Vwcy5sZW5ndGg7IGwrKykge1xyXG4gICAgICAgICAgICBsZXQgbGV2ZWxBcnJheTogeyBTcGFuOiBudW1iZXI7IFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+OyBDb250ZW50Pzogc3RyaW5nLCBQaW5uZWQ/OiBib29sZWFuOyBCb3JkZXJzPzogYm9vbGVhbjsgfVtdID0gW107XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LlRNUFJvd1RoR3JvdXBzLnB1c2gobGV2ZWxBcnJheSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5lc3QuU2VsZWN0aW9uIHx8IHRoaXMuZXN0Lkhhc1Bpbm5lZENvbHVtbnMpXHJcbiAgICAgICAgICAgICAgICBsZXZlbEFycmF5LnB1c2goeyBTcGFuOiAxLCBUZW1wbGF0ZTogbnVsbCwgUGlubmVkOiB0aGlzLmVzdC5IYXNQaW5uZWRDb2x1bW5zIH0pO1xyXG5cclxuICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBleHBhbmRlZEdyb3Vwc1tsXS5sZW5ndGg7IGgrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSBleHBhbmRlZEdyb3Vwc1tsXVtoXTtcclxuICAgICAgICAgICAgICAgIGlmIChpdGVtID09IGN1cnJlbnRQYXJlbnQpXHJcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNwYW4rKztcclxuICAgICAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U3BhbiA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsQXJyYXkucHVzaCh7IFNwYW46IGN1cnJlbnRTcGFuLCBUZW1wbGF0ZTogY3VycmVudFBhcmVudCA/IGluZm9zLnRoc0NhY2hlW2N1cnJlbnRQYXJlbnRdLlRlbXBsYXRlIDogbnVsbCwgQ29udGVudDogY3VycmVudFBhcmVudCA/IGluZm9zLnRoc0NhY2hlW2N1cnJlbnRQYXJlbnRdLl9tdWx0aV9jb250ZW50IDogbnVsbCwgQm9yZGVyczogISFjdXJyZW50UGFyZW50IH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTcGFuID0gMTtcclxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gaXRlbTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gVWx0aW1hIGFnZ2l1bnRhIGNoZSBhbHRyaW1lbnRpIG1pIHJpbWFycmViYmUgaW4gY2FjaGVcclxuICAgICAgICAgICAgbGV2ZWxBcnJheS5wdXNoKHsgU3BhbjogY3VycmVudFNwYW4sIFRlbXBsYXRlOiBjdXJyZW50UGFyZW50ID8gaW5mb3MudGhzQ2FjaGVbY3VycmVudFBhcmVudF0uVGVtcGxhdGUgOiBudWxsLCBDb250ZW50OiBjdXJyZW50UGFyZW50ID8gaW5mb3MudGhzQ2FjaGVbY3VycmVudFBhcmVudF0uX211bHRpX2NvbnRlbnQgOiBudWxsICwgQm9yZGVyczogISFjdXJyZW50UGFyZW50IH0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuZXN0LlJlbW92YWwpXHJcbiAgICAgICAgICAgICAgICBsZXZlbEFycmF5LnB1c2goeyBTcGFuOiAxLCBUZW1wbGF0ZTogbnVsbCB9KTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVzdC5FeHBvcnQgfHwgdGhpcy5lc3QuSGlkZGVuQ29sdW1ucyB8fCB0aGlzLmVzdC5Db2x1bW5zT3JkZXJpbmcgfHwgdGhpcy5lc3QuQ29ybmVyTWVudU9wdGlvbnMpXHJcbiAgICAgICAgICAgICAgICBsZXZlbEFycmF5LnB1c2goeyBTcGFuOiAxLCBUZW1wbGF0ZTogbnVsbCB9KTtcclxuXHJcbiAgICAgICAgICAgIGN1cnJlbnRTcGFuID0gMDtcclxuICAgICAgICAgICAgY3VycmVudFBhcmVudCA9IFwiXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY29sYSBpbCBudW1lcm8gZGkgc2FsdGkgZGEgdW4gaGVhZGVyIGZvZ2xpYSBhbGwndWx0aW1vIHBhcmVudCBkZWxsYSBjYXRlbmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmV9IHRoIEhlYWRlciBkYSBjdWkgc2NvcnJlcmUgaSBwYWRyaSBwZXIgY2FwaXJlIHF1YW50aSBsaXZlbGxpIGNpIHNvbm8gc29wcmFcclxuICAgICAqIEBwYXJhbSB7eyBbaW5kZXg6IHN0cmluZ106IEVzVGhEaXJlY3RpdmUgfX0gdGhzQ2FjaGUgQ2FjaGUgZGVnbGkgaGVhZGVyXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUganVtcHNUb0ZpbmFsUGFyZW50KHRoOiBFc1RoRGlyZWN0aXZlLCB0aHNDYWNoZTogeyBbaW5kZXg6IHN0cmluZ106IEVzVGhEaXJlY3RpdmU7IH0pIHtcclxuICAgICAgICBsZXQganVtcHMgPSAwOyBsZXQgcGFyZW50ID0gbnVsbDsgbGV0IHBhcmVudHNQcmVwZW5kOiB7IHRtcGw/OiBUZW1wbGF0ZVJlZjxhbnk+LCBjb250ZW50Pzogc3RyaW5nIH1bXSA9IFtdO1xyXG4gICAgICAgIGxldCBiYXNlVGhSZWYgPSB0aDtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIHBhcmVudCA9IHRoLnRoUGFyZW50O1xyXG4gICAgICAgICAgICBpZiAocGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICB0aCA9IHRoc0NhY2hlW3BhcmVudF07XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoLnRoRW1wdHkgJiYgIXRoLl9tdWx0aV9jb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudHNQcmVwZW5kLnVuc2hpZnQoeyB0bXBsOiB0aC5UZW1wbGF0ZSB9KTtcclxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aC50aEVtcHR5ICYmIHRoLl9tdWx0aV9jb250ZW50KVxyXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudHNQcmVwZW5kLnVuc2hpZnQoeyBjb250ZW50OiB0aC5fbXVsdGlfY29udGVudCB9KTtcclxuICAgICAgICAgICAgICAgIGp1bXBzKys7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IHdoaWxlIChwYXJlbnQpO1xyXG4gICAgICAgIGJhc2VUaFJlZi5fdGhQYXJlbnRzID0gcGFyZW50c1ByZXBlbmQ7XHJcbiAgICAgICAgcmV0dXJuIGp1bXBzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWV0b2RvIGNoZSBnZW5lcmEgbCdvcmRpbmUgZGkgZGVmYXVsdCBkZWxsZSBjb2xvbm5lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcHBTZWFyY2g8YW55Pn0gdmlldyBBcHBTZWFyY2ggZGEgdXRpbGl6emFyZSBwZXIgcXVlc3RhIG9wZXJhemlvbmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdlbmVyYXRlRGVmYXVsdE9yZGVyKHRoczogRXNUaERpcmVjdGl2ZVtdLCB2aWV3OiBBcHBTZWFyY2g8YW55Pikge1xyXG4gICAgICAgIGlmICh0aHMubGVuZ3RoID09IDApXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgbGV0IG9yZGVyaW5ncyA9IHRoaXMuZXN0LnZpZXdNb2RlID8gdmlldy5jb2x1bW5fb3JkZXJpbmcgOiB0aGlzLmVzdC5hcnJheUNvbHVtbk9yZGVyaW5nO1xyXG4gICAgICAgIC8vIEdlbmVybyBvcmRpbmFtZW50byBkaSBkZWZhdWx0IGRhIDAgZmlubyBhIGRvdmUgZGV2ZSBhcnJpdmFyZS4gU2l0dWF6aW9uZSBhdHR1YWxlIHNlbnphIGhvdHBvdGF0b1xyXG4gICAgICAgIGlmICghb3JkZXJpbmdzIHx8IG9yZGVyaW5ncy5sZW5ndGggPT0gMCkge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRocy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgbGV0IHRoID0gdGhzW2ldO1xyXG4gICAgICAgICAgICAgICAgbGV0IG9yZGVyID0gdGgudGg7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXMucHVzaChvcmRlcik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcyA9IG9yZGVyaW5ncztcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCB0aCA9IHRoc1tpXTtcclxuICAgICAgICAgICAgICAgIGxldCB0aElkID0gdGgudGg7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcy5maW5kKG8gPT4gbyA9PSB0aElkKSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXMucHVzaCh0aElkKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFwcGxpY2EgbCdvcmRpbmUgc3BlY2lmaWNhdG8gYWxsZSB2YXJpZSBjb2xvbm5lXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtBcHBTZWFyY2g8YW55Pn0gdmlldyBBcHBTZWFyY2ggZGEgdXRpbGl6emFyZSBwZXIgcXVlc3RhIG9wZXJhemlvbmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZmluYWxpemUgU2UgKip0cnVlKiogc2lnbmlmaWNhIGNoZSBub24gbWkgYXNwZXR0byBkaSBkb3ZlciBlZmZldHR1YXJlIGFsdHJlIG9wZXJhemlvbmkgZSBwb3NzbyByZW5kZXJpenphcmUgbGEgc2l0dWF6aW9uZSBpbiBiYXNlIGFpIFJvd0NvbnRleHRcclxuICAgICAqIFNlbnphIGZpbmFsaXplIHNpZ25pZmljYSBjaGUgbWkgYXNwZXR0byBhbHRyZSBvcGVyYXppb25pIGNoZSBwcmltYSBvIHBvaSByaWNoaWFtZXJhbm5vIHF1ZXN0YSBmdW56aW9uZSBjb2wgZmluYWxpemUuXHJcbiAgICAgKlxyXG4gICAgICogQWQgZXNlbXBpbywgdW5hIHZvbHRhIHNlbGV6aW9uYXRvIG9yZGluYW1lbnRvIGZpc2ljby9sb2dpY28gZGVsbGUgY29sb25uZSBzbyBjaGUgcGFydGUgdW4gYWx0cmEgcmljZXJjYSBjaGUgbWkgcml2YWxvcml6emVyw6AgZGEgXCJ3cml0ZVZhbHVlXCIsIGNoZSBnacOgIGNoaWFtYSBxdWVzdGEgZnVuemlvbmUuXHJcbiAgICAgKiBNZXR0ZW5kbyBzb2xvIGxhIGNoaWFtYXRhIGRhIFwid3JpdGVWYWx1ZVwiIGNvbWUgXCJmaW5hbGl6emFudGVcIiBtaSBhc3NpY3VybyBjaGUgc21hbmF0dGFtZW50aSBhIGZyb250ZW5kIG5vbiBjYXVzaW5vIGZsaWNrZXJpbmcgZmlubyBhIHF1YW5kbyBub24gc2Vydm9ub1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgYXBwbHlPcmRlcmluZyh2aWV3OiBBcHBTZWFyY2g8YW55PiwgZmluYWxpemU6IGJvb2xlYW4pIHtcclxuICAgICAgICAvLyBHZW5lcm8gb3JkaW5hbWVudG8gcGVyIGdsaSBoZWFkZXJcclxuICAgICAgICBsZXQgbmV3SGVhZGVycyA9IFtdO1xyXG5cclxuICAgICAgICAvLyBTZSBkZXZvIGZpbmFsaXp6YXJlIGFnZ2FuY2lvIHR1dHRlIGxlIHZhcmlhYmlsaSBkaSBiaW5kXHJcbiAgICAgICAgaWYgKGZpbmFsaXplKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcy5mb3JFYWNoKG8gPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IGhlYWVkckl0ZW0gPSB0aGlzLmVzdC5UTVBSb3dUSHMuZmlsdGVyKHQgPT4gdC5JRCA9PSBvKVswXTtcclxuICAgICAgICAgICAgICAgIGlmIChoZWFlZHJJdGVtKVxyXG4gICAgICAgICAgICAgICAgICAgIG5ld0hlYWRlcnMucHVzaChoZWFlZHJJdGVtKTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0LlRNUFJvd1RIcyA9IG5ld0hlYWRlcnM7XHJcblxyXG4gICAgICAgICAgICAvLyBHZW5lcm8gb3JkaW5hbWVudG8gcGVyIGxlIGNlbGxlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lc3QuUm93Q29udGV4dHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5lc3QuVE1QUm93VERzW3RoaXMuZXN0LlJvd0NvbnRleHRzW2ldXTtcclxuICAgICAgICAgICAgICAgIGxldCBuZXdDb250ZXh0ID0gW107XHJcblxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzLmZvckVhY2gobyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRleHRJdGVtID0gY29udGV4dC5maWx0ZXIodCA9PiB0LklEID09IG8pWzBdO1xyXG4gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRleHQucHVzaChjb250ZXh0SXRlbSk7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5UTVBSb3dURHNbdGhpcy5lc3QuUm93Q29udGV4dHNbaV1dID0gbmV3Q29udGV4dDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LnZpZXdNb2RlKVxyXG4gICAgICAgICAgICB2aWV3LmNvbHVtbl9vcmRlcmluZyA9IHRoaXMuZXN0Lk9yZGVyRGlyZWN0aXZlcztcclxuXHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICB0aGlzLmVzdC5hcnJheUNvbHVtbk9yZGVyaW5nID0gdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzO1xyXG5cclxuICAgICAgICB0aGlzLmVzdC5jaGFuZ2VkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgKiBBbGwnaW50ZXJubyBkZWxsYSBkaWFsb2cgXCJPcmRpbmFtZW50byBlIFZpc2liaWxpdMOgIENvbG9ubmVcIiBtZXR0ZSBsYSBjb2xvbm5hIHNwZWNpZmljYXRhIHByaW1hIGRlbGxhIGNvbG9ubmEgcHJlY2VkZW50ZVxyXG4gICpcclxuICAqIEBwYXJhbSB7RXNUYWJsZUNvbHVtbn0gY29sdW1uSXRlbSBDb2xvbm5hIGRhIHNwb3N0YXJlXHJcbiAgKi9cclxuICAgIHB1YmxpYyBzZW5kVXAoY29sdW1uSXRlbTogRXNUYWJsZUNvbHVtbikge1xyXG4gICAgICAgIGxldCBpdGVtSW5kZXggPSB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5pbmRleE9mKGNvbHVtbkl0ZW0pO1xyXG4gICAgICAgIGlmICh0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdFtpdGVtSW5kZXggLSAxXS5maXhlZCB8fCB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdFtpdGVtSW5kZXggLSAxXS5waW5uZWQpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLnV0aUV4dHMuc3dhcCh0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCwgaXRlbUluZGV4LCBpdGVtSW5kZXggLSAxKTtcclxuXHJcbiAgICAgICAgLy8gTm9uIHBvc3NvIGZhcmUgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLkNvbHVtbnNMaXN0KSkgcGVyY2jDqSBjb250aWVuZSByaWZlcmltZW50aSBhIFRlbXBsYXRlUmVmXHJcbiAgICAgICAgbGV0IHRtcCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmZvckVhY2goYyA9PiB7IHRtcC5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGMpKTsgfSk7XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QgPSB0bXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGwnaW50ZXJubyBkZWxsYSBkaWFsb2cgXCJPcmRpbmFtZW50byBlIFZpc2liaWxpdMOgIENvbG9ubmVcIiBtZXR0ZSBsYSBjb2xvbm5hIHNwZWNpZmljYXRhIGRvcG8gbGEgY29sb25uYSBzdWNjZXNzaXZhXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RhYmxlQ29sdW1ufSBjb2x1bW5JdGVtIENvbG9ubmEgZGEgc3Bvc3RhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNlbmREb3duKGNvbHVtbkl0ZW06IEVzVGFibGVDb2x1bW4pIHtcclxuICAgICAgICBsZXQgaXRlbUluZGV4ID0gdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuaW5kZXhPZihjb2x1bW5JdGVtKTtcclxuICAgICAgICB0aGlzLnV0aUV4dHMuc3dhcCh0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCwgaXRlbUluZGV4LCBpdGVtSW5kZXggKyAxKTtcclxuXHJcbiAgICAgICAgLy8gTm9uIHBvc3NvIGZhcmUgSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLkNvbHVtbnNMaXN0KSkgcGVyY2jDqSBjb250aWVuZSByaWZlcmltZW50aSBhIFRlbXBsYXRlUmVmXHJcbiAgICAgICAgbGV0IHRtcCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmZvckVhY2goYyA9PiB7IHRtcC5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGMpKTsgfSk7XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QgPSB0bXA7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGwnaW50ZXJubyBkZWxsYSBkaWFsb2cgXCJPcmRpbmFtZW50byBlIFZpc2liaWxpdMOgIENvbG9ubmVcIiBwaW5uYSBsYSBjb2xvbm5hIHNwZWNpZmljYXRhXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHtFc1RhYmxlQ29sdW1ufSBjb2x1bW5JdGVtIENvbG9ubmEgZGEgc3Bvc3RhcmVcclxuICAgICAqL1xyXG4gICAgcHVibGljIHBpbk9yVW5waW5Db2x1bW4oY29sdW1uSXRlbTogRXNUYWJsZUNvbHVtbikge1xyXG4gICAgICAgIGxldCBpdGVtSW5kZXggPSB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5pbmRleE9mKGNvbHVtbkl0ZW0pO1xyXG4gICAgICAgIGlmICghY29sdW1uSXRlbS5waW5uZWQpIHtcclxuICAgICAgICAgICAgY29sdW1uSXRlbS5wcmV2X2luZGV4ID0gaXRlbUluZGV4O1xyXG5cclxuICAgICAgICAgICAgLy9RdWFuZG8gcGlubm8gZGV2byBzcG9zdGFyZSBsJ2VsZW1lbnRvIGNvbWUgdWx0aW1hIGNvbG9ubmEgcGlubmF0YSBvIGNvbWUgcHJpbWEgY29sb25uYSBzZSBub24gY2UgbmUgc29ubyBkaSBwaW5uYXRlXHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIGlmICghdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3RbaV0ucGlubmVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuYXJyYXlNb3ZlKHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LCBpdGVtSW5kZXgsIGkpO1xyXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAvL1F1YW5kbyBzcGlubm8gcmlwb3J0byBsJ2VsZW1lbnRvIGFsbG8gc3Rlc3NvIGluZGljZSBpbiBjdWkgZXJhIHByaW1hIChzZSBzb25vIHN0YXRpIGZhdHRpIHNwb3N0YW1lbnRpIG5lbCBtZXp6byBjYXp6aSBkZWxsJ3V0ZW50ZSlcclxuICAgICAgICAgICAgaWYgKGNvbHVtbkl0ZW0ucHJldl9pbmRleCAhPSBudWxsICYmIGNvbHVtbkl0ZW0ucHJldl9pbmRleCAhPSB1bmRlZmluZWQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnV0aWxpdGllcy5hcnJheU1vdmUodGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QsIGl0ZW1JbmRleCwgY29sdW1uSXRlbS5wcmV2X2luZGV4KTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBTZSBzcGlubm8gc2VuemEgdW4gcHJldl9pbmRleCB2dW9sIGRpcmUgY2hlIGxhIGNvbG9ubmEgZXJhIHBpbm5hdGEgZGEgY29uZmlndXJhemlvbmUuIExhIHNwb3N0byBuZWwgcHJpbW8gcHVudG8gZGlzcG9uaWJpbGVcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZXN0LlRNUENvbHVtbnNMaXN0W2ldLnBpbm5lZCAmJiAhdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3RbaV0uZml4ZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51dGlsaXRpZXMuYXJyYXlNb3ZlKHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LCBpdGVtSW5kZXgsIGkgLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb2x1bW5JdGVtLnBpbm5lZCA9ICFjb2x1bW5JdGVtLnBpbm5lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFsbCdpbnRlcm5vIGRlbGxhIGRpYWxvZyBcIk9yZGluYW1lbnRvIGUgVmlzaWJpbGl0w6AgQ29sb25uZVwiIGludmVydGUgbGUgaW1wb3N0YXppb25pIGRpIHZpc2liaWxpdMOgIGRlbGxhIGNvbG9ubmFcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge0VzVGFibGVDb2x1bW59IGNvbHVtbkl0ZW0gQ29sb25uYSBkYSBzcG9zdGFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sdW1uQ2xpY2tlZChpdGVtOiBFc1RhYmxlQ29sdW1uKSB7XHJcbiAgICAgICAgdGhpcy5lc3QubGFzdFNlbGVjdGVkSXRlbUlEID0gaXRlbS5pZDtcclxuICAgICAgICBpZiAoIXRoaXMuZXN0LkhpZGRlbkNvbHVtbnMgfHwgaXRlbS5maXhlZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBpdGVtLnZpc2libGUgPSAhaXRlbS52aXNpYmxlO1xyXG4gICAgICAgIHRoaXMudXBkYXRlR2xvYmFsQ29sVmlzQ2hlY2soKTtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQWxsJ2FwZXJ0dXJhIGRlbGxhIGRpYWxvZyBcIk9yZGluYW1lbnRvIGUgVmlzaWJpbGl0w6AgQ29sb25uZVwiIHJpY2FyaWNhIGxlIGluZm9ybWF6aW9uaSBhdHR1YWxpIHBlciBwZXJtZXR0ZXJlIGxhIG1vZGlmaWNhICovXHJcbiAgICBwdWJsaWMgcmVzZXRDb2x1bW5WaXNTZWxlY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QgPSBbXTtcclxuICAgICAgICAvLyBOb24gcG9zc28gZmFyZSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuQ29sdW1uc0xpc3QpKSBwZXJjaMOpIGNvbnRpZW5lIHJpZmVyaW1lbnRpIGEgVGVtcGxhdGVSZWZcclxuICAgICAgICB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuZXN0LkNvbHVtbnNMaXN0LmZvckVhY2goYyA9PiB7IHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LnB1c2goT2JqZWN0LmFzc2lnbih7fSwgYykpOyB9KTtcclxuXHJcbiAgICAgICAgbGV0IHJlb3JkZXJlZENvbExpc3QgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LkNvbHVtbnNPcmRlcmluZykge1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXMuZm9yRWFjaChvID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBjb2x1bW4gPSB0aGlzLmVzdC5UTVBDb2x1bW5zTGlzdC5maWx0ZXIodCA9PiB0LmlkID09IG8pWzBdO1xyXG4gICAgICAgICAgICAgICAgLy8gUG90cmVpIG5vbiBhdmVybmUgbmVsIGNhc28gY2kgc2lhIGlsIGZsYWcgSGlkZGVuQ29sdW1ucyBhIGZhbHNlLCBldml0byBkaSBpbnNlcmlyZSBkZWdsaSB1bmRlZmluZWRcclxuICAgICAgICAgICAgICAgIGlmIChjb2x1bW4pXHJcbiAgICAgICAgICAgICAgICAgICAgcmVvcmRlcmVkQ29sTGlzdC5wdXNoKGNvbHVtbik7XHJcbiAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QgPSByZW9yZGVyZWRDb2xMaXN0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGVHbG9iYWxDb2xWaXNDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBSaWFnZ2lvcm5hIGxlICoqT3JkZXJEaXJlY3RpdmVzKiogY29uIGxlIGluZm9ybWF6aW9uaSBpbiAgKipDb2x1bW5zTGlzdCoqICovXHJcbiAgICBwcml2YXRlIHJlZnJlc2hDb2x1bW5PcmRlcmluZygpIHtcclxuICAgICAgICB0aGlzLmVzdC5PcmRlckRpcmVjdGl2ZXMgPSBbXTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB0aGlzLmVzdC5Db2x1bW5zTGlzdC5sZW5ndGg7IGMrKylcclxuICAgICAgICAgICAgdGhpcy5lc3QuT3JkZXJEaXJlY3RpdmVzLnB1c2godGhpcy5lc3QuQ29sdW1uc0xpc3RbY10uaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBFZmZldHR1YSBsYSBzZWxlemlvbmUgbyBtZW5vIGRlbCBjaGVjayBnbG9iYWxlICgqKmdsb2JhbENvbFZpc0NoZWNrKiopIGRpIHZpc2liaWxpdMOgIGluIGJhc2UgYSBzZSB0dXR0ZSBsZSAqKlRNUENvbHVtbnNMaXN0Kiogc29ubyB2aXNpYmlsaSBvIG5vICovXHJcbiAgICBwdWJsaWMgdXBkYXRlR2xvYmFsQ29sVmlzQ2hlY2soKSB7XHJcbiAgICAgICAgLy8gVE1QQ29sTGlzdCB2aWVuZSByaWVtcGl0YSBkaSB1bmRlZmluZWQgbmVsIGNhc28gaW4gY3VpIHNpYSBkaXNhdHRpdmF0YSBsYSBzZWxlemlvbmUgZGVsbGUgY29sb25uZSBuYXNjb3N0ZVxyXG4gICAgICAgIHRoaXMuZXN0Lmdsb2JhbENvbFZpc0NoZWNrID0gdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZXZlcnkodCA9PiB0LnZpc2libGUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hpYW1hdG8gcXVhbmRvIHVuYSBjb2xvbm5hIHZpZW5lIHJpb3JkaW5hdGEgYWxsJ2ludGVybm8gZGVsbGEgbGlzdGEgZGVsbGUgdmlzaWJpbGl0w6AvcG9zaXppb25pIGNvbG9ubmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtDZGtEcmFnRHJvcDxFc1RhYmxlQ29sdW1uW10+fSBldmVudCBFdmVudG8gZGkgZHJvcCBkZWxsYSBsaXN0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sdW1uUmVvcmRlcmVkKGV2ZW50OiBDZGtEcmFnRHJvcDxFc1RhYmxlQ29sdW1uW10+KSB7XHJcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KGV2ZW50LmNvbnRhaW5lci5kYXRhLCBldmVudC5wcmV2aW91c0luZGV4LCBldmVudC5jdXJyZW50SW5kZXgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hpYW1hdG8gcXVhbmRvIHVuYSBjb2xvbm5hIHZpZW5lIHJpb3JkaW5hdGEgYWxsJ2ludGVybm8gZGVsbGEgbGlzdGEgZGVsbGUgdmlzaWJpbGl0w6AvcG9zaXppb25pIGNvbG9ubmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGljZSBpbiBjdWkgdm9nbGlvIGRyb3BwYXJlIGwnZWxlbWVudG8gZHJhZ2dhdG9cclxuICAgICAqIEBwYXJhbSB7Q2RrRHJhZzxFc1RhYmxlQ29sdW1uPn0gaXRlbSBPZ2dldHRvIGNoZSBzdG8gZHJhZ2dhbmRvXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBsYSBjb2xvbm5hIHB1w7IgZXNzZXJlIHNwb3N0YXRhIHN1bGwnaW5kaWNlICoqaW5kZXgqKiwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIHNvcnRQcmVkaWNhdGUoaW5kZXg6IG51bWJlciwgaXRlbTogQ2RrRHJhZzxFc1RhYmxlQ29sdW1uPik6IGJvb2xlYW4ge1xyXG4gICAgICAgIGxldCBpdGVtQXRJbmRleCA9IHRoaXMuZXN0LkNvbHVtbnNMaXN0W2luZGV4XTtcclxuICAgICAgICByZXR1cm4gIWl0ZW1BdEluZGV4LmZpeGVkICYmICFpdGVtQXRJbmRleC5waW5uZWQgJiYgIWl0ZW0uZGF0YS5waW5uZWQgJiYgIWl0ZW0uZGF0YS5waW5uZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBGdW56aW9uZSBjaGUgZWZmZXR0dWEgbGEgY29uZmVybWEgZGVsbGEgdmlzaWJpbGl0w6AgZSBkZWxsJ29yZGluZSBkZWxsZSBjb2xvbm5lLlxyXG4gICAgICpcclxuICAgICAqIFF1ZXN0YSBzZWxlemlvbmUgdmllbmUgaW5vbHRyZSBzYWx2YXRhIG5lbGxlIHByZWZlcmVuemUgKCoqQGVzZmFlbnphL3ByZWZlcmVuY2VzKiopLCBxdWFsb3JhIGwnSW5wdXQgKipTYXZlUHJlZmVyZW5jZXMqKiBmb3NzZSB2YWxvcml6emF0b1xyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtib29sZWFufSAqKnRydWUqKiBzZSBub24gY2kgc29ubyBwcm9ibGVtaSwgKipmYWxzZSoqIGFsdHJpbWVudGlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNvbmZpcm1Db2x1bW5WaXNpYmlsaXR5U2VsZWN0aW9uKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIC8vIE5vbiBwZXJtZXR0byBkaSBub24gc2VsZXppb25hcmUgbnVsbGFcclxuICAgICAgICBpZiAodGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZXZlcnkodCA9PiAhdC52aXNpYmxlKSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgY2FzdGVkVmlldyA9IHRoaXMuZXN0LnZpZXdNb2RlID8gKHRoaXMuZXN0Lk1haW5Hcm91cFZpZXcgfHwgdGhpcy5lc3QuVmlldyBhcyBBcHBTZWFyY2g8YW55PikgOiBudWxsO1xyXG4gICAgICAgIHRoaXMuZXN0LkNvbHVtbnNMaXN0ID0gW107XHJcbiAgICAgICAgdGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZm9yRWFjaChjID0+IHsgdGhpcy5lc3QuQ29sdW1uc0xpc3QucHVzaChPYmplY3QuYXNzaWduKHt9LCBjKSk7IH0pO1xyXG5cclxuICAgICAgICB0aGlzLnJlZnJlc2hDb2x1bW5PcmRlcmluZygpO1xyXG4gICAgICAgIHRoaXMuYXBwbHlPcmRlcmluZyhjYXN0ZWRWaWV3LCBmYWxzZSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaENvbHVtbnNWaXNpYmlsaXR5KG51bGwsIG51bGwsIGNhc3RlZFZpZXcpO1xyXG5cclxuICAgICAgICAvL1NhbHZvIGxlIHByZWZlcmVuY2VzIGRpIHF1ZXN0YSB2aWV3XHJcbiAgICAgICAgLy9EaSBkZWZhdWx0IHJlZ2lzdHJvIG9yZGluYW1lbnRvIGUgdmlzaWJpbGl0w6AgZGVsbGUgY29sb25uZSBuZWxsYSB2aXN0YS4gU29sbyBsZSBjb3NlIGRpIFVJXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LlNhdmVQcmVmZXJlbmNlcykgXHJcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJWaWV3UHJlZmVyZW5jZXMoY2FzdGVkVmlldyk7XHJcblxyXG4gICAgICAgIC8vIFJpZXNlZ3VvIGwndWx0aW1hIHJpY2VyY2EgYmluZGF0YSBhbGxhIHRhYmVsbGFcclxuICAgICAgICAvLyBNaSBhc3NpY3VybyBkaSBmYXJsbyBkb3BvIGwnZXNwYW5zaW9uZSBkZWwgY2hhbmdlZCBvIHJpc2NoaW8gY2hlIGxhIHJpY2VyY2EgbWkgcmlkaWEgY29sb25uZSBjaGUgaW4gcmVhbHTDoCBub24gZXNpc3Rvbm9cclxuICAgICAgICBpZiAodGhpcy5lc3Qudmlld01vZGUpXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZXN0Lk1haW5Hcm91cFZpZXcpIHtcclxuICAgICAgICAgICAgICAgICAgICAvL3RoaXMuZW1pdFNlYXJjaFJlcXVlc3QodHJ1ZSwgdGhpcy5NYWluR3JvdXBWaWV3KTtcclxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmlldyA9IHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZVtpXS52aWV3O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmNvbHVtbnMgPSB0aGlzLmVzdC5NYWluR3JvdXBWaWV3LmNvbHVtbnM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuY29sdW1uX29yZGVyaW5nID0gdGhpcy5lc3QuTWFpbkdyb3VwVmlldy5jb2x1bW5fb3JkZXJpbmc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUsIHRoaXMuZXN0Lmdyb3VwU2VhcmNoUmVxdWVzdHNDYWNoZVtpXS52aWV3KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LmVtaXRTZWFyY2hSZXF1ZXN0KHRydWUpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICBlbHNlIGlmICh0aGlzLmVzdC5hcnJheU1vZGUpXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aGlzLmVzdC5pbnRlcm5hbFdyaXRlVmFsdWUoKTsgfSk7XHJcblxyXG4gICAgICAgIC8vIExvIHZvcnJlaSBtZXR0ZXJlIGxhdG8gdGVtcGxhdGUgbWEgbm9cclxuICAgICAgICB0aGlzLmVzdC5sYXN0U2VsZWN0ZWRJdGVtSUQgPSBudWxsO1xyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRWZmZXR0dW8gbCd1bnBpbm5pbmcgZGkgdW5hIGNvbG9ubmEgaW4gbWFuaWVyYSBwcm9ncmFtbWF0aWNhIHNlbXBsaWNlbWVudGUgZXNlZ3VlbmRvIHVuYSBwZXIgdW5hIGxlIG9wZXJhemlvbmkgY2hlIHZlcnJlYmJlcm8gZXNlZ3VpdGUgYWx0cmltZW50aVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBDb2RpY2UgZGVsbGEgY29sb25uYSBkYSBzcGlubmFyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdW5waW5Db2x1bW4oaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMucmVzZXRDb2x1bW5WaXNTZWxlY3Rpb24oKTtcclxuICAgICAgICB0aGlzLnBpbk9yVW5waW5Db2x1bW4odGhpcy5lc3QuVE1QQ29sdW1uc0xpc3QuZmluZCh0ID0+IHQuaWQgPT0gaWQpKTtcclxuICAgICAgICB0aGlzLmNvbmZpcm1Db2x1bW5WaXNpYmlsaXR5U2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIFN1bCBjbGljayBuZWxsYSBjaGVja2JveCBkaSBzZWxlemlvbmUgZ2xvYmFsZSBzaSBzY29ycm9ubyB0dXR0ZSBsZSBjb2xvbm5lIGUgc2kgaW1wb3N0YW5vIGFsIHZhbG9yZSBkZWxsYSBjaGVjayBnbG9iYWxlICovXHJcbiAgICBwdWJsaWMgZ2xvYmFsQ29sVmlzQ2hlY2tDaGFuZ2VkKCkge1xyXG4gICAgICAgIHRoaXMuZXN0LlRNUENvbHVtbnNMaXN0LmZvckVhY2godCA9PiB7XHJcbiAgICAgICAgICAgIGlmICghdC5maXhlZClcclxuICAgICAgICAgICAgICAgIHQudmlzaWJsZSA9IHRoaXMuZXN0Lmdsb2JhbENvbFZpc0NoZWNrO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==