@esfaenza/es-charts 15.2.7 → 16.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 (102) hide show
  1. package/{esm2020 → esm2022}/esfaenza-es-charts.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/adapters/BaseAdapter.mjs +50 -50
  3. package/{esm2020 → esm2022}/lib/adapters/IBaseAdapter.mjs +1 -1
  4. package/{esm2020 → esm2022}/lib/components/base/base-chart.component.mjs +350 -350
  5. package/{esm2020 → esm2022}/lib/components/chart-pager/chart-pager.component.mjs +89 -89
  6. package/{esm2020 → esm2022}/lib/components/specializations/es-area-chart.component.mjs +77 -77
  7. package/{esm2020 → esm2022}/lib/components/specializations/es-chart.component.mjs +122 -122
  8. package/{esm2020 → esm2022}/lib/components/specializations/es-line-chart.component.mjs +112 -112
  9. package/{esm2020 → esm2022}/lib/components/specializations/es-pie-chart.component.mjs +98 -98
  10. package/{esm2020 → esm2022}/lib/components/specializations/es-vertical-2d-chart.component.mjs +95 -95
  11. package/{esm2020 → esm2022}/lib/components/specializations/es-vertical-chart.component.mjs +92 -92
  12. package/{esm2020 → esm2022}/lib/components/specializations/es-vertical-stacked-chart.component.mjs +92 -92
  13. package/{esm2020 → esm2022}/lib/es-charts.module.mjs +67 -67
  14. package/{esm2020 → esm2022}/lib/models/EsChaartsModuleConfig.mjs +5 -5
  15. package/{esm2020 → esm2022}/lib/models/core/ChartDispatcher.mjs +91 -91
  16. package/{esm2020 → esm2022}/lib/models/core/ChartLoader.mjs +212 -212
  17. package/{esm2020 → esm2022}/lib/models/core/ChartThemes.mjs +60 -60
  18. package/{esm2020 → esm2022}/lib/models/data/AreaChartData.mjs +15 -15
  19. package/{esm2020 → esm2022}/lib/models/data/LineChartData.mjs +15 -15
  20. package/{esm2020 → esm2022}/lib/models/data/PagedChartData.mjs +19 -19
  21. package/{esm2020 → esm2022}/lib/models/data/PieChartData.mjs +13 -13
  22. package/{esm2020 → esm2022}/lib/models/data/Vertical2DChartData.mjs +15 -15
  23. package/{esm2020 → esm2022}/lib/models/data/VerticalChartData.mjs +13 -13
  24. package/{esm2020 → esm2022}/lib/models/data/VerticalStackedChartData.mjs +13 -13
  25. package/{esm2020 → esm2022}/lib/models/data/base/DateValue.mjs +10 -10
  26. package/{esm2020 → esm2022}/lib/models/data/base/KeyValue.mjs +10 -10
  27. package/{esm2020 → esm2022}/lib/models/data/base/KeyValueColor.mjs +12 -12
  28. package/{esm2020 → esm2022}/lib/models/data/base/Limit.mjs +15 -15
  29. package/{esm2020 → esm2022}/lib/models/data/base/LineSerie.mjs +27 -27
  30. package/{esm2020 → esm2022}/lib/models/settings/AreaChartSettings.mjs +10 -10
  31. package/{esm2020 → esm2022}/lib/models/settings/LineChartSettings.mjs +10 -10
  32. package/{esm2020 → esm2022}/lib/models/settings/PieChartSettings.mjs +6 -6
  33. package/{esm2020 → esm2022}/lib/models/settings/Vertical2DChartSettings.mjs +10 -10
  34. package/{esm2020 → esm2022}/lib/models/settings/VerticalChartSettings.mjs +10 -10
  35. package/{esm2020 → esm2022}/lib/models/settings/VerticalStackedChartSettings.mjs +10 -10
  36. package/{esm2020 → esm2022}/lib/models/settings/base/BaseInterval.mjs +5 -5
  37. package/{esm2020 → esm2022}/lib/models/settings/base/BaseSettings.mjs +5 -5
  38. package/{esm2020 → esm2022}/lib/models/settings/base/LegendPad.mjs +5 -5
  39. package/esm2022/lib/services/AreaChartService.mjs +157 -0
  40. package/esm2022/lib/services/LineChartService.mjs +392 -0
  41. package/{esm2020 → esm2022}/lib/services/PieChartService.mjs +113 -113
  42. package/{esm2020 → esm2022}/lib/services/Vertical2DChartService.mjs +162 -162
  43. package/{esm2020 → esm2022}/lib/services/VerticalChartService.mjs +113 -113
  44. package/{esm2020 → esm2022}/lib/services/VerticalStackedChartService.mjs +126 -126
  45. package/{esm2020 → esm2022}/lib/services/base/IBaseService.mjs +1 -1
  46. package/{esm2020 → esm2022}/lib/tokens.mjs +13 -13
  47. package/{esm2020 → esm2022}/public-api.mjs +38 -38
  48. package/{fesm2020 → fesm2022}/esfaenza-es-charts.mjs +2728 -2688
  49. package/fesm2022/esfaenza-es-charts.mjs.map +1 -0
  50. package/index.d.ts +5 -5
  51. package/lib/adapters/BaseAdapter.d.ts +40 -40
  52. package/lib/adapters/IBaseAdapter.d.ts +35 -35
  53. package/lib/components/base/base-chart.component.d.ts +304 -304
  54. package/lib/components/chart-pager/chart-pager.component.d.ts +70 -70
  55. package/lib/components/specializations/es-area-chart.component.d.ts +53 -53
  56. package/lib/components/specializations/es-chart.component.d.ts +71 -71
  57. package/lib/components/specializations/es-line-chart.component.d.ts +112 -112
  58. package/lib/components/specializations/es-pie-chart.component.d.ts +81 -81
  59. package/lib/components/specializations/es-vertical-2d-chart.component.d.ts +79 -79
  60. package/lib/components/specializations/es-vertical-chart.component.d.ts +74 -74
  61. package/lib/components/specializations/es-vertical-stacked-chart.component.d.ts +74 -74
  62. package/lib/es-charts.module.d.ts +18 -18
  63. package/lib/models/EsChaartsModuleConfig.d.ts +24 -24
  64. package/lib/models/core/ChartDispatcher.d.ts +46 -46
  65. package/lib/models/core/ChartLoader.d.ts +92 -92
  66. package/lib/models/core/ChartThemes.d.ts +23 -23
  67. package/lib/models/data/AreaChartData.d.ts +22 -22
  68. package/lib/models/data/LineChartData.d.ts +16 -16
  69. package/lib/models/data/PagedChartData.d.ts +23 -23
  70. package/lib/models/data/PieChartData.d.ts +13 -13
  71. package/lib/models/data/Vertical2DChartData.d.ts +27 -27
  72. package/lib/models/data/VerticalChartData.d.ts +13 -13
  73. package/lib/models/data/VerticalStackedChartData.d.ts +21 -21
  74. package/lib/models/data/base/DateValue.d.ts +9 -9
  75. package/lib/models/data/base/KeyValue.d.ts +9 -9
  76. package/lib/models/data/base/KeyValueColor.d.ts +11 -11
  77. package/lib/models/data/base/Limit.d.ts +14 -14
  78. package/lib/models/data/base/LineSerie.d.ts +28 -28
  79. package/lib/models/settings/AreaChartSettings.d.ts +10 -10
  80. package/lib/models/settings/LineChartSettings.d.ts +67 -67
  81. package/lib/models/settings/PieChartSettings.d.ts +34 -34
  82. package/lib/models/settings/Vertical2DChartSettings.d.ts +36 -36
  83. package/lib/models/settings/VerticalChartSettings.d.ts +31 -31
  84. package/lib/models/settings/VerticalStackedChartSettings.d.ts +31 -31
  85. package/lib/models/settings/base/BaseInterval.d.ts +13 -13
  86. package/lib/models/settings/base/BaseSettings.d.ts +67 -67
  87. package/lib/models/settings/base/LegendPad.d.ts +21 -21
  88. package/lib/services/AreaChartService.d.ts +32 -31
  89. package/lib/services/LineChartService.d.ts +48 -47
  90. package/lib/services/PieChartService.d.ts +27 -27
  91. package/lib/services/Vertical2DChartService.d.ts +39 -39
  92. package/lib/services/VerticalChartService.d.ts +33 -33
  93. package/lib/services/VerticalStackedChartService.d.ts +35 -35
  94. package/lib/services/base/IBaseService.d.ts +38 -38
  95. package/lib/tokens.d.ts +13 -13
  96. package/package.json +11 -17
  97. package/public-api.d.ts +35 -35
  98. package/esm2020/lib/services/AreaChartService.mjs +0 -137
  99. package/esm2020/lib/services/LineChartService.mjs +0 -372
  100. package/fesm2015/esfaenza-es-charts.mjs +0 -2829
  101. package/fesm2015/esfaenza-es-charts.mjs.map +0 -1
  102. package/fesm2020/esfaenza-es-charts.mjs.map +0 -1
@@ -1,122 +1,122 @@
1
- import { Component, Input, Inject, PLATFORM_ID, ChangeDetectionStrategy } from '@angular/core';
2
- import { ESC_ANIMATIONS, ESC_THEME, ESC_DEBUG_MODE } from '../../tokens';
3
- import { BaseChartComponent } from '../base/base-chart.component';
4
- // Services
5
- import { LineChartService } from "../../services/LineChartService";
6
- import { PieChartService } from "../../services/PieChartService";
7
- import { VerticalChartService } from "../../services/VerticalChartService";
8
- import { Vertical2DChartService } from "../../services/Vertical2DChartService";
9
- import { VerticalStackedChartService } from "../../services/VerticalStackedChartService";
10
- import { AreaChartService } from "../../services/AreaChartService";
11
- // Settings
12
- import { PieChartSettings } from "../../models/settings/PieChartSettings";
13
- import { AreaChartSettings } from "../../models/settings/AreaChartSettings";
14
- import { VerticalChartSettings } from "../../models/settings/VerticalChartSettings";
15
- import { Vertical2DChartSettings } from "../../models/settings/Vertical2DChartSettings";
16
- import { VerticalStackedChartSettings } from "../../models/settings/VerticalStackedChartSettings";
17
- import { LineChartSettings } from "../../models/settings/LineChartSettings";
18
- import * as i0 from "@angular/core";
19
- import * as i1 from "../../models/core/ChartLoader";
20
- import * as i2 from "../../models/core/ChartDispatcher";
21
- import * as i3 from "@esfaenza/extensions";
22
- import * as i4 from "../../adapters/BaseAdapter";
23
- import * as i5 from "@esfaenza/localizations";
24
- import * as i6 from "@angular/common";
25
- import * as i7 from "../chart-pager/chart-pager.component";
26
- /**
27
- * Componente specifico per la graficazione di un qualsiasi tipo di grafico.
28
- *
29
- * Si basa sul tipo specificato dalla proprietà **Type**
30
- */
31
- export class EsChartComponent extends BaseChartComponent {
32
- /**
33
- * @ignore
34
- */
35
- constructor(el, ChartLoader, ChartDispatcher, dateService, adapter, zone, platformId, ESC_DEBUG_MODE, ESC_ANIMATIONS, ESC_THEME, lc) {
36
- super(el, platformId, zone, ChartLoader, ChartDispatcher, ESC_DEBUG_MODE, ESC_ANIMATIONS, lc.Locale, ESC_THEME);
37
- this.dateService = dateService;
38
- this.adapter = adapter;
39
- }
40
- /**
41
- * Ottiene le proprietà specifiche per questa tipologia di grafico per cui serve rigraficare
42
- */
43
- getSpecificPropertiesToCheck() {
44
- return ["Data", "Type"];
45
- }
46
- /**
47
- * Ottiene i Settings (Ereditati dalla classe base, quindi del tipo generico **BaseSettings**) castati al tipo specifico per questo grafico
48
- *
49
- * @returns {PieChartSettings | AreaChartSettings | LineChartSettings | VerticalChartSettings | Vertical2DChartSettings | VerticalStackedChartSettings} Settings castati al tipo giusto
50
- */
51
- getCastedSettings() {
52
- switch (this.Type) {
53
- case 'pie':
54
- return (this.Settings ?? new PieChartSettings());
55
- case 'area':
56
- return (this.Settings ?? new AreaChartSettings());
57
- case 'line':
58
- return (this.Settings ?? new LineChartSettings());
59
- case 'vertical':
60
- return (this.Settings ?? new VerticalChartSettings());
61
- case 'vertical-2d':
62
- return (this.Settings ?? new Vertical2DChartSettings());
63
- case 'vertical-stacked':
64
- return (this.Settings ?? new VerticalStackedChartSettings());
65
- }
66
- }
67
- /**
68
- * Integra i Settings base con tutti gli Input specifici di questo grafico, dando priorità ai Settings se definiti
69
- *
70
- * @param {PieChartSettings | AreaChartSettings | LineChartSettings | VerticalChartSettings | Vertical2DChartSettings | VerticalStackedChartSettings} settingsCasted Settings castati al tipo giusto
71
- */
72
- fillSpecificSettings(settingsCasted) {
73
- // Nope. Se si usa l'es-chart si danno i settings con l'oggetto
74
- }
75
- /**
76
- * Effettua il rendering di questo grafico in base ai Settings
77
- *
78
- * @param {PieChartSettings | AreaChartSettings | LineChartSettings | VerticalChartSettings | Vertical2DChartSettings | VerticalStackedChartSettings} settingsCasted Impostazioni di graficazione
79
- * @returns {PieChartService | AreaChartService | LineChartService | VerticalChartService | Vertical2DChartService | VerticalStackedChartService} La service utilizzata per il rendering nello stato subito successivo al rendering effettuato
80
- */
81
- graphicate(settings) {
82
- switch (this.Type) {
83
- case 'pie':
84
- return new PieChartService(this.adapter).graphicate(this.Data, settings);
85
- case 'area':
86
- return new AreaChartService(this.adapter).graphicate(this.Data, settings);
87
- case 'line':
88
- return new LineChartService(this.adapter, this.dateService).graphicate(this.Data, settings);
89
- case 'vertical':
90
- return new VerticalChartService(this.adapter).graphicate(this.Data, settings);
91
- case 'vertical-2d':
92
- return new Vertical2DChartService(this.adapter).graphicate(this.Data, settings);
93
- case 'vertical-stacked':
94
- return new VerticalStackedChartService(this.adapter).graphicate(this.Data, settings);
95
- }
96
- }
97
- }
98
- EsChartComponentfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsChartComponent, deps: [{ token: i0.ElementRef }, { token: i1.ChartLoader }, { token: i2.ChartDispatcher }, { token: i3.DateService }, { token: i4.BaseAdapter }, { token: i0.NgZone }, { token: PLATFORM_ID }, { token: ESC_DEBUG_MODE }, { token: ESC_ANIMATIONS }, { token: ESC_THEME }, { token: i5.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
99
- EsChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: EsChartComponent, selector: "es-chart", inputs: { Type: "Type", Data: "Data", DataArray: "DataArray" }, usesInheritance: true, ngImport: i0, template: "<chart-pager *ngIf=\"isPaged\" (onPageChange)=\"changePage($event)\" [Items]=\"DataArray\" [Dtos]=\"DataDtos\" [StartIndex]=\"DataDtoStartIndex\"\r\n [BrowseDelayMs]=\"BrowseDelayMs\">\r\n <ng-template #header_inner let-headerItem>\r\n <ng-container *ngTemplateOutlet=\"header_tr; context : {$implicit: headerItem}\"></ng-container>\r\n </ng-template>\r\n</chart-pager>\r\n\r\n<ng-container *ngIf=\"loadingChart && loading_template\">\r\n <div style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <ng-container *ngTemplateOutlet=\"loading_template\"></ng-container>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"loadingChart && !loading_template\">\r\n <div class=\"esc-loading-overlay\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <p class=\"label\">Loading....</p>\r\n </div>\r\n</ng-container>\r\n\r\n<div [class.hide-block]=\"loadingChart\" id=\"{{name}}\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\"></div>", styles: [".esc-loading-overlay{background:rgba(153,153,153,.6);text-transform:uppercase;font-size:30px;font-weight:700;color:#fff;text-align:center;font-family:monospace}.esc-loading-overlay .label{margin:0;padding-top:7%}.hide-block{display:none}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.PageChartSelector, selector: "chart-pager", inputs: ["Items", "Dtos", "BrowseDelayMs", "StartIndex"], outputs: ["onPageChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
100
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: EsChartComponent, decorators: [{
101
- type: Component,
102
- args: [{ selector: 'es-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<chart-pager *ngIf=\"isPaged\" (onPageChange)=\"changePage($event)\" [Items]=\"DataArray\" [Dtos]=\"DataDtos\" [StartIndex]=\"DataDtoStartIndex\"\r\n [BrowseDelayMs]=\"BrowseDelayMs\">\r\n <ng-template #header_inner let-headerItem>\r\n <ng-container *ngTemplateOutlet=\"header_tr; context : {$implicit: headerItem}\"></ng-container>\r\n </ng-template>\r\n</chart-pager>\r\n\r\n<ng-container *ngIf=\"loadingChart && loading_template\">\r\n <div style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <ng-container *ngTemplateOutlet=\"loading_template\"></ng-container>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"loadingChart && !loading_template\">\r\n <div class=\"esc-loading-overlay\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <p class=\"label\">Loading....</p>\r\n </div>\r\n</ng-container>\r\n\r\n<div [class.hide-block]=\"loadingChart\" id=\"{{name}}\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\"></div>", styles: [".esc-loading-overlay{background:rgba(153,153,153,.6);text-transform:uppercase;font-size:30px;font-weight:700;color:#fff;text-align:center;font-family:monospace}.esc-loading-overlay .label{margin:0;padding-top:7%}.hide-block{display:none}\n"] }]
103
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ChartLoader }, { type: i2.ChartDispatcher }, { type: i3.DateService }, { type: i4.BaseAdapter }, { type: i0.NgZone }, { type: Object, decorators: [{
104
- type: Inject,
105
- args: [PLATFORM_ID]
106
- }] }, { type: undefined, decorators: [{
107
- type: Inject,
108
- args: [ESC_DEBUG_MODE]
109
- }] }, { type: undefined, decorators: [{
110
- type: Inject,
111
- args: [ESC_ANIMATIONS]
112
- }] }, { type: undefined, decorators: [{
113
- type: Inject,
114
- args: [ESC_THEME]
115
- }] }, { type: i5.LocalizationService }]; }, propDecorators: { Type: [{
116
- type: Input
117
- }], Data: [{
118
- type: Input
119
- }], DataArray: [{
120
- type: Input
121
- }] } });
122
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXMtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9zcGVjaWFsaXphdGlvbnMvZXMtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Jhc2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBVSx1QkFBdUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUtuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFhbEUsV0FBVztBQUNYLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxXQUFXO0FBQ1gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sK0NBQStDLENBQUM7QUFDeEYsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0sb0RBQW9ELENBQUM7QUFDbEcsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7OztBQUc1RTs7OztHQUlHO0FBT0gsTUFBTSxPQUFPLGdCQUFpQixTQUFRLGtCQUFrQjtJQXVCdEQ7O09BRUc7SUFDSCxZQUFZLEVBQWMsRUFBRSxXQUF3QixFQUFFLGVBQWdDLEVBQVUsV0FBd0IsRUFBVSxPQUFvQixFQUFFLElBQVksRUFDN0ksVUFBa0IsRUFDZixjQUF1QixFQUN2QixjQUF1QixFQUM1QixTQUFpQixFQUNwQyxFQUF1QjtRQUN2QixLQUFLLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFObEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFBVSxZQUFPLEdBQVAsT0FBTyxDQUFhO0lBT3RKLENBQUM7SUFFRDs7T0FFRztJQUNILDRCQUE0QjtRQUMxQixPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsaUJBQWlCO1FBQ2YsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2pCLEtBQUssS0FBSztnQkFDUixPQUF5QixDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxnQkFBZ0IsRUFBRSxDQUFDLENBQUM7WUFDckUsS0FBSyxNQUFNO2dCQUNULE9BQTBCLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLGlCQUFpQixFQUFFLENBQUMsQ0FBQztZQUN2RSxLQUFLLE1BQU07Z0JBQ1QsT0FBMEIsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZFLEtBQUssVUFBVTtnQkFDYixPQUE4QixDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxxQkFBcUIsRUFBRSxDQUFDLENBQUM7WUFDL0UsS0FBSyxhQUFhO2dCQUNoQixPQUFnQyxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7WUFDbkYsS0FBSyxrQkFBa0I7Z0JBQ3JCLE9BQXFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLDRCQUE0QixFQUFFLENBQUMsQ0FBQztTQUM5RjtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsb0JBQW9CLENBQUMsY0FBeUo7UUFDNUssK0RBQStEO0lBQ2pFLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFVBQVUsQ0FBQyxRQUFtSjtRQUM1SixRQUFRLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDakIsS0FBSyxLQUFLO2dCQUNSLE9BQU8sSUFBSSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBZSxJQUFJLENBQUMsSUFBSSxFQUFvQixRQUFRLENBQUMsQ0FBQztZQUMzRyxLQUFLLE1BQU07Z0JBQ1QsT0FBTyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQWdCLElBQUksQ0FBQyxJQUFJLEVBQXFCLFFBQVEsQ0FBQyxDQUFDO1lBQzlHLEtBQUssTUFBTTtnQkFDVCxPQUFPLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFnQixJQUFJLENBQUMsSUFBSSxFQUFxQixRQUFRLENBQUMsQ0FBQztZQUNoSSxLQUFLLFVBQVU7Z0JBQ2IsT0FBTyxJQUFJLG9CQUFvQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQW9CLElBQUksQ0FBQyxJQUFJLEVBQXlCLFFBQVEsQ0FBQyxDQUFDO1lBQzFILEtBQUssYUFBYTtnQkFDaEIsT0FBTyxJQUFJLHNCQUFzQixDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxVQUFVLENBQXNCLElBQUksQ0FBQyxJQUFJLEVBQTJCLFFBQVEsQ0FBQyxDQUFDO1lBQ2hJLEtBQUssa0JBQWtCO2dCQUNyQixPQUFPLElBQUksMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBMkIsSUFBSSxDQUFDLElBQUksRUFBZ0MsUUFBUSxDQUFDLENBQUM7U0FDaEo7SUFDSCxDQUFDOzs2R0E5RlUsZ0JBQWdCLGtMQTJCakIsV0FBVyxhQUNYLGNBQWMsYUFDZCxjQUFjLGFBQ2QsU0FBUztpR0E5QlIsZ0JBQWdCLHVJQ2hEN0Isd2pDQW1Cd0k7MkZENkIzSCxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0UsVUFBVSxtQkFHSCx1QkFBdUIsQ0FBQyxNQUFNOzswQkE2QjVDLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsY0FBYzs7MEJBQ3JCLE1BQU07MkJBQUMsY0FBYzs7MEJBQ3JCLE1BQU07MkJBQUMsU0FBUzs4RUF6QlYsSUFBSTtzQkFBWixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgSW5qZWN0LCBQTEFURk9STV9JRCwgTmdab25lLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL2xvY2FsaXphdGlvbnMnO1xyXG5cclxuaW1wb3J0IHsgQmFzZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9CYXNlQWRhcHRlcic7XHJcbmltcG9ydCB7IEVTQ19BTklNQVRJT05TLCBFU0NfVEhFTUUsIEVTQ19ERUJVR19NT0RFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbmltcG9ydCB7IEJhc2VDaGFydENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGFydERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvcmUvQ2hhcnREaXNwYXRjaGVyXCI7XHJcbmltcG9ydCB7IENoYXJ0TG9hZGVyIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb3JlL0NoYXJ0TG9hZGVyXCI7XHJcblxyXG4vLyBEYXRhXHJcbmltcG9ydCB7IExpbmVDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvTGluZUNoYXJ0RGF0YVwiO1xyXG5pbXBvcnQgeyBQaWVDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvUGllQ2hhcnREYXRhXCI7XHJcbmltcG9ydCB7IFZlcnRpY2FsQ2hhcnREYXRhIH0gZnJvbSBcIi4uLy4uL21vZGVscy9kYXRhL1ZlcnRpY2FsQ2hhcnREYXRhXCI7XHJcbmltcG9ydCB7IFZlcnRpY2FsMkRDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvVmVydGljYWwyRENoYXJ0RGF0YVwiO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbFN0YWNrZWRDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvVmVydGljYWxTdGFja2VkQ2hhcnREYXRhXCI7XHJcbmltcG9ydCB7IEFyZWFDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvQXJlYUNoYXJ0RGF0YVwiO1xyXG5pbXBvcnQgeyBQYWdlZENoYXJ0RGF0YSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGF0YS9QYWdlZENoYXJ0RGF0YVwiO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgTGluZUNoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9MaW5lQ2hhcnRTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBpZUNoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9QaWVDaGFydFNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmVydGljYWxDaGFydFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvVmVydGljYWxDaGFydFNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmVydGljYWwyRENoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9WZXJ0aWNhbDJEQ2hhcnRTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9WZXJ0aWNhbFN0YWNrZWRDaGFydFNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQXJlYUNoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9BcmVhQ2hhcnRTZXJ2aWNlXCI7XHJcblxyXG4vLyBTZXR0aW5nc1xyXG5pbXBvcnQgeyBQaWVDaGFydFNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zZXR0aW5ncy9QaWVDaGFydFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IEFyZWFDaGFydFNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zZXR0aW5ncy9BcmVhQ2hhcnRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbENoYXJ0U2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NldHRpbmdzL1ZlcnRpY2FsQ2hhcnRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbDJEQ2hhcnRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc2V0dGluZ3MvVmVydGljYWwyRENoYXJ0U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc2V0dGluZ3MvVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBMaW5lQ2hhcnRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc2V0dGluZ3MvTGluZUNoYXJ0U2V0dGluZ3NcIjtcclxuXHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBzcGVjaWZpY28gcGVyIGxhIGdyYWZpY2F6aW9uZSBkaSB1biBxdWFsc2lhc2kgdGlwbyBkaSBncmFmaWNvLlxyXG4gKiBcclxuICogU2kgYmFzYSBzdWwgdGlwbyBzcGVjaWZpY2F0byBkYWxsYSBwcm9wcmlldMOgICoqVHlwZSoqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VzLWNoYXJ0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4uL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4uL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFc0NoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQmFzZUNoYXJ0Q29tcG9uZW50IHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGlwb2xvZ2lhIGRpIGdyYWZpY28gZGEgcHJlc2VudGFyZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIFR5cGU6ICdwaWUnIHwgJ2xpbmUnIHwgJ3ZlcnRpY2FsJyB8ICd2ZXJ0aWNhbC0yZCcgfCAndmVydGljYWwtc3RhY2tlZCcgfCAnYXJlYSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGkgc3BlY2lmaWNpIHBlciBpbCBncmFmaWNvIG8gZGkgdW4gdGlwbyB0cmFtdXRhYmlsZSBhbCB0aXBvIGdpdXN0byBjb2wgc3VwcG9ydG8gZGVsICoqQmFzZUFkYXB0ZXIqKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIERhdGE6IExpbmVDaGFydERhdGEgfCBQaWVDaGFydERhdGEgfCBWZXJ0aWNhbDJEQ2hhcnREYXRhIHwgVmVydGljYWxDaGFydERhdGEgfCBWZXJ0aWNhbFN0YWNrZWRDaGFydERhdGEgfCBBcmVhQ2hhcnREYXRhIHwgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBMaXN0YSBkaSBEYXRpIHNwZWNpZmljaSBwZXIgdW4gZ3JhZmljbyBwYWdpbmF0byBvIGRpIGN1aSBvZ25pIGJsb2NjbyBkYXRpIMOoIHRyYW11dGFiaWxlIGFsIHRpcG8gZ2l1c3RvIGNvbCBzdXBwb3J0byBkZWwgKipCYXNlQWRhcHRlcioqXHJcbiAgICovXHJcbiAgQElucHV0KCkgRGF0YUFycmF5OiBQYWdlZENoYXJ0RGF0YTxMaW5lQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPFBpZUNoYXJ0RGF0YT5bXVxyXG4gICAgfCBQYWdlZENoYXJ0RGF0YTxWZXJ0aWNhbDJEQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPFZlcnRpY2FsQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YT5bXVxyXG4gICAgfCBQYWdlZENoYXJ0RGF0YTxBcmVhQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPGFueT5bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmLCBDaGFydExvYWRlcjogQ2hhcnRMb2FkZXIsIENoYXJ0RGlzcGF0Y2hlcjogQ2hhcnREaXNwYXRjaGVyLCBwcml2YXRlIGRhdGVTZXJ2aWNlOiBEYXRlU2VydmljZSwgcHJpdmF0ZSBhZGFwdGVyOiBCYXNlQWRhcHRlciwgem9uZTogTmdab25lLFxyXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgQEluamVjdChFU0NfREVCVUdfTU9ERSkgRVNDX0RFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBASW5qZWN0KEVTQ19BTklNQVRJT05TKSBFU0NfQU5JTUFUSU9OUzogYm9vbGVhbixcclxuICAgIEBJbmplY3QoRVNDX1RIRU1FKSBFU0NfVEhFTUU6IHN0cmluZyxcclxuICAgIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihlbCwgcGxhdGZvcm1JZCwgem9uZSwgQ2hhcnRMb2FkZXIsIENoYXJ0RGlzcGF0Y2hlciwgRVNDX0RFQlVHX01PREUsIEVTQ19BTklNQVRJT05TLCBsYy5Mb2NhbGUsIEVTQ19USEVNRSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPdHRpZW5lIGxlIHByb3ByaWV0w6Agc3BlY2lmaWNoZSBwZXIgcXVlc3RhIHRpcG9sb2dpYSBkaSBncmFmaWNvIHBlciBjdWkgc2VydmUgcmlncmFmaWNhcmVcclxuICAgKi9cclxuICBnZXRTcGVjaWZpY1Byb3BlcnRpZXNUb0NoZWNrKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbXCJEYXRhXCIsIFwiVHlwZVwiXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE90dGllbmUgaSBTZXR0aW5ncyAoRXJlZGl0YXRpIGRhbGxhIGNsYXNzZSBiYXNlLCBxdWluZGkgZGVsIHRpcG8gZ2VuZXJpY28gKipCYXNlU2V0dGluZ3MqKikgY2FzdGF0aSBhbCB0aXBvIHNwZWNpZmljbyBwZXIgcXVlc3RvIGdyYWZpY29cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7UGllQ2hhcnRTZXR0aW5ncyB8IEFyZWFDaGFydFNldHRpbmdzIHwgTGluZUNoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbENoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbDJEQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2V0dGluZ3N9IFNldHRpbmdzIGNhc3RhdGkgYWwgdGlwbyBnaXVzdG9cclxuICAgKi9cclxuICBnZXRDYXN0ZWRTZXR0aW5ncygpIHtcclxuICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgIGNhc2UgJ3BpZSc6XHJcbiAgICAgICAgcmV0dXJuIDxQaWVDaGFydFNldHRpbmdzPih0aGlzLlNldHRpbmdzID8/IG5ldyBQaWVDaGFydFNldHRpbmdzKCkpO1xyXG4gICAgICBjYXNlICdhcmVhJzpcclxuICAgICAgICByZXR1cm4gPEFyZWFDaGFydFNldHRpbmdzPih0aGlzLlNldHRpbmdzID8/IG5ldyBBcmVhQ2hhcnRTZXR0aW5ncygpKTtcclxuICAgICAgY2FzZSAnbGluZSc6XHJcbiAgICAgICAgcmV0dXJuIDxMaW5lQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgTGluZUNoYXJ0U2V0dGluZ3MoKSk7XHJcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcclxuICAgICAgICByZXR1cm4gPFZlcnRpY2FsQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgVmVydGljYWxDaGFydFNldHRpbmdzKCkpO1xyXG4gICAgICBjYXNlICd2ZXJ0aWNhbC0yZCc6XHJcbiAgICAgICAgcmV0dXJuIDxWZXJ0aWNhbDJEQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgVmVydGljYWwyRENoYXJ0U2V0dGluZ3MoKSk7XHJcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsLXN0YWNrZWQnOlxyXG4gICAgICAgIHJldHVybiA8VmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVncmEgaSBTZXR0aW5ncyBiYXNlIGNvbiB0dXR0aSBnbGkgSW5wdXQgc3BlY2lmaWNpIGRpIHF1ZXN0byBncmFmaWNvLCBkYW5kbyBwcmlvcml0w6AgYWkgU2V0dGluZ3Mgc2UgZGVmaW5pdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1BpZUNoYXJ0U2V0dGluZ3MgfCBBcmVhQ2hhcnRTZXR0aW5ncyB8IExpbmVDaGFydFNldHRpbmdzIHwgVmVydGljYWxDaGFydFNldHRpbmdzIHwgVmVydGljYWwyRENoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzfSBzZXR0aW5nc0Nhc3RlZCBTZXR0aW5ncyBjYXN0YXRpIGFsIHRpcG8gZ2l1c3RvXHJcbiAgICovXHJcbiAgZmlsbFNwZWNpZmljU2V0dGluZ3Moc2V0dGluZ3NDYXN0ZWQ6IFBpZUNoYXJ0U2V0dGluZ3MgfCBBcmVhQ2hhcnRTZXR0aW5ncyB8IExpbmVDaGFydFNldHRpbmdzIHwgVmVydGljYWxDaGFydFNldHRpbmdzIHwgVmVydGljYWwyRENoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzKTogdm9pZCB7XHJcbiAgICAvLyBOb3BlLiBTZSBzaSB1c2EgbCdlcy1jaGFydCBzaSBkYW5ubyBpIHNldHRpbmdzIGNvbiBsJ29nZ2V0dG9cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVmZmV0dHVhIGlsIHJlbmRlcmluZyBkaSBxdWVzdG8gZ3JhZmljbyBpbiBiYXNlIGFpIFNldHRpbmdzXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtQaWVDaGFydFNldHRpbmdzIHwgQXJlYUNoYXJ0U2V0dGluZ3MgfCBMaW5lQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzIHwgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5nc30gc2V0dGluZ3NDYXN0ZWQgSW1wb3N0YXppb25pIGRpIGdyYWZpY2F6aW9uZVxyXG4gICAqIEByZXR1cm5zIHtQaWVDaGFydFNlcnZpY2UgfCBBcmVhQ2hhcnRTZXJ2aWNlIHwgTGluZUNoYXJ0U2VydmljZSB8IFZlcnRpY2FsQ2hhcnRTZXJ2aWNlIHwgVmVydGljYWwyRENoYXJ0U2VydmljZSB8IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2VydmljZX0gTGEgc2VydmljZSB1dGlsaXp6YXRhIHBlciBpbCByZW5kZXJpbmcgbmVsbG8gc3RhdG8gc3ViaXRvIHN1Y2Nlc3Npdm8gYWwgcmVuZGVyaW5nIGVmZmV0dHVhdG9cclxuICAgKi9cclxuICBncmFwaGljYXRlKHNldHRpbmdzOiBQaWVDaGFydFNldHRpbmdzIHwgQXJlYUNoYXJ0U2V0dGluZ3MgfCBMaW5lQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzIHwgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncyk6IGFueSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICBjYXNlICdwaWUnOlxyXG4gICAgICAgIHJldHVybiBuZXcgUGllQ2hhcnRTZXJ2aWNlKHRoaXMuYWRhcHRlcikuZ3JhcGhpY2F0ZSg8UGllQ2hhcnREYXRhPnRoaXMuRGF0YSwgPFBpZUNoYXJ0U2V0dGluZ3M+c2V0dGluZ3MpO1xyXG4gICAgICBjYXNlICdhcmVhJzpcclxuICAgICAgICByZXR1cm4gbmV3IEFyZWFDaGFydFNlcnZpY2UodGhpcy5hZGFwdGVyKS5ncmFwaGljYXRlKDxBcmVhQ2hhcnREYXRhPnRoaXMuRGF0YSwgPEFyZWFDaGFydFNldHRpbmdzPnNldHRpbmdzKTtcclxuICAgICAgY2FzZSAnbGluZSc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ2hhcnRTZXJ2aWNlKHRoaXMuYWRhcHRlciwgdGhpcy5kYXRlU2VydmljZSkuZ3JhcGhpY2F0ZSg8TGluZUNoYXJ0RGF0YT50aGlzLkRhdGEsIDxMaW5lQ2hhcnRTZXR0aW5ncz5zZXR0aW5ncyk7XHJcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcclxuICAgICAgICByZXR1cm4gbmV3IFZlcnRpY2FsQ2hhcnRTZXJ2aWNlKHRoaXMuYWRhcHRlcikuZ3JhcGhpY2F0ZSg8VmVydGljYWxDaGFydERhdGE+dGhpcy5EYXRhLCA8VmVydGljYWxDaGFydFNldHRpbmdzPnNldHRpbmdzKTtcclxuICAgICAgY2FzZSAndmVydGljYWwtMmQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgVmVydGljYWwyRENoYXJ0U2VydmljZSh0aGlzLmFkYXB0ZXIpLmdyYXBoaWNhdGUoPFZlcnRpY2FsMkRDaGFydERhdGE+dGhpcy5EYXRhLCA8VmVydGljYWwyRENoYXJ0U2V0dGluZ3M+c2V0dGluZ3MpO1xyXG4gICAgICBjYXNlICd2ZXJ0aWNhbC1zdGFja2VkJzpcclxuICAgICAgICByZXR1cm4gbmV3IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2VydmljZSh0aGlzLmFkYXB0ZXIpLmdyYXBoaWNhdGUoPFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YT50aGlzLkRhdGEsIDxWZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzPnNldHRpbmdzKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCI8Y2hhcnQtcGFnZXIgKm5nSWY9XCJpc1BhZ2VkXCIgKG9uUGFnZUNoYW5nZSk9XCJjaGFuZ2VQYWdlKCRldmVudClcIiBbSXRlbXNdPVwiRGF0YUFycmF5XCIgW0R0b3NdPVwiRGF0YUR0b3NcIiBbU3RhcnRJbmRleF09XCJEYXRhRHRvU3RhcnRJbmRleFwiXHJcbiAgICBbQnJvd3NlRGVsYXlNc109XCJCcm93c2VEZWxheU1zXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgI2hlYWRlcl9pbm5lciBsZXQtaGVhZGVySXRlbT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyX3RyOyBjb250ZXh0IDogeyRpbXBsaWNpdDogaGVhZGVySXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvY2hhcnQtcGFnZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ0NoYXJ0ICYmIGxvYWRpbmdfdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGUuaGVpZ2h0XT1cImlzUGFnZWQgPyAnY2FsYygxMDAlIC0gNDRweCknIDogJzEwMCUnXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdfdGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nQ2hhcnQgJiYgIWxvYWRpbmdfdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJlc2MtbG9hZGluZy1vdmVybGF5XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGUuaGVpZ2h0XT1cImlzUGFnZWQgPyAnY2FsYygxMDAlIC0gNDRweCknIDogJzEwMCUnXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJsYWJlbFwiPkxvYWRpbmcuLi4uPC9wPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPGRpdiBbY2xhc3MuaGlkZS1ibG9ja109XCJsb2FkaW5nQ2hhcnRcIiBpZD1cInt7bmFtZX19XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGUuaGVpZ2h0XT1cImlzUGFnZWQgPyAnY2FsYygxMDAlIC0gNDRweCknIDogJzEwMCUnXCI+PC9kaXY+Il19
1
+ import { Component, Input, Inject, PLATFORM_ID, ChangeDetectionStrategy } from '@angular/core';
2
+ import { ESC_ANIMATIONS, ESC_THEME, ESC_DEBUG_MODE } from '../../tokens';
3
+ import { BaseChartComponent } from '../base/base-chart.component';
4
+ // Services
5
+ import { LineChartService } from "../../services/LineChartService";
6
+ import { PieChartService } from "../../services/PieChartService";
7
+ import { VerticalChartService } from "../../services/VerticalChartService";
8
+ import { Vertical2DChartService } from "../../services/Vertical2DChartService";
9
+ import { VerticalStackedChartService } from "../../services/VerticalStackedChartService";
10
+ import { AreaChartService } from "../../services/AreaChartService";
11
+ // Settings
12
+ import { PieChartSettings } from "../../models/settings/PieChartSettings";
13
+ import { AreaChartSettings } from "../../models/settings/AreaChartSettings";
14
+ import { VerticalChartSettings } from "../../models/settings/VerticalChartSettings";
15
+ import { Vertical2DChartSettings } from "../../models/settings/Vertical2DChartSettings";
16
+ import { VerticalStackedChartSettings } from "../../models/settings/VerticalStackedChartSettings";
17
+ import { LineChartSettings } from "../../models/settings/LineChartSettings";
18
+ import * as i0 from "@angular/core";
19
+ import * as i1 from "../../models/core/ChartLoader";
20
+ import * as i2 from "../../models/core/ChartDispatcher";
21
+ import * as i3 from "@esfaenza/extensions";
22
+ import * as i4 from "../../adapters/BaseAdapter";
23
+ import * as i5 from "@esfaenza/localizations";
24
+ import * as i6 from "@angular/common";
25
+ import * as i7 from "../chart-pager/chart-pager.component";
26
+ /**
27
+ * Componente specifico per la graficazione di un qualsiasi tipo di grafico.
28
+ *
29
+ * Si basa sul tipo specificato dalla proprietà **Type**
30
+ */
31
+ export class EsChartComponent extends BaseChartComponent {
32
+ /**
33
+ * @ignore
34
+ */
35
+ constructor(el, ChartLoader, ChartDispatcher, dateService, adapter, zone, platformId, ESC_DEBUG_MODE, ESC_ANIMATIONS, ESC_THEME, lc) {
36
+ super(el, platformId, zone, ChartLoader, ChartDispatcher, ESC_DEBUG_MODE, ESC_ANIMATIONS, lc.Locale, ESC_THEME);
37
+ this.dateService = dateService;
38
+ this.adapter = adapter;
39
+ }
40
+ /**
41
+ * Ottiene le proprietà specifiche per questa tipologia di grafico per cui serve rigraficare
42
+ */
43
+ getSpecificPropertiesToCheck() {
44
+ return ["Data", "Type"];
45
+ }
46
+ /**
47
+ * Ottiene i Settings (Ereditati dalla classe base, quindi del tipo generico **BaseSettings**) castati al tipo specifico per questo grafico
48
+ *
49
+ * @returns {PieChartSettings | AreaChartSettings | LineChartSettings | VerticalChartSettings | Vertical2DChartSettings | VerticalStackedChartSettings} Settings castati al tipo giusto
50
+ */
51
+ getCastedSettings() {
52
+ switch (this.Type) {
53
+ case 'pie':
54
+ return (this.Settings ?? new PieChartSettings());
55
+ case 'area':
56
+ return (this.Settings ?? new AreaChartSettings());
57
+ case 'line':
58
+ return (this.Settings ?? new LineChartSettings());
59
+ case 'vertical':
60
+ return (this.Settings ?? new VerticalChartSettings());
61
+ case 'vertical-2d':
62
+ return (this.Settings ?? new Vertical2DChartSettings());
63
+ case 'vertical-stacked':
64
+ return (this.Settings ?? new VerticalStackedChartSettings());
65
+ }
66
+ }
67
+ /**
68
+ * Integra i Settings base con tutti gli Input specifici di questo grafico, dando priorità ai Settings se definiti
69
+ *
70
+ * @param {PieChartSettings | AreaChartSettings | LineChartSettings | VerticalChartSettings | Vertical2DChartSettings | VerticalStackedChartSettings} settingsCasted Settings castati al tipo giusto
71
+ */
72
+ fillSpecificSettings(settingsCasted) {
73
+ // Nope. Se si usa l'es-chart si danno i settings con l'oggetto
74
+ }
75
+ /**
76
+ * Effettua il rendering di questo grafico in base ai Settings
77
+ *
78
+ * @param {PieChartSettings | AreaChartSettings | LineChartSettings | VerticalChartSettings | Vertical2DChartSettings | VerticalStackedChartSettings} settingsCasted Impostazioni di graficazione
79
+ * @returns {PieChartService | AreaChartService | LineChartService | VerticalChartService | Vertical2DChartService | VerticalStackedChartService} La service utilizzata per il rendering nello stato subito successivo al rendering effettuato
80
+ */
81
+ graphicate(settings) {
82
+ switch (this.Type) {
83
+ case 'pie':
84
+ return new PieChartService(this.adapter).graphicate(this.Data, settings);
85
+ case 'area':
86
+ return new AreaChartService(this.adapter).graphicate(this.Data, settings);
87
+ case 'line':
88
+ return new LineChartService(this.adapter, this.dateService).graphicate(this.Data, settings);
89
+ case 'vertical':
90
+ return new VerticalChartService(this.adapter).graphicate(this.Data, settings);
91
+ case 'vertical-2d':
92
+ return new Vertical2DChartService(this.adapter).graphicate(this.Data, settings);
93
+ case 'vertical-stacked':
94
+ return new VerticalStackedChartService(this.adapter).graphicate(this.Data, settings);
95
+ }
96
+ }
97
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsChartComponent, deps: [{ token: i0.ElementRef }, { token: i1.ChartLoader }, { token: i2.ChartDispatcher }, { token: i3.DateService }, { token: i4.BaseAdapter }, { token: i0.NgZone }, { token: PLATFORM_ID }, { token: ESC_DEBUG_MODE }, { token: ESC_ANIMATIONS }, { token: ESC_THEME }, { token: i5.LocalizationService }], target: i0.ɵɵFactoryTarget.Component }); }
98
+ static { thiscmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: EsChartComponent, selector: "es-chart", inputs: { Type: "Type", Data: "Data", DataArray: "DataArray" }, usesInheritance: true, ngImport: i0, template: "<chart-pager *ngIf=\"isPaged\" (onPageChange)=\"changePage($event)\" [Items]=\"DataArray\" [Dtos]=\"DataDtos\" [StartIndex]=\"DataDtoStartIndex\"\r\n [BrowseDelayMs]=\"BrowseDelayMs\">\r\n <ng-template #header_inner let-headerItem>\r\n <ng-container *ngTemplateOutlet=\"header_tr; context : {$implicit: headerItem}\"></ng-container>\r\n </ng-template>\r\n</chart-pager>\r\n\r\n<ng-container *ngIf=\"loadingChart && loading_template\">\r\n <div style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <ng-container *ngTemplateOutlet=\"loading_template\"></ng-container>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"loadingChart && !loading_template\">\r\n <div class=\"esc-loading-overlay\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <p class=\"label\">Loading....</p>\r\n </div>\r\n</ng-container>\r\n\r\n<div [class.hide-block]=\"loadingChart\" id=\"{{name}}\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\"></div>", styles: [".esc-loading-overlay{background:#9999;text-transform:uppercase;font-size:30px;font-weight:700;color:#fff;text-align:center;font-family:monospace}.esc-loading-overlay .label{margin:0;padding-top:7%}.hide-block{display:none}\n"], dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.PageChartSelector, selector: "chart-pager", inputs: ["Items", "Dtos", "BrowseDelayMs", "StartIndex"], outputs: ["onPageChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
99
+ }
100
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: EsChartComponent, decorators: [{
101
+ type: Component,
102
+ args: [{ selector: 'es-chart', changeDetection: ChangeDetectionStrategy.OnPush, template: "<chart-pager *ngIf=\"isPaged\" (onPageChange)=\"changePage($event)\" [Items]=\"DataArray\" [Dtos]=\"DataDtos\" [StartIndex]=\"DataDtoStartIndex\"\r\n [BrowseDelayMs]=\"BrowseDelayMs\">\r\n <ng-template #header_inner let-headerItem>\r\n <ng-container *ngTemplateOutlet=\"header_tr; context : {$implicit: headerItem}\"></ng-container>\r\n </ng-template>\r\n</chart-pager>\r\n\r\n<ng-container *ngIf=\"loadingChart && loading_template\">\r\n <div style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <ng-container *ngTemplateOutlet=\"loading_template\"></ng-container>\r\n </div>\r\n</ng-container>\r\n\r\n<ng-container *ngIf=\"loadingChart && !loading_template\">\r\n <div class=\"esc-loading-overlay\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\">\r\n <p class=\"label\">Loading....</p>\r\n </div>\r\n</ng-container>\r\n\r\n<div [class.hide-block]=\"loadingChart\" id=\"{{name}}\" style=\"width: 100%;\" [style.height]=\"isPaged ? 'calc(100% - 44px)' : '100%'\"></div>", styles: [".esc-loading-overlay{background:#9999;text-transform:uppercase;font-size:30px;font-weight:700;color:#fff;text-align:center;font-family:monospace}.esc-loading-overlay .label{margin:0;padding-top:7%}.hide-block{display:none}\n"] }]
103
+ }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ChartLoader }, { type: i2.ChartDispatcher }, { type: i3.DateService }, { type: i4.BaseAdapter }, { type: i0.NgZone }, { type: Object, decorators: [{
104
+ type: Inject,
105
+ args: [PLATFORM_ID]
106
+ }] }, { type: undefined, decorators: [{
107
+ type: Inject,
108
+ args: [ESC_DEBUG_MODE]
109
+ }] }, { type: undefined, decorators: [{
110
+ type: Inject,
111
+ args: [ESC_ANIMATIONS]
112
+ }] }, { type: undefined, decorators: [{
113
+ type: Inject,
114
+ args: [ESC_THEME]
115
+ }] }, { type: i5.LocalizationService }]; }, propDecorators: { Type: [{
116
+ type: Input
117
+ }], Data: [{
118
+ type: Input
119
+ }], DataArray: [{
120
+ type: Input
121
+ }] } });
122
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXMtY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9zcGVjaWFsaXphdGlvbnMvZXMtY2hhcnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtY2hhcnRzL3NyYy9saWIvY29tcG9uZW50cy9iYXNlL2Jhc2UtY2hhcnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBVSx1QkFBdUIsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUtuSCxPQUFPLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFhbEUsV0FBVztBQUNYLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUMvRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN6RixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVuRSxXQUFXO0FBQ1gsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDMUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDNUUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkNBQTZDLENBQUM7QUFDcEYsT0FB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QUFPLENBQUMsQ0FBQyxVQUFVLENBQXNCLElBQUksQ0FBQyxJQUFJLEVBQTJCLFFBQVEsQ0FBQyxDQUFDO1lBQ2hJLEtBQUssa0JBQWtCO2dCQUNyQixPQUFPLElBQUksMkJBQTJCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLFVBQVUsQ0FBMkIsSUFBSSxDQUFDLElBQUksRUFBZ0MsUUFBUSxDQUFDLENBQUM7U0FDaEo7SUFDSCxDQUFDOytHQTlGVSxnQkFBZ0Isa0xBMkJqQixXQUFXLGFBQ1gsY0FBYyxhQUNkLGNBQWMsYUFDZCxTQUFTO21HQTlCUixnQkFBZ0IsdUlDaEQ3Qix3akNBbUJ3STs7NEZENkIzSCxnQkFBZ0I7a0JBTjVCLFNBQVM7K0JBQ0UsVUFBVSxtQkFHSCx1QkFBdUIsQ0FBQyxNQUFNOzswQkE2QjVDLE1BQU07MkJBQUMsV0FBVzs7MEJBQ2xCLE1BQU07MkJBQUMsY0FBYzs7MEJBQ3JCLE1BQU07MkJBQUMsY0FBYzs7MEJBQ3JCLE1BQU07MkJBQUMsU0FBUzs4RUF6QlYsSUFBSTtzQkFBWixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgSW5qZWN0LCBQTEFURk9STV9JRCwgTmdab25lLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgRWxlbWVudFJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBEYXRlU2VydmljZSB9IGZyb20gXCJAZXNmYWVuemEvZXh0ZW5zaW9uc1wiO1xyXG5pbXBvcnQgeyBMb2NhbGl6YXRpb25TZXJ2aWNlIH0gZnJvbSAnQGVzZmFlbnphL2xvY2FsaXphdGlvbnMnO1xyXG5cclxuaW1wb3J0IHsgQmFzZUFkYXB0ZXIgfSBmcm9tICcuLi8uLi9hZGFwdGVycy9CYXNlQWRhcHRlcic7XHJcbmltcG9ydCB7IEVTQ19BTklNQVRJT05TLCBFU0NfVEhFTUUsIEVTQ19ERUJVR19NT0RFIH0gZnJvbSAnLi4vLi4vdG9rZW5zJztcclxuXHJcbmltcG9ydCB7IEJhc2VDaGFydENvbXBvbmVudCB9IGZyb20gJy4uL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGFydERpc3BhdGNoZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvcmUvQ2hhcnREaXNwYXRjaGVyXCI7XHJcbmltcG9ydCB7IENoYXJ0TG9hZGVyIH0gZnJvbSBcIi4uLy4uL21vZGVscy9jb3JlL0NoYXJ0TG9hZGVyXCI7XHJcblxyXG4vLyBEYXRhXHJcbmltcG9ydCB7IExpbmVDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvTGluZUNoYXJ0RGF0YVwiO1xyXG5pbXBvcnQgeyBQaWVDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvUGllQ2hhcnREYXRhXCI7XHJcbmltcG9ydCB7IFZlcnRpY2FsQ2hhcnREYXRhIH0gZnJvbSBcIi4uLy4uL21vZGVscy9kYXRhL1ZlcnRpY2FsQ2hhcnREYXRhXCI7XHJcbmltcG9ydCB7IFZlcnRpY2FsMkRDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvVmVydGljYWwyRENoYXJ0RGF0YVwiO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbFN0YWNrZWRDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvVmVydGljYWxTdGFja2VkQ2hhcnREYXRhXCI7XHJcbmltcG9ydCB7IEFyZWFDaGFydERhdGEgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2RhdGEvQXJlYUNoYXJ0RGF0YVwiO1xyXG5pbXBvcnQgeyBQYWdlZENoYXJ0RGF0YSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvZGF0YS9QYWdlZENoYXJ0RGF0YVwiO1xyXG5cclxuLy8gU2VydmljZXNcclxuaW1wb3J0IHsgTGluZUNoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9MaW5lQ2hhcnRTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFBpZUNoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9QaWVDaGFydFNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmVydGljYWxDaGFydFNlcnZpY2UgfSBmcm9tIFwiLi4vLi4vc2VydmljZXMvVmVydGljYWxDaGFydFNlcnZpY2VcIjtcclxuaW1wb3J0IHsgVmVydGljYWwyRENoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9WZXJ0aWNhbDJEQ2hhcnRTZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9WZXJ0aWNhbFN0YWNrZWRDaGFydFNlcnZpY2VcIjtcclxuaW1wb3J0IHsgQXJlYUNoYXJ0U2VydmljZSB9IGZyb20gXCIuLi8uLi9zZXJ2aWNlcy9BcmVhQ2hhcnRTZXJ2aWNlXCI7XHJcblxyXG4vLyBTZXR0aW5nc1xyXG5pbXBvcnQgeyBQaWVDaGFydFNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zZXR0aW5ncy9QaWVDaGFydFNldHRpbmdzXCI7XHJcbmltcG9ydCB7IEFyZWFDaGFydFNldHRpbmdzIH0gZnJvbSBcIi4uLy4uL21vZGVscy9zZXR0aW5ncy9BcmVhQ2hhcnRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbENoYXJ0U2V0dGluZ3MgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NldHRpbmdzL1ZlcnRpY2FsQ2hhcnRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBWZXJ0aWNhbDJEQ2hhcnRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc2V0dGluZ3MvVmVydGljYWwyRENoYXJ0U2V0dGluZ3NcIjtcclxuaW1wb3J0IHsgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc2V0dGluZ3MvVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5nc1wiO1xyXG5pbXBvcnQgeyBMaW5lQ2hhcnRTZXR0aW5ncyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc2V0dGluZ3MvTGluZUNoYXJ0U2V0dGluZ3NcIjtcclxuXHJcblxyXG4vKipcclxuICogQ29tcG9uZW50ZSBzcGVjaWZpY28gcGVyIGxhIGdyYWZpY2F6aW9uZSBkaSB1biBxdWFsc2lhc2kgdGlwbyBkaSBncmFmaWNvLlxyXG4gKiBcclxuICogU2kgYmFzYSBzdWwgdGlwbyBzcGVjaWZpY2F0byBkYWxsYSBwcm9wcmlldMOgICoqVHlwZSoqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2VzLWNoYXJ0JyxcclxuICB0ZW1wbGF0ZVVybDogJy4uL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4uL2Jhc2UvYmFzZS1jaGFydC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFc0NoYXJ0Q29tcG9uZW50IGV4dGVuZHMgQmFzZUNoYXJ0Q29tcG9uZW50IHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGlwb2xvZ2lhIGRpIGdyYWZpY28gZGEgcHJlc2VudGFyZVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIFR5cGU6ICdwaWUnIHwgJ2xpbmUnIHwgJ3ZlcnRpY2FsJyB8ICd2ZXJ0aWNhbC0yZCcgfCAndmVydGljYWwtc3RhY2tlZCcgfCAnYXJlYSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIERhdGkgc3BlY2lmaWNpIHBlciBpbCBncmFmaWNvIG8gZGkgdW4gdGlwbyB0cmFtdXRhYmlsZSBhbCB0aXBvIGdpdXN0byBjb2wgc3VwcG9ydG8gZGVsICoqQmFzZUFkYXB0ZXIqKlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIERhdGE6IExpbmVDaGFydERhdGEgfCBQaWVDaGFydERhdGEgfCBWZXJ0aWNhbDJEQ2hhcnREYXRhIHwgVmVydGljYWxDaGFydERhdGEgfCBWZXJ0aWNhbFN0YWNrZWRDaGFydERhdGEgfCBBcmVhQ2hhcnREYXRhIHwgYW55O1xyXG5cclxuICAvKipcclxuICAgKiBMaXN0YSBkaSBEYXRpIHNwZWNpZmljaSBwZXIgdW4gZ3JhZmljbyBwYWdpbmF0byBvIGRpIGN1aSBvZ25pIGJsb2NjbyBkYXRpIMOoIHRyYW11dGFiaWxlIGFsIHRpcG8gZ2l1c3RvIGNvbCBzdXBwb3J0byBkZWwgKipCYXNlQWRhcHRlcioqXHJcbiAgICovXHJcbiAgQElucHV0KCkgRGF0YUFycmF5OiBQYWdlZENoYXJ0RGF0YTxMaW5lQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPFBpZUNoYXJ0RGF0YT5bXVxyXG4gICAgfCBQYWdlZENoYXJ0RGF0YTxWZXJ0aWNhbDJEQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPFZlcnRpY2FsQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YT5bXVxyXG4gICAgfCBQYWdlZENoYXJ0RGF0YTxBcmVhQ2hhcnREYXRhPltdXHJcbiAgICB8IFBhZ2VkQ2hhcnREYXRhPGFueT5bXTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGlnbm9yZVxyXG4gICAqL1xyXG4gIGNvbnN0cnVjdG9yKGVsOiBFbGVtZW50UmVmLCBDaGFydExvYWRlcjogQ2hhcnRMb2FkZXIsIENoYXJ0RGlzcGF0Y2hlcjogQ2hhcnREaXNwYXRjaGVyLCBwcml2YXRlIGRhdGVTZXJ2aWNlOiBEYXRlU2VydmljZSwgcHJpdmF0ZSBhZGFwdGVyOiBCYXNlQWRhcHRlciwgem9uZTogTmdab25lLFxyXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogT2JqZWN0LFxyXG4gICAgQEluamVjdChFU0NfREVCVUdfTU9ERSkgRVNDX0RFQlVHX01PREU6IGJvb2xlYW4sXHJcbiAgICBASW5qZWN0KEVTQ19BTklNQVRJT05TKSBFU0NfQU5JTUFUSU9OUzogYm9vbGVhbixcclxuICAgIEBJbmplY3QoRVNDX1RIRU1FKSBFU0NfVEhFTUU6IHN0cmluZyxcclxuICAgIGxjOiBMb2NhbGl6YXRpb25TZXJ2aWNlKSB7XHJcbiAgICBzdXBlcihlbCwgcGxhdGZvcm1JZCwgem9uZSwgQ2hhcnRMb2FkZXIsIENoYXJ0RGlzcGF0Y2hlciwgRVNDX0RFQlVHX01PREUsIEVTQ19BTklNQVRJT05TLCBsYy5Mb2NhbGUsIEVTQ19USEVNRSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBPdHRpZW5lIGxlIHByb3ByaWV0w6Agc3BlY2lmaWNoZSBwZXIgcXVlc3RhIHRpcG9sb2dpYSBkaSBncmFmaWNvIHBlciBjdWkgc2VydmUgcmlncmFmaWNhcmVcclxuICAgKi9cclxuICBnZXRTcGVjaWZpY1Byb3BlcnRpZXNUb0NoZWNrKCk6IHN0cmluZ1tdIHtcclxuICAgIHJldHVybiBbXCJEYXRhXCIsIFwiVHlwZVwiXTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE90dGllbmUgaSBTZXR0aW5ncyAoRXJlZGl0YXRpIGRhbGxhIGNsYXNzZSBiYXNlLCBxdWluZGkgZGVsIHRpcG8gZ2VuZXJpY28gKipCYXNlU2V0dGluZ3MqKikgY2FzdGF0aSBhbCB0aXBvIHNwZWNpZmljbyBwZXIgcXVlc3RvIGdyYWZpY29cclxuICAgKiBcclxuICAgKiBAcmV0dXJucyB7UGllQ2hhcnRTZXR0aW5ncyB8IEFyZWFDaGFydFNldHRpbmdzIHwgTGluZUNoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbENoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbDJEQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2V0dGluZ3N9IFNldHRpbmdzIGNhc3RhdGkgYWwgdGlwbyBnaXVzdG9cclxuICAgKi9cclxuICBnZXRDYXN0ZWRTZXR0aW5ncygpIHtcclxuICAgIHN3aXRjaCAodGhpcy5UeXBlKSB7XHJcbiAgICAgIGNhc2UgJ3BpZSc6XHJcbiAgICAgICAgcmV0dXJuIDxQaWVDaGFydFNldHRpbmdzPih0aGlzLlNldHRpbmdzID8/IG5ldyBQaWVDaGFydFNldHRpbmdzKCkpO1xyXG4gICAgICBjYXNlICdhcmVhJzpcclxuICAgICAgICByZXR1cm4gPEFyZWFDaGFydFNldHRpbmdzPih0aGlzLlNldHRpbmdzID8/IG5ldyBBcmVhQ2hhcnRTZXR0aW5ncygpKTtcclxuICAgICAgY2FzZSAnbGluZSc6XHJcbiAgICAgICAgcmV0dXJuIDxMaW5lQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgTGluZUNoYXJ0U2V0dGluZ3MoKSk7XHJcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcclxuICAgICAgICByZXR1cm4gPFZlcnRpY2FsQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgVmVydGljYWxDaGFydFNldHRpbmdzKCkpO1xyXG4gICAgICBjYXNlICd2ZXJ0aWNhbC0yZCc6XHJcbiAgICAgICAgcmV0dXJuIDxWZXJ0aWNhbDJEQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgVmVydGljYWwyRENoYXJ0U2V0dGluZ3MoKSk7XHJcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsLXN0YWNrZWQnOlxyXG4gICAgICAgIHJldHVybiA8VmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncz4odGhpcy5TZXR0aW5ncyA/PyBuZXcgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncygpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEludGVncmEgaSBTZXR0aW5ncyBiYXNlIGNvbiB0dXR0aSBnbGkgSW5wdXQgc3BlY2lmaWNpIGRpIHF1ZXN0byBncmFmaWNvLCBkYW5kbyBwcmlvcml0w6AgYWkgU2V0dGluZ3Mgc2UgZGVmaW5pdGlcclxuICAgKiBcclxuICAgKiBAcGFyYW0ge1BpZUNoYXJ0U2V0dGluZ3MgfCBBcmVhQ2hhcnRTZXR0aW5ncyB8IExpbmVDaGFydFNldHRpbmdzIHwgVmVydGljYWxDaGFydFNldHRpbmdzIHwgVmVydGljYWwyRENoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzfSBzZXR0aW5nc0Nhc3RlZCBTZXR0aW5ncyBjYXN0YXRpIGFsIHRpcG8gZ2l1c3RvXHJcbiAgICovXHJcbiAgZmlsbFNwZWNpZmljU2V0dGluZ3Moc2V0dGluZ3NDYXN0ZWQ6IFBpZUNoYXJ0U2V0dGluZ3MgfCBBcmVhQ2hhcnRTZXR0aW5ncyB8IExpbmVDaGFydFNldHRpbmdzIHwgVmVydGljYWxDaGFydFNldHRpbmdzIHwgVmVydGljYWwyRENoYXJ0U2V0dGluZ3MgfCBWZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzKTogdm9pZCB7XHJcbiAgICAvLyBOb3BlLiBTZSBzaSB1c2EgbCdlcy1jaGFydCBzaSBkYW5ubyBpIHNldHRpbmdzIGNvbiBsJ29nZ2V0dG9cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVmZmV0dHVhIGlsIHJlbmRlcmluZyBkaSBxdWVzdG8gZ3JhZmljbyBpbiBiYXNlIGFpIFNldHRpbmdzXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHtQaWVDaGFydFNldHRpbmdzIHwgQXJlYUNoYXJ0U2V0dGluZ3MgfCBMaW5lQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzIHwgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5nc30gc2V0dGluZ3NDYXN0ZWQgSW1wb3N0YXppb25pIGRpIGdyYWZpY2F6aW9uZVxyXG4gICAqIEByZXR1cm5zIHtQaWVDaGFydFNlcnZpY2UgfCBBcmVhQ2hhcnRTZXJ2aWNlIHwgTGluZUNoYXJ0U2VydmljZSB8IFZlcnRpY2FsQ2hhcnRTZXJ2aWNlIHwgVmVydGljYWwyRENoYXJ0U2VydmljZSB8IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2VydmljZX0gTGEgc2VydmljZSB1dGlsaXp6YXRhIHBlciBpbCByZW5kZXJpbmcgbmVsbG8gc3RhdG8gc3ViaXRvIHN1Y2Nlc3Npdm8gYWwgcmVuZGVyaW5nIGVmZmV0dHVhdG9cclxuICAgKi9cclxuICBncmFwaGljYXRlKHNldHRpbmdzOiBQaWVDaGFydFNldHRpbmdzIHwgQXJlYUNoYXJ0U2V0dGluZ3MgfCBMaW5lQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsQ2hhcnRTZXR0aW5ncyB8IFZlcnRpY2FsMkRDaGFydFNldHRpbmdzIHwgVmVydGljYWxTdGFja2VkQ2hhcnRTZXR0aW5ncyk6IGFueSB7XHJcbiAgICBzd2l0Y2ggKHRoaXMuVHlwZSkge1xyXG4gICAgICBjYXNlICdwaWUnOlxyXG4gICAgICAgIHJldHVybiBuZXcgUGllQ2hhcnRTZXJ2aWNlKHRoaXMuYWRhcHRlcikuZ3JhcGhpY2F0ZSg8UGllQ2hhcnREYXRhPnRoaXMuRGF0YSwgPFBpZUNoYXJ0U2V0dGluZ3M+c2V0dGluZ3MpO1xyXG4gICAgICBjYXNlICdhcmVhJzpcclxuICAgICAgICByZXR1cm4gbmV3IEFyZWFDaGFydFNlcnZpY2UodGhpcy5hZGFwdGVyKS5ncmFwaGljYXRlKDxBcmVhQ2hhcnREYXRhPnRoaXMuRGF0YSwgPEFyZWFDaGFydFNldHRpbmdzPnNldHRpbmdzKTtcclxuICAgICAgY2FzZSAnbGluZSc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBMaW5lQ2hhcnRTZXJ2aWNlKHRoaXMuYWRhcHRlciwgdGhpcy5kYXRlU2VydmljZSkuZ3JhcGhpY2F0ZSg8TGluZUNoYXJ0RGF0YT50aGlzLkRhdGEsIDxMaW5lQ2hhcnRTZXR0aW5ncz5zZXR0aW5ncyk7XHJcbiAgICAgIGNhc2UgJ3ZlcnRpY2FsJzpcclxuICAgICAgICByZXR1cm4gbmV3IFZlcnRpY2FsQ2hhcnRTZXJ2aWNlKHRoaXMuYWRhcHRlcikuZ3JhcGhpY2F0ZSg8VmVydGljYWxDaGFydERhdGE+dGhpcy5EYXRhLCA8VmVydGljYWxDaGFydFNldHRpbmdzPnNldHRpbmdzKTtcclxuICAgICAgY2FzZSAndmVydGljYWwtMmQnOlxyXG4gICAgICAgIHJldHVybiBuZXcgVmVydGljYWwyRENoYXJ0U2VydmljZSh0aGlzLmFkYXB0ZXIpLmdyYXBoaWNhdGUoPFZlcnRpY2FsMkRDaGFydERhdGE+dGhpcy5EYXRhLCA8VmVydGljYWwyRENoYXJ0U2V0dGluZ3M+c2V0dGluZ3MpO1xyXG4gICAgICBjYXNlICd2ZXJ0aWNhbC1zdGFja2VkJzpcclxuICAgICAgICByZXR1cm4gbmV3IFZlcnRpY2FsU3RhY2tlZENoYXJ0U2VydmljZSh0aGlzLmFkYXB0ZXIpLmdyYXBoaWNhdGUoPFZlcnRpY2FsU3RhY2tlZENoYXJ0RGF0YT50aGlzLkRhdGEsIDxWZXJ0aWNhbFN0YWNrZWRDaGFydFNldHRpbmdzPnNldHRpbmdzKTtcclxuICAgIH1cclxuICB9XHJcbn0iLCI8Y2hhcnQtcGFnZXIgKm5nSWY9XCJpc1BhZ2VkXCIgKG9uUGFnZUNoYW5nZSk9XCJjaGFuZ2VQYWdlKCRldmVudClcIiBbSXRlbXNdPVwiRGF0YUFycmF5XCIgW0R0b3NdPVwiRGF0YUR0b3NcIiBbU3RhcnRJbmRleF09XCJEYXRhRHRvU3RhcnRJbmRleFwiXHJcbiAgICBbQnJvd3NlRGVsYXlNc109XCJCcm93c2VEZWxheU1zXCI+XHJcbiAgICA8bmctdGVtcGxhdGUgI2hlYWRlcl9pbm5lciBsZXQtaGVhZGVySXRlbT5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiaGVhZGVyX3RyOyBjb250ZXh0IDogeyRpbXBsaWNpdDogaGVhZGVySXRlbX1cIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbjwvY2hhcnQtcGFnZXI+XHJcblxyXG48bmctY29udGFpbmVyICpuZ0lmPVwibG9hZGluZ0NoYXJ0ICYmIGxvYWRpbmdfdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGUuaGVpZ2h0XT1cImlzUGFnZWQgPyAnY2FsYygxMDAlIC0gNDRweCknIDogJzEwMCUnXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdfdGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuXHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nQ2hhcnQgJiYgIWxvYWRpbmdfdGVtcGxhdGVcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJlc2MtbG9hZGluZy1vdmVybGF5XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGUuaGVpZ2h0XT1cImlzUGFnZWQgPyAnY2FsYygxMDAlIC0gNDRweCknIDogJzEwMCUnXCI+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJsYWJlbFwiPkxvYWRpbmcuLi4uPC9wPlxyXG4gICAgPC9kaXY+XHJcbjwvbmctY29udGFpbmVyPlxyXG5cclxuPGRpdiBbY2xhc3MuaGlkZS1ibG9ja109XCJsb2FkaW5nQ2hhcnRcIiBpZD1cInt7bmFtZX19XCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIiBbc3R5bGUuaGVpZ2h0XT1cImlzUGFnZWQgPyAnY2FsYygxMDAlIC0gNDRweCknIDogJzEwMCUnXCI+PC9kaXY+Il19