@igo2/geo 1.9.3 → 1.11.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 (158) hide show
  1. package/bundles/igo2-geo.umd.js +3569 -1190
  2. package/bundles/igo2-geo.umd.js.map +1 -1
  3. package/esm2015/lib/catalog/catalog-browser/catalog-browser.component.js +2 -2
  4. package/esm2015/lib/catalog/catalog-library/add-catalog-dialog.component.js +72 -53
  5. package/esm2015/lib/catalog/catalog-library/catalog-library.component.js +7 -6
  6. package/esm2015/lib/catalog/shared/catalog.service.js +5 -2
  7. package/esm2015/lib/datasource/shared/capabilities.service.js +26 -12
  8. package/esm2015/lib/datasource/shared/datasources/arcgisrest-datasource.js +84 -14
  9. package/esm2015/lib/datasource/shared/datasources/datasource.interface.js +1 -1
  10. package/esm2015/lib/datasource/shared/datasources/imagearcgisrest-datasource.js +7 -10
  11. package/esm2015/lib/datasource/shared/datasources/mvt-datasource.js +2 -2
  12. package/esm2015/lib/datasource/shared/datasources/tilearcgisrest-datasource.js +7 -9
  13. package/esm2015/lib/datasource/shared/datasources/wfs-datasource.js +3 -1
  14. package/esm2015/lib/datasource/shared/datasources/wms-datasource.js +7 -1
  15. package/esm2015/lib/datasource/shared/datasources/wms-wfs.utils.js +5 -2
  16. package/esm2015/lib/directions/directions-buttons/directions-buttons.component.js +15 -8
  17. package/esm2015/lib/directions/directions-inputs/directions-inputs.component.js +12 -4
  18. package/esm2015/lib/directions/directions-sources/osrm-directions-source.js +3 -1
  19. package/esm2015/lib/directions/directions.component.js +66 -15
  20. package/esm2015/lib/directions/shared/directions.enum.js +6 -1
  21. package/esm2015/lib/directions/shared/directions.interface.js +1 -1
  22. package/esm2015/lib/directions/shared/directions.utils.js +4 -37
  23. package/esm2015/lib/draw/draw/draw.component.js +2 -1
  24. package/esm2015/lib/feature/shared/feature.utils.js +2 -1
  25. package/esm2015/lib/feature/shared/strategies/in-map-extent.js +17 -4
  26. package/esm2015/lib/filter/filter.module.js +7 -4
  27. package/esm2015/lib/filter/ogc-filter-button/ogc-filter-button.component.js +15 -1
  28. package/esm2015/lib/filter/ogc-filter-selection/ogc-filter-selection.component.js +31 -13
  29. package/esm2015/lib/filter/ogc-filter-time/ogc-filter-time.component.js +296 -161
  30. package/esm2015/lib/filter/shared/ogc-filter.interface.js +1 -1
  31. package/esm2015/lib/filter/shared/ogc-filter.js +8 -1
  32. package/esm2015/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.js +185 -95
  33. package/esm2015/lib/geometry/shared/controls/draw.js +7 -2
  34. package/esm2015/lib/geometry/shared/controls/modify.js +1 -1
  35. package/esm2015/lib/geometry/shared/controls/slice.js +1 -1
  36. package/esm2015/lib/import-export/import-export/import-export.component.js +226 -66
  37. package/esm2015/lib/import-export/shared/export.interface.js +1 -1
  38. package/esm2015/lib/layer/layer-legend/layer-legend.component.js +32 -26
  39. package/esm2015/lib/layer/layer.module.js +8 -5
  40. package/esm2015/lib/layer/shared/layer.service.js +20 -17
  41. package/esm2015/lib/layer/shared/layers/image-layer.js +9 -4
  42. package/esm2015/lib/layer/shared/layers/layer.interface.js +1 -1
  43. package/esm2015/lib/layer/shared/layers/layer.js +23 -5
  44. package/esm2015/lib/layer/shared/layers/tile-layer.js +23 -3
  45. package/esm2015/lib/layer/shared/layers/vector-layer.interface.js +1 -1
  46. package/esm2015/lib/layer/shared/layers/vector-layer.js +32 -14
  47. package/esm2015/lib/layer/shared/layers/vectortile-layer.interface.js +1 -1
  48. package/esm2015/lib/layer/shared/layers/vectortile-layer.js +13 -3
  49. package/esm2015/lib/layer/shared/style.service.js +21 -16
  50. package/esm2015/lib/layer/shared/vector-style.interface.js +1 -1
  51. package/esm2015/lib/layer/utils/index.js +2 -1
  52. package/esm2015/lib/layer/utils/layer.utils.js +11 -0
  53. package/esm2015/lib/layer/utils/layerSync-watcher.js +10 -6
  54. package/esm2015/lib/map/home-extent-button/home-extent-button.component.js +69 -0
  55. package/esm2015/lib/map/home-extent-button/index.js +2 -0
  56. package/esm2015/lib/map/index.js +3 -1
  57. package/esm2015/lib/map/info-section/index.js +2 -0
  58. package/esm2015/lib/map/info-section/info-section.component.js +36 -0
  59. package/esm2015/lib/map/map-browser/map-browser.component.js +1 -1
  60. package/esm2015/lib/map/map-center/map-center.component.js +1 -1
  61. package/esm2015/lib/map/map.module.js +11 -1
  62. package/esm2015/lib/map/shared/hover-feature.directive.js +229 -78
  63. package/esm2015/lib/map/shared/map.js +2 -2
  64. package/esm2015/lib/map/shared/mapOffline.directive.js +17 -6
  65. package/esm2015/lib/measure/measurer/measurer.component.js +8 -2
  66. package/esm2015/lib/query/shared/query.directive.js +6 -3
  67. package/esm2015/lib/query/shared/query.interfaces.js +1 -1
  68. package/esm2015/lib/query/shared/query.service.js +57 -14
  69. package/esm2015/lib/query/shared/query.utils.js +19 -1
  70. package/esm2015/lib/search/search-bar/search-bar.component.js +4 -2
  71. package/esm2015/lib/search/search-results/search-results-add-button.component.js +7 -7
  72. package/esm2015/lib/search/shared/search-pointer-summary.directive.js +16 -5
  73. package/esm2015/lib/search/shared/search.interfaces.js +1 -1
  74. package/esm2015/lib/search/shared/sources/icherche.js +3 -2
  75. package/esm2015/lib/search/shared/sources/source.js +2 -2
  76. package/esm2015/lib/search/shared/sources/storedqueries.js +3 -7
  77. package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.component.js +56 -0
  78. package/esm2015/lib/workspace/confirmation-popup/confirmation-popup.module.js +38 -0
  79. package/esm2015/lib/workspace/confirmation-popup/index.js +3 -0
  80. package/esm2015/lib/workspace/index.js +2 -1
  81. package/esm2015/lib/workspace/shared/edition-workspace.js +271 -0
  82. package/esm2015/lib/workspace/shared/edition-workspace.service.js +619 -0
  83. package/esm2015/lib/workspace/shared/feature-workspace.js +18 -1
  84. package/esm2015/lib/workspace/shared/feature-workspace.service.js +27 -6
  85. package/esm2015/lib/workspace/shared/index.js +3 -1
  86. package/esm2015/lib/workspace/shared/wfs-workspace.js +18 -1
  87. package/esm2015/lib/workspace/shared/wfs-workspace.service.js +27 -5
  88. package/esm2015/lib/workspace/shared/wms-workspace.service.js +59 -15
  89. package/esm2015/lib/workspace/shared/workspace.utils.js +1 -1
  90. package/esm2015/lib/workspace/workspace-selector/workspace-selector.directive.js +40 -10
  91. package/esm2015/lib/workspace/workspace-updator/workspace-updator.directive.js +22 -8
  92. package/esm2015/lib/workspace/workspace.module.js +19 -7
  93. package/fesm2015/igo2-geo.js +2946 -794
  94. package/fesm2015/igo2-geo.js.map +1 -1
  95. package/lib/catalog/catalog-library/add-catalog-dialog.component.d.ts +1 -1
  96. package/lib/datasource/shared/datasources/arcgisrest-datasource.d.ts +2 -0
  97. package/lib/datasource/shared/datasources/datasource.interface.d.ts +45 -0
  98. package/lib/datasource/shared/datasources/wfs-datasource.d.ts +1 -0
  99. package/lib/datasource/shared/datasources/wms-wfs.utils.d.ts +1 -1
  100. package/lib/directions/directions-buttons/directions-buttons.component.d.ts +2 -1
  101. package/lib/directions/directions-inputs/directions-inputs.component.d.ts +1 -0
  102. package/lib/directions/directions.component.d.ts +7 -3
  103. package/lib/directions/shared/directions.enum.d.ts +4 -0
  104. package/lib/directions/shared/directions.interface.d.ts +3 -1
  105. package/lib/directions/shared/directions.utils.d.ts +0 -4
  106. package/lib/filter/filter.module.d.ts +1 -1
  107. package/lib/filter/ogc-filter-time/ogc-filter-time.component.d.ts +6 -0
  108. package/lib/filter/shared/ogc-filter.interface.d.ts +1 -0
  109. package/lib/filter/spatial-filter/spatial-filter-item/spatial-filter-item.component.d.ts +7 -2
  110. package/lib/geometry/shared/controls/draw.d.ts +8 -4
  111. package/lib/geometry/shared/controls/modify.d.ts +3 -4
  112. package/lib/geometry/shared/controls/slice.d.ts +3 -4
  113. package/lib/import-export/import-export/import-export.component.d.ts +2 -0
  114. package/lib/import-export/shared/export.interface.d.ts +2 -1
  115. package/lib/layer/layer-legend/layer-legend.component.d.ts +0 -1
  116. package/lib/layer/layer.module.d.ts +1 -1
  117. package/lib/layer/shared/layer.service.d.ts +1 -1
  118. package/lib/layer/shared/layers/layer.d.ts +7 -0
  119. package/lib/layer/shared/layers/layer.interface.d.ts +8 -0
  120. package/lib/layer/shared/layers/tile-layer.d.ts +10 -1
  121. package/lib/layer/shared/layers/vector-layer.d.ts +2 -1
  122. package/lib/layer/shared/layers/vector-layer.interface.d.ts +1 -0
  123. package/lib/layer/shared/layers/vectortile-layer.interface.d.ts +1 -0
  124. package/lib/layer/shared/style.service.d.ts +4 -1
  125. package/lib/layer/shared/vector-style.interface.d.ts +9 -5
  126. package/lib/layer/utils/index.d.ts +1 -0
  127. package/lib/layer/utils/layer.utils.d.ts +2 -0
  128. package/lib/map/home-extent-button/home-extent-button.component.d.ts +20 -0
  129. package/lib/map/home-extent-button/index.d.ts +1 -0
  130. package/lib/map/index.d.ts +2 -0
  131. package/lib/map/info-section/index.d.ts +1 -0
  132. package/lib/map/info-section/info-section.component.d.ts +7 -0
  133. package/lib/map/map.module.d.ts +19 -17
  134. package/lib/map/shared/hover-feature.directive.d.ts +14 -5
  135. package/lib/map/shared/mapOffline.directive.d.ts +1 -0
  136. package/lib/query/shared/query.interfaces.d.ts +3 -0
  137. package/lib/query/shared/query.service.d.ts +9 -1
  138. package/lib/query/shared/query.utils.d.ts +12 -0
  139. package/lib/search/shared/search-pointer-summary.directive.d.ts +6 -0
  140. package/lib/search/shared/search.interfaces.d.ts +1 -0
  141. package/lib/workspace/confirmation-popup/confirmation-popup.component.d.ts +23 -0
  142. package/lib/workspace/confirmation-popup/confirmation-popup.module.d.ts +14 -0
  143. package/lib/workspace/confirmation-popup/index.d.ts +2 -0
  144. package/lib/workspace/index.d.ts +1 -0
  145. package/lib/workspace/shared/edition-workspace.d.ts +81 -0
  146. package/lib/workspace/shared/edition-workspace.service.d.ts +45 -0
  147. package/lib/workspace/shared/feature-workspace.d.ts +3 -0
  148. package/lib/workspace/shared/feature-workspace.service.d.ts +2 -0
  149. package/lib/workspace/shared/index.d.ts +2 -0
  150. package/lib/workspace/shared/wfs-workspace.d.ts +3 -0
  151. package/lib/workspace/shared/wfs-workspace.service.d.ts +2 -0
  152. package/lib/workspace/shared/wms-workspace.service.d.ts +2 -0
  153. package/lib/workspace/shared/workspace.utils.d.ts +3 -2
  154. package/lib/workspace/workspace-selector/workspace-selector.directive.d.ts +10 -3
  155. package/lib/workspace/workspace-updator/workspace-updator.directive.d.ts +3 -1
  156. package/lib/workspace/workspace.module.d.ts +8 -5
  157. package/package.json +4 -4
  158. package/style/geo.theming.scss +1 -0
@@ -0,0 +1,619 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { HttpHeaders } from '@angular/common/http';
3
+ import { ActionStore, EntityStoreFilterCustomFuncStrategy, EntityStoreFilterSelectionStrategy, EntityTableColumnRenderer } from '@igo2/common';
4
+ import { catchError, map, skipWhile, take } from 'rxjs/operators';
5
+ import { FeatureDataSource } from '../../datasource/shared/datasources/feature-datasource';
6
+ import { FeatureMotion, FeatureStore, FeatureStoreInMapExtentStrategy, FeatureStoreInMapResolutionStrategy, FeatureStoreLoadingLayerStrategy, FeatureStoreSelectionStrategy } from '../../feature';
7
+ import { LinkedProperties, VectorLayer } from '../../layer';
8
+ import { EditionWorkspace } from './edition-workspace';
9
+ import { BehaviorSubject, throwError } from 'rxjs';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "../../layer";
12
+ import * as i2 from "@igo2/core";
13
+ import * as i3 from "@angular/common/http";
14
+ import * as i4 from "@angular/material/dialog";
15
+ import * as i5 from "@igo2/auth";
16
+ export class EditionWorkspaceService {
17
+ constructor(layerService, storageService, configService, messageService, languageService, http, dialog, authInterceptor) {
18
+ this.layerService = layerService;
19
+ this.storageService = storageService;
20
+ this.configService = configService;
21
+ this.messageService = messageService;
22
+ this.languageService = languageService;
23
+ this.http = http;
24
+ this.dialog = dialog;
25
+ this.authInterceptor = authInterceptor;
26
+ this.ws$ = new BehaviorSubject(undefined);
27
+ this.adding$ = new BehaviorSubject(false);
28
+ this.relationLayers$ = new BehaviorSubject(undefined);
29
+ this.rowsInMapExtentCheckCondition$ = new BehaviorSubject(true);
30
+ this.loading = false;
31
+ }
32
+ get zoomAuto() {
33
+ return this.storageService.get('zoomAuto');
34
+ }
35
+ createWorkspace(layer, map) {
36
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
37
+ if (((_a = layer.options.workspace) === null || _a === void 0 ? void 0 : _a.enabled) !== true || layer.dataSource.options.edition.enabled !== true) {
38
+ return;
39
+ }
40
+ let wksConfig;
41
+ if (layer.options.workspace) {
42
+ wksConfig = layer.options.workspace;
43
+ }
44
+ else {
45
+ wksConfig = {};
46
+ }
47
+ wksConfig.srcId = layer.id;
48
+ wksConfig.workspaceId = layer.id;
49
+ wksConfig.enabled = true;
50
+ wksConfig.pageSize = (_b = layer.options.workspace) === null || _b === void 0 ? void 0 : _b.pageSize;
51
+ wksConfig.pageSizeOptions = (_c = layer.options.workspace) === null || _c === void 0 ? void 0 : _c.pageSizeOptions;
52
+ const dataSource = layer.dataSource;
53
+ const wmsLinkId = layer.id + '.WmsWorkspaceTableSrc';
54
+ const wfsLinkId = layer.id + '.WfsWorkspaceTableDest';
55
+ if (!layer.options.linkedLayers) {
56
+ layer.options.linkedLayers = { linkId: wmsLinkId, links: [] };
57
+ }
58
+ const linkProperties = {
59
+ bidirectionnal: true,
60
+ syncedDelete: true,
61
+ linkedIds: [wfsLinkId],
62
+ properties: [
63
+ LinkedProperties.ZINDEX,
64
+ LinkedProperties.VISIBLE
65
+ ]
66
+ };
67
+ if (!((_d = layer.options.workspace) === null || _d === void 0 ? void 0 : _d.minResolution)) {
68
+ linkProperties.properties.push(LinkedProperties.MINRESOLUTION);
69
+ }
70
+ let hasOgcFilters = false;
71
+ if ((_e = dataSource.options.ogcFilters) === null || _e === void 0 ? void 0 : _e.enabled) {
72
+ linkProperties.properties.push(LinkedProperties.OGCFILTERS);
73
+ hasOgcFilters = true;
74
+ }
75
+ if (!((_f = layer.options.workspace) === null || _f === void 0 ? void 0 : _f.maxResolution)) {
76
+ linkProperties.properties.push(LinkedProperties.MAXRESOLUTION);
77
+ }
78
+ let clonedLinks = [];
79
+ if (layer.options.linkedLayers.links) {
80
+ clonedLinks = JSON.parse(JSON.stringify(layer.options.linkedLayers.links));
81
+ }
82
+ clonedLinks.push(linkProperties);
83
+ layer.options.linkedLayers.linkId = layer.options.linkedLayers.linkId ? layer.options.linkedLayers.linkId : wmsLinkId,
84
+ layer.options.linkedLayers.links = clonedLinks;
85
+ let wks;
86
+ this.layerService
87
+ .createAsyncLayer({
88
+ id: wfsLinkId,
89
+ linkedLayers: {
90
+ linkId: wfsLinkId
91
+ },
92
+ workspace: {
93
+ srcId: layer.id,
94
+ workspaceId: undefined,
95
+ enabled: false,
96
+ queryOptions: {
97
+ mapQueryOnOpenTab: (_h = (_g = layer.options.workspace) === null || _g === void 0 ? void 0 : _g.queryOptions) === null || _h === void 0 ? void 0 : _h.mapQueryOnOpenTab,
98
+ tabQuery: false
99
+ },
100
+ pageSize: (_j = layer.options.workspace) === null || _j === void 0 ? void 0 : _j.pageSize,
101
+ pageSizeOptions: (_k = layer.options.workspace) === null || _k === void 0 ? void 0 : _k.pageSizeOptions
102
+ },
103
+ showInLayerList: false,
104
+ opacity: 0,
105
+ title: layer.title,
106
+ minResolution: ((_l = layer.options.workspace) === null || _l === void 0 ? void 0 : _l.minResolution) || layer.minResolution || 0,
107
+ maxResolution: ((_m = layer.options.workspace) === null || _m === void 0 ? void 0 : _m.maxResolution) || layer.maxResolution || Infinity,
108
+ sourceOptions: {
109
+ download: dataSource.options.download,
110
+ type: 'wfs',
111
+ url: dataSource.options.urlWfs || dataSource.options.url,
112
+ queryable: true,
113
+ relations: dataSource.options.relations,
114
+ queryTitle: dataSource.options.queryTitle,
115
+ params: dataSource.options.paramsWFS,
116
+ ogcFilters: Object.assign({}, dataSource.ogcFilters$.value, { enabled: hasOgcFilters }),
117
+ sourceFields: dataSource.options.sourceFields || undefined,
118
+ edition: dataSource.options.edition
119
+ }
120
+ })
121
+ .subscribe((workspaceLayer) => {
122
+ map.addLayer(workspaceLayer);
123
+ layer.ol.setProperties({ linkedLayers: { linkId: layer.options.linkedLayers.linkId, links: clonedLinks } }, false);
124
+ workspaceLayer.dataSource.ol.refresh();
125
+ wks = new EditionWorkspace({
126
+ id: layer.id,
127
+ title: layer.title,
128
+ layer: workspaceLayer,
129
+ map,
130
+ entityStore: this.createFeatureStore(workspaceLayer, map),
131
+ actionStore: new ActionStore([]),
132
+ meta: {
133
+ tableTemplate: undefined
134
+ }
135
+ }, this, this.dialog, this.configService);
136
+ this.createTableTemplate(wks, workspaceLayer);
137
+ workspaceLayer.options.workspace.workspaceId = workspaceLayer.id;
138
+ layer.options.workspace = Object.assign({}, layer.options.workspace, {
139
+ wksConfig
140
+ });
141
+ delete dataSource.options.download;
142
+ return wks;
143
+ });
144
+ return wks;
145
+ }
146
+ createFeatureStore(layer, map) {
147
+ const store = new FeatureStore([], { map });
148
+ store.bindLayer(layer);
149
+ const loadingStrategy = new FeatureStoreLoadingLayerStrategy({});
150
+ const inMapExtentStrategy = new FeatureStoreInMapExtentStrategy({});
151
+ const inMapResolutionStrategy = new FeatureStoreInMapResolutionStrategy({});
152
+ const selectedRecordStrategy = new EntityStoreFilterSelectionStrategy({});
153
+ const selectionStrategy = new FeatureStoreSelectionStrategy({
154
+ layer: new VectorLayer({
155
+ zIndex: 300,
156
+ source: new FeatureDataSource(),
157
+ style: undefined,
158
+ showInLayerList: false,
159
+ exportable: false,
160
+ browsable: false
161
+ }),
162
+ map,
163
+ hitTolerance: 15,
164
+ motion: this.zoomAuto ? FeatureMotion.Default : FeatureMotion.None,
165
+ many: true,
166
+ dragBox: true
167
+ });
168
+ store.addStrategy(loadingStrategy, true);
169
+ store.addStrategy(inMapExtentStrategy, true);
170
+ store.addStrategy(inMapResolutionStrategy, true);
171
+ store.addStrategy(selectionStrategy, true);
172
+ store.addStrategy(selectedRecordStrategy, false);
173
+ store.addStrategy(this.createFilterInMapExtentOrResolutionStrategy(), true);
174
+ return store;
175
+ }
176
+ createTableTemplate(workspace, layer) {
177
+ const fields = layer.dataSource.options.sourceFields || [];
178
+ const relations = layer.dataSource.options.relations || [];
179
+ let rendererType = EntityTableColumnRenderer.UnsanitizedHTML;
180
+ let buttons = [];
181
+ let columns = [];
182
+ let relationsColumn = [];
183
+ buttons = [{
184
+ name: 'edition',
185
+ title: undefined,
186
+ renderer: EntityTableColumnRenderer.ButtonGroup,
187
+ primary: false,
188
+ valueAccessor: () => {
189
+ return [{
190
+ editMode: false,
191
+ icon: 'pencil',
192
+ color: 'primary',
193
+ click: (feature) => { workspace.editFeature(feature, workspace); }
194
+ },
195
+ {
196
+ editMode: false,
197
+ icon: 'delete',
198
+ color: 'warn',
199
+ click: (feature) => { workspace.deleteFeature(feature, workspace); }
200
+ },
201
+ {
202
+ editMode: true,
203
+ icon: 'check',
204
+ color: 'primary',
205
+ disabled: this.loading,
206
+ click: (feature) => { this.saveFeature(feature, workspace); }
207
+ },
208
+ {
209
+ editMode: true,
210
+ icon: 'alpha-x',
211
+ color: 'primary',
212
+ disabled: this.loading,
213
+ click: (feature) => { this.cancelEdit(workspace, feature); }
214
+ }];
215
+ }
216
+ }];
217
+ if (fields.length === 0) {
218
+ workspace.entityStore.entities$.pipe(skipWhile(val => val.length === 0), take(1)).subscribe(entities => {
219
+ const ol = entities[0].ol;
220
+ const columnsFromFeatures = ol.getKeys()
221
+ .filter(col => !col.startsWith('_') &&
222
+ col !== 'geometry' &&
223
+ col !== ol.getGeometryName() &&
224
+ !col.match(/boundedby/gi))
225
+ .map(key => {
226
+ return {
227
+ name: `properties.${key}`,
228
+ title: key,
229
+ renderer: rendererType,
230
+ };
231
+ });
232
+ workspace.meta.tableTemplate = {
233
+ selection: false,
234
+ sort: true,
235
+ columns: columnsFromFeatures
236
+ };
237
+ });
238
+ return;
239
+ }
240
+ columns = fields.map((field) => {
241
+ let column = {
242
+ name: `properties.${field.name}`,
243
+ title: field.alias ? field.alias : field.name,
244
+ renderer: rendererType,
245
+ valueAccessor: undefined,
246
+ cellClassFunc: () => {
247
+ const cellClass = {};
248
+ if (field.type) {
249
+ cellClass[`class_${field.type}`] = true;
250
+ return cellClass;
251
+ }
252
+ },
253
+ primary: field.primary === true ? true : false,
254
+ visible: field.visible,
255
+ validation: field.validation,
256
+ type: field.type,
257
+ domainValues: undefined,
258
+ relation: undefined,
259
+ multiple: field.multiple,
260
+ step: field.step,
261
+ tooltip: field.tooltip
262
+ };
263
+ if (field.type === 'list' || field.type === 'autocomplete') {
264
+ this.getDomainValues(field.relation.table).subscribe(result => {
265
+ column.domainValues = result;
266
+ column.relation = field.relation;
267
+ });
268
+ }
269
+ return column;
270
+ });
271
+ relationsColumn = relations.map((relation) => {
272
+ return {
273
+ name: `properties.${relation.name}`,
274
+ title: relation.alias ? relation.alias : relation.name,
275
+ renderer: EntityTableColumnRenderer.Icon,
276
+ icon: relation.icon,
277
+ parent: relation.parent,
278
+ type: 'relation',
279
+ tooltip: relation.tooltip,
280
+ onClick: () => {
281
+ if (this.adding$.getValue() === false) {
282
+ this.ws$.next(relation.title);
283
+ }
284
+ },
285
+ cellClassFunc: () => {
286
+ return { 'class_icon': true };
287
+ }
288
+ };
289
+ });
290
+ columns.push(...relationsColumn);
291
+ columns.push(...buttons);
292
+ workspace.meta.tableTemplate = {
293
+ selection: false,
294
+ sort: true,
295
+ columns
296
+ };
297
+ }
298
+ createFilterInMapExtentOrResolutionStrategy() {
299
+ const filterClauseFunc = (record) => {
300
+ return record.state.inMapExtent === true && record.state.inMapResolution === true;
301
+ };
302
+ return new EntityStoreFilterCustomFuncStrategy({ filterClauseFunc });
303
+ }
304
+ saveFeature(feature, workspace) {
305
+ if (!this.validateFeature(feature, workspace)) {
306
+ return false;
307
+ }
308
+ this.sanitizeParameter(feature, workspace);
309
+ let url = this.configService.getConfig('edition.url');
310
+ if (workspace.layer.dataSource.options.edition.baseUrl) {
311
+ url += workspace.layer.dataSource.options.edition.baseUrl;
312
+ }
313
+ if (feature.newFeature) {
314
+ url += workspace.layer.dataSource.options.edition.addUrl;
315
+ const addHeaders = workspace.layer.dataSource.options.edition.addHeaders;
316
+ const headers = new HttpHeaders(addHeaders);
317
+ this.addFeature(feature, workspace, url, headers);
318
+ }
319
+ else {
320
+ if (workspace.layer.dataSource.options.edition.modifyProtocol !== "post") {
321
+ url += '?' + workspace.layer.dataSource.options.edition.modifyUrl + feature.idkey;
322
+ }
323
+ else {
324
+ url += workspace.layer.dataSource.options.edition.modifyUrl;
325
+ }
326
+ const protocole = workspace.layer.dataSource.options.edition.modifyProtocol;
327
+ const modifyHeaders = workspace.layer.dataSource.options.edition.modifyHeaders;
328
+ const headers = new HttpHeaders(modifyHeaders);
329
+ this.modifyFeature(feature, workspace, url, headers, protocole);
330
+ }
331
+ }
332
+ addFeature(feature, workspace, url, headers) {
333
+ var _a;
334
+ // TODO: adapt to any kind of geometry
335
+ if (workspace.layer.dataSource.options.edition.hasGeometry) {
336
+ //feature.properties[geom] = feature.geometry;
337
+ feature.properties["longitude"] = feature.geometry.coordinates[0];
338
+ feature.properties["latitude"] = feature.geometry.coordinates[1];
339
+ }
340
+ for (const property in feature.properties) {
341
+ for (const sf of workspace.layer.dataSource.options.sourceFields) {
342
+ if (sf.name === property && ((_a = sf.validation) === null || _a === void 0 ? void 0 : _a.readonly)) {
343
+ delete feature.properties[property];
344
+ }
345
+ }
346
+ }
347
+ this.loading = true;
348
+ this.http.post(`${url}`, feature.properties, { headers: headers }).subscribe(() => {
349
+ this.loading = false;
350
+ workspace.entityStore.stateView.clear();
351
+ workspace.deleteDrawings();
352
+ workspace.entityStore.delete(feature);
353
+ const message = this.languageService.translate.instant('igo.geo.workspace.addSuccess');
354
+ this.messageService.success(message);
355
+ this.refreshMap(workspace.layer, workspace.layer.map);
356
+ this.adding$.next(false);
357
+ this.rowsInMapExtentCheckCondition$.next(true);
358
+ }, error => {
359
+ this.loading = false;
360
+ error.error.caught = true;
361
+ const genericErrorMessage = this.languageService.translate.instant('igo.geo.workspace.addError');
362
+ const messages = workspace.layer.dataSource.options.edition.messages;
363
+ if (messages) {
364
+ let text;
365
+ messages.forEach(message => {
366
+ const key = Object.keys(message)[0];
367
+ if (error.error.message.includes(key)) {
368
+ text = message[key];
369
+ this.messageService.error(text);
370
+ }
371
+ });
372
+ if (!text) {
373
+ this.messageService.error(genericErrorMessage);
374
+ }
375
+ }
376
+ else {
377
+ this.messageService.error(genericErrorMessage);
378
+ }
379
+ });
380
+ }
381
+ deleteFeature(workspace, url) {
382
+ this.loading = true;
383
+ this.http.delete(`${url}`, {}).subscribe(() => {
384
+ this.loading = false;
385
+ const message = this.languageService.translate.instant('igo.geo.workspace.deleteSuccess');
386
+ this.messageService.success(message);
387
+ this.refreshMap(workspace.layer, workspace.layer.map);
388
+ for (const relation of workspace.layer.options.sourceOptions.relations) {
389
+ workspace.map.layers.forEach((layer) => {
390
+ if (layer.title === relation.title) {
391
+ layer.dataSource.ol.refresh();
392
+ }
393
+ });
394
+ }
395
+ }, error => {
396
+ this.loading = false;
397
+ error.error.caught = true;
398
+ const genericErrorMessage = this.languageService.translate.instant('igo.geo.workspace.addError');
399
+ const messages = workspace.layer.dataSource.options.edition.messages;
400
+ if (messages) {
401
+ let text;
402
+ messages.forEach(message => {
403
+ const key = Object.keys(message)[0];
404
+ if (error.error.message.includes(key)) {
405
+ text = message[key];
406
+ this.messageService.error(text);
407
+ }
408
+ });
409
+ if (!text) {
410
+ this.messageService.error(genericErrorMessage);
411
+ }
412
+ }
413
+ else {
414
+ this.messageService.error(genericErrorMessage);
415
+ }
416
+ });
417
+ }
418
+ modifyFeature(feature, workspace, url, headers, protocole = 'patch') {
419
+ var _a;
420
+ //TODO: adapt to any kind of geometry
421
+ if (workspace.layer.dataSource.options.edition.hasGeometry) {
422
+ //feature.properties[geom] = feature.geometry;
423
+ feature.properties["longitude"] = feature.geometry.coordinates[0];
424
+ feature.properties["latitude"] = feature.geometry.coordinates[1];
425
+ }
426
+ for (const property in feature.properties) {
427
+ for (const sf of workspace.layer.dataSource.options.sourceFields) {
428
+ if ((sf.name === property && ((_a = sf.validation) === null || _a === void 0 ? void 0 : _a.readonly)) || property === 'boundedBy') {
429
+ delete feature.properties[property];
430
+ }
431
+ }
432
+ }
433
+ this.loading = true;
434
+ this.http[protocole](`${url}`, feature.properties, { headers: headers }).subscribe(() => {
435
+ this.loading = false;
436
+ this.cancelEdit(workspace, feature, true);
437
+ const message = this.languageService.translate.instant('igo.geo.workspace.modifySuccess');
438
+ this.messageService.success(message);
439
+ this.refreshMap(workspace.layer, workspace.layer.map);
440
+ let relationLayers = [];
441
+ for (const relation of workspace.layer.options.sourceOptions.relations) {
442
+ workspace.map.layers.forEach((layer) => {
443
+ if (layer.title === relation.title) {
444
+ relationLayers.push(layer);
445
+ layer.dataSource.ol.refresh();
446
+ }
447
+ });
448
+ }
449
+ this.relationLayers$.next(relationLayers);
450
+ }, error => {
451
+ this.loading = false;
452
+ error.error.caught = true;
453
+ const genericErrorMessage = this.languageService.translate.instant('igo.geo.workspace.addError');
454
+ const messages = workspace.layer.dataSource.options.edition.messages;
455
+ if (messages) {
456
+ let text;
457
+ messages.forEach(message => {
458
+ const key = Object.keys(message)[0];
459
+ if (error.error.message.includes(key)) {
460
+ text = message[key];
461
+ this.messageService.error(text);
462
+ }
463
+ });
464
+ if (!text) {
465
+ this.messageService.error(genericErrorMessage);
466
+ }
467
+ }
468
+ else {
469
+ this.messageService.error(genericErrorMessage);
470
+ }
471
+ });
472
+ }
473
+ cancelEdit(workspace, feature, fromSave = false) {
474
+ feature.edition = false;
475
+ this.adding$.next(false);
476
+ workspace.deleteDrawings();
477
+ if (feature.newFeature) {
478
+ workspace.entityStore.stateView.clear();
479
+ workspace.entityStore.delete(feature);
480
+ workspace.deactivateDrawControl();
481
+ this.rowsInMapExtentCheckCondition$.next(true);
482
+ }
483
+ else {
484
+ if (!fromSave) {
485
+ feature.properties = feature.original_properties;
486
+ feature.geometry = feature.original_geometry;
487
+ }
488
+ delete feature.original_properties;
489
+ delete feature.original_geometry;
490
+ }
491
+ }
492
+ getDomainValues(table) {
493
+ let url = this.configService.getConfig('edition.url') + table;
494
+ return this.http.get(url).pipe(map(result => {
495
+ return result;
496
+ }), catchError((err) => {
497
+ return throwError(err);
498
+ }));
499
+ }
500
+ /*
501
+ * Refresh both wms and wfs layer
502
+ * A new wfs loader is used to ensure cache is not retrieving old data
503
+ * WMS params are updated to ensure layer is correctly refreshed
504
+ */
505
+ refreshMap(layer, map) {
506
+ var _a, _b;
507
+ const wfsOlLayer = layer.dataSource.ol;
508
+ const loader = (extent, resolution, proj, success, failure) => {
509
+ layer.customWFSLoader(layer.ol.getSource(), layer.options.sourceOptions, this.authInterceptor, extent, resolution, proj, success, failure, true);
510
+ };
511
+ wfsOlLayer.setLoader(loader);
512
+ wfsOlLayer.refresh();
513
+ for (const lay of map.layers) {
514
+ if (lay.id !== layer.id &&
515
+ ((_a = lay.options.linkedLayers) === null || _a === void 0 ? void 0 : _a.linkId.includes(layer.id.substr(0, layer.id.indexOf('.') - 1))) &&
516
+ ((_b = lay.options.linkedLayers) === null || _b === void 0 ? void 0 : _b.linkId.includes('WmsWorkspaceTableSrc'))) {
517
+ const wmsOlLayer = lay.dataSource.ol;
518
+ let params = wmsOlLayer.getParams();
519
+ params._t = new Date().getTime();
520
+ wmsOlLayer.updateParams(params);
521
+ }
522
+ }
523
+ }
524
+ validateFeature(feature, workspace) {
525
+ const translate = this.languageService.translate;
526
+ let message;
527
+ let key;
528
+ let valid = true;
529
+ workspace.meta.tableTemplate.columns.forEach(column => {
530
+ if (column.hasOwnProperty('validation') && column.validation) {
531
+ key = getColumnKeyWithoutPropertiesTag(column.name);
532
+ Object.keys(column.validation).forEach((type) => {
533
+ switch (type) {
534
+ case 'mandatory': {
535
+ if (column.validation[type] && (!feature.properties.hasOwnProperty(key) || !feature.properties[key])) {
536
+ valid = false;
537
+ message = translate.instant('igo.geo.formValidation.mandatory', {
538
+ column: column.title
539
+ });
540
+ this.messageService.error(message);
541
+ }
542
+ break;
543
+ }
544
+ case 'minValue': {
545
+ if (feature.properties.hasOwnProperty(key) && feature.properties[key] && feature.properties[key] < column.validation[type]) {
546
+ valid = false;
547
+ message = translate.instant('igo.geo.formValidation.minValue', {
548
+ column: column.title,
549
+ value: column.validation[type]
550
+ });
551
+ this.messageService.error(message);
552
+ }
553
+ break;
554
+ }
555
+ case 'maxValue': {
556
+ if (feature.properties.hasOwnProperty(key) && feature.properties[key] && feature.properties[key] > column.validation[type]) {
557
+ valid = false;
558
+ message = translate.instant('igo.geo.formValidation.maxValue', {
559
+ column: column.title,
560
+ value: column.validation[type]
561
+ });
562
+ this.messageService.error(message);
563
+ }
564
+ break;
565
+ }
566
+ case 'minLength': {
567
+ if (feature.properties.hasOwnProperty(key) && feature.properties[key] &&
568
+ feature.properties[key].length < column.validation[type]) {
569
+ valid = false;
570
+ message = translate.instant('igo.geo.formValidation.minLength', {
571
+ column: column.title,
572
+ value: column.validation[type]
573
+ });
574
+ this.messageService.error(message);
575
+ }
576
+ break;
577
+ }
578
+ case 'maxLength': {
579
+ if (feature.properties.hasOwnProperty(key) && feature.properties[key] &&
580
+ feature.properties[key].length > column.validation[type]) {
581
+ valid = false;
582
+ message = translate.instant('igo.geo.formValidation.maxLength', {
583
+ column: column.title,
584
+ value: column.validation[type]
585
+ });
586
+ this.messageService.error(message);
587
+ }
588
+ break;
589
+ }
590
+ }
591
+ });
592
+ }
593
+ });
594
+ return valid;
595
+ }
596
+ sanitizeParameter(feature, workspace) {
597
+ workspace.meta.tableTemplate.columns.forEach(column => {
598
+ if (column.type === 'list' && feature.properties[getColumnKeyWithoutPropertiesTag(column.name)]) {
599
+ feature.properties[getColumnKeyWithoutPropertiesTag(column.name)] =
600
+ feature.properties[getColumnKeyWithoutPropertiesTag(column.name)].toString();
601
+ }
602
+ });
603
+ }
604
+ }
605
+ EditionWorkspaceService.ɵfac = function EditionWorkspaceService_Factory(t) { return new (t || EditionWorkspaceService)(i0.ɵɵinject(i1.LayerService), i0.ɵɵinject(i2.StorageService), i0.ɵɵinject(i2.ConfigService), i0.ɵɵinject(i2.MessageService), i0.ɵɵinject(i2.LanguageService), i0.ɵɵinject(i3.HttpClient), i0.ɵɵinject(i4.MatDialog), i0.ɵɵinject(i5.AuthInterceptor)); };
606
+ EditionWorkspaceService.ɵprov = /*@__PURE__*/ i0.ɵɵdefineInjectable({ token: EditionWorkspaceService, factory: EditionWorkspaceService.ɵfac, providedIn: 'root' });
607
+ (function () { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EditionWorkspaceService, [{
608
+ type: Injectable,
609
+ args: [{
610
+ providedIn: 'root'
611
+ }]
612
+ }], function () { return [{ type: i1.LayerService }, { type: i2.StorageService }, { type: i2.ConfigService }, { type: i2.MessageService }, { type: i2.LanguageService }, { type: i3.HttpClient }, { type: i4.MatDialog }, { type: i5.AuthInterceptor }]; }, null); })();
613
+ function getColumnKeyWithoutPropertiesTag(column) {
614
+ if (column.includes('properties.')) {
615
+ return column.split('.')[1];
616
+ }
617
+ return column;
618
+ }
619
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGlvbi13b3Jrc3BhY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2dlby9zcmMvbGliL3dvcmtzcGFjZS9zaGFyZWQvZWRpdGlvbi13b3Jrc3BhY2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBaUMsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFHbEYsT0FBTyxFQUNMLFdBQVcsRUFFWCxtQ0FBbUMsRUFDbkMsa0NBQWtDLEVBRWxDLHlCQUF5QixFQUVQLE1BQU0sY0FBYyxDQUFDO0FBR3pDLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx3REFBd0QsQ0FBQztBQUUzRixPQUFPLEVBRUwsYUFBYSxFQUNiLFlBQVksRUFDWiwrQkFBK0IsRUFDL0IsbUNBQW1DLEVBQ25DLGdDQUFnQyxFQUNoQyw2QkFBNkIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUd0RCxPQUFPLEVBQWtELGdCQUFnQixFQUFFLFdBQVcsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUk1RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUt2RCxPQUFPLEVBQUUsZUFBZSxFQUFjLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7OztBQUsvRCxNQUFNLE9BQU8sdUJBQXVCO0lBWWxDLFlBQ1UsWUFBMEIsRUFDMUIsY0FBOEIsRUFDOUIsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsZUFBZ0MsRUFDaEMsSUFBZ0IsRUFDaEIsTUFBaUIsRUFDbEIsZUFBaUM7UUFQaEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUFDaEMsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNoQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2xCLG9CQUFlLEdBQWYsZUFBZSxDQUFrQjtRQWxCbkMsUUFBRyxHQUFHLElBQUksZUFBZSxDQUFTLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUM5QyxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUErQixTQUFTLENBQUMsQ0FBQztRQUMvRSxtQ0FBOEIsR0FBRyxJQUFJLGVBQWUsQ0FBVSxJQUFJLENBQUMsQ0FBQztRQUNwRSxZQUFPLEdBQUcsS0FBSyxDQUFDO0lBY3VCLENBQUM7SUFaL0MsSUFBSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQVksQ0FBQztJQUN4RCxDQUFDO0lBWUQsZUFBZSxDQUFDLEtBQWlCLEVBQUUsR0FBVzs7UUFDNUMsSUFBSSxDQUFBLE1BQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLDBDQUFFLE9BQU8sTUFBSyxJQUFJLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sS0FBSyxJQUFJLEVBQUU7WUFDbEcsT0FBTztTQUNSO1FBQ0QsSUFBSSxTQUFTLENBQUM7UUFDZCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFO1lBQzNCLFNBQVMsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQztTQUNyQzthQUFNO1lBQ0wsU0FBUyxHQUFHLEVBQUUsQ0FBQztTQUNoQjtRQUNELFNBQVMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMzQixTQUFTLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDakMsU0FBUyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDekIsU0FBUyxDQUFDLFFBQVEsR0FBRyxNQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUywwQ0FBRSxRQUFRLENBQUM7UUFDdkQsU0FBUyxDQUFDLGVBQWUsR0FBRyxNQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUywwQ0FBRSxlQUFlLENBQUM7UUFFckUsTUFBTSxVQUFVLEdBQWtCLEtBQUssQ0FBQyxVQUEyQixDQUFFO1FBQ3JFLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsdUJBQXVCLENBQUM7UUFDckQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyx3QkFBd0IsQ0FBQztRQUN0RCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUU7WUFDL0IsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztTQUMvRDtRQUNELE1BQU0sY0FBYyxHQUFHO1lBQ3JCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN0QixVQUFVLEVBQUU7Z0JBQ1YsZ0JBQWdCLENBQUMsTUFBTTtnQkFDdkIsZ0JBQWdCLENBQUMsT0FBTzthQUFDO1NBQ0osQ0FBQztRQUUxQixJQUFJLENBQUMsQ0FBQSxNQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUywwQ0FBRSxhQUFhLENBQUEsRUFBRTtZQUMxQyxjQUFjLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLE1BQUMsVUFBVSxDQUFDLE9BQTBDLENBQUMsVUFBVSwwQ0FBRSxPQUFPLEVBQUU7WUFDOUUsY0FBYyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUQsYUFBYSxHQUFHLElBQUksQ0FBQztTQUN0QjtRQUNELElBQUksQ0FBQyxDQUFBLE1BQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLDBDQUFFLGFBQWEsQ0FBQSxFQUFFO1lBQzNDLGNBQWMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ2hFO1FBRUQsSUFBSSxXQUFXLEdBQTJCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRTtZQUNwQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDNUU7UUFDRCxXQUFXLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBRWpDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUztZQUNuSCxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDO1FBRWpELElBQUksR0FBRyxDQUFDO1FBQ1IsSUFBSSxDQUFDLFlBQVk7YUFDZCxnQkFBZ0IsQ0FBQztZQUNoQixFQUFFLEVBQUUsU0FBUztZQUNiLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUUsU0FBUzthQUNsQjtZQUNELFNBQVMsRUFBRTtnQkFDVCxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ2YsV0FBVyxFQUFFLFNBQVM7Z0JBQ3RCLE9BQU8sRUFBRSxLQUFLO2dCQUNkLFlBQVksRUFBRTtvQkFDWixpQkFBaUIsRUFBRSxNQUFBLE1BQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLDBDQUFFLFlBQVksMENBQUUsaUJBQWlCO29CQUMzRSxRQUFRLEVBQUUsS0FBSztpQkFDaEI7Z0JBQ0QsUUFBUSxFQUFFLE1BQUEsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLDBDQUFFLFFBQVE7Z0JBQzNDLGVBQWUsRUFBRSxNQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUywwQ0FBRSxlQUFlO2FBQzFEO1lBQ0QsZUFBZSxFQUFFLEtBQUs7WUFDdEIsT0FBTyxFQUFFLENBQUM7WUFDVixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsYUFBYSxFQUFFLENBQUEsTUFBQSxLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsMENBQUUsYUFBYSxLQUFJLEtBQUssQ0FBQyxhQUFhLElBQUksQ0FBQztZQUNqRixhQUFhLEVBQUUsQ0FBQSxNQUFBLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUywwQ0FBRSxhQUFhLEtBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxRQUFRO1lBQ3hGLGFBQWEsRUFBRTtnQkFDYixRQUFRLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRO2dCQUNyQyxJQUFJLEVBQUUsS0FBSztnQkFDWCxHQUFHLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxHQUFHO2dCQUN4RCxTQUFTLEVBQUUsSUFBSTtnQkFDZixTQUFTLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxTQUFTO2dCQUN2QyxVQUFVLEVBQUcsVUFBVSxDQUFDLE9BQXNDLENBQUMsVUFBVTtnQkFDekUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUztnQkFDcEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLEVBQUMsT0FBTyxFQUFFLGFBQWEsRUFBQyxDQUFDO2dCQUNyRixZQUFZLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksU0FBUztnQkFDMUQsT0FBTyxFQUFFLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTzthQUN0QjtTQUNoQixDQUFDO2FBQ0QsU0FBUyxDQUFDLENBQUMsY0FBMkIsRUFBRSxFQUFFO1lBQ3pDLEdBQUcsQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDN0IsS0FBSyxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsRUFBRSxZQUFZLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ25ILGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBRXZDLEdBQUcsR0FBRyxJQUFJLGdCQUFnQixDQUFDO2dCQUN6QixFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUU7Z0JBQ1osS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixLQUFLLEVBQUUsY0FBYztnQkFDckIsR0FBRztnQkFDSCxXQUFXLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUM7Z0JBQ3pELFdBQVcsRUFBRSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksRUFBRTtvQkFDSixhQUFhLEVBQUUsU0FBUztpQkFDekI7YUFDRixFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBRTlDLGNBQWMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxjQUFjLENBQUMsRUFBRSxDQUFDO1lBQ2pFLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUNqRTtnQkFDRSxTQUFTO2FBQ2EsQ0FBQyxDQUFDO1lBRTVCLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDbkMsT0FBTyxHQUFHLENBQUM7UUFFYixDQUFDLENBQUMsQ0FBQztRQUVMLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVPLGtCQUFrQixDQUFDLEtBQWtCLEVBQUUsR0FBVztRQUN4RCxNQUFNLEtBQUssR0FBRyxJQUFJLFlBQVksQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLEtBQUssQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkIsTUFBTSxlQUFlLEdBQUcsSUFBSSxnQ0FBZ0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqRSxNQUFNLG1CQUFtQixHQUFHLElBQUksK0JBQStCLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDcEUsTUFBTSx1QkFBdUIsR0FBRyxJQUFJLG1DQUFtQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxrQ0FBa0MsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxRSxNQUFNLGlCQUFpQixHQUFHLElBQUksNkJBQTZCLENBQUM7WUFDMUQsS0FBSyxFQUFFLElBQUksV0FBVyxDQUFDO2dCQUNyQixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsSUFBSSxpQkFBaUIsRUFBRTtnQkFDL0IsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLGVBQWUsRUFBRSxLQUFLO2dCQUN0QixVQUFVLEVBQUUsS0FBSztnQkFDakIsU0FBUyxFQUFFLEtBQUs7YUFDakIsQ0FBQztZQUNGLEdBQUc7WUFDSCxZQUFZLEVBQUUsRUFBRTtZQUNoQixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLElBQUk7WUFDbEUsSUFBSSxFQUFFLElBQUk7WUFDVixPQUFPLEVBQUUsSUFBSTtTQUNkLENBQUMsQ0FBQztRQUNILEtBQUssQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxXQUFXLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDN0MsS0FBSyxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxLQUFLLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLEtBQUssQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakQsS0FBSyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFTyxtQkFBbUIsQ0FBQyxTQUEyQixFQUFFLEtBQWtCO1FBQ3pFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFFM0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUUzRCxJQUFJLFlBQVksR0FBRyx5QkFBeUIsQ0FBQyxlQUFlLENBQUM7UUFDN0QsSUFBSSxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLGVBQWUsR0FBRyxFQUFFLENBQUM7UUFFekIsT0FBTyxHQUFHLENBQUM7Z0JBQ1QsSUFBSSxFQUFFLFNBQVM7Z0JBQ2YsS0FBSyxFQUFFLFNBQVM7Z0JBQ2hCLFFBQVEsRUFBRSx5QkFBeUIsQ0FBQyxXQUFXO2dCQUMvQyxPQUFPLEVBQUUsS0FBSztnQkFDZCxhQUFhLEVBQUUsR0FBRyxFQUFFO29CQUNsQixPQUFPLENBQUM7NEJBQ04sUUFBUSxFQUFFLEtBQUs7NEJBQ2YsSUFBSSxFQUFFLFFBQVE7NEJBQ2QsS0FBSyxFQUFFLFNBQVM7NEJBQ2hCLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUNuRTt3QkFDRDs0QkFDRSxRQUFRLEVBQUUsS0FBSzs0QkFDZixJQUFJLEVBQUUsUUFBUTs0QkFDZCxLQUFLLEVBQUUsTUFBTTs0QkFDYixLQUFLLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQzt5QkFDckU7d0JBQ0Q7NEJBQ0UsUUFBUSxFQUFFLElBQUk7NEJBQ2QsSUFBSSxFQUFFLE9BQU87NEJBQ2IsS0FBSyxFQUFFLFNBQVM7NEJBQ2hCLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTzs0QkFDdEIsS0FBSyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQzlEO3dCQUNEOzRCQUNFLFFBQVEsRUFBRSxJQUFJOzRCQUNkLElBQUksRUFBRSxTQUFTOzRCQUNmLEtBQUssRUFBRSxTQUFTOzRCQUNoQixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU87NEJBQ3RCLEtBQUssRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO3lCQUM3RCxDQUF3QixDQUFDO2dCQUM1QixDQUFDO2FBQ0YsQ0FBQyxDQUFDO1FBR0gsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixTQUFTLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ2xDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLEVBQ2xDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FDUixDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsRUFBRTtnQkFDckIsTUFBTSxFQUFFLEdBQUksUUFBUSxDQUFDLENBQUMsQ0FBYSxDQUFDLEVBQTJCLENBQUM7Z0JBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRTtxQkFDckMsTUFBTSxDQUNMLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztvQkFDekIsR0FBRyxLQUFLLFVBQVU7b0JBQ2xCLEdBQUcsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFO29CQUM1QixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7cUJBQzdCLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDVCxPQUFPO3dCQUNMLElBQUksRUFBRSxjQUFjLEdBQUcsRUFBRTt3QkFDekIsS0FBSyxFQUFFLEdBQUc7d0JBQ1YsUUFBUSxFQUFFLFlBQVk7cUJBQ3ZCLENBQUM7Z0JBQ0osQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUc7b0JBQzdCLFNBQVMsRUFBRSxLQUFLO29CQUNoQixJQUFJLEVBQUUsSUFBSTtvQkFDVixPQUFPLEVBQUUsbUJBQW1CO2lCQUM3QixDQUFDO1lBQ0osQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPO1NBQ1I7UUFFRCxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWdDLEVBQUUsRUFBRTtZQUV4RCxJQUFJLE1BQU0sR0FBRztnQkFDWCxJQUFJLEVBQUUsY0FBYyxLQUFLLENBQUMsSUFBSSxFQUFFO2dCQUNoQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUk7Z0JBQzdDLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixhQUFhLEVBQUUsU0FBUztnQkFDeEIsYUFBYSxFQUFFLEdBQUcsRUFBRTtvQkFDbEIsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO29CQUNyQixJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUU7d0JBQ2QsU0FBUyxDQUFDLFNBQVMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO3dCQUN4QyxPQUFPLFNBQVMsQ0FBQztxQkFDbEI7Z0JBQ0gsQ0FBQztnQkFDRCxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSztnQkFDOUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2dCQUN0QixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsWUFBWSxFQUFFLFNBQVM7Z0JBQ3ZCLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixRQUFRLEVBQUUsS0FBSyxDQUFDLFFBQVE7Z0JBQ3hCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtnQkFDaEIsT0FBTyxFQUFFLEtBQUssQ0FBQyxPQUFPO2FBQ3ZCLENBQUM7WUFFRixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxFQUFFO2dCQUMxRCxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFO29CQUM1RCxNQUFNLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQztvQkFDN0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO2dCQUNuQyxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxlQUFlLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQXlCLEVBQUUsRUFBRTtZQUM1RCxPQUFPO2dCQUNMLElBQUksRUFBRSxjQUFjLFFBQVEsQ0FBQyxJQUFJLEVBQUU7Z0JBQ25DLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSTtnQkFDdEQsUUFBUSxFQUFFLHlCQUF5QixDQUFDLElBQUk7Z0JBQ3hDLElBQUksRUFBRSxRQUFRLENBQUMsSUFBSTtnQkFDbkIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QixJQUFJLEVBQUUsVUFBVTtnQkFDaEIsT0FBTyxFQUFFLFFBQVEsQ0FBQyxPQUFPO2dCQUN6QixPQUFPLEVBQUUsR0FBRyxFQUFFO29CQUNaLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsS0FBSyxLQUFLLEVBQUU7d0JBQ3JDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDL0I7Z0JBQ0gsQ0FBQztnQkFDRCxhQUFhLEVBQUUsR0FBRyxFQUFFO29CQUNsQixPQUFPLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxDQUFDO2dCQUNoQyxDQUFDO2FBQ0YsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUV6QixTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRztZQUM3QixTQUFTLEVBQUUsS0FBSztZQUNoQixJQUFJLEVBQUUsSUFBSTtZQUNWLE9BQU87U0FDUixDQUFDO0lBQ0osQ0FBQztJQUVPLDJDQUEyQztRQUNqRCxNQUFNLGdCQUFnQixHQUFHLENBQUMsTUFBNEIsRUFBRSxFQUFFO1lBQ3hELE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQztRQUNwRixDQUFDLENBQUM7UUFDRixPQUFPLElBQUksbUNBQW1DLENBQUMsRUFBQyxnQkFBZ0IsRUFBbUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUM7SUFFTSxXQUFXLENBQUMsT0FBTyxFQUFFLFNBQTJCO1FBQ3JELElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFBQztZQUM1QyxPQUFPLEtBQUssQ0FBQztTQUNkO1FBRUQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUzQyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUV0RCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFO1lBQ3RELEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztTQUMzRDtRQUVELElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtZQUN0QixHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7WUFFekQsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDekUsTUFBTSxPQUFPLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFFNUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsS0FBSyxNQUFNLEVBQUU7Z0JBQ3hFLEdBQUcsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQzthQUNuRjtpQkFDSTtnQkFDSCxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7YUFDN0Q7WUFFRCxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQztZQUM1RSxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUMvRSxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUUvQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztTQUNqRTtJQUNILENBQUM7SUFFTSxVQUFVLENBQUMsT0FBTyxFQUFFLFNBQTJCLEVBQUUsR0FBVyxFQUFFLE9BQTZCOztRQUNoRyxzQ0FBc0M7UUFDdEMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRTtZQUMxRCw4Q0FBOEM7WUFDOUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRSxPQUFPLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xFO1FBRUQsS0FBSyxNQUFNLFFBQVEsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3pDLEtBQUssTUFBTSxFQUFFLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFlBQVksRUFBRTtnQkFDaEUsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLFFBQVEsS0FBSSxNQUFBLEVBQUUsQ0FBQyxVQUFVLDBDQUFFLFFBQVEsQ0FBQSxFQUFFO29CQUNuRCxPQUFPLE9BQU8sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3JDO2FBQ0Y7U0FDRjtRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxFQUFFLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FDMUUsR0FBRyxFQUFFO1lBQ0gsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsU0FBUyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDeEMsU0FBUyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzNCLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBRXRDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEQsOEJBQThCLENBQy9CLENBQUM7WUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFvQixFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekIsSUFBSSxDQUFDLDhCQUE4QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ2hFLDRCQUE0QixDQUM3QixDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDckUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxJQUFJLENBQUM7Z0JBQ1QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3JDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNqQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNULElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUNoRDtRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVNLGFBQWEsQ0FBQyxTQUEyQixFQUFFLEdBQVc7UUFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQ3RDLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FDcEQsaUNBQWlDLENBQ2xDLENBQUM7WUFDRixJQUFJLENBQUMsY0FBYyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUVyQyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFvQixFQUFFLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDckUsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFO2dCQUN0RSxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtvQkFDckMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxLQUFLLEVBQUU7d0JBQ2xDLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMvQjtnQkFDSCxDQUFDLENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxFQUNELEtBQUssQ0FBQyxFQUFFO1lBQ04sSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7WUFDckIsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUNoRSw0QkFBNEIsQ0FDN0IsQ0FBQztZQUNGLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQ3JFLElBQUksUUFBUSxFQUFFO2dCQUNaLElBQUksSUFBSSxDQUFDO2dCQUNULFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7b0JBQ3pCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3BDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNyQyxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO3dCQUNwQixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDakM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsSUFBSSxDQUFDLElBQUksRUFBRTtvQkFDVCxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2lCQUNoRDthQUNGO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7YUFDaEQ7UUFDTCxDQUFDLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFTSxhQUFhLENBQUMsT0FBTyxFQUFFLFNBQTJCLEVBQUUsR0FBVyxFQUFFLE9BQTZCLEVBQUUsU0FBUyxHQUFHLE9BQU87O1FBQ3hILHFDQUFxQztRQUNyQyxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFO1lBQzFELDhDQUE4QztZQUM5QyxPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLE9BQU8sQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEU7UUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDekMsS0FBSyxNQUFNLEVBQUUsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFO2dCQUNoRSxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRLEtBQUksTUFBQSxFQUFFLENBQUMsVUFBVSwwQ0FBRSxRQUFRLENBQUEsQ0FBQyxJQUFJLFFBQVEsS0FBSyxXQUFXLEVBQUU7b0JBQ2pGLE9BQU8sT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDckM7YUFDRjtTQUNGO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQ2hGLEdBQUcsRUFBRTtZQUNILElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUxQyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ3BELGlDQUFpQyxDQUNsQyxDQUFDO1lBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7WUFFckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBb0IsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBRXJFLElBQUksY0FBYyxHQUFHLEVBQUUsQ0FBQztZQUN4QixLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUU7Z0JBQ3RFLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNyQyxJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxDQUFDLEtBQUssRUFBRTt3QkFDbEMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDM0IsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7cUJBQy9CO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1QyxDQUFDLEVBQ0QsS0FBSyxDQUFDLEVBQUU7WUFDTixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDMUIsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQ2hFLDRCQUE0QixDQUM3QixDQUFDO1lBQ0YsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7WUFDckUsSUFBSSxRQUFRLEVBQUU7Z0JBQ1osSUFBSSxJQUFJLENBQUM7Z0JBQ1QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDekIsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDcEMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7d0JBQ3JDLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3BCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNqQztnQkFDSCxDQUFDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsSUFBSSxFQUFFO29CQUNULElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7aUJBQ2hEO2FBQ0Y7aUJBQU07Z0JBQ0wsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsQ0FBQzthQUNoRDtRQUNILENBQUMsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FBQyxTQUEyQixFQUFFLE9BQU8sRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMvRCxPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN6QixTQUFTLENBQUMsY0FBYyxFQUFFLENBQUM7UUFFM0IsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO1lBQ3RCLFNBQVMsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hDLFNBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3RDLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1lBRWxDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDaEQ7YUFBTTtZQUNMLElBQUksQ0FBQyxRQUFRLEVBQUU7Z0JBQ2IsT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsbUJBQW1CLENBQUM7Z0JBQ2pELE9BQU8sQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLGlCQUFpQixDQUFDO2FBQzlDO1lBQ0QsT0FBTyxPQUFPLENBQUMsbUJBQW1CLENBQUM7WUFDbkMsT0FBTyxPQUFPLENBQUMsaUJBQWlCLENBQUM7U0FDbEM7SUFDSCxDQUFDO0lBRUQsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRTlELE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUNqQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDWCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsRUFDRixVQUFVLENBQUMsQ0FBQyxHQUFzQixFQUFFLEVBQUU7WUFDcEMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsVUFBVSxDQUFDLEtBQWtCLEVBQUUsR0FBVzs7UUFDeEMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDdkMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEVBQUU7WUFDNUQsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsS0FBSyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsRUFDcEIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLEVBQzNCLElBQUksQ0FBQyxlQUFlLEVBQ3BCLE1BQU0sRUFDTixVQUFVLEVBQ1YsSUFBSSxFQUNKLE9BQU8sRUFDUCxPQUFPLEVBQ1AsSUFBSSxDQUNMLENBQUM7UUFDSixDQUFDLENBQUM7UUFDRixVQUFVLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUVyQixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDNUIsSUFDRSxHQUFHLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFO2lCQUNuQixNQUFBLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSwwQ0FBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFBO2lCQUN4RixNQUFBLEdBQUcsQ0FBQyxPQUFPLENBQUMsWUFBWSwwQ0FBRSxNQUFNLENBQUMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQUEsRUFFakU7Z0JBQ0UsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFzQixDQUFDO2dCQUN6RCxJQUFJLE1BQU0sR0FBRyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3BDLE1BQU0sQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakMsVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNqQztTQUNKO0lBQ0gsQ0FBQztJQUVELGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBMkI7UUFDbEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUM7UUFDakQsSUFBSSxPQUFPLENBQUU7UUFDYixJQUFJLEdBQUcsQ0FBQztRQUNSLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQztRQUNqQixTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3BELElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFO2dCQUM1RCxHQUFHLEdBQUcsZ0NBQWdDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwRCxNQUFNLENBQUMsSUFBSSxDQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtvQkFDL0MsUUFBUSxJQUFJLEVBQUU7d0JBQ1osS0FBSyxXQUFXLENBQUMsQ0FBQzs0QkFDaEIsSUFBSSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQ0FDcEcsS0FBSyxHQUFHLEtBQUssQ0FBQztnQ0FDWixPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxrQ0FBa0MsRUFDOUQ7b0NBQ0UsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLO2lDQUNyQixDQUNGLENBQUM7Z0NBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7NkJBQ3BDOzRCQUNELE1BQU07eUJBQ1A7d0JBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQzs0QkFDZixJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFO2dDQUMxSCxLQUFLLEdBQUcsS0FBSyxDQUFDO2dDQUNkLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGlDQUFpQyxFQUMzRDtvQ0FDRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0NBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztpQ0FDL0IsQ0FDRixDQUFDO2dDQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzZCQUNwQzs0QkFDRCxNQUFNO3lCQUNQO3dCQUNELEtBQUssVUFBVSxDQUFDLENBQUM7NEJBQ2YsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtnQ0FDMUgsS0FBSyxHQUFHLEtBQUssQ0FBQztnQ0FDZCxPQUFPLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxpQ0FBaUMsRUFDM0Q7b0NBQ0UsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLO29DQUNwQixLQUFLLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUM7aUNBQy9CLENBQ0YsQ0FBQztnQ0FDRixJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQzs2QkFDcEM7NEJBQ0QsTUFBTTt5QkFDUDt3QkFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDOzRCQUNoQixJQUNFLE9BQU8sQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO2dDQUNqRSxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUMxRDtnQ0FDRSxLQUFLLEdBQUcsS0FBSyxDQUFDO2dDQUNkLE9BQU8sR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLGtDQUFrQyxFQUM1RDtvQ0FDRSxNQUFNLEVBQUUsTUFBTSxDQUFDLEtBQUs7b0NBQ3BCLEtBQUssRUFBRSxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQztpQ0FDL0IsQ0FDRixDQUFDO2dDQUNGLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOzZCQUNwQzs0QkFDRCxNQUFNO3lCQUNQO3dCQUNELEtBQUssV0FBVyxDQUFDLENBQUM7NEJBQ2hCLElBQ0UsT0FBTyxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUM7Z0NBQ2pFLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQzFEO2dDQUNFLEtBQUssR0FBRyxLQUFLLENBQUM7Z0NBQ2QsT0FBTyxHQUFHLFNBQVMsQ0FBQyxPQUFPLENBQUMsa0NBQWtDLEVBQzVEO29DQUNFLE1BQU0sRUFBRSxNQUFNLENBQUMsS0FBSztvQ0FDcEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDO2lDQUMvQixDQUNGLENBQUM7Z0NBQ0YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7NkJBQ3BDOzRCQUNELE1BQU07eUJBQ1A7cUJBQ0E7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7YUFDTjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsaUJBQWlCLENBQUMsT0FBTyxFQUFFLFNBQTJCO1FBQ3BELFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDcEQsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLE1BQU0sSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO2dCQUMvRixPQUFPLENBQUMsVUFBVSxDQUFDLGdDQUFnQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0QsT0FBTyxDQUFDLFVBQVUsQ0FBQyxnQ0FBZ0MsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQzthQUNoRjtRQUVILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7OEZBcHJCVSx1QkFBdUI7NkVBQXZCLHVCQUF1QixXQUF2Qix1QkFBdUIsbUJBRnRCLE1BQU07dUZBRVAsdUJBQXVCO2NBSG5DLFVBQVU7ZUFBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7QUF5ckJELFNBQVMsZ0NBQWdDLENBQUMsTUFBYztJQUN0RCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUU7UUFDbEMsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgSHR0cENsaWVudCwgSHR0cEVycm9yUmVzcG9uc2UsIEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5cclxuaW1wb3J0IHtcclxuICBBY3Rpb25TdG9yZSxcclxuICBFbnRpdHlSZWNvcmQsXHJcbiAgRW50aXR5U3RvcmVGaWx0ZXJDdXN0b21GdW5jU3RyYXRlZ3ksXHJcbiAgRW50aXR5U3RvcmVGaWx0ZXJTZWxlY3Rpb25TdHJhdGVneSxcclxuICBFbnRpdHlTdG9yZVN0cmF0ZWd5RnVuY09wdGlvbnMsXHJcbiAgRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlcixcclxuICBFbnRpdHlUYWJsZVRlbXBsYXRlLFxyXG4gIEVudGl0eVRhYmxlQnV0dG9ufSBmcm9tICdAaWdvMi9jb21tb24nO1xyXG5pbXBvcnQgeyBDb25maWdTZXJ2aWNlLCBMYW5ndWFnZVNlcnZpY2UsIE1lc3NhZ2VTZXJ2aWNlLCBTdG9yYWdlU2VydmljZSB9IGZyb20gJ0BpZ28yL2NvcmUnO1xyXG5pbXBvcnQgeyBBdXRoSW50ZXJjZXB0b3IgfSBmcm9tICdAaWdvMi9hdXRoJztcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgbWFwLCBza2lwV2hpbGUsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFJlbGF0aW9uT3B0aW9ucywgU291cmNlRmllbGRzT3B0aW9uc1BhcmFtcywgV01TRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2UnO1xyXG5pbXBvcnQgeyBGZWF0dXJlRGF0YVNvdXJjZSB9IGZyb20gJy4uLy4uL2RhdGFzb3VyY2Uvc2hhcmVkL2RhdGFzb3VyY2VzL2ZlYXR1cmUtZGF0YXNvdXJjZSc7XHJcbmltcG9ydCB7IFdGU0RhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGF0YXNvdXJjZS9zaGFyZWQvZGF0YXNvdXJjZXMvd2ZzLWRhdGFzb3VyY2UuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBGZWF0dXJlLFxyXG4gIEZlYXR1cmVNb3Rpb24sXHJcbiAgRmVhdHVyZVN0b3JlLFxyXG4gIEZlYXR1cmVTdG9yZUluTWFwRXh0ZW50U3RyYXRlZ3ksXHJcbiAgRmVhdHVyZVN0b3JlSW5NYXBSZXNvbHV0aW9uU3RyYXRlZ3ksXHJcbiAgRmVhdHVyZVN0b3JlTG9hZGluZ0xheWVyU3RyYXRlZ3ksXHJcbiAgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4uLy4uL2ZlYXR1cmUnO1xyXG5cclxuaW1wb3J0IHsgT2djRmlsdGVyYWJsZURhdGFTb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vZmlsdGVyL3NoYXJlZC9vZ2MtZmlsdGVyLmludGVyZmFjZSc7XHJcbmltcG9ydCB7IEltYWdlTGF5ZXIsIExheWVyU2VydmljZSwgTGF5ZXJzTGlua1Byb3BlcnRpZXMsIExpbmtlZFByb3BlcnRpZXMsIFZlY3RvckxheWVyIH0gZnJvbSAnLi4vLi4vbGF5ZXInO1xyXG5pbXBvcnQgeyBHZW9Xb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSAnLi4vLi4vbGF5ZXIvc2hhcmVkL2xheWVycy9sYXllci5pbnRlcmZhY2UnO1xyXG5pbXBvcnQgeyBJZ29NYXAgfSBmcm9tICcuLi8uLi9tYXAnO1xyXG5pbXBvcnQgeyBRdWVyeWFibGVEYXRhU291cmNlT3B0aW9ucyB9IGZyb20gJy4uLy4uL3F1ZXJ5L3NoYXJlZC9xdWVyeS5pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgRWRpdGlvbldvcmtzcGFjZSB9IGZyb20gJy4vZWRpdGlvbi13b3Jrc3BhY2UnO1xyXG5cclxuaW1wb3J0IG9sRmVhdHVyZSBmcm9tICdvbC9GZWF0dXJlJztcclxuaW1wb3J0IG9sU291cmNlSW1hZ2VXTVMgZnJvbSAnb2wvc291cmNlL0ltYWdlV01TJztcclxuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIE9sR2VvbWV0cnkgfSBmcm9tICdvbC9nZW9tL0dlb21ldHJ5JztcclxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlLCB0aHJvd0Vycm9yIH0gZnJvbSAncnhqcyc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBFZGl0aW9uV29ya3NwYWNlU2VydmljZSB7XHJcblxyXG4gIHB1YmxpYyB3cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4odW5kZWZpbmVkKTtcclxuICBwdWJsaWMgYWRkaW5nJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHB1YmxpYyByZWxhdGlvbkxheWVycyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEltYWdlTGF5ZXJbXSB8IFZlY3RvckxheWVyW10+KHVuZGVmaW5lZCk7XHJcbiAgcHVibGljIHJvd3NJbk1hcEV4dGVudENoZWNrQ29uZGl0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4odHJ1ZSk7XHJcbiAgcHVibGljIGxvYWRpbmcgPSBmYWxzZTtcclxuXHJcbiAgZ2V0IHpvb21BdXRvKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0KCd6b29tQXV0bycpIGFzIGJvb2xlYW47XHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgbGF5ZXJTZXJ2aWNlOiBMYXllclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcclxuICAgIHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZSxcclxuICAgIHByaXZhdGUgaHR0cDogSHR0cENsaWVudCxcclxuICAgIHByaXZhdGUgZGlhbG9nOiBNYXREaWFsb2csXHJcbiAgICBwdWJsaWMgYXV0aEludGVyY2VwdG9yPzogQXV0aEludGVyY2VwdG9yKSB7IH1cclxuXHJcbiAgY3JlYXRlV29ya3NwYWNlKGxheWVyOiBJbWFnZUxheWVyLCBtYXA6IElnb01hcCk6IEVkaXRpb25Xb3Jrc3BhY2Uge1xyXG4gICAgaWYgKGxheWVyLm9wdGlvbnMud29ya3NwYWNlPy5lbmFibGVkICE9PSB0cnVlIHx8IGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLmVuYWJsZWQgIT09IHRydWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgbGV0IHdrc0NvbmZpZztcclxuICAgIGlmIChsYXllci5vcHRpb25zLndvcmtzcGFjZSkge1xyXG4gICAgICB3a3NDb25maWcgPSBsYXllci5vcHRpb25zLndvcmtzcGFjZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHdrc0NvbmZpZyA9IHt9O1xyXG4gICAgfVxyXG4gICAgd2tzQ29uZmlnLnNyY0lkID0gbGF5ZXIuaWQ7XHJcbiAgICB3a3NDb25maWcud29ya3NwYWNlSWQgPSBsYXllci5pZDtcclxuICAgIHdrc0NvbmZpZy5lbmFibGVkID0gdHJ1ZTtcclxuICAgIHdrc0NvbmZpZy5wYWdlU2l6ZSA9IGxheWVyLm9wdGlvbnMud29ya3NwYWNlPy5wYWdlU2l6ZTtcclxuICAgIHdrc0NvbmZpZy5wYWdlU2l6ZU9wdGlvbnMgPSBsYXllci5vcHRpb25zLndvcmtzcGFjZT8ucGFnZVNpemVPcHRpb25zO1xyXG5cclxuICAgIGNvbnN0IGRhdGFTb3VyY2U6IFdNU0RhdGFTb3VyY2UgPSBsYXllci5kYXRhU291cmNlIGFzIFdNU0RhdGFTb3VyY2UgO1xyXG4gICAgY29uc3Qgd21zTGlua0lkID0gbGF5ZXIuaWQgKyAnLldtc1dvcmtzcGFjZVRhYmxlU3JjJztcclxuICAgIGNvbnN0IHdmc0xpbmtJZCA9IGxheWVyLmlkICsgJy5XZnNXb3Jrc3BhY2VUYWJsZURlc3QnO1xyXG4gICAgaWYgKCFsYXllci5vcHRpb25zLmxpbmtlZExheWVycykge1xyXG4gICAgICBsYXllci5vcHRpb25zLmxpbmtlZExheWVycyA9IHsgbGlua0lkOiB3bXNMaW5rSWQsIGxpbmtzOiBbXSB9O1xyXG4gICAgfVxyXG4gICAgY29uc3QgbGlua1Byb3BlcnRpZXMgPSB7XHJcbiAgICAgIGJpZGlyZWN0aW9ubmFsOiB0cnVlLFxyXG4gICAgICBzeW5jZWREZWxldGU6IHRydWUsXHJcbiAgICAgIGxpbmtlZElkczogW3dmc0xpbmtJZF0sXHJcbiAgICAgIHByb3BlcnRpZXM6IFtcclxuICAgICAgICBMaW5rZWRQcm9wZXJ0aWVzLlpJTkRFWCxcclxuICAgICAgICBMaW5rZWRQcm9wZXJ0aWVzLlZJU0lCTEVdXHJcbiAgICB9IGFzIExheWVyc0xpbmtQcm9wZXJ0aWVzO1xyXG5cclxuICAgIGlmICghbGF5ZXIub3B0aW9ucy53b3Jrc3BhY2U/Lm1pblJlc29sdXRpb24pIHtcclxuICAgICAgIGxpbmtQcm9wZXJ0aWVzLnByb3BlcnRpZXMucHVzaChMaW5rZWRQcm9wZXJ0aWVzLk1JTlJFU09MVVRJT04pO1xyXG4gICAgfVxyXG4gICAgbGV0IGhhc09nY0ZpbHRlcnMgPSBmYWxzZTtcclxuICAgIGlmICgoZGF0YVNvdXJjZS5vcHRpb25zIGFzIE9nY0ZpbHRlcmFibGVEYXRhU291cmNlT3B0aW9ucykub2djRmlsdGVycz8uZW5hYmxlZCkge1xyXG4gICAgICBsaW5rUHJvcGVydGllcy5wcm9wZXJ0aWVzLnB1c2goTGlua2VkUHJvcGVydGllcy5PR0NGSUxURVJTKTtcclxuICAgICAgaGFzT2djRmlsdGVycyA9IHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoIWxheWVyLm9wdGlvbnMud29ya3NwYWNlPy5tYXhSZXNvbHV0aW9uKSB7XHJcbiAgICAgIGxpbmtQcm9wZXJ0aWVzLnByb3BlcnRpZXMucHVzaChMaW5rZWRQcm9wZXJ0aWVzLk1BWFJFU09MVVRJT04pO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBjbG9uZWRMaW5rczogTGF5ZXJzTGlua1Byb3BlcnRpZXNbXSA9IFtdO1xyXG4gICAgaWYgKGxheWVyLm9wdGlvbnMubGlua2VkTGF5ZXJzLmxpbmtzKSB7XHJcbiAgICAgIGNsb25lZExpbmtzID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShsYXllci5vcHRpb25zLmxpbmtlZExheWVycy5saW5rcykpO1xyXG4gICAgfVxyXG4gICAgY2xvbmVkTGlua3MucHVzaChsaW5rUHJvcGVydGllcyk7XHJcblxyXG4gICAgbGF5ZXIub3B0aW9ucy5saW5rZWRMYXllcnMubGlua0lkID0gbGF5ZXIub3B0aW9ucy5saW5rZWRMYXllcnMubGlua0lkID8gbGF5ZXIub3B0aW9ucy5saW5rZWRMYXllcnMubGlua0lkIDogd21zTGlua0lkLFxyXG4gICAgICBsYXllci5vcHRpb25zLmxpbmtlZExheWVycy5saW5rcyA9IGNsb25lZExpbmtzO1xyXG4gICAgaW50ZXJmYWNlIFdGU29wdGlvbnMgZXh0ZW5kcyBXRlNEYXRhU291cmNlT3B0aW9ucywgT2djRmlsdGVyYWJsZURhdGFTb3VyY2VPcHRpb25zIHsgfVxyXG4gICAgbGV0IHdrcztcclxuICAgIHRoaXMubGF5ZXJTZXJ2aWNlXHJcbiAgICAgIC5jcmVhdGVBc3luY0xheWVyKHtcclxuICAgICAgICBpZDogd2ZzTGlua0lkLFxyXG4gICAgICAgIGxpbmtlZExheWVyczoge1xyXG4gICAgICAgICAgbGlua0lkOiB3ZnNMaW5rSWRcclxuICAgICAgICB9LFxyXG4gICAgICAgIHdvcmtzcGFjZToge1xyXG4gICAgICAgICAgc3JjSWQ6IGxheWVyLmlkLFxyXG4gICAgICAgICAgd29ya3NwYWNlSWQ6IHVuZGVmaW5lZCxcclxuICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLFxyXG4gICAgICAgICAgcXVlcnlPcHRpb25zOiB7XHJcbiAgICAgICAgICAgIG1hcFF1ZXJ5T25PcGVuVGFiOiBsYXllci5vcHRpb25zLndvcmtzcGFjZT8ucXVlcnlPcHRpb25zPy5tYXBRdWVyeU9uT3BlblRhYixcclxuICAgICAgICAgICAgdGFiUXVlcnk6IGZhbHNlXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgcGFnZVNpemU6IGxheWVyLm9wdGlvbnMud29ya3NwYWNlPy5wYWdlU2l6ZSxcclxuICAgICAgICAgIHBhZ2VTaXplT3B0aW9uczogbGF5ZXIub3B0aW9ucy53b3Jrc3BhY2U/LnBhZ2VTaXplT3B0aW9uc1xyXG4gICAgICAgIH0sXHJcbiAgICAgICAgc2hvd0luTGF5ZXJMaXN0OiBmYWxzZSxcclxuICAgICAgICBvcGFjaXR5OiAwLFxyXG4gICAgICAgIHRpdGxlOiBsYXllci50aXRsZSxcclxuICAgICAgICBtaW5SZXNvbHV0aW9uOiBsYXllci5vcHRpb25zLndvcmtzcGFjZT8ubWluUmVzb2x1dGlvbiB8fCBsYXllci5taW5SZXNvbHV0aW9uIHx8IDAsXHJcbiAgICAgICAgbWF4UmVzb2x1dGlvbjogbGF5ZXIub3B0aW9ucy53b3Jrc3BhY2U/Lm1heFJlc29sdXRpb24gfHwgbGF5ZXIubWF4UmVzb2x1dGlvbiB8fCBJbmZpbml0eSxcclxuICAgICAgICBzb3VyY2VPcHRpb25zOiB7XHJcbiAgICAgICAgICBkb3dubG9hZDogZGF0YVNvdXJjZS5vcHRpb25zLmRvd25sb2FkLFxyXG4gICAgICAgICAgdHlwZTogJ3dmcycsXHJcbiAgICAgICAgICB1cmw6IGRhdGFTb3VyY2Uub3B0aW9ucy51cmxXZnMgfHwgZGF0YVNvdXJjZS5vcHRpb25zLnVybCxcclxuICAgICAgICAgIHF1ZXJ5YWJsZTogdHJ1ZSxcclxuICAgICAgICAgIHJlbGF0aW9uczogZGF0YVNvdXJjZS5vcHRpb25zLnJlbGF0aW9ucyxcclxuICAgICAgICAgIHF1ZXJ5VGl0bGU6IChkYXRhU291cmNlLm9wdGlvbnMgYXMgUXVlcnlhYmxlRGF0YVNvdXJjZU9wdGlvbnMpLnF1ZXJ5VGl0bGUsXHJcbiAgICAgICAgICBwYXJhbXM6IGRhdGFTb3VyY2Uub3B0aW9ucy5wYXJhbXNXRlMsXHJcbiAgICAgICAgICBvZ2NGaWx0ZXJzOiBPYmplY3QuYXNzaWduKHt9LCBkYXRhU291cmNlLm9nY0ZpbHRlcnMkLnZhbHVlLCB7ZW5hYmxlZDogaGFzT2djRmlsdGVyc30pLFxyXG4gICAgICAgICAgc291cmNlRmllbGRzOiBkYXRhU291cmNlLm9wdGlvbnMuc291cmNlRmllbGRzIHx8IHVuZGVmaW5lZCxcclxuICAgICAgICAgIGVkaXRpb246IGRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uXHJcbiAgICAgICAgfSBhcyBXRlNvcHRpb25zXHJcbiAgICAgIH0pXHJcbiAgICAgIC5zdWJzY3JpYmUoKHdvcmtzcGFjZUxheWVyOiBWZWN0b3JMYXllcikgPT4ge1xyXG4gICAgICAgIG1hcC5hZGRMYXllcih3b3Jrc3BhY2VMYXllcik7XHJcbiAgICAgICAgbGF5ZXIub2wuc2V0UHJvcGVydGllcyh7IGxpbmtlZExheWVyczogeyBsaW5rSWQ6IGxheWVyLm9wdGlvbnMubGlua2VkTGF5ZXJzLmxpbmtJZCwgbGlua3M6IGNsb25lZExpbmtzIH0gfSwgZmFsc2UpO1xyXG4gICAgICAgIHdvcmtzcGFjZUxheWVyLmRhdGFTb3VyY2Uub2wucmVmcmVzaCgpO1xyXG5cclxuICAgICAgICB3a3MgPSBuZXcgRWRpdGlvbldvcmtzcGFjZSh7XHJcbiAgICAgICAgICBpZDogbGF5ZXIuaWQsXHJcbiAgICAgICAgICB0aXRsZTogbGF5ZXIudGl0bGUsXHJcbiAgICAgICAgICBsYXllcjogd29ya3NwYWNlTGF5ZXIsXHJcbiAgICAgICAgICBtYXAsXHJcbiAgICAgICAgICBlbnRpdHlTdG9yZTogdGhpcy5jcmVhdGVGZWF0dXJlU3RvcmUod29ya3NwYWNlTGF5ZXIsIG1hcCksXHJcbiAgICAgICAgICBhY3Rpb25TdG9yZTogbmV3IEFjdGlvblN0b3JlKFtdKSxcclxuICAgICAgICAgIG1ldGE6IHtcclxuICAgICAgICAgICAgdGFibGVUZW1wbGF0ZTogdW5kZWZpbmVkXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgdGhpcywgdGhpcy5kaWFsb2csIHRoaXMuY29uZmlnU2VydmljZSk7XHJcbiAgICAgICAgdGhpcy5jcmVhdGVUYWJsZVRlbXBsYXRlKHdrcywgd29ya3NwYWNlTGF5ZXIpO1xyXG5cclxuICAgICAgICB3b3Jrc3BhY2VMYXllci5vcHRpb25zLndvcmtzcGFjZS53b3Jrc3BhY2VJZCA9IHdvcmtzcGFjZUxheWVyLmlkO1xyXG4gICAgICAgIGxheWVyLm9wdGlvbnMud29ya3NwYWNlID0gT2JqZWN0LmFzc2lnbih7fSwgbGF5ZXIub3B0aW9ucy53b3Jrc3BhY2UsXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHdrc0NvbmZpZ1xyXG4gICAgICAgICAgfSBhcyBHZW9Xb3Jrc3BhY2VPcHRpb25zKTtcclxuXHJcbiAgICAgICAgZGVsZXRlIGRhdGFTb3VyY2Uub3B0aW9ucy5kb3dubG9hZDtcclxuICAgICAgICByZXR1cm4gd2tzO1xyXG5cclxuICAgICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHdrcztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmVhdHVyZVN0b3JlKGxheWVyOiBWZWN0b3JMYXllciwgbWFwOiBJZ29NYXApOiBGZWF0dXJlU3RvcmUge1xyXG4gICAgY29uc3Qgc3RvcmUgPSBuZXcgRmVhdHVyZVN0b3JlKFtdLCB7IG1hcCB9KTtcclxuICAgIHN0b3JlLmJpbmRMYXllcihsYXllcik7XHJcblxyXG4gICAgY29uc3QgbG9hZGluZ1N0cmF0ZWd5ID0gbmV3IEZlYXR1cmVTdG9yZUxvYWRpbmdMYXllclN0cmF0ZWd5KHt9KTtcclxuICAgIGNvbnN0IGluTWFwRXh0ZW50U3RyYXRlZ3kgPSBuZXcgRmVhdHVyZVN0b3JlSW5NYXBFeHRlbnRTdHJhdGVneSh7fSk7XHJcbiAgICBjb25zdCBpbk1hcFJlc29sdXRpb25TdHJhdGVneSA9IG5ldyBGZWF0dXJlU3RvcmVJbk1hcFJlc29sdXRpb25TdHJhdGVneSh7fSk7XHJcbiAgICBjb25zdCBzZWxlY3RlZFJlY29yZFN0cmF0ZWd5ID0gbmV3IEVudGl0eVN0b3JlRmlsdGVyU2VsZWN0aW9uU3RyYXRlZ3koe30pO1xyXG4gICAgY29uc3Qgc2VsZWN0aW9uU3RyYXRlZ3kgPSBuZXcgRmVhdHVyZVN0b3JlU2VsZWN0aW9uU3RyYXRlZ3koe1xyXG4gICAgICBsYXllcjogbmV3IFZlY3RvckxheWVyKHtcclxuICAgICAgICB6SW5kZXg6IDMwMCxcclxuICAgICAgICBzb3VyY2U6IG5ldyBGZWF0dXJlRGF0YVNvdXJjZSgpLFxyXG4gICAgICAgIHN0eWxlOiB1bmRlZmluZWQsXHJcbiAgICAgICAgc2hvd0luTGF5ZXJMaXN0OiBmYWxzZSxcclxuICAgICAgICBleHBvcnRhYmxlOiBmYWxzZSxcclxuICAgICAgICBicm93c2FibGU6IGZhbHNlXHJcbiAgICAgIH0pLFxyXG4gICAgICBtYXAsXHJcbiAgICAgIGhpdFRvbGVyYW5jZTogMTUsXHJcbiAgICAgIG1vdGlvbjogdGhpcy56b29tQXV0byA/IEZlYXR1cmVNb3Rpb24uRGVmYXVsdCA6IEZlYXR1cmVNb3Rpb24uTm9uZSxcclxuICAgICAgbWFueTogdHJ1ZSxcclxuICAgICAgZHJhZ0JveDogdHJ1ZVxyXG4gICAgfSk7XHJcbiAgICBzdG9yZS5hZGRTdHJhdGVneShsb2FkaW5nU3RyYXRlZ3ksIHRydWUpO1xyXG4gICAgc3RvcmUuYWRkU3RyYXRlZ3koaW5NYXBFeHRlbnRTdHJhdGVneSwgdHJ1ZSk7XHJcbiAgICBzdG9yZS5hZGRTdHJhdGVneShpbk1hcFJlc29sdXRpb25TdHJhdGVneSwgdHJ1ZSk7XHJcbiAgICBzdG9yZS5hZGRTdHJhdGVneShzZWxlY3Rpb25TdHJhdGVneSwgdHJ1ZSk7XHJcbiAgICBzdG9yZS5hZGRTdHJhdGVneShzZWxlY3RlZFJlY29yZFN0cmF0ZWd5LCBmYWxzZSk7XHJcbiAgICBzdG9yZS5hZGRTdHJhdGVneSh0aGlzLmNyZWF0ZUZpbHRlckluTWFwRXh0ZW50T3JSZXNvbHV0aW9uU3RyYXRlZ3koKSwgdHJ1ZSk7XHJcbiAgICByZXR1cm4gc3RvcmU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVRhYmxlVGVtcGxhdGUod29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlLCBsYXllcjogVmVjdG9yTGF5ZXIpOiBFbnRpdHlUYWJsZVRlbXBsYXRlIHtcclxuICAgIGNvbnN0IGZpZWxkcyA9IGxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5zb3VyY2VGaWVsZHMgfHwgW107XHJcblxyXG4gICAgY29uc3QgcmVsYXRpb25zID0gbGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLnJlbGF0aW9ucyB8fCBbXTtcclxuXHJcbiAgICBsZXQgcmVuZGVyZXJUeXBlID0gRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlci5VbnNhbml0aXplZEhUTUw7XHJcbiAgICBsZXQgYnV0dG9ucyA9IFtdO1xyXG4gICAgbGV0IGNvbHVtbnMgPSBbXTtcclxuICAgIGxldCByZWxhdGlvbnNDb2x1bW4gPSBbXTtcclxuXHJcbiAgICBidXR0b25zID0gW3tcclxuICAgICAgbmFtZTogJ2VkaXRpb24nLFxyXG4gICAgICB0aXRsZTogdW5kZWZpbmVkLFxyXG4gICAgICByZW5kZXJlcjogRW50aXR5VGFibGVDb2x1bW5SZW5kZXJlci5CdXR0b25Hcm91cCxcclxuICAgICAgcHJpbWFyeTogZmFsc2UsXHJcbiAgICAgIHZhbHVlQWNjZXNzb3I6ICgpID0+IHtcclxuICAgICAgICByZXR1cm4gW3tcclxuICAgICAgICAgIGVkaXRNb2RlOiBmYWxzZSxcclxuICAgICAgICAgIGljb246ICdwZW5jaWwnLFxyXG4gICAgICAgICAgY29sb3I6ICdwcmltYXJ5JyxcclxuICAgICAgICAgIGNsaWNrOiAoZmVhdHVyZSkgPT4geyB3b3Jrc3BhY2UuZWRpdEZlYXR1cmUoZmVhdHVyZSwgd29ya3NwYWNlKTsgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZWRpdE1vZGU6IGZhbHNlLFxyXG4gICAgICAgICAgaWNvbjogJ2RlbGV0ZScsXHJcbiAgICAgICAgICBjb2xvcjogJ3dhcm4nLFxyXG4gICAgICAgICAgY2xpY2s6IChmZWF0dXJlKSA9PiB7IHdvcmtzcGFjZS5kZWxldGVGZWF0dXJlKGZlYXR1cmUsIHdvcmtzcGFjZSk7IH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHtcclxuICAgICAgICAgIGVkaXRNb2RlOiB0cnVlLFxyXG4gICAgICAgICAgaWNvbjogJ2NoZWNrJyxcclxuICAgICAgICAgIGNvbG9yOiAncHJpbWFyeScsXHJcbiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5sb2FkaW5nLFxyXG4gICAgICAgICAgY2xpY2s6IChmZWF0dXJlKSA9PiB7IHRoaXMuc2F2ZUZlYXR1cmUoZmVhdHVyZSwgd29ya3NwYWNlKTsgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgZWRpdE1vZGU6IHRydWUsXHJcbiAgICAgICAgICBpY29uOiAnYWxwaGEteCcsXHJcbiAgICAgICAgICBjb2xvcjogJ3ByaW1hcnknLFxyXG4gICAgICAgICAgZGlzYWJsZWQ6IHRoaXMubG9hZGluZyxcclxuICAgICAgICAgIGNsaWNrOiAoZmVhdHVyZSkgPT4geyB0aGlzLmNhbmNlbEVkaXQod29ya3NwYWNlLCBmZWF0dXJlKTsgfVxyXG4gICAgICAgIH1dIGFzIEVudGl0eVRhYmxlQnV0dG9uW107XHJcbiAgICAgIH1cclxuICAgIH1dO1xyXG5cclxuXHJcbiAgICBpZiAoZmllbGRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB3b3Jrc3BhY2UuZW50aXR5U3RvcmUuZW50aXRpZXMkLnBpcGUoXHJcbiAgICAgICAgc2tpcFdoaWxlKHZhbCA9PiB2YWwubGVuZ3RoID09PSAwKSxcclxuICAgICAgICB0YWtlKDEpXHJcbiAgICAgICkuc3Vic2NyaWJlKGVudGl0aWVzID0+IHtcclxuICAgICAgICBjb25zdCBvbCA9IChlbnRpdGllc1swXSBhcyBGZWF0dXJlKS5vbCBhcyBvbEZlYXR1cmU8T2xHZW9tZXRyeT47XHJcbiAgICAgICAgY29uc3QgY29sdW1uc0Zyb21GZWF0dXJlcyA9IG9sLmdldEtleXMoKVxyXG4gICAgICAgICAgLmZpbHRlcihcclxuICAgICAgICAgICAgY29sID0+ICFjb2wuc3RhcnRzV2l0aCgnXycpICYmXHJcbiAgICAgICAgICAgICAgY29sICE9PSAnZ2VvbWV0cnknICYmXHJcbiAgICAgICAgICAgICAgY29sICE9PSBvbC5nZXRHZW9tZXRyeU5hbWUoKSAmJlxyXG4gICAgICAgICAgICAgICFjb2wubWF0Y2goL2JvdW5kZWRieS9naSkpXHJcbiAgICAgICAgICAubWFwKGtleSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgICAgbmFtZTogYHByb3BlcnRpZXMuJHtrZXl9YCxcclxuICAgICAgICAgICAgICB0aXRsZToga2V5LFxyXG4gICAgICAgICAgICAgIHJlbmRlcmVyOiByZW5kZXJlclR5cGUsXHJcbiAgICAgICAgICAgIH07XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB3b3Jrc3BhY2UubWV0YS50YWJsZVRlbXBsYXRlID0ge1xyXG4gICAgICAgICAgc2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgICAgIHNvcnQ6IHRydWUsXHJcbiAgICAgICAgICBjb2x1bW5zOiBjb2x1bW5zRnJvbUZlYXR1cmVzXHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb2x1bW5zID0gZmllbGRzLm1hcCgoZmllbGQ6IFNvdXJjZUZpZWxkc09wdGlvbnNQYXJhbXMpID0+IHtcclxuXHJcbiAgICAgIGxldCBjb2x1bW4gPSB7XHJcbiAgICAgICAgbmFtZTogYHByb3BlcnRpZXMuJHtmaWVsZC5uYW1lfWAsXHJcbiAgICAgICAgdGl0bGU6IGZpZWxkLmFsaWFzID8gZmllbGQuYWxpYXMgOiBmaWVsZC5uYW1lLFxyXG4gICAgICAgIHJlbmRlcmVyOiByZW5kZXJlclR5cGUsXHJcbiAgICAgICAgdmFsdWVBY2Nlc3NvcjogdW5kZWZpbmVkLFxyXG4gICAgICAgIGNlbGxDbGFzc0Z1bmM6ICgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNlbGxDbGFzcyA9IHt9O1xyXG4gICAgICAgICAgaWYgKGZpZWxkLnR5cGUpIHtcclxuICAgICAgICAgICAgY2VsbENsYXNzW2BjbGFzc18ke2ZpZWxkLnR5cGV9YF0gPSB0cnVlO1xyXG4gICAgICAgICAgICByZXR1cm4gY2VsbENsYXNzO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgcHJpbWFyeTogZmllbGQucHJpbWFyeSA9PT0gdHJ1ZSA/IHRydWUgOiBmYWxzZSxcclxuICAgICAgICB2aXNpYmxlOiBmaWVsZC52aXNpYmxlLFxyXG4gICAgICAgIHZhbGlkYXRpb246IGZpZWxkLnZhbGlkYXRpb24sXHJcbiAgICAgICAgdHlwZTogZmllbGQudHlwZSxcclxuICAgICAgICBkb21haW5WYWx1ZXM6IHVuZGVmaW5lZCxcclxuICAgICAgICByZWxhdGlvbjogdW5kZWZpbmVkLFxyXG4gICAgICAgIG11bHRpcGxlOiBmaWVsZC5tdWx0aXBsZSxcclxuICAgICAgICBzdGVwOiBmaWVsZC5zdGVwLFxyXG4gICAgICAgIHRvb2x0aXA6IGZpZWxkLnRvb2x0aXBcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGlmIChmaWVsZC50eXBlID09PSAnbGlzdCcgfHwgZmllbGQudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScpIHtcclxuICAgICAgICB0aGlzLmdldERvbWFpblZhbHVlcyhmaWVsZC5yZWxhdGlvbi50YWJsZSkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgICBjb2x1bW4uZG9tYWluVmFsdWVzID0gcmVzdWx0O1xyXG4gICAgICAgICAgY29sdW1uLnJlbGF0aW9uID0gZmllbGQucmVsYXRpb247XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNvbHVtbjtcclxuICAgIH0pO1xyXG5cclxuICAgIHJlbGF0aW9uc0NvbHVtbiA9IHJlbGF0aW9ucy5tYXAoKHJlbGF0aW9uOiBSZWxhdGlvbk9wdGlvbnMpID0+IHtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBuYW1lOiBgcHJvcGVydGllcy4ke3JlbGF0aW9uLm5hbWV9YCxcclxuICAgICAgICB0aXRsZTogcmVsYXRpb24uYWxpYXMgPyByZWxhdGlvbi5hbGlhcyA6IHJlbGF0aW9uLm5hbWUsXHJcbiAgICAgICAgcmVuZGVyZXI6IEVudGl0eVRhYmxlQ29sdW1uUmVuZGVyZXIuSWNvbixcclxuICAgICAgICBpY29uOiByZWxhdGlvbi5pY29uLFxyXG4gICAgICAgIHBhcmVudDogcmVsYXRpb24ucGFyZW50LFxyXG4gICAgICAgIHR5cGU6ICdyZWxhdGlvbicsXHJcbiAgICAgICAgdG9vbHRpcDogcmVsYXRpb24udG9vbHRpcCxcclxuICAgICAgICBvbkNsaWNrOiAoKSA9PiB7XHJcbiAgICAgICAgICBpZiAodGhpcy5hZGRpbmckLmdldFZhbHVlKCkgPT09IGZhbHNlKSB7XHJcbiAgICAgICAgICAgIHRoaXMud3MkLm5leHQocmVsYXRpb24udGl0bGUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgY2VsbENsYXNzRnVuYzogKCkgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHsgJ2NsYXNzX2ljb24nOiB0cnVlIH07XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29sdW1ucy5wdXNoKC4uLnJlbGF0aW9uc0NvbHVtbik7XHJcbiAgICBjb2x1bW5zLnB1c2goLi4uYnV0dG9ucyk7XHJcblxyXG4gICAgd29ya3NwYWNlLm1ldGEudGFibGVUZW1wbGF0ZSA9IHtcclxuICAgICAgc2VsZWN0aW9uOiBmYWxzZSxcclxuICAgICAgc29ydDogdHJ1ZSxcclxuICAgICAgY29sdW1uc1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY3JlYXRlRmlsdGVySW5NYXBFeHRlbnRPclJlc29sdXRpb25TdHJhdGVneSgpOiBFbnRpdHlTdG9yZUZpbHRlckN1c3RvbUZ1bmNTdHJhdGVneSB7XHJcbiAgICBjb25zdCBmaWx0ZXJDbGF1c2VGdW5jID0gKHJlY29yZDogRW50aXR5UmVjb3JkPG9iamVjdD4pID0+IHtcclxuICAgICAgcmV0dXJuIHJlY29yZC5zdGF0ZS5pbk1hcEV4dGVudCA9PT0gdHJ1ZSAmJiByZWNvcmQuc3RhdGUuaW5NYXBSZXNvbHV0aW9uID09PSB0cnVlO1xyXG4gICAgfTtcclxuICAgIHJldHVybiBuZXcgRW50aXR5U3RvcmVGaWx0ZXJDdXN0b21GdW5jU3RyYXRlZ3koe2ZpbHRlckNsYXVzZUZ1bmN9IGFzIEVudGl0eVN0b3JlU3RyYXRlZ3lGdW5jT3B0aW9ucyk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZUZlYXR1cmUoZmVhdHVyZSwgd29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlKSB7XHJcbiAgICBpZiAoIXRoaXMudmFsaWRhdGVGZWF0dXJlKGZlYXR1cmUsIHdvcmtzcGFjZSkpe1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5zYW5pdGl6ZVBhcmFtZXRlcihmZWF0dXJlLCB3b3Jrc3BhY2UpO1xyXG5cclxuICAgIGxldCB1cmwgPSB0aGlzLmNvbmZpZ1NlcnZpY2UuZ2V0Q29uZmlnKCdlZGl0aW9uLnVybCcpO1xyXG5cclxuICAgIGlmICh3b3Jrc3BhY2UubGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmVkaXRpb24uYmFzZVVybCkge1xyXG4gICAgICB1cmwgKz0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLmJhc2VVcmw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZlYXR1cmUubmV3RmVhdHVyZSkge1xyXG4gICAgICB1cmwgKz0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLmFkZFVybDtcclxuXHJcbiAgICAgIGNvbnN0IGFkZEhlYWRlcnMgPSB3b3Jrc3BhY2UubGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmVkaXRpb24uYWRkSGVhZGVycztcclxuICAgICAgY29uc3QgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyhhZGRIZWFkZXJzKTtcclxuXHJcbiAgICAgIHRoaXMuYWRkRmVhdHVyZShmZWF0dXJlLCB3b3Jrc3BhY2UsIHVybCwgaGVhZGVycyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAod29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLm1vZGlmeVByb3RvY29sICE9PSBcInBvc3RcIikge1xyXG4gICAgICAgIHVybCArPSAnPycgKyB3b3Jrc3BhY2UubGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmVkaXRpb24ubW9kaWZ5VXJsICsgZmVhdHVyZS5pZGtleTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB1cmwgKz0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLm1vZGlmeVVybDtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgcHJvdG9jb2xlID0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLm1vZGlmeVByb3RvY29sO1xyXG4gICAgICBjb25zdCBtb2RpZnlIZWFkZXJzID0gd29ya3NwYWNlLmxheWVyLmRhdGFTb3VyY2Uub3B0aW9ucy5lZGl0aW9uLm1vZGlmeUhlYWRlcnM7XHJcbiAgICAgIGNvbnN0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMobW9kaWZ5SGVhZGVycyk7XHJcblxyXG4gICAgICB0aGlzLm1vZGlmeUZlYXR1cmUoZmVhdHVyZSwgd29ya3NwYWNlLCB1cmwsIGhlYWRlcnMsIHByb3RvY29sZSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWRkRmVhdHVyZShmZWF0dXJlLCB3b3Jrc3BhY2U6IEVkaXRpb25Xb3Jrc3BhY2UsIHVybDogc3RyaW5nLCBoZWFkZXJzOiB7W2tleTogc3RyaW5nXTogYW55fSkge1xyXG4gICAgLy8gVE9ETzogYWRhcHQgdG8gYW55IGtpbmQgb2YgZ2VvbWV0cnlcclxuICAgIGlmICh3b3Jrc3BhY2UubGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmVkaXRpb24uaGFzR2VvbWV0cnkpIHtcclxuICAgICAgLy9mZWF0dXJlLnByb3BlcnRpZXNbZ2VvbV0gPSBmZWF0dXJlLmdlb21ldHJ5O1xyXG4gICAgICBmZWF0dXJlLnByb3BlcnRpZXNbXCJsb25naXR1ZGVcIl0gPSBmZWF0dXJlLmdlb21ldHJ5LmNvb3JkaW5hdGVzWzBdO1xyXG4gICAgICBmZWF0dXJlLnByb3BlcnRpZXNbXCJsYXRpdHVkZVwiXSA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMV07XHJcbiAgICB9XHJcblxyXG4gICAgZm9yIChjb25zdCBwcm9wZXJ0eSBpbiBmZWF0dXJlLnByb3BlcnRpZXMpIHtcclxuICAgICAgZm9yIChjb25zdCBzZiBvZiB3b3Jrc3BhY2UubGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLnNvdXJjZUZpZWxkcykge1xyXG4gICAgICAgIGlmIChzZi5uYW1lID09PSBwcm9wZXJ0eSAmJiBzZi52YWxpZGF0aW9uPy5yZWFkb25seSkge1xyXG4gICAgICAgICAgZGVsZXRlIGZlYXR1cmUucHJvcGVydGllc1twcm9wZXJ0eV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuaHR0cC5wb3N0KGAke3VybH1gLCBmZWF0dXJlLnByb3BlcnRpZXMsIHsgaGVhZGVyczogaGVhZGVycyB9KS5zdWJzY3JpYmUoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICB3b3Jrc3BhY2UuZW50aXR5U3RvcmUuc3RhdGVWaWV3LmNsZWFyKCk7XHJcbiAgICAgICAgd29ya3NwYWNlLmRlbGV0ZURyYXdpbmdzKCk7XHJcbiAgICAgICAgd29ya3NwYWNlLmVudGl0eVN0b3JlLmRlbGV0ZShmZWF0dXJlKTtcclxuXHJcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgJ2lnby5nZW8ud29ya3NwYWNlLmFkZFN1Y2Nlc3MnXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLnN1Y2Nlc3MobWVzc2FnZSk7XHJcblxyXG4gICAgICAgIHRoaXMucmVmcmVzaE1hcCh3b3Jrc3BhY2UubGF5ZXIgYXMgVmVjdG9yTGF5ZXIsIHdvcmtzcGFjZS5sYXllci5tYXApO1xyXG4gICAgICAgIHRoaXMuYWRkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB0aGlzLnJvd3NJbk1hcEV4dGVudENoZWNrQ29uZGl0aW9uJC5uZXh0KHRydWUpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgZXJyb3IuZXJyb3IuY2F1Z2h0ID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBnZW5lcmljRXJyb3JNZXNzYWdlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby53b3Jrc3BhY2UuYWRkRXJyb3InXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHdvcmtzcGFjZS5sYXllci5kYXRhU291cmNlLm9wdGlvbnMuZWRpdGlvbi5tZXNzYWdlcztcclxuICAgICAgICBpZiAobWVzc2FnZXMpIHtcclxuICAgICAgICAgIGxldCB0ZXh0O1xyXG4gICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobWVzc2FnZSlbMF07XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5tZXNzYWdlLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICB0ZXh0ID0gbWVzc2FnZVtrZXldO1xyXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKCF0ZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoZ2VuZXJpY0Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoZ2VuZXJpY0Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZUZlYXR1cmUod29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlLCB1cmw6IHN0cmluZykge1xyXG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuaHR0cC5kZWxldGUoYCR7dXJsfWAsIHt9KS5zdWJzY3JpYmUoXHJcbiAgICAgICgpID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby53b3Jrc3BhY2UuZGVsZXRlU3VjY2VzcydcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFwKHdvcmtzcGFjZS5sYXllciBhcyBWZWN0b3JMYXllciwgd29ya3NwYWNlLmxheWVyLm1hcCk7XHJcbiAgICAgICAgZm9yIChjb25zdCByZWxhdGlvbiBvZiB3b3Jrc3BhY2UubGF5ZXIub3B0aW9ucy5zb3VyY2VPcHRpb25zLnJlbGF0aW9ucykge1xyXG4gICAgICAgICAgd29ya3NwYWNlLm1hcC5sYXllcnMuZm9yRWFjaCgobGF5ZXIpID0+IHtcclxuICAgICAgICAgICAgaWYgKGxheWVyLnRpdGxlID09PSByZWxhdGlvbi50aXRsZSkge1xyXG4gICAgICAgICAgICAgIGxheWVyLmRhdGFTb3VyY2Uub2wucmVmcmVzaCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgICBlcnJvci5lcnJvci5jYXVnaHQgPSB0cnVlO1xyXG4gICAgICAgICAgY29uc3QgZ2VuZXJpY0Vycm9yTWVzc2FnZSA9IHRoaXMubGFuZ3VhZ2VTZXJ2aWNlLnRyYW5zbGF0ZS5pbnN0YW50KFxyXG4gICAgICAgICAgICAnaWdvLmdlby53b3Jrc3BhY2UuYWRkRXJyb3InXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgY29uc3QgbWVzc2FnZXMgPSB3b3Jrc3BhY2UubGF5ZXIuZGF0YVNvdXJjZS5vcHRpb25zLmVkaXRpb24ubWVzc2FnZXM7XHJcbiAgICAgICAgICBpZiAobWVzc2FnZXMpIHtcclxuICAgICAgICAgICAgbGV0IHRleHQ7XHJcbiAgICAgICAgICAgIG1lc3NhZ2VzLmZvckVhY2gobWVzc2FnZSA9PiB7XHJcbiAgICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobWVzc2FnZSlbMF07XHJcbiAgICAgICAgICAgICAgaWYgKGVycm9yLmVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgdGV4dCA9IG1lc3NhZ2Vba2V5XTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IodGV4dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgaWYgKCF0ZXh0KSB7XHJcbiAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihnZW5lcmljRXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihnZW5lcmljRXJyb3JNZXNzYWdlKTtcclxuICAgICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb2RpZnlGZWF0dXJlKGZlYXR1cmUsIHdvcmtzcGFjZTogRWRpdGlvbldvcmtzcGFjZSwgdXJsOiBzdHJpbmcsIGhlYWRlcnM6IHtba2V5OiBzdHJpbmddOiBhbnl9LCBwcm90b2NvbGUgPSAncGF0Y2gnICkge1xyXG4gICAgLy9UT0RPOiBhZGFwdCB0byBhbnkga2luZCBvZiBnZW9tZXRyeVxyXG4gICAgaWYgKHdvcmtzcGFjZS5sYXllci5kYXRhU291cmNlLm9wdGlvbnMuZWRpdGlvbi5oYXNHZW9tZXRyeSkge1xyXG4gICAgICAvL2ZlYXR1cmUucHJvcGVydGllc1tnZW9tXSA9IGZlYXR1cmUuZ2VvbWV0cnk7XHJcbiAgICAgIGZlYXR1cmUucHJvcGVydGllc1tcImxvbmdpdHVkZVwiXSA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF07XHJcbiAgICAgIGZlYXR1cmUucHJvcGVydGllc1tcImxhdGl0dWRlXCJdID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlc1sxXTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGZlYXR1cmUucHJvcGVydGllcykge1xyXG4gICAgICBmb3IgKGNvbnN0IHNmIG9mIHdvcmtzcGFjZS5sYXllci5kYXRhU291cmNlLm9wdGlvbnMuc291cmNlRmllbGRzKSB7XHJcbiAgICAgICAgaWYgKChzZi5uYW1lID09PSBwcm9wZXJ0eSAmJiBzZi52YWxpZGF0aW9uPy5yZWFkb25seSkgfHwgcHJvcGVydHkgPT09ICdib3VuZGVkQnknKSB7XHJcbiAgICAgICAgICBkZWxldGUgZmVhdHVyZS5wcm9wZXJ0aWVzW3Byb3BlcnR5XTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5odHRwW3Byb3RvY29sZV0oYCR7dXJsfWAsIGZlYXR1cmUucHJvcGVydGllcywgeyBoZWFkZXJzOiBoZWFkZXJzIH0pLnN1YnNjcmliZShcclxuICAgICAgKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuY2FuY2VsRWRpdCh3b3Jrc3BhY2UsIGZlYXR1cmUsIHRydWUpO1xyXG5cclxuICAgICAgICBjb25zdCBtZXNzYWdlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby53b3Jrc3BhY2UubW9kaWZ5U3VjY2VzcydcclxuICAgICAgICApO1xyXG4gICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2Uuc3VjY2VzcyhtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgdGhpcy5yZWZyZXNoTWFwKHdvcmtzcGFjZS5sYXllciBhcyBWZWN0b3JMYXllciwgd29ya3NwYWNlLmxheWVyLm1hcCk7XHJcblxyXG4gICAgICAgIGxldCByZWxhdGlvbkxheWVycyA9IFtdO1xyXG4gICAgICAgIGZvciAoY29uc3QgcmVsYXRpb24gb2Ygd29ya3NwYWNlLmxheWVyLm9wdGlvbnMuc291cmNlT3B0aW9ucy5yZWxhdGlvbnMpIHtcclxuICAgICAgICAgIHdvcmtzcGFjZS5tYXAubGF5ZXJzLmZvckVhY2goKGxheWVyKSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChsYXllci50aXRsZSA9PT0gcmVsYXRpb24udGl0bGUpIHtcclxuICAgICAgICAgICAgICByZWxhdGlvbkxheWVycy5wdXNoKGxheWVyKTtcclxuICAgICAgICAgICAgICBsYXllci5kYXRhU291cmNlLm9sLnJlZnJlc2goKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMucmVsYXRpb25MYXllcnMkLm5leHQocmVsYXRpb25MYXllcnMpO1xyXG4gICAgICB9LFxyXG4gICAgICBlcnJvciA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgZXJyb3IuZXJyb3IuY2F1Z2h0ID0gdHJ1ZTtcclxuICAgICAgICBjb25zdCBnZW5lcmljRXJyb3JNZXNzYWdlID0gdGhpcy5sYW5ndWFnZVNlcnZpY2UudHJhbnNsYXRlLmluc3RhbnQoXHJcbiAgICAgICAgICAnaWdvLmdlby53b3Jrc3BhY2UuYWRkRXJyb3InXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBtZXNzYWdlcyA9IHdvcmtzcGFjZS5sYXllci5kYXRhU291cmNlLm9wdGlvbnMuZWRpdGlvbi5tZXNzYWdlcztcclxuICAgICAgICBpZiAobWVzc2FnZXMpIHtcclxuICAgICAgICAgIGxldCB0ZXh0O1xyXG4gICAgICAgICAgbWVzc2FnZXMuZm9yRWFjaChtZXNzYWdlID0+IHtcclxuICAgICAgICAgICAgY29uc3Qga2V5ID0gT2JqZWN0LmtleXMobWVzc2FnZSlbMF07XHJcbiAgICAgICAgICAgIGlmIChlcnJvci5lcnJvci5tZXNzYWdlLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICB0ZXh0ID0gbWVzc2FnZVtrZXldO1xyXG4gICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IodGV4dCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgaWYgKCF0ZXh0KSB7XHJcbiAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoZ2VuZXJpY0Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IoZ2VuZXJpY0Vycm9yTWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgY2FuY2VsRWRpdCh3b3Jrc3BhY2U6IEVkaXRpb25Xb3Jrc3BhY2UsIGZlYXR1cmUsIGZyb21TYXZlID0gZmFsc2UpIHtcclxuICAgIGZlYXR1cmUuZWRpdGlvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5hZGRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgd29ya3NwYWNlLmRlbGV0ZURyYXdpbmdzKCk7XHJcblxyXG4gICAgaWYgKGZlYXR1cmUubmV3RmVhdHVyZSkge1xyXG4gICAgICB3b3Jrc3BhY2UuZW50aXR5U3RvcmUuc3RhdGVWaWV3LmNsZWFyKCk7XHJcbiAgICAgIHdvcmtzcGFjZS5lbnRpdHlTdG9yZS5kZWxldGUoZmVhdHVyZSk7XHJcbiAgICAgIHdvcmtzcGFjZS5kZWFjdGl2YXRlRHJhd0NvbnRyb2woKTtcclxuXHJcbiAgICAgIHRoaXMucm93c0luTWFwRXh0ZW50Q2hlY2tDb25kaXRpb24kLm5leHQodHJ1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAoIWZyb21TYXZlKSB7XHJcbiAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzID0gZmVhdHVyZS5vcmlnaW5hbF9wcm9wZXJ0aWVzO1xyXG4gICAgICAgIGZlYXR1cmUuZ2VvbWV0cnkgPSBmZWF0dXJlLm9yaWdpbmFsX2dlb21ldHJ5O1xyXG4gICAgICB9XHJcbiAgICAgIGRlbGV0ZSBmZWF0dXJlLm9yaWdpbmFsX3Byb3BlcnRpZXM7XHJcbiAgICAgIGRlbGV0ZSBmZWF0dXJlLm9yaWdpbmFsX2dlb21ldHJ5O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0RG9tYWluVmFsdWVzKHRhYmxlOiBzdHJpbmcpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgbGV0IHVybCA9IHRoaXMuY29uZmlnU2VydmljZS5nZXRDb25maWcoJ2VkaXRpb24udXJsJykgKyB0YWJsZTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5odHRwLmdldDxhbnk+KHVybCkucGlwZShcclxuICAgICAgbWFwKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgICAgfSksXHJcbiAgICAgIGNhdGNoRXJyb3IoKGVycjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogUmVmcmVzaCBib3RoIHdtcyBhbmQgd2ZzIGxheWVyXHJcbiAgICogQSBuZXcgd2ZzIGxvYWRlciBpcyB1c2VkIHRvIGVuc3VyZSBjYWNoZSBpcyBub3QgcmV0cmlldmluZyBvbGQgZGF0YVxyXG4gICAqIFdNUyBwYXJhbXMgYXJlIHVwZGF0ZWQgdG8gZW5zdXJlIGxheWVyIGlzIGNvcnJlY3RseSByZWZyZXNoZWRcclxuICAgKi9cclxuICByZWZyZXNoTWFwKGxheWVyOiBWZWN0b3JMYXllciwgbWFwOiBJZ29NYXApIHtcclxuICAgIGNvbnN0IHdmc09sTGF5ZXIgPSBsYXllci5kYXRhU291cmNlLm9sO1xyXG4gICAgY29uc3QgbG9hZGVyID0gKGV4dGVudCwgcmVzb2x1dGlvbiwgcHJvaiwgc3VjY2VzcywgZmFpbHVyZSkgPT4ge1xyXG4gICAgICBsYXllci5jdXN0b21XRlNMb2FkZXIoXHJcbiAgICAgICAgbGF5ZXIub2wuZ2V0U291cmNlKCksXHJcbiAgICAgICAgbGF5ZXIub3B0aW9ucy5zb3VyY2VPcHRpb25zLFxyXG4gICAgICAgIHRoaXMuYXV0aEludGVyY2VwdG9yLFxyXG4gICAgICAgIGV4dGVudCxcclxuICAgICAgICByZXNvbHV0aW9uLFxyXG4gICAgICAgIHByb2osXHJcbiAgICAgICAgc3VjY2VzcyxcclxuICAgICAgICBmYWlsdXJlLFxyXG4gICAgICAgIHRydWVcclxuICAgICAgKTtcclxuICAgIH07XHJcbiAgICB3ZnNPbExheWVyLnNldExvYWRlcihsb2FkZXIpO1xyXG4gICAgd2ZzT2xMYXllci5yZWZyZXNoKCk7XHJcblxyXG4gICAgZm9yIChjb25zdCBsYXkgb2YgbWFwLmxheWVycykge1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgbGF5LmlkICE9PSBsYXllci5pZCAmJlxyXG4gICAgICAgIGxheS5vcHRpb25zLmxpbmtlZExheWVycz8ubGlua0lkLmluY2x1ZGVzKGxheWVyLmlkLnN1YnN0cigwLCBsYXllci5pZC5pbmRleE9mKCcuJykgLSAxKSkgJiZcclxuICAgICAgICBsYXkub3B0aW9ucy5saW5rZWRMYXllcnM/LmxpbmtJZC5pbmNsdWRlcygnV21zV29ya3NwYWNlVGFibGVTcmMnKVxyXG4gICAgICApXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgY29uc3Qgd21zT2xMYXllciA9IGxheS5kYXRhU291cmNlLm9sIGFzIG9sU291cmNlSW1hZ2VXTVM7XHJcbiAgICAgICAgICBsZXQgcGFyYW1zID0gd21zT2xMYXllci5nZXRQYXJhbXMoKTtcclxuICAgICAgICAgIHBhcmFtcy5fdCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xyXG4gICAgICAgICAgd21zT2xMYXllci51cGRhdGVQYXJhbXMocGFyYW1zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZUZlYXR1cmUoZmVhdHVyZSwgd29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlKSB7XHJcbiAgICBjb25zdCB0cmFuc2xhdGUgPSB0aGlzLmxhbmd1YWdlU2VydmljZS50cmFuc2xhdGU7XHJcbiAgICBsZXQgbWVzc2FnZSA7XHJcbiAgICBsZXQga2V5O1xyXG4gICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuICAgIHdvcmtzcGFjZS5tZXRhLnRhYmxlVGVtcGxhdGUuY29sdW1ucy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIGlmIChjb2x1bW4uaGFzT3duUHJvcGVydHkoJ3ZhbGlkYXRpb24nKSAmJiBjb2x1bW4udmFsaWRhdGlvbikge1xyXG4gICAgICAgIGtleSA9IGdldENvbHVtbktleVdpdGhvdXRQcm9wZXJ0aWVzVGFnKGNvbHVtbi5uYW1lKTtcclxuICAgICAgICBPYmplY3Qua2V5cyggY29sdW1uLnZhbGlkYXRpb24pLmZvckVhY2goKHR5cGUpID0+IHtcclxuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xyXG4gICAgICAgICAgICBjYXNlICdtYW5kYXRvcnknOiB7XHJcbiAgICAgICAgICAgICAgaWYgKGNvbHVtbi52YWxpZGF0aW9uW3R5cGVdICYmICghZmVhdHVyZS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkgfHwgIWZlYXR1cmUucHJvcGVydGllc1trZXldKSkge1xyXG4gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRyYW5zbGF0ZS5pbnN0YW50KCdpZ28uZ2VvLmZvcm1WYWxpZGF0aW9uLm1hbmRhdG9yeScsXHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi50aXRsZVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSAnbWluVmFsdWUnOiB7XHJcbiAgICAgICAgICAgICAgaWYgKGZlYXR1cmUucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIGZlYXR1cmUucHJvcGVydGllc1trZXldICYmIGZlYXR1cmUucHJvcGVydGllc1trZXldIDwgY29sdW1uLnZhbGlkYXRpb25bdHlwZV0pIHtcclxuICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZm9ybVZhbGlkYXRpb24ubWluVmFsdWUnLFxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNvbHVtbi52YWxpZGF0aW9uW3R5cGVdXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdtYXhWYWx1ZSc6IHtcclxuICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gJiYgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gPiBjb2x1bW4udmFsaWRhdGlvblt0eXBlXSkge1xyXG4gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5mb3JtVmFsaWRhdGlvbi5tYXhWYWx1ZScsXHJcbiAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IGNvbHVtbi50aXRsZSxcclxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogY29sdW1uLnZhbGlkYXRpb25bdHlwZV1cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuZXJyb3IobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgJ21pbkxlbmd0aCc6IHtcclxuICAgICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSAmJlxyXG4gICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0ubGVuZ3RoIDwgY29sdW1uLnZhbGlkYXRpb25bdHlwZV0pXHJcbiAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgdmFsaWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSB0cmFuc2xhdGUuaW5zdGFudCgnaWdvLmdlby5mb3JtVmFsaWRhdGlvbi5taW5MZW5ndGgnLFxyXG4gICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4udGl0bGUsXHJcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNvbHVtbi52YWxpZGF0aW9uW3R5cGVdXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmVycm9yKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlICdtYXhMZW5ndGgnOiB7XHJcbiAgICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzLmhhc093blByb3BlcnR5KGtleSkgJiYgZmVhdHVyZS5wcm9wZXJ0aWVzW2tleV0gJiZcclxuICAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldLmxlbmd0aCA+IGNvbHVtbi52YWxpZGF0aW9uW3R5cGVdKVxyXG4gICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gdHJhbnNsYXRlLmluc3RhbnQoJ2lnby5nZW8uZm9ybVZhbGlkYXRpb24ubWF4TGVuZ3RoJyxcclxuICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbjogY29sdW1uLnRpdGxlLFxyXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBjb2x1bW4udmFsaWRhdGlvblt0eXBlXVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5lcnJvcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG4gIH1cclxuXHJcbiAgc2FuaXRpemVQYXJhbWV0ZXIoZmVhdHVyZSwgd29ya3NwYWNlOiBFZGl0aW9uV29ya3NwYWNlKSB7XHJcbiAgICB3b3Jrc3BhY2UubWV0YS50YWJsZVRlbXBsYXRlLmNvbHVtbnMuZm9yRWFjaChjb2x1bW4gPT4ge1xyXG4gICAgICBpZiAoY29sdW1uLnR5cGUgPT09ICdsaXN0JyAmJiBmZWF0dXJlLnByb3BlcnRpZXNbZ2V0Q29sdW1uS2V5V2l0aG91dFByb3BlcnRpZXNUYWcoY29sdW1uLm5hbWUpXSkge1xyXG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1tnZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubmFtZSldID1cclxuICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllc1tnZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW4ubmFtZSldLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDb2x1bW5LZXlXaXRob3V0UHJvcGVydGllc1RhZyhjb2x1bW46IHN0cmluZykge1xyXG4gIGlmIChjb2x1bW4uaW5jbHVkZXMoJ3Byb3BlcnRpZXMuJykpIHtcclxuICAgIHJldHVybiBjb2x1bW4uc3BsaXQoJy4nKVsxXTtcclxuICB9XHJcbiAgcmV0dXJuIGNvbHVtbjtcclxufVxyXG4iXX0=