bways-report 0.1.6 → 0.1.7

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 (98) hide show
  1. package/README.md +293 -464
  2. package/esm2022/lib/core/config/bways-report-config.mjs +83 -0
  3. package/esm2022/lib/core/index.mjs +2 -1
  4. package/esm2022/lib/core/models/report-definition.model.mjs +1 -1
  5. package/esm2022/lib/core/services/report-data-discovery.service.mjs +6 -3
  6. package/esm2022/lib/core/services/report-session-context.service.mjs +11 -7
  7. package/esm2022/lib/core/tokens/reporting-config.token.mjs +1 -1
  8. package/esm2022/lib/core/utils/data-normalization.util.mjs +87 -1
  9. package/esm2022/lib/core/utils/report-parameter.util.mjs +119 -3
  10. package/esm2022/lib/data-access/adapters/endpoint-datasource.adapter.mjs +69 -0
  11. package/esm2022/lib/data-access/adapters/endpoint-lookup.adapter.mjs +98 -0
  12. package/esm2022/lib/data-access/adapters/endpoint-masterdata.adapter.mjs +57 -0
  13. package/esm2022/lib/data-access/adapters/endpoint-persistence.adapter.mjs +85 -0
  14. package/esm2022/lib/data-access/adapters/endpoint-schema-discovery.adapter.mjs +163 -0
  15. package/esm2022/lib/data-access/adapters/endpoint-tokens.mjs +12 -0
  16. package/esm2022/lib/data-access/adapters/http-lookup.adapter.mjs +4 -23
  17. package/esm2022/lib/data-access/adapters/index.mjs +8 -1
  18. package/esm2022/lib/data-access/contracts/lookup.contract.mjs +1 -1
  19. package/esm2022/lib/features/designer/components/component-palette/component-palette.component.mjs +12 -2
  20. package/esm2022/lib/features/designer/components/design-canvas/design-canvas.component.mjs +5 -5
  21. package/esm2022/lib/features/designer/components/dialogs/report-saved-dialog.component.mjs +407 -0
  22. package/esm2022/lib/features/designer/components/property-editor/parameter-binding-editor.component.mjs +109 -60
  23. package/esm2022/lib/features/designer/components/property-editor/property-editor-action.component.mjs +3 -3
  24. package/esm2022/lib/features/designer/components/property-editor/property-editor-datasource.component.mjs +110 -20
  25. package/esm2022/lib/features/designer/components/property-editor/property-editor-general.component.mjs +3 -3
  26. package/esm2022/lib/features/designer/components/property-editor/property-editor-grid.component.mjs +60 -3
  27. package/esm2022/lib/features/designer/components/property-editor/property-editor-layout.component.mjs +11 -5
  28. package/esm2022/lib/features/designer/components/property-editor/property-editor-report.component.mjs +3 -3
  29. package/esm2022/lib/features/designer/components/property-editor/property-editor-validation.component.mjs +15 -3
  30. package/esm2022/lib/features/designer/components/toolbar/designer-toolbar.component.mjs +204 -10
  31. package/esm2022/lib/features/designer/designer.component.mjs +43 -2
  32. package/esm2022/lib/features/designer/services/designer-state.service.mjs +9 -2
  33. package/esm2022/lib/features/embed/bways-report-builder.component.mjs +207 -0
  34. package/esm2022/lib/features/embed/bways-report-menu.component.mjs +433 -0
  35. package/esm2022/lib/features/embed/bways-report-page.component.mjs +204 -0
  36. package/esm2022/lib/features/embed/index.mjs +5 -0
  37. package/esm2022/lib/features/embed/inject-report-menu.mjs +99 -0
  38. package/esm2022/lib/features/index.mjs +2 -1
  39. package/esm2022/lib/features/persistence/services/report-store.service.mjs +43 -5
  40. package/esm2022/lib/features/routing/components/routed-report-runtime.component.mjs +4 -4
  41. package/esm2022/lib/features/routing/index.mjs +2 -2
  42. package/esm2022/lib/features/routing/models/report-route.models.mjs +1 -1
  43. package/esm2022/lib/features/routing/report-routes.mjs +42 -1
  44. package/esm2022/lib/features/routing/resolvers/report.resolver.mjs +6 -8
  45. package/esm2022/lib/features/routing/services/report-menu.service.mjs +14 -4
  46. package/esm2022/lib/features/runtime/dynamic-renderer.component.mjs +22 -3
  47. package/esm2022/lib/features/runtime/report-grid-bridge.component.mjs +16 -2
  48. package/esm2022/lib/primitives/components/button/rpt-button.component.mjs +28 -5
  49. package/esm2022/lib/primitives/components/dropdown/rpt-dropdown.component.mjs +86 -19
  50. package/esm2022/lib/primitives/components/icon/rpt-icon.component.mjs +8 -1
  51. package/esm2022/lib/primitives/components/index.mjs +2 -1
  52. package/esm2022/lib/primitives/components/number/rpt-number.component.mjs +9 -3
  53. package/esm2022/lib/primitives/components/searchable-select/rpt-searchable-select.component.mjs +386 -0
  54. package/esm2022/lib/provide-reporting.mjs +137 -7
  55. package/fesm2022/bways-report.mjs +4053 -840
  56. package/fesm2022/bways-report.mjs.map +1 -1
  57. package/lib/core/config/bways-report-config.d.ts +161 -0
  58. package/lib/core/index.d.ts +1 -0
  59. package/lib/core/models/report-definition.model.d.ts +16 -0
  60. package/lib/core/services/report-session-context.service.d.ts +1 -0
  61. package/lib/core/tokens/reporting-config.token.d.ts +16 -0
  62. package/lib/core/utils/data-normalization.util.d.ts +10 -0
  63. package/lib/core/utils/report-parameter.util.d.ts +18 -1
  64. package/lib/data-access/adapters/endpoint-datasource.adapter.d.ts +13 -0
  65. package/lib/data-access/adapters/endpoint-lookup.adapter.d.ts +14 -0
  66. package/lib/data-access/adapters/endpoint-masterdata.adapter.d.ts +11 -0
  67. package/lib/data-access/adapters/endpoint-persistence.adapter.d.ts +15 -0
  68. package/lib/data-access/adapters/endpoint-schema-discovery.adapter.d.ts +21 -0
  69. package/lib/data-access/adapters/endpoint-tokens.d.ts +21 -0
  70. package/lib/data-access/adapters/index.d.ts +7 -0
  71. package/lib/data-access/contracts/lookup.contract.d.ts +2 -2
  72. package/lib/features/designer/components/component-palette/component-palette.component.d.ts +1 -0
  73. package/lib/features/designer/components/design-canvas/design-canvas.component.d.ts +1 -1
  74. package/lib/features/designer/components/dialogs/report-saved-dialog.component.d.ts +34 -0
  75. package/lib/features/designer/components/property-editor/parameter-binding-editor.component.d.ts +1 -0
  76. package/lib/features/designer/components/property-editor/property-editor-datasource.component.d.ts +12 -2
  77. package/lib/features/designer/components/property-editor/property-editor-grid.component.d.ts +10 -0
  78. package/lib/features/designer/components/toolbar/designer-toolbar.component.d.ts +13 -1
  79. package/lib/features/designer/designer.component.d.ts +4 -0
  80. package/lib/features/embed/bways-report-builder.component.d.ts +48 -0
  81. package/lib/features/embed/bways-report-menu.component.d.ts +40 -0
  82. package/lib/features/embed/bways-report-page.component.d.ts +61 -0
  83. package/lib/features/embed/index.d.ts +4 -0
  84. package/lib/features/embed/inject-report-menu.d.ts +44 -0
  85. package/lib/features/index.d.ts +1 -0
  86. package/lib/features/persistence/services/report-store.service.d.ts +5 -0
  87. package/lib/features/routing/index.d.ts +1 -1
  88. package/lib/features/routing/models/report-route.models.d.ts +3 -0
  89. package/lib/features/routing/report-routes.d.ts +40 -0
  90. package/lib/features/routing/resolvers/report.resolver.d.ts +1 -1
  91. package/lib/features/runtime/dynamic-renderer.component.d.ts +1 -0
  92. package/lib/features/runtime/report-grid-bridge.component.d.ts +1 -1
  93. package/lib/primitives/components/button/rpt-button.component.d.ts +3 -0
  94. package/lib/primitives/components/dropdown/rpt-dropdown.component.d.ts +16 -3
  95. package/lib/primitives/components/index.d.ts +2 -0
  96. package/lib/primitives/components/searchable-select/rpt-searchable-select.component.d.ts +89 -0
  97. package/lib/provide-reporting.d.ts +22 -6
  98. package/package.json +1 -1
@@ -5,12 +5,14 @@ import { DragDropModule } from '@angular/cdk/drag-drop';
5
5
  import { ComponentRegistry } from '../../../../core/registry/component-registry';
6
6
  import { DesignerStateService } from '../../services/designer-state.service';
7
7
  import { RptIconComponent } from '../../../../primitives/components/icon/rpt-icon.component';
8
+ import { REPORTING_CONFIG } from '../../../../core/tokens/reporting-config.token';
8
9
  import * as i0 from "@angular/core";
9
10
  import * as i1 from "@angular/forms";
10
11
  import * as i2 from "@angular/cdk/drag-drop";
11
12
  export class ComponentPaletteComponent {
12
13
  registry = inject(ComponentRegistry);
13
14
  designerState = inject(DesignerStateService);
15
+ reportingConfig = inject(REPORTING_CONFIG, { optional: true });
14
16
  collapseRequested = output();
15
17
  searchQuery = signal('');
16
18
  /** Layout view mode: 'grid' (2-column side-by-side grid) or 'list' (compact row list). Defaults to 'grid'. */
@@ -28,9 +30,17 @@ export class ComponentPaletteComponent {
28
30
  filteredCategories = computed(() => {
29
31
  const all = this.registry.getAll();
30
32
  const query = this.searchQuery();
31
- const filtered = query
33
+ const allowedCats = this.reportingConfig?.allowedCategories;
34
+ let filtered = query
32
35
  ? all.filter((c) => matchesSearchQuery(c, query))
33
36
  : all;
37
+ // Filter by allowed categories if configured
38
+ if (allowedCats && allowedCats.length > 0) {
39
+ filtered = filtered.filter((c) => {
40
+ const cat = c.category || 'input';
41
+ return allowedCats.includes(cat);
42
+ });
43
+ }
34
44
  const groups = new Map();
35
45
  for (const item of filtered) {
36
46
  const cat = item.category || 'input';
@@ -192,4 +202,4 @@ export function matchesSearchQuery(item, rawQuery) {
192
202
  ];
193
203
  return tokens.every((token) => targetWords.some((word) => fuzzyMatchWord(word, token)));
194
204
  }
195
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXBhbGV0dGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9jb21wb25lbnQtcGFsZXR0ZS9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2NvbXBvbmVudC1wYWxldHRlL2NvbXBvbmVudC1wYWxldHRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBd0IsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLDhDQUE4QyxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDOzs7O0FBVTdGLE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLGFBQWEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUVyRCxpQkFBaUIsR0FBRyxNQUFNLEVBQVEsQ0FBQztJQUVuQyxXQUFXLEdBQUcsTUFBTSxD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cG9uZW50LFxuICBjb21wdXRlZCxcbiAgaW5qZWN0LFxuICBvdXRwdXQsXG4gIHNpZ25hbCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDZGtEcmFnLCBDZGtEcmFnRHJvcCwgRHJhZ0Ryb3BNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvZHJhZy1kcm9wJztcbmltcG9ydCB7IENvbXBvbmVudFJlZ2lzdHJ5LCBSZXBvcnRpbmdDb21wb25lbnRNZXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS9yZWdpc3RyeS9jb21wb25lbnQtcmVnaXN0cnknO1xuaW1wb3J0IHsgRGVzaWduZXJTdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9kZXNpZ25lci1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IFJwdEljb25Db21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9wcmltaXRpdmVzL2NvbXBvbmVudHMvaWNvbi9ycHQtaWNvbi5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdycHQtY29tcG9uZW50LXBhbGV0dGUnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgRHJhZ0Ryb3BNb2R1bGUsIFJwdEljb25Db21wb25lbnRdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29tcG9uZW50LXBhbGV0dGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29tcG9uZW50LXBhbGV0dGUuY29tcG9uZW50LmNzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRQYWxldHRlQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSByZWdpc3RyeSA9IGluamVjdChDb21wb25lbnRSZWdpc3RyeSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVzaWduZXJTdGF0ZSA9IGluamVjdChEZXNpZ25lclN0YXRlU2VydmljZSk7XG5cbiAgcmVhZG9ubHkgY29sbGFwc2VSZXF1ZXN0ZWQgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICByZWFkb25seSBzZWFyY2hRdWVyeSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcblxuICAvKiogTGF5b3V0IHZpZXcgbW9kZTogJ2dyaWQnICgyLWNvbHVtbiBzaWRlLWJ5LXNpZGUgZ3JpZCkgb3IgJ2xpc3QnIChjb21wYWN0IHJvdyBsaXN0KS4gRGVmYXVsdHMgdG8gJ2dyaWQnLiAqL1xuICByZWFkb25seSBsYXlvdXRNb2RlID0gc2lnbmFsPCdncmlkJyB8ICdsaXN0Jz4oJ2dyaWQnKTtcblxuICAvKiogU2V0IG9mIGV4cGFuZGVkIGNhdGVnb3J5IElEcyAqL1xuICByZWFkb25seSBleHBhbmRlZENhdGVnb3JpZXMgPSBzaWduYWw8U2V0PHN0cmluZz4+KFxuICAgIG5ldyBTZXQoWydpbnB1dCcsICdhY3Rpb24nLCAnZGlzcGxheScsICdkYXRhJywgJ2xheW91dCddKVxuICApO1xuXG4gIHJlYWRvbmx5IHRvdGFsQ29tcG9uZW50Q291bnQgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnJlZ2lzdHJ5LmdldEFsbCgpLmxlbmd0aCk7XG5cbiAgcmVhZG9ubHkgY2F0ZWdvcnlNZXRhOiBSZWNvcmQ8c3RyaW5nLCB7IGxhYmVsOiBzdHJpbmc7IGljb246IHN0cmluZyB9PiA9IHtcbiAgICBpbnB1dDogeyBsYWJlbDogJ0Zvcm0gSW5wdXRzJywgaWNvbjogJ3RleHQtZmllbGRzJyB9LFxuICAgIGFjdGlvbjogeyBsYWJlbDogJ0FjdGlvbiBCdXR0b25zJywgaWNvbjogJ2xpZ2h0bmluZycgfSxcbiAgICBkaXNwbGF5OiB7IGxhYmVsOiAnRGlzcGxheSAmIExhYmVscycsIGljb246ICdjaGFydC1iYXInIH0sXG4gICAgZGF0YTogeyBsYWJlbDogJ0RhdGEgJiBMb29rdXBzJywgaWNvbjogJ2dyaWQnIH0sXG4gICAgbGF5b3V0OiB7IGxhYmVsOiAnTGF5b3V0ICYgQ29udGFpbmVycycsIGljb246ICdsYXlvdXQnIH0sXG4gIH07XG5cbiAgcmVhZG9ubHkgZmlsdGVyZWRDYXRlZ29yaWVzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGFsbCA9IHRoaXMucmVnaXN0cnkuZ2V0QWxsKCk7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNlYXJjaFF1ZXJ5KCk7XG5cbiAgICBjb25zdCBmaWx0ZXJlZCA9IHF1ZXJ5XG4gICAgICA/IGFsbC5maWx0ZXIoKGMpID0+IG1hdGNoZXNTZWFyY2hRdWVyeShjLCBxdWVyeSkpXG4gICAgICA6IGFsbDtcblxuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBSZXBvcnRpbmdDb21wb25lbnRNZXRhW10+KCk7XG4gICAgZm9yIChjb25zdCBpdGVtIG9mIGZpbHRlcmVkKSB7XG4gICAgICBjb25zdCBjYXQgPSBpdGVtLmNhdGVnb3J5IHx8ICdpbnB1dCc7XG4gICAgICBpZiAoIWdyb3Vwcy5oYXMoY2F0KSkge1xuICAgICAgICBncm91cHMuc2V0KGNhdCwgW10pO1xuICAgICAgfVxuICAgICAgZ3JvdXBzLmdldChjYXQpIS5wdXNoKGl0ZW0pO1xuICAgIH1cblxuICAgIHJldHVybiBBcnJheS5mcm9tKGdyb3Vwcy5lbnRyaWVzKCkpLm1hcCgoW2NhdCwgaXRlbXNdKSA9PiB7XG4gICAgICBjb25zdCBtZXRhID0gdGhpcy5jYXRlZ29yeU1ldGFbY2F0XTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGNhdCxcbiAgICAgICAgbGFiZWw6IG1ldGE/LmxhYmVsID8/IGNhdCxcbiAgICAgICAgaWNvbjogbWV0YT8uaWNvbiA/PyAnYm94JyxcbiAgICAgICAgaXRlbXMsXG4gICAgICB9O1xuICAgIH0pO1xuICB9KTtcblxuICByZWFkb25seSBhbGxFeHBhbmRlZCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjYXRzID0gdGhpcy5maWx0ZXJlZENhdGVnb3JpZXMoKTtcbiAgICBpZiAoY2F0cy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBjb25zdCBleHBhbmRlZCA9IHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzKCk7XG4gICAgcmV0dXJuIGNhdHMuZXZlcnkoKGMpID0+IGV4cGFuZGVkLmhhcyhjLm5hbWUpKTtcbiAgfSk7XG5cbiAgaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgLy8gV2hlbiBzZWFyY2hpbmcsIGF1dG8tZXhwYW5kIGNhdGVnb3JpZXMgdGhhdCBjb250YWluIG1hdGNoaW5nIHJlc3VsdHNcbiAgICBpZiAodGhpcy5zZWFyY2hRdWVyeSgpLnRyaW0oKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcygpLmhhcyhjYXRlZ29yeU5hbWUpO1xuICB9XG5cbiAgdG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnlOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBjdXJyZW50ID0gbmV3IFNldCh0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcygpKTtcbiAgICBpZiAoY3VycmVudC5oYXMoY2F0ZWdvcnlOYW1lKSkge1xuICAgICAgY3VycmVudC5kZWxldGUoY2F0ZWdvcnlOYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY3VycmVudC5hZGQoY2F0ZWdvcnlOYW1lKTtcbiAgICB9XG4gICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXMuc2V0KGN1cnJlbnQpO1xuICB9XG5cbiAgdG9nZ2xlQWxsQ2F0ZWdvcmllcygpOiB2b2lkIHtcbiAgICBjb25zdCBjYXRzID0gdGhpcy5maWx0ZXJlZENhdGVnb3JpZXMoKTtcbiAgICBpZiAodGhpcy5hbGxFeHBhbmRlZCgpKSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcy5zZXQobmV3IFNldCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5leHBhbmRlZENhdGVnb3JpZXMuc2V0KG5ldyBTZXQoY2F0cy5tYXAoKGMpID0+IGMubmFtZSkpKTtcbiAgICB9XG4gIH1cblxuICBnZXRJY29uTmFtZShpdGVtOiBSZXBvcnRpbmdDb21wb25lbnRNZXRhKTogc3RyaW5nIHtcbiAgICBzd2l0Y2ggKGl0ZW0udHlwZSkge1xuICAgICAgY2FzZSAnaW5wdXQnOlxuICAgICAgICByZXR1cm4gJ3RleHQtZmllbGRzJztcbiAgICAgIGNhc2UgJ2Ryb3Bkb3duJzpcbiAgICAgICAgcmV0dXJuICdkcm9wZG93bic7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgcmV0dXJuICdjYWxlbmRhcic7XG4gICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICByZXR1cm4gJ251bWJlcic7XG4gICAgICBjYXNlICdjaGVja2JveCc6XG4gICAgICAgIHJldHVybiAnY2hlY2tib3gnO1xuICAgICAgY2FzZSAnYnV0dG9uJzpcbiAgICAgICAgcmV0dXJuICdidXR0b24nO1xuICAgICAgY2FzZSAna3BpLWNhcmQnOlxuICAgICAgICByZXR1cm4gJ2twaSc7XG4gICAgICBjYXNlICdjaGFydCc6XG4gICAgICAgIHJldHVybiAnY2hhcnQtYmFyJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnYm94JztcbiAgICB9XG4gIH1cblxuXG4gIG9uSXRlbURvdWJsZUNsaWNrKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5hZGRDb21wb25lbnQodHlwZSk7XG4gIH1cblxuICBvbkFkZENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50LCB0eXBlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB0aGlzLmRlc2lnbmVyU3RhdGUuYWRkQ29tcG9uZW50KHR5cGUpO1xuICB9XG59XG5cbi8qKiBEaWN0aW9uYXJ5IG9mIHN5bm9ueW1zIGZvciBjb21wb25lbnQgdHlwZXMgYW5kIFVJIGNvbmNlcHRzICovXG5leHBvcnQgY29uc3QgQ09NUE9ORU5UX1NZTk9OWU1TOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gIGlucHV0OiBbJ3RleHRib3gnLCAndGV4dCcsICdmaWVsZCcsICdzdHJpbmcnLCAnZW50cnknLCAncHJvbXB0J10sXG4gIGRyb3Bkb3duOiBbJ3NlbGVjdCcsICdjb21ib2JveCcsICdwaWNrZXInLCAnb3B0aW9ucycsICdjaG9pY2UnLCAnbWVudScsICdsaXN0J10sXG4gIGRhdGU6IFsnY2FsZW5kYXInLCAndGltZScsICdkYXRldGltZScsICdkYXknLCAnbW9udGgnLCAneWVhcicsICdzY2hlZHVsZScsICdwaWNrZXInXSxcbiAgbnVtYmVyOiBbJ251bWVyaWMnLCAnaW50ZWdlcicsICdmbG9hdCcsICdhbW91bnQnLCAnY3VycmVuY3knLCAncHJpY2UnLCAncXVhbnRpdHknLCAnY291bnRlcicsICdkaWdpdHMnLCAnc3VtJ10sXG4gIGNoZWNrYm94OiBbJ3RvZ2dsZScsICdzd2l0Y2gnLCAnYm9vbGVhbicsICdjaGVjaycsICd0aWNrJywgJ2ZsYWcnLCAneWVzL25vJ10sXG4gIGJ1dHRvbjogWydhY3Rpb24nLCAnc3VibWl0JywgJ3RyaWdnZXInLCAnY2xpY2snLCAnY3RhJywgJ3ByZXNzJywgJ2V4ZWN1dGUnXSxcbiAgJ2twaS1jYXJkJzogWydrcGknLCAnbWV0cmljJywgJ3N0YXQnLCAnY2FyZCcsICdpbmRpY2F0b3InLCAnc3VtbWFyeScsICdmaWd1cmUnLCAnYW5hbHl0aWNzJywgJ21lYXN1cmUnLCAndG90YWwnXSxcbiAgY2hhcnQ6IFsnZ3JhcGgnLCAnYmFyJywgJ2RvbnV0JywgJ2xpbmUnLCAndmlzdWFsJywgJ2FuYWx5dGljcycsICdwbG90JywgJ3BpZScsICdkaWFncmFtJ10sXG59O1xuXG4vKiogQ29tcHV0ZSBMZXZlbnNodGVpbiBkaXN0YW5jZSBiZXR3ZWVuIHR3byBzdHJpbmdzIGZvciB0eXBvIHRvbGVyYW5jZSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxldmVuc2h0ZWluRGlzdGFuY2UoYTogc3RyaW5nLCBiOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAoYSA9PT0gYikgcmV0dXJuIDA7XG4gIGlmICghYS5sZW5ndGgpIHJldHVybiBiLmxlbmd0aDtcbiAgaWYgKCFiLmxlbmd0aCkgcmV0dXJuIGEubGVuZ3RoO1xuXG4gIGNvbnN0IHJvdyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGIubGVuZ3RoICsgMSB9LCAoXywgaSkgPT4gaSk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGEubGVuZ3RoOyBpKyspIHtcbiAgICBsZXQgcHJldiA9IGk7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gYi5sZW5ndGg7IGorKykge1xuICAgICAgY29uc3QgdmFsID0gYVtpIC0gMV0gPT09IGJbaiAtIDFdID8gcm93W2ogLSAxXSA6IE1hdGgubWluKHJvd1tqIC0gMV0sIHJvd1tqXSwgcHJldikgKyAxO1xuICAgICAgcm93W2ogLSAxXSA9IHByZXY7XG4gICAgICBwcmV2ID0gdmFsO1xuICAgIH1cbiAgICByb3dbYi5sZW5ndGhdID0gcHJldjtcbiAgfVxuICByZXR1cm4gcm93W2IubGVuZ3RoXTtcbn1cblxuLyoqIENoZWNrIGlmIGEgc2VhcmNoIHRlcm0gbWF0Y2hlcyBhIHRhcmdldCB3b3JkIChzdWJzdHJpbmcgb3IgbWlzc3BlbGxpbmcpICovXG5leHBvcnQgZnVuY3Rpb24gZnV6enlNYXRjaFdvcmQodGFyZ2V0OiBzdHJpbmcsIHRlcm06IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAodGFyZ2V0LmluY2x1ZGVzKHRlcm0pIHx8IHRlcm0uaW5jbHVkZXModGFyZ2V0KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICh0ZXJtLmxlbmd0aCA+PSA0ICYmIHRhcmdldC5sZW5ndGggPj0gNCkge1xuICAgIGNvbnN0IG1heERpc3QgPSB0ZXJtLmxlbmd0aCA+PSA3ID8gMiA6IDE7XG4gICAgaWYgKGxldmVuc2h0ZWluRGlzdGFuY2UodGFyZ2V0LCB0ZXJtKSA8PSBtYXhEaXN0KSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKiogUHVyZSBwcmVkaWNhdGUgdG8gY2hlY2sgaWYgYSBjb21wb25lbnQgbWV0YWRhdGEgaXRlbSBtYXRjaGVzIGEgc2VhcmNoIHF1ZXJ5ICovXG5leHBvcnQgZnVuY3Rpb24gbWF0Y2hlc1NlYXJjaFF1ZXJ5KGl0ZW06IFJlcG9ydGluZ0NvbXBvbmVudE1ldGEsIHJhd1F1ZXJ5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFyYXdRdWVyeSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGNsZWFuID0gcmF3UXVlcnkudHJpbSgpO1xuICBpZiAoIWNsZWFuKSByZXR1cm4gdHJ1ZTtcblxuICBjb25zdCBsb3dlciA9IGNsZWFuLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gVG9rZW5pemUgYnkgcHVuY3R1YXRpb24gYW5kIHdoaXRlc3BhY2VcbiAgY29uc3QgdG9rZW5zID0gbG93ZXJcbiAgICAucmVwbGFjZSgvW15cXHdcXHMtXS9nLCAnICcpXG4gICAgLnNwbGl0KC9bXFxzLV0rLylcbiAgICAuZmlsdGVyKCh0KSA9PiB0Lmxlbmd0aCA+IDApO1xuXG4gIC8vIElmIHF1ZXJ5IGNvbnNpc3RzIG9ubHkgb2Ygc3BlY2lhbCBjaGFyYWN0ZXJzIChlLmcuLCBcIiQkJFwiIG9yIFwiKioqXCIpXG4gIGlmICh0b2tlbnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGl0ZW0uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhsb3dlcikgfHxcbiAgICAgIGl0ZW0udHlwZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyKSB8fFxuICAgICAgaXRlbS5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyKVxuICAgICk7XG4gIH1cblxuICBjb25zdCBzeW5vbnltcyA9IENPTVBPTkVOVF9TWU5PTllNU1tpdGVtLnR5cGVdIHx8IFtdO1xuICBjb25zdCB0YXJnZXRXb3JkcyA9IFtcbiAgICBpdGVtLmRpc3BsYXlOYW1lLnRvTG93ZXJDYXNlKCksXG4gICAgaXRlbS50eXBlLnRvTG93ZXJDYXNlKCksXG4gICAgaXRlbS5jYXRlZ29yeS50b0xvd2VyQ2FzZSgpLFxuICAgIC4uLml0ZW0uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pLFxuICAgIC4uLml0ZW0udHlwZS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9bLV9dKy8pLFxuICAgIC4uLnN5bm9ueW1zLFxuICBdO1xuXG4gIHJldHVybiB0b2tlbnMuZXZlcnkoKHRva2VuKSA9PiB0YXJnZXRXb3Jkcy5zb21lKCh3b3JkKSA9PiBmdXp6eU1hdGNoV29yZCh3b3JkLCB0b2tlbikpKTtcbn1cblxuIiwiICAgIDxkaXYgY2xhc3M9XCJwYWxldHRlLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYWxldHRlLXRpdGxlLWFyZWFcIj5cbiAgICAgICAgICA8aDMgY2xhc3M9XCJwYWxldHRlLXRpdGxlXCI+Q29tcG9uZW50czwvaDM+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJwYWxldHRlLWNvdW50XCIgW3RpdGxlXT1cInRvdGFsQ29tcG9uZW50Q291bnQoKSArICcgY29tcG9uZW50cyBhdmFpbGFibGUnXCI+XG4gICAgICAgICAgICB7eyB0b3RhbENvbXBvbmVudENvdW50KCkgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYWxldHRlLWFjdGlvbnNcIj5cbiAgICAgICAgICA8IS0tIFZpZXcgTW9kZSBUb2dnbGU6IDItQ29sdW1uIEdyaWQgdnMgMS1Db2x1bW4gTGlzdCAtLT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwidmlldy1tb2RlLXRvZ2dsZVwiIHJvbGU9XCJncm91cFwiIGFyaWEtbGFiZWw9XCJQYWxldHRlIGxheW91dCB2aWV3XCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cInRvZ2dsZS1idG5cIlxuICAgICAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1wcmVzc2VkXT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cImxheW91dE1vZGUuc2V0KCdncmlkJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIjItQ29sdW1uIEdyaWQgVmlld1wiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCIyLUNvbHVtbiBHcmlkIFZpZXdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImdyaWRcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibGF5b3V0TW9kZSgpID09PSAnbGlzdCdcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwibGF5b3V0TW9kZSgpID09PSAnbGlzdCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibGF5b3V0TW9kZS5zZXQoJ2xpc3QnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ29tcGFjdCBMaXN0IFZpZXdcIlxuICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29tcGFjdCBMaXN0IFZpZXdcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImxpc3RcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWxldHRlLWFjdGlvbi1idG4gaWNvbi1vbmx5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJ0b2dnbGVBbGxDYXRlZ29yaWVzKClcIlxuICAgICAgICAgICAgW3RpdGxlXT1cImFsbEV4cGFuZGVkKCkgPyAnQ29sbGFwc2UgQWxsIFNlY3Rpb25zJyA6ICdFeHBhbmQgQWxsIFNlY3Rpb25zJ1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFsbEV4cGFuZGVkKCkgPyAnQ29sbGFwc2UgQWxsIFNlY3Rpb25zJyA6ICdFeHBhbmQgQWxsIFNlY3Rpb25zJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cImFsbEV4cGFuZGVkKCkgPyAnY2hldnJvbi11cCcgOiAnY2hldnJvbi1kb3duJ1wiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJwYWxldHRlLWFjdGlvbi1idG4gaWNvbi1vbmx5XCJcbiAgICAgICAgICAgIChjbGljayk9XCJjb2xsYXBzZVJlcXVlc3RlZC5lbWl0KClcIlxuICAgICAgICAgICAgdGl0bGU9XCJDb2xsYXBzZSBDb21wb25lbnQgUGFsZXR0ZVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiQ29sbGFwc2UgQ29tcG9uZW50IFBhbGV0dGVcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1sZWZ0XCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFNlYXJjaCBGaWx0ZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFsZXR0ZS1zZWFyY2gtd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWlucHV0LWJveFwiPlxuICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2VhcmNoXCIgW3NpemVdPVwiMTNcIiBjbGFzcz1cInNlYXJjaC1wcmVmaXgtaWNvblwiIC8+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtc2VhcmNoLWlucHV0XCJcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIGNvbnRyb2xzLi4uXCJcbiAgICAgICAgICAgIFtuZ01vZGVsXT1cInNlYXJjaFF1ZXJ5KClcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwic2VhcmNoUXVlcnkuc2V0KCRldmVudClcIlxuICAgICAgICAgICAgYXJpYS1sYWJlbD1cIlNlYXJjaCBjb21wb25lbnRzXCJcbiAgICAgICAgICAvPlxuICAgICAgICAgIEBpZiAoc2VhcmNoUXVlcnkoKSkge1xuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjbGVhci1zZWFyY2gtYnRuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInNlYXJjaFF1ZXJ5LnNldCgnJylcIlxuICAgICAgICAgICAgICB0aXRsZT1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDbGVhciBzZWFyY2hcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNsb3NlXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8IS0tIFBhbGV0dGUgQ2F0ZWdvcmllcyBEcm9wIExpc3Qgd2l0aCBBY2NvcmRpb24gLS0+XG4gICAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwicGFsZXR0ZS1zY3JvbGwtYXJlYVwiXG4gICAgICAgIGNka0Ryb3BMaXN0XG4gICAgICAgIGlkPVwiZGVzaWduZXItcGFsZXR0ZS1kcm9wLWxpc3RcIlxuICAgICAgICBbY2RrRHJvcExpc3RTb3J0aW5nRGlzYWJsZWRdPVwidHJ1ZVwiXG4gICAgICA+XG4gICAgICAgIEBmb3IgKGNhdGVnb3J5IG9mIGZpbHRlcmVkQ2F0ZWdvcmllcygpOyB0cmFjayBjYXRlZ29yeS5uYW1lKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1pdGVtXCIgW2NsYXNzLmlzLWV4cGFuZGVkXT1cImlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJhY2NvcmRpb24taGVhZGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUNhdGVnb3J5KGNhdGVnb3J5Lm5hbWUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1leHBhbmRlZF09XCJpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnkubmFtZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbnRyb2xzXT1cIidwYWxldHRlLXNlY3Rpb24tJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgICBbaWRdPVwiJ3BhbGV0dGUtaGVhZGVyLScgKyBjYXRlZ29yeS5uYW1lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXItbGVmdFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWNjb3JkaW9uLWNoZXZyb25cIiBbY2xhc3Mucm90YXRlZF09XCIhaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCI+XG4gICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cImNoZXZyb24tZG93blwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGVnb3J5LWljb24taW5kaWNhdG9yXCI+XG4gICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiY2F0ZWdvcnkuaWNvblwiIFtzaXplXT1cIjEzXCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNhdGVnb3J5LW5hbWVcIj57eyBjYXRlZ29yeS5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktYmFkZ2VcIj57eyBjYXRlZ29yeS5pdGVtcy5sZW5ndGggfX08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1jb2xsYXBzZS13cmFwcGVyXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmV4cGFuZGVkXT1cImlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtaGlkZGVuXT1cIiFpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnkubmFtZSlcIlxuICAgICAgICAgICAgICBbaWRdPVwiJ3BhbGV0dGUtc2VjdGlvbi0nICsgY2F0ZWdvcnkubmFtZVwiXG4gICAgICAgICAgICAgIHJvbGU9XCJyZWdpb25cIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiJ3BhbGV0dGUtaGVhZGVyLScgKyBjYXRlZ29yeS5uYW1lXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY29yZGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjYXRlZ29yeS1pdGVtc1wiXG4gICAgICAgICAgICAgICAgICBbY2xhc3MuZ3JpZC12aWV3XT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5saXN0LXZpZXddPVwibGF5b3V0TW9kZSgpID09PSAnbGlzdCdcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2YgY2F0ZWdvcnkuaXRlbXM7IHRyYWNrIGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwYWxldHRlLWl0ZW1cIlxuICAgICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICAgICAgICAgICAgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQWRkICcgKyBpdGVtLmRpc3BsYXlOYW1lICsgJyB0byBjYW52YXMnXCJcbiAgICAgICAgICAgICAgICAgICAgICBjZGtEcmFnXG4gICAgICAgICAgICAgICAgICAgICAgW2Nka0RyYWdEYXRhXT1cIml0ZW0udHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGRibGNsaWNrKT1cIm9uSXRlbURvdWJsZUNsaWNrKGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9uSXRlbURvdWJsZUNsaWNrKGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cIm9uSXRlbURvdWJsZUNsaWNrKGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgIFt0aXRsZV09XCInRHJhZyBvbnRvIGNhbnZhcyBvciBkb3VibGUtY2xpY2sgdG8gYWRkICcgKyBpdGVtLmRpc3BsYXlOYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWljb24tYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiZ2V0SWNvbk5hbWUoaXRlbSlcIiBbc2l6ZV09XCJsYXlvdXRNb2RlKCkgPT09ICdncmlkJyA/IDE2IDogMTVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpdGVtLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS10aXRsZVwiIFt0aXRsZV09XCJpdGVtLmRpc3BsYXlOYW1lXCI+e3sgaXRlbS5kaXNwbGF5TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaXRlbS10eXBlLWNvZGVcIj57eyBpdGVtLnR5cGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIml0ZW0tYWRkLWJ0blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25BZGRDbGljaygkZXZlbnQsIGl0ZW0udHlwZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiQWRkIHRvIGNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWxhYmVsPVwiQWRkIHRvIGNhbnZhc1wiXG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJwbHVzXCIgW3NpemVdPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCcgPyAxMiA6IDEzXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgIDwhLS0gQ0RLIERyYWcgUGxhY2Vob2xkZXIgLyBQcmV2aWV3IC0tPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKmNka0RyYWdQbGFjZWhvbGRlciBjbGFzcz1cImRyYWctcGxhY2Vob2xkZXJcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2ICpjZGtEcmFnUHJldmlldyBjbGFzcz1cImRyYWctcHJldmlld1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJwdC1pY29uIFtuYW1lXT1cImdldEljb25OYW1lKGl0ZW0pXCIgW3NpemVdPVwiMTZcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgaXRlbS5kaXNwbGF5TmFtZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGZpbHRlcmVkQ2F0ZWdvcmllcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1yZXN1bHRzXCI+XG4gICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInNlYXJjaFwiIFtzaXplXT1cIjIwXCIgY2xhc3M9XCJuby1yZXN1bHRzLWljb25cIiAvPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJuby1yZXN1bHRzLXRleHRcIj5ObyBjb21wb25lbnRzIG1hdGNoaW5nIFwie3sgc2VhcmNoUXVlcnkoKSB9fVwiPC9zcGFuPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJuby1yZXN1bHRzLWNsZWFyLWJ0blwiIChjbGljayk9XCJzZWFyY2hRdWVyeS5zZXQoJycpXCI+XG4gICAgICAgICAgICAgIENsZWFyIFNlYXJjaFxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PiJdfQ==
205
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcG9uZW50LXBhbGV0dGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYndheXMtcmVwb3J0L3NyYy9saWIvZmVhdHVyZXMvZGVzaWduZXIvY29tcG9uZW50cy9jb21wb25lbnQtcGFsZXR0ZS9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9id2F5cy1yZXBvcnQvc3JjL2xpYi9mZWF0dXJlcy9kZXNpZ25lci9jb21wb25lbnRzL2NvbXBvbmVudC1wYWxldHRlL2NvbXBvbmVudC1wYWxldHRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixNQUFNLEVBQ04sTUFBTSxFQUNOLE1BQU0sR0FDUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBd0IsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGlCQUFpQixFQUEwQixNQUFNLDhDQUE4QyxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDJEQUEyRCxDQUFDO0FBQzdGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBVWxGLE1BQU0sT0FBTyx5QkFBeUI7SUFDbkIsUUFBUSxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3JDLGFBQWEsR0FBRyxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUM3QyxlQUFlLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFFdkUsaUJBQWlCLEdBQUcsTUFBTSxFQUFRLENBQUM7SUFFbkMsV0FBVyxHQUFHLE1BQU0sQ0FBUyxFQUFFLENBQUMsQ0FBQztJQUUxQyw4R0FBOEc7SUFDckcsVUFBVSxHQUFHLE1BQU0sQ0FBa0IsTUFBTSxDQUFDLENBQUM7SUFFdEQsbUNBQW1DO0lBQzFCLGtCQUFrQixHQUFHLE1BQU0sQ0FDbEMsSUFBSSxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FDMUQsQ0FBQztJQUVPLG1CQUFtQixHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBFLFlBQVksR0FBb0Q7UUFDdkUsS0FBSyxFQUFFLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO1FBQ3BELE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO1FBQ3RELE9BQU8sRUFBRSxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFO1FBQ3pELElBQUksRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFO1FBQy9DLE1BQU0sRUFBRSxFQUFFLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFO0tBQ3pELENBQUM7SUFFTyxrQkFBa0IsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1FBQzFDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLENBQUM7UUFFNUQsSUFBSSxRQUFRLEdBQUcsS0FBSztZQUNsQixDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxHQUFHLENBQUM7UUFFUiw2Q0FBNkM7UUFDN0MsSUFBSSxXQUFXLElBQUksV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMxQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO2dCQUMvQixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsUUFBUSxJQUFJLE9BQU8sQ0FBQztnQkFDbEMsT0FBTyxXQUFXLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFvQyxDQUFDO1FBQzNELEtBQUssTUFBTSxJQUFJLElBQUksUUFBUSxFQUFFLENBQUM7WUFDNUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLENBQUM7WUFDckMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEIsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN2RCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLE9BQU87Z0JBQ0wsSUFBSSxFQUFFLEdBQUc7Z0JBQ1QsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLElBQUksR0FBRztnQkFDekIsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLElBQUksS0FBSztnQkFDekIsS0FBSzthQUNOLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDdkMsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUMzQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7SUFFSCxrQkFBa0IsQ0FBQyxZQUFvQjtRQUNyQyx1RUFBdUU7UUFDdkUsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQztZQUM5QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsY0FBYyxDQUFDLFlBQW9CO1FBQ2pDLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDbkQsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMvQixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN2QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQ3pDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLElBQTRCO1FBQ3RDLFFBQVEsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2xCLEtBQUssT0FBTztnQkFDVixPQUFPLGFBQWEsQ0FBQztZQUN2QixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxNQUFNO2dCQUNULE9BQU8sVUFBVSxDQUFDO1lBQ3BCLEtBQUssUUFBUTtnQkFDWCxPQUFPLFFBQVEsQ0FBQztZQUNsQixLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxVQUFVLENBQUM7WUFDcEIsS0FBSyxRQUFRO2dCQUNYLE9BQU8sUUFBUSxDQUFDO1lBQ2xCLEtBQUssVUFBVTtnQkFDYixPQUFPLEtBQUssQ0FBQztZQUNmLEtBQUssT0FBTztnQkFDVixPQUFPLFdBQVcsQ0FBQztZQUNyQjtnQkFDRSxPQUFPLEtBQUssQ0FBQztRQUNqQixDQUFDO0lBQ0gsQ0FBQztJQUdELGlCQUFpQixDQUFDLElBQVk7UUFDNUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELFVBQVUsQ0FBQyxLQUFpQixFQUFFLElBQVk7UUFDeEMsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7d0dBaklVLHlCQUF5Qjs0RkFBekIseUJBQXlCLHNJQ3hCdEMseXZQQXNMVSxxOFhEbktFLFlBQVksOEJBQUUsV0FBVyw4bUJBQUUsY0FBYyx3dUNBQUUsZ0JBQWdCOzs0RkFLMUQseUJBQXlCO2tCQVJyQyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsQ0FBQyxtQkFHckQsdUJBQXVCLENBQUMsTUFBTTs7QUFzSWpELGlFQUFpRTtBQUNqRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBNkI7SUFDMUQsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUM7SUFDaEUsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQy9FLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7SUFDcEYsTUFBTSxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDO0lBQzlHLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsQ0FBQztJQUM1RSxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUM7SUFDM0UsVUFBVSxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDO0lBQ2hILEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDO0NBQzFGLENBQUM7QUFFRiwwRUFBMEU7QUFDMUUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLENBQVMsRUFBRSxDQUFTO0lBQ3RELElBQUksQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLENBQUMsQ0FBQztJQUN0QixJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFBRSxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNO1FBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRS9CLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDbkMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNuQyxNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hGLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBQ2xCLElBQUksR0FBRyxHQUFHLENBQUM7UUFDYixDQUFDO1FBQ0QsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN2QixDQUFDO0FBRUQsOEVBQThFO0FBQzlFLE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBYyxFQUFFLElBQVk7SUFDekQsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztRQUNuRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksbUJBQW1CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQ2pELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxrRkFBa0Y7QUFDbEYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBQTRCLEVBQUUsUUFBZ0I7SUFDL0UsSUFBSSxDQUFDLFFBQVE7UUFBRSxPQUFPLElBQUksQ0FBQztJQUMzQixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDOUIsSUFBSSxDQUFDLEtBQUs7UUFBRSxPQUFPLElBQUksQ0FBQztJQUV4QixNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7SUFFbEMseUNBQXlDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLEtBQUs7U0FDakIsT0FBTyxDQUFDLFdBQVcsRUFBRSxHQUFHLENBQUM7U0FDekIsS0FBSyxDQUFDLFFBQVEsQ0FBQztTQUNmLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUUvQixzRUFBc0U7SUFDdEUsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sQ0FDTCxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDOUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVELE1BQU0sUUFBUSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckQsTUFBTSxXQUFXLEdBQUc7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUU7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUU7UUFDM0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDOUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7UUFDekMsR0FBRyxRQUFRO0tBQ1osQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUYsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIGNvbXB1dGVkLFxuICBpbmplY3QsXG4gIG91dHB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENka0RyYWcsIENka0RyYWdEcm9wLCBEcmFnRHJvcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9kcmFnLWRyb3AnO1xuaW1wb3J0IHsgQ29tcG9uZW50UmVnaXN0cnksIFJlcG9ydGluZ0NvbXBvbmVudE1ldGEgfSBmcm9tICcuLi8uLi8uLi8uLi9jb3JlL3JlZ2lzdHJ5L2NvbXBvbmVudC1yZWdpc3RyeSc7XG5pbXBvcnQgeyBEZXNpZ25lclN0YXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2Rlc2lnbmVyLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnB0SWNvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL3ByaW1pdGl2ZXMvY29tcG9uZW50cy9pY29uL3JwdC1pY29uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSRVBPUlRJTkdfQ09ORklHIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29yZS90b2tlbnMvcmVwb3J0aW5nLWNvbmZpZy50b2tlbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3JwdC1jb21wb25lbnQtcGFsZXR0ZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBEcmFnRHJvcE1vZHVsZSwgUnB0SWNvbkNvbXBvbmVudF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb21wb25lbnQtcGFsZXR0ZS5jb21wb25lbnQuY3NzJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIENvbXBvbmVudFBhbGV0dGVDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHJlZ2lzdHJ5ID0gaW5qZWN0KENvbXBvbmVudFJlZ2lzdHJ5KTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXNpZ25lclN0YXRlID0gaW5qZWN0KERlc2lnbmVyU3RhdGVTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXBvcnRpbmdDb25maWcgPSBpbmplY3QoUkVQT1JUSU5HX0NPTkZJRywgeyBvcHRpb25hbDogdHJ1ZSB9KTtcblxuICByZWFkb25seSBjb2xsYXBzZVJlcXVlc3RlZCA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHJlYWRvbmx5IHNlYXJjaFF1ZXJ5ID0gc2lnbmFsPHN0cmluZz4oJycpO1xuXG4gIC8qKiBMYXlvdXQgdmlldyBtb2RlOiAnZ3JpZCcgKDItY29sdW1uIHNpZGUtYnktc2lkZSBncmlkKSBvciAnbGlzdCcgKGNvbXBhY3Qgcm93IGxpc3QpLiBEZWZhdWx0cyB0byAnZ3JpZCcuICovXG4gIHJlYWRvbmx5IGxheW91dE1vZGUgPSBzaWduYWw8J2dyaWQnIHwgJ2xpc3QnPignZ3JpZCcpO1xuXG4gIC8qKiBTZXQgb2YgZXhwYW5kZWQgY2F0ZWdvcnkgSURzICovXG4gIHJlYWRvbmx5IGV4cGFuZGVkQ2F0ZWdvcmllcyA9IHNpZ25hbDxTZXQ8c3RyaW5nPj4oXG4gICAgbmV3IFNldChbJ2lucHV0JywgJ2FjdGlvbicsICdkaXNwbGF5JywgJ2RhdGEnLCAnbGF5b3V0J10pXG4gICk7XG5cbiAgcmVhZG9ubHkgdG90YWxDb21wb25lbnRDb3VudCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucmVnaXN0cnkuZ2V0QWxsKCkubGVuZ3RoKTtcblxuICByZWFkb25seSBjYXRlZ29yeU1ldGE6IFJlY29yZDxzdHJpbmcsIHsgbGFiZWw6IHN0cmluZzsgaWNvbjogc3RyaW5nIH0+ID0ge1xuICAgIGlucHV0OiB7IGxhYmVsOiAnRm9ybSBJbnB1dHMnLCBpY29uOiAndGV4dC1maWVsZHMnIH0sXG4gICAgYWN0aW9uOiB7IGxhYmVsOiAnQWN0aW9uIEJ1dHRvbnMnLCBpY29uOiAnbGlnaHRuaW5nJyB9LFxuICAgIGRpc3BsYXk6IHsgbGFiZWw6ICdEaXNwbGF5ICYgTGFiZWxzJywgaWNvbjogJ2NoYXJ0LWJhcicgfSxcbiAgICBkYXRhOiB7IGxhYmVsOiAnRGF0YSAmIExvb2t1cHMnLCBpY29uOiAnZ3JpZCcgfSxcbiAgICBsYXlvdXQ6IHsgbGFiZWw6ICdMYXlvdXQgJiBDb250YWluZXJzJywgaWNvbjogJ2xheW91dCcgfSxcbiAgfTtcblxuICByZWFkb25seSBmaWx0ZXJlZENhdGVnb3JpZXMgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgYWxsID0gdGhpcy5yZWdpc3RyeS5nZXRBbGwoKTtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2VhcmNoUXVlcnkoKTtcbiAgICBjb25zdCBhbGxvd2VkQ2F0cyA9IHRoaXMucmVwb3J0aW5nQ29uZmlnPy5hbGxvd2VkQ2F0ZWdvcmllcztcblxuICAgIGxldCBmaWx0ZXJlZCA9IHF1ZXJ5XG4gICAgICA/IGFsbC5maWx0ZXIoKGMpID0+IG1hdGNoZXNTZWFyY2hRdWVyeShjLCBxdWVyeSkpXG4gICAgICA6IGFsbDtcblxuICAgIC8vIEZpbHRlciBieSBhbGxvd2VkIGNhdGVnb3JpZXMgaWYgY29uZmlndXJlZFxuICAgIGlmIChhbGxvd2VkQ2F0cyAmJiBhbGxvd2VkQ2F0cy5sZW5ndGggPiAwKSB7XG4gICAgICBmaWx0ZXJlZCA9IGZpbHRlcmVkLmZpbHRlcigoYykgPT4ge1xuICAgICAgICBjb25zdCBjYXQgPSBjLmNhdGVnb3J5IHx8ICdpbnB1dCc7XG4gICAgICAgIHJldHVybiBhbGxvd2VkQ2F0cy5pbmNsdWRlcyhjYXQpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIFJlcG9ydGluZ0NvbXBvbmVudE1ldGFbXT4oKTtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyZWQpIHtcbiAgICAgIGNvbnN0IGNhdCA9IGl0ZW0uY2F0ZWdvcnkgfHwgJ2lucHV0JztcbiAgICAgIGlmICghZ3JvdXBzLmhhcyhjYXQpKSB7XG4gICAgICAgIGdyb3Vwcy5zZXQoY2F0LCBbXSk7XG4gICAgICB9XG4gICAgICBncm91cHMuZ2V0KGNhdCkhLnB1c2goaXRlbSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIEFycmF5LmZyb20oZ3JvdXBzLmVudHJpZXMoKSkubWFwKChbY2F0LCBpdGVtc10pID0+IHtcbiAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmNhdGVnb3J5TWV0YVtjYXRdO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogY2F0LFxuICAgICAgICBsYWJlbDogbWV0YT8ubGFiZWwgPz8gY2F0LFxuICAgICAgICBpY29uOiBtZXRhPy5pY29uID8/ICdib3gnLFxuICAgICAgICBpdGVtcyxcbiAgICAgIH07XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGFsbEV4cGFuZGVkID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNhdHMgPSB0aGlzLmZpbHRlcmVkQ2F0ZWdvcmllcygpO1xuICAgIGlmIChjYXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IGV4cGFuZGVkID0gdGhpcy5leHBhbmRlZENhdGVnb3JpZXMoKTtcbiAgICByZXR1cm4gY2F0cy5ldmVyeSgoYykgPT4gZXhwYW5kZWQuaGFzKGMubmFtZSkpO1xuICB9KTtcblxuICBpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBXaGVuIHNlYXJjaGluZywgYXV0by1leHBhbmQgY2F0ZWdvcmllcyB0aGF0IGNvbnRhaW4gbWF0Y2hpbmcgcmVzdWx0c1xuICAgIGlmICh0aGlzLnNlYXJjaFF1ZXJ5KCkudHJpbSgpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzKCkuaGFzKGNhdGVnb3J5TmFtZSk7XG4gIH1cblxuICB0b2dnbGVDYXRlZ29yeShjYXRlZ29yeU5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGN1cnJlbnQgPSBuZXcgU2V0KHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzKCkpO1xuICAgIGlmIChjdXJyZW50LmhhcyhjYXRlZ29yeU5hbWUpKSB7XG4gICAgICBjdXJyZW50LmRlbGV0ZShjYXRlZ29yeU5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjdXJyZW50LmFkZChjYXRlZ29yeU5hbWUpO1xuICAgIH1cbiAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcy5zZXQoY3VycmVudCk7XG4gIH1cblxuICB0b2dnbGVBbGxDYXRlZ29yaWVzKCk6IHZvaWQge1xuICAgIGNvbnN0IGNhdHMgPSB0aGlzLmZpbHRlcmVkQ2F0ZWdvcmllcygpO1xuICAgIGlmICh0aGlzLmFsbEV4cGFuZGVkKCkpIHtcbiAgICAgIHRoaXMuZXhwYW5kZWRDYXRlZ29yaWVzLnNldChuZXcgU2V0KCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmV4cGFuZGVkQ2F0ZWdvcmllcy5zZXQobmV3IFNldChjYXRzLm1hcCgoYykgPT4gYy5uYW1lKSkpO1xuICAgIH1cbiAgfVxuXG4gIGdldEljb25OYW1lKGl0ZW06IFJlcG9ydGluZ0NvbXBvbmVudE1ldGEpOiBzdHJpbmcge1xuICAgIHN3aXRjaCAoaXRlbS50eXBlKSB7XG4gICAgICBjYXNlICdpbnB1dCc6XG4gICAgICAgIHJldHVybiAndGV4dC1maWVsZHMnO1xuICAgICAgY2FzZSAnZHJvcGRvd24nOlxuICAgICAgICByZXR1cm4gJ2Ryb3Bkb3duJztcbiAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICByZXR1cm4gJ2NhbGVuZGFyJztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIGNhc2UgJ2NoZWNrYm94JzpcbiAgICAgICAgcmV0dXJuICdjaGVja2JveCc7XG4gICAgICBjYXNlICdidXR0b24nOlxuICAgICAgICByZXR1cm4gJ2J1dHRvbic7XG4gICAgICBjYXNlICdrcGktY2FyZCc6XG4gICAgICAgIHJldHVybiAna3BpJztcbiAgICAgIGNhc2UgJ2NoYXJ0JzpcbiAgICAgICAgcmV0dXJuICdjaGFydC1iYXInO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICdib3gnO1xuICAgIH1cbiAgfVxuXG5cbiAgb25JdGVtRG91YmxlQ2xpY2sodHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXNpZ25lclN0YXRlLmFkZENvbXBvbmVudCh0eXBlKTtcbiAgfVxuXG4gIG9uQWRkQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQsIHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIHRoaXMuZGVzaWduZXJTdGF0ZS5hZGRDb21wb25lbnQodHlwZSk7XG4gIH1cbn1cblxuLyoqIERpY3Rpb25hcnkgb2Ygc3lub255bXMgZm9yIGNvbXBvbmVudCB0eXBlcyBhbmQgVUkgY29uY2VwdHMgKi9cbmV4cG9ydCBjb25zdCBDT01QT05FTlRfU1lOT05ZTVM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHtcbiAgaW5wdXQ6IFsndGV4dGJveCcsICd0ZXh0JywgJ2ZpZWxkJywgJ3N0cmluZycsICdlbnRyeScsICdwcm9tcHQnXSxcbiAgZHJvcGRvd246IFsnc2VsZWN0JywgJ2NvbWJvYm94JywgJ3BpY2tlcicsICdvcHRpb25zJywgJ2Nob2ljZScsICdtZW51JywgJ2xpc3QnXSxcbiAgZGF0ZTogWydjYWxlbmRhcicsICd0aW1lJywgJ2RhdGV0aW1lJywgJ2RheScsICdtb250aCcsICd5ZWFyJywgJ3NjaGVkdWxlJywgJ3BpY2tlciddLFxuICBudW1iZXI6IFsnbnVtZXJpYycsICdpbnRlZ2VyJywgJ2Zsb2F0JywgJ2Ftb3VudCcsICdjdXJyZW5jeScsICdwcmljZScsICdxdWFudGl0eScsICdjb3VudGVyJywgJ2RpZ2l0cycsICdzdW0nXSxcbiAgY2hlY2tib3g6IFsndG9nZ2xlJywgJ3N3aXRjaCcsICdib29sZWFuJywgJ2NoZWNrJywgJ3RpY2snLCAnZmxhZycsICd5ZXMvbm8nXSxcbiAgYnV0dG9uOiBbJ2FjdGlvbicsICdzdWJtaXQnLCAndHJpZ2dlcicsICdjbGljaycsICdjdGEnLCAncHJlc3MnLCAnZXhlY3V0ZSddLFxuICAna3BpLWNhcmQnOiBbJ2twaScsICdtZXRyaWMnLCAnc3RhdCcsICdjYXJkJywgJ2luZGljYXRvcicsICdzdW1tYXJ5JywgJ2ZpZ3VyZScsICdhbmFseXRpY3MnLCAnbWVhc3VyZScsICd0b3RhbCddLFxuICBjaGFydDogWydncmFwaCcsICdiYXInLCAnZG9udXQnLCAnbGluZScsICd2aXN1YWwnLCAnYW5hbHl0aWNzJywgJ3Bsb3QnLCAncGllJywgJ2RpYWdyYW0nXSxcbn07XG5cbi8qKiBDb21wdXRlIExldmVuc2h0ZWluIGRpc3RhbmNlIGJldHdlZW4gdHdvIHN0cmluZ3MgZm9yIHR5cG8gdG9sZXJhbmNlICovXG5leHBvcnQgZnVuY3Rpb24gbGV2ZW5zaHRlaW5EaXN0YW5jZShhOiBzdHJpbmcsIGI6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChhID09PSBiKSByZXR1cm4gMDtcbiAgaWYgKCFhLmxlbmd0aCkgcmV0dXJuIGIubGVuZ3RoO1xuICBpZiAoIWIubGVuZ3RoKSByZXR1cm4gYS5sZW5ndGg7XG5cbiAgY29uc3Qgcm93ID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogYi5sZW5ndGggKyAxIH0sIChfLCBpKSA9PiBpKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYS5sZW5ndGg7IGkrKykge1xuICAgIGxldCBwcmV2ID0gaTtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBiLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCB2YWwgPSBhW2kgLSAxXSA9PT0gYltqIC0gMV0gPyByb3dbaiAtIDFdIDogTWF0aC5taW4ocm93W2ogLSAxXSwgcm93W2pdLCBwcmV2KSArIDE7XG4gICAgICByb3dbaiAtIDFdID0gcHJldjtcbiAgICAgIHByZXYgPSB2YWw7XG4gICAgfVxuICAgIHJvd1tiLmxlbmd0aF0gPSBwcmV2O1xuICB9XG4gIHJldHVybiByb3dbYi5sZW5ndGhdO1xufVxuXG4vKiogQ2hlY2sgaWYgYSBzZWFyY2ggdGVybSBtYXRjaGVzIGEgdGFyZ2V0IHdvcmQgKHN1YnN0cmluZyBvciBtaXNzcGVsbGluZykgKi9cbmV4cG9ydCBmdW5jdGlvbiBmdXp6eU1hdGNoV29yZCh0YXJnZXQ6IHN0cmluZywgdGVybTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmICh0YXJnZXQuaW5jbHVkZXModGVybSkgfHwgdGVybS5pbmNsdWRlcyh0YXJnZXQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKHRlcm0ubGVuZ3RoID49IDQgJiYgdGFyZ2V0Lmxlbmd0aCA+PSA0KSB7XG4gICAgY29uc3QgbWF4RGlzdCA9IHRlcm0ubGVuZ3RoID49IDcgPyAyIDogMTtcbiAgICBpZiAobGV2ZW5zaHRlaW5EaXN0YW5jZSh0YXJnZXQsIHRlcm0pIDw9IG1heERpc3QpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKiBQdXJlIHByZWRpY2F0ZSB0byBjaGVjayBpZiBhIGNvbXBvbmVudCBtZXRhZGF0YSBpdGVtIG1hdGNoZXMgYSBzZWFyY2ggcXVlcnkgKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaGVzU2VhcmNoUXVlcnkoaXRlbTogUmVwb3J0aW5nQ29tcG9uZW50TWV0YSwgcmF3UXVlcnk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXJhd1F1ZXJ5KSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgY2xlYW4gPSByYXdRdWVyeS50cmltKCk7XG4gIGlmICghY2xlYW4pIHJldHVybiB0cnVlO1xuXG4gIGNvbnN0IGxvd2VyID0gY2xlYW4udG9Mb3dlckNhc2UoKTtcblxuICAvLyBUb2tlbml6ZSBieSBwdW5jdHVhdGlvbiBhbmQgd2hpdGVzcGFjZVxuICBjb25zdCB0b2tlbnMgPSBsb3dlclxuICAgIC5yZXBsYWNlKC9bXlxcd1xccy1dL2csICcgJylcbiAgICAuc3BsaXQoL1tcXHMtXSsvKVxuICAgIC5maWx0ZXIoKHQpID0+IHQubGVuZ3RoID4gMCk7XG5cbiAgLy8gSWYgcXVlcnkgY29uc2lzdHMgb25seSBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgKGUuZy4sIFwiJCQkXCIgb3IgXCIqKipcIilcbiAgaWYgKHRva2Vucy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXRlbS5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyKSB8fFxuICAgICAgaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXIpIHx8XG4gICAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXIpXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHN5bm9ueW1zID0gQ09NUE9ORU5UX1NZTk9OWU1TW2l0ZW0udHlwZV0gfHwgW107XG4gIGNvbnN0IHRhcmdldFdvcmRzID0gW1xuICAgIGl0ZW0uZGlzcGxheU5hbWUudG9Mb3dlckNhc2UoKSxcbiAgICBpdGVtLnR5cGUudG9Mb3dlckNhc2UoKSxcbiAgICBpdGVtLmNhdGVnb3J5LnRvTG93ZXJDYXNlKCksXG4gICAgLi4uaXRlbS5kaXNwbGF5TmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyksXG4gICAgLi4uaXRlbS50eXBlLnRvTG93ZXJDYXNlKCkuc3BsaXQoL1stX10rLyksXG4gICAgLi4uc3lub255bXMsXG4gIF07XG5cbiAgcmV0dXJuIHRva2Vucy5ldmVyeSgodG9rZW4pID0+IHRhcmdldFdvcmRzLnNvbWUoKHdvcmQpID0+IGZ1enp5TWF0Y2hXb3JkKHdvcmQsIHRva2VuKSkpO1xufVxuXG4iLCIgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtY29udGFpbmVyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwicGFsZXR0ZS1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtdGl0bGUtYXJlYVwiPlxuICAgICAgICAgIDxoMyBjbGFzcz1cInBhbGV0dGUtdGl0bGVcIj5Db21wb25lbnRzPC9oMz5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInBhbGV0dGUtY291bnRcIiBbdGl0bGVdPVwidG90YWxDb21wb25lbnRDb3VudCgpICsgJyBjb21wb25lbnRzIGF2YWlsYWJsZSdcIj5cbiAgICAgICAgICAgIHt7IHRvdGFsQ29tcG9uZW50Q291bnQoKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbGV0dGUtYWN0aW9uc1wiPlxuICAgICAgICAgIDwhLS0gVmlldyBNb2RlIFRvZ2dsZTogMi1Db2x1bW4gR3JpZCB2cyAxLUNvbHVtbiBMaXN0IC0tPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWV3LW1vZGUtdG9nZ2xlXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIlBhbGV0dGUgbGF5b3V0IHZpZXdcIj5cbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwidG9nZ2xlLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLXByZXNzZWRdPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwibGF5b3V0TW9kZS5zZXQoJ2dyaWQnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiMi1Db2x1bW4gR3JpZCBWaWV3XCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIjItQ29sdW1uIEdyaWQgVmlld1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiZ3JpZFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJ0b2dnbGUtYnRuXCJcbiAgICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtcHJlc3NlZF09XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgIChjbGljayk9XCJsYXlvdXRNb2RlLnNldCgnbGlzdCcpXCJcbiAgICAgICAgICAgICAgdGl0bGU9XCJDb21wYWN0IExpc3QgVmlld1wiXG4gICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb21wYWN0IExpc3QgVmlld1wiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwibGlzdFwiIFtzaXplXT1cIjEyXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtYWN0aW9uLWJ0biBpY29uLW9ubHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFsbENhdGVnb3JpZXMoKVwiXG4gICAgICAgICAgICBbdGl0bGVdPVwiYWxsRXhwYW5kZWQoKSA/ICdDb2xsYXBzZSBBbGwgU2VjdGlvbnMnIDogJ0V4cGFuZCBBbGwgU2VjdGlvbnMnXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYWxsRXhwYW5kZWQoKSA/ICdDb2xsYXBzZSBBbGwgU2VjdGlvbnMnIDogJ0V4cGFuZCBBbGwgU2VjdGlvbnMnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiYWxsRXhwYW5kZWQoKSA/ICdjaGV2cm9uLXVwJyA6ICdjaGV2cm9uLWRvd24nXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtYWN0aW9uLWJ0biBpY29uLW9ubHlcIlxuICAgICAgICAgICAgKGNsaWNrKT1cImNvbGxhcHNlUmVxdWVzdGVkLmVtaXQoKVwiXG4gICAgICAgICAgICB0aXRsZT1cIkNvbGxhcHNlIENvbXBvbmVudCBQYWxldHRlXCJcbiAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJDb2xsYXBzZSBDb21wb25lbnQgUGFsZXR0ZVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJjaGV2cm9uLWxlZnRcIiBbc2l6ZV09XCIxM1wiIC8+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gU2VhcmNoIEZpbHRlciAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYWxldHRlLXNlYXJjaC13cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtYm94XCI+XG4gICAgICAgICAgPHJwdC1pY29uIG5hbWU9XCJzZWFyY2hcIiBbc2l6ZV09XCIxM1wiIGNsYXNzPVwic2VhcmNoLXByZWZpeC1pY29uXCIgLz5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgIGNsYXNzPVwicGFsZXR0ZS1zZWFyY2gtaW5wdXRcIlxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWFyY2ggY29udHJvbHMuLi5cIlxuICAgICAgICAgICAgW25nTW9kZWxdPVwic2VhcmNoUXVlcnkoKVwiXG4gICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJzZWFyY2hRdWVyeS5zZXQoJGV2ZW50KVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiU2VhcmNoIGNvbXBvbmVudHNcIlxuICAgICAgICAgIC8+XG4gICAgICAgICAgQGlmIChzZWFyY2hRdWVyeSgpKSB7XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImNsZWFyLXNlYXJjaC1idG5cIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VhcmNoUXVlcnkuc2V0KCcnKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiQ2xlYXIgc2VhcmNoXCJcbiAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIkNsZWFyIHNlYXJjaFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2xvc2VcIiBbc2l6ZV09XCIxMlwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUGFsZXR0ZSBDYXRlZ29yaWVzIERyb3AgTGlzdCB3aXRoIEFjY29yZGlvbiAtLT5cbiAgICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJwYWxldHRlLXNjcm9sbC1hcmVhXCJcbiAgICAgICAgY2RrRHJvcExpc3RcbiAgICAgICAgaWQ9XCJkZXNpZ25lci1wYWxldHRlLWRyb3AtbGlzdFwiXG4gICAgICAgIFtjZGtEcm9wTGlzdFNvcnRpbmdEaXNhYmxlZF09XCJ0cnVlXCJcbiAgICAgID5cbiAgICAgICAgQGZvciAoY2F0ZWdvcnkgb2YgZmlsdGVyZWRDYXRlZ29yaWVzKCk7IHRyYWNrIGNhdGVnb3J5Lm5hbWUpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWl0ZW1cIiBbY2xhc3MuaXMtZXhwYW5kZWRdPVwiaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCI+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICBjbGFzcz1cImFjY29yZGlvbi1oZWFkZXJcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlQ2F0ZWdvcnkoY2F0ZWdvcnkubmFtZSlcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWV4cGFuZGVkXT1cImlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtY29udHJvbHNdPVwiJ3BhbGV0dGUtc2VjdGlvbi0nICsgY2F0ZWdvcnkubmFtZVwiXG4gICAgICAgICAgICAgIFtpZF09XCIncGFsZXR0ZS1oZWFkZXItJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWhlYWRlci1sZWZ0XCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJhY2NvcmRpb24tY2hldnJvblwiIFtjbGFzcy5yb3RhdGVkXT1cIiFpc0NhdGVnb3J5RXhwYW5kZWQoY2F0ZWdvcnkubmFtZSlcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwiY2hldnJvbi1kb3duXCIgW3NpemVdPVwiMTJcIiAvPlxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0ZWdvcnktaWNvbi1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJjYXRlZ29yeS5pY29uXCIgW3NpemVdPVwiMTNcIiAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2F0ZWdvcnktbmFtZVwiPnt7IGNhdGVnb3J5LmxhYmVsIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRlZ29yeS1iYWRnZVwiPnt7IGNhdGVnb3J5Lml0ZW1zLmxlbmd0aCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgIGNsYXNzPVwiYWNjb3JkaW9uLWNvbGxhcHNlLXdyYXBwZXJcIlxuICAgICAgICAgICAgICBbY2xhc3MuZXhwYW5kZWRdPVwiaXNDYXRlZ29yeUV4cGFuZGVkKGNhdGVnb3J5Lm5hbWUpXCJcbiAgICAgICAgICAgICAgW2F0dHIuYXJpYS1oaWRkZW5dPVwiIWlzQ2F0ZWdvcnlFeHBhbmRlZChjYXRlZ29yeS5uYW1lKVwiXG4gICAgICAgICAgICAgIFtpZF09XCIncGFsZXR0ZS1zZWN0aW9uLScgKyBjYXRlZ29yeS5uYW1lXCJcbiAgICAgICAgICAgICAgcm9sZT1cInJlZ2lvblwiXG4gICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCIncGFsZXR0ZS1oZWFkZXItJyArIGNhdGVnb3J5Lm5hbWVcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWNjb3JkaW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNhdGVnb3J5LWl0ZW1zXCJcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5ncmlkLXZpZXddPVwibGF5b3V0TW9kZSgpID09PSAnZ3JpZCdcIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLmxpc3Qtdmlld109XCJsYXlvdXRNb2RlKCkgPT09ICdsaXN0J1wiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgQGZvciAoaXRlbSBvZiBjYXRlZ29yeS5pdGVtczsgdHJhY2sgaXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInBhbGV0dGUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCJcbiAgICAgICAgICAgICAgICAgICAgICByb2xlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidBZGQgJyArIGl0ZW0uZGlzcGxheU5hbWUgKyAnIHRvIGNhbnZhcydcIlxuICAgICAgICAgICAgICAgICAgICAgIGNka0RyYWdcbiAgICAgICAgICAgICAgICAgICAgICBbY2RrRHJhZ0RhdGFdPVwiaXRlbS50eXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoZGJsY2xpY2spPVwib25JdGVtRG91YmxlQ2xpY2soaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib25JdGVtRG91YmxlQ2xpY2soaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib25JdGVtRG91YmxlQ2xpY2soaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgW3RpdGxlXT1cIidEcmFnIG9udG8gY2FudmFzIG9yIGRvdWJsZS1jbGljayB0byBhZGQgJyArIGl0ZW0uZGlzcGxheU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taWNvbi1ib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxycHQtaWNvbiBbbmFtZV09XCJnZXRJY29uTmFtZShpdGVtKVwiIFtzaXplXT1cImxheW91dE1vZGUoKSA9PT0gJ2dyaWQnID8gMTYgOiAxNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIml0ZW0taW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLXRpdGxlXCIgW3RpdGxlXT1cIml0ZW0uZGlzcGxheU5hbWVcIj57eyBpdGVtLmRpc3BsYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJpdGVtLXR5cGUtY29kZVwiPnt7IGl0ZW0udHlwZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaXRlbS1hZGQtYnRuXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbkFkZENsaWNrKCRldmVudCwgaXRlbS50eXBlKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9XCJBZGQgdG8gY2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9XCJBZGQgdG8gY2FudmFzXCJcbiAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gbmFtZT1cInBsdXNcIiBbc2l6ZV09XCJsYXlvdXRNb2RlKCkgPT09ICdncmlkJyA/IDEyIDogMTNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgPCEtLSBDREsgRHJhZyBQbGFjZWhvbGRlciAvIFByZXZpZXcgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiAqY2RrRHJhZ1BsYWNlaG9sZGVyIGNsYXNzPVwiZHJhZy1wbGFjZWhvbGRlclwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgKmNka0RyYWdQcmV2aWV3IGNsYXNzPVwiZHJhZy1wcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cnB0LWljb24gW25hbWVdPVwiZ2V0SWNvbk5hbWUoaXRlbSlcIiBbc2l6ZV09XCIxNlwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57eyBpdGVtLmRpc3BsYXlOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZiAoZmlsdGVyZWRDYXRlZ29yaWVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXJlc3VsdHNcIj5cbiAgICAgICAgICAgIDxycHQtaWNvbiBuYW1lPVwic2VhcmNoXCIgW3NpemVdPVwiMjBcIiBjbGFzcz1cIm5vLXJlc3VsdHMtaWNvblwiIC8+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm5vLXJlc3VsdHMtdGV4dFwiPk5vIGNvbXBvbmVudHMgbWF0Y2hpbmcgXCJ7eyBzZWFyY2hRdWVyeSgpIH19XCI8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm5vLXJlc3VsdHMtY2xlYXItYnRuXCIgKGNsaWNrKT1cInNlYXJjaFF1ZXJ5LnNldCgnJylcIj5cbiAgICAgICAgICAgICAgQ2xlYXIgU2VhcmNoXG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+Il19