bbj-screen-widget 2.4.67 → 2.4.68
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bbj-screen-widget.d.ts +16 -12
- package/bbj-screen-widget.metadata.json +1 -1
- package/bundles/bbj-screen-widget-core.umd.js +147 -4
- package/bundles/bbj-screen-widget-core.umd.js.map +1 -1
- package/bundles/bbj-screen-widget-core.umd.min.js +1 -1
- package/bundles/bbj-screen-widget-core.umd.min.js.map +1 -1
- package/bundles/bbj-screen-widget.umd.js +1309 -201
- package/bundles/bbj-screen-widget.umd.js.map +1 -1
- package/bundles/bbj-screen-widget.umd.min.js +1 -1
- package/bundles/bbj-screen-widget.umd.min.js.map +1 -1
- package/core/bbj-screen-widget-core.metadata.json +1 -1
- package/core/public_api.d.ts +2 -0
- package/core/util/map.util.d.ts +23 -0
- package/core/util/scale.util.d.ts +4 -0
- package/esm2015/bbj-screen-widget.js +17 -13
- package/esm2015/core/public_api.js +3 -1
- package/esm2015/core/util/map.util.js +104 -0
- package/esm2015/core/util/scale.util.js +33 -0
- package/esm2015/lib/custom-baidu-map/custom-baidu-map.component.js +4 -42
- package/esm2015/lib/screen-widget.module.js +7 -1
- package/esm2015/lib/tianditu/base-layer.js +80 -0
- package/esm2015/lib/tianditu/tianditu-marker/tianditu-marker.component.js +666 -0
- package/esm2015/lib/tianditu/tianditu.component.js +399 -0
- package/esm2015/lib/tianditu/tianditu.module.js +21 -0
- package/fesm2015/bbj-screen-widget-core.js +138 -1
- package/fesm2015/bbj-screen-widget-core.js.map +1 -1
- package/fesm2015/bbj-screen-widget.js +1193 -86
- package/fesm2015/bbj-screen-widget.js.map +1 -1
- package/lib/custom-baidu-map/custom-baidu-map.component.d.ts +1 -1
- package/lib/tianditu/base-layer.d.ts +20 -0
- package/lib/tianditu/tianditu-marker/tianditu-marker.component.d.ts +63 -0
- package/lib/tianditu/tianditu.component.d.ts +53 -0
- package/lib/tianditu/tianditu.module.d.ts +4 -0
- package/package.json +1 -1
|
@@ -0,0 +1,666 @@
|
|
|
1
|
+
import { __awaiter, __decorate, __metadata } from "tslib";
|
|
2
|
+
import { Component, EventEmitter, NgZone, ViewChild, } from '@angular/core';
|
|
3
|
+
import { Data, DataOutput, Property, Widget, Event, DataInput } from 'bbj-widget-base';
|
|
4
|
+
import { BaseLayer } from '../base-layer';
|
|
5
|
+
import { FileUrlService } from '../../shared/service/file-url.service';
|
|
6
|
+
import { NzContextMenuService } from 'ng-zorro-antd/dropdown';
|
|
7
|
+
import { getUUID } from '../../shared/util/base.util';
|
|
8
|
+
import { takeUntil } from 'rxjs/operators';
|
|
9
|
+
import { TiandituComponent } from '../tianditu.component';
|
|
10
|
+
const ɵ0 = { type: 'string', title: 'id' }, ɵ1 = { type: 'string', title: 'id' }, ɵ2 = { type: 'string', title: 'id' };
|
|
11
|
+
let TiandituMarkerComponent = class TiandituMarkerComponent extends BaseLayer {
|
|
12
|
+
constructor(parent, zone, fileUrlService, nzContextMenuService) {
|
|
13
|
+
super(parent, zone);
|
|
14
|
+
this.parent = parent;
|
|
15
|
+
this.zone = zone;
|
|
16
|
+
this.fileUrlService = fileUrlService;
|
|
17
|
+
this.nzContextMenuService = nzContextMenuService;
|
|
18
|
+
this.iconUrl = 'assets/img/screen/marker.png';
|
|
19
|
+
this.iconWidth = 20;
|
|
20
|
+
this.iconHeight = 30;
|
|
21
|
+
this.iconOffsetX = 10;
|
|
22
|
+
this.iconOffsetY = 30;
|
|
23
|
+
// @Property('分组', {type: 'string'})
|
|
24
|
+
// group = '';
|
|
25
|
+
this.toCenter = false;
|
|
26
|
+
// @Property('标签底色', { ui: { widget: 'myColor', visibleIf: { showLabel: [true] } } })
|
|
27
|
+
// labelBackground: string;
|
|
28
|
+
this.labelFont = {
|
|
29
|
+
family: '',
|
|
30
|
+
color: '#000000',
|
|
31
|
+
weight: 'normal',
|
|
32
|
+
size: 16,
|
|
33
|
+
space: 0,
|
|
34
|
+
lineHeight: 0,
|
|
35
|
+
};
|
|
36
|
+
// @Property('阴影', { ui: { widget: 'myShadow' } })
|
|
37
|
+
// shadow: any = { color: '', X: 0, Y: 0, Z: 0 };
|
|
38
|
+
this.labelOffsetX = -50;
|
|
39
|
+
this.labelOffsetY = 10;
|
|
40
|
+
this.unselectOnClickBlank = true;
|
|
41
|
+
this.groups = [];
|
|
42
|
+
this.data = [
|
|
43
|
+
{
|
|
44
|
+
id: '1',
|
|
45
|
+
address: '',
|
|
46
|
+
information: '暂无信息',
|
|
47
|
+
group: '',
|
|
48
|
+
lng: '120.7',
|
|
49
|
+
lat: '28',
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
// id: string;
|
|
53
|
+
this.makerClick = new EventEmitter();
|
|
54
|
+
this.onClick = new EventEmitter();
|
|
55
|
+
this.layers = [];
|
|
56
|
+
// defaultLayer: any;
|
|
57
|
+
this.optionsMap = {};
|
|
58
|
+
this.dataMap = {};
|
|
59
|
+
}
|
|
60
|
+
ngOnInit() {
|
|
61
|
+
const _super = Object.create(null, {
|
|
62
|
+
ngOnInit: { get: () => super.ngOnInit }
|
|
63
|
+
});
|
|
64
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
65
|
+
yield _super.ngOnInit.call(this);
|
|
66
|
+
if (this.showLabel && this.showLabelMinZoom != null) {
|
|
67
|
+
this.parent.zoomChange.pipe(takeUntil(this.destroy$)).subscribe((zoom) => {
|
|
68
|
+
this.updateTextVisible(zoom);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
ngOnChanges(changes) {
|
|
74
|
+
if (this.inited) {
|
|
75
|
+
if (changes.data) {
|
|
76
|
+
this.zone.runOutsideAngular(() => {
|
|
77
|
+
this.updateOverlays();
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (changes.selectedId) {
|
|
81
|
+
if (this.selectedId != this.currentSelectedId) {
|
|
82
|
+
this.select(this.selectedId, { move: true });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
ngOnDestroy() {
|
|
88
|
+
super.ngOnDestroy();
|
|
89
|
+
this.destroy$.next();
|
|
90
|
+
this.destroy$.complete();
|
|
91
|
+
}
|
|
92
|
+
init() {
|
|
93
|
+
var _a;
|
|
94
|
+
this.optionsMap = {};
|
|
95
|
+
const defaultOptions = this.createOptions();
|
|
96
|
+
this.optionsMap[''] = defaultOptions;
|
|
97
|
+
if ((_a = this.groups) === null || _a === void 0 ? void 0 : _a.length) {
|
|
98
|
+
this.groups.forEach((group) => {
|
|
99
|
+
if (group.group) {
|
|
100
|
+
const options = this.createOptions(group);
|
|
101
|
+
this.optionsMap[group.group] = options;
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
if (this.unselectOnClickBlank) {
|
|
106
|
+
this.parent.mapClick.pipe(takeUntil(this.destroy$)).subscribe(() => {
|
|
107
|
+
this.selectedId = null;
|
|
108
|
+
this.select(null);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
// if (!this.enableMarkerClusterer && this.showLabel) {
|
|
112
|
+
// const textOptions = {
|
|
113
|
+
// ...this.getTextOptions(this.labelFont),
|
|
114
|
+
// // color: '#fff',
|
|
115
|
+
// // fontFamily: 'Microsoft Yahei',
|
|
116
|
+
// // fontSize: 14,
|
|
117
|
+
// flat: false,
|
|
118
|
+
// collides: true,
|
|
119
|
+
// offset: [this.labelOffsetX || 0, this.labelOffsetY || 0],
|
|
120
|
+
// stroke: {
|
|
121
|
+
// color: this.stroke,
|
|
122
|
+
// },
|
|
123
|
+
// padding: [2, 2],
|
|
124
|
+
// margin: [0, 0],
|
|
125
|
+
// };
|
|
126
|
+
// if (this.stroke && this.stroke !== 'rgba(0,0,0,0)') {
|
|
127
|
+
// textOptions.stroke = { color: this.stroke };
|
|
128
|
+
// }
|
|
129
|
+
// if (this.strokeWidth) {
|
|
130
|
+
// textOptions.lineWidth = this.strokeWidth;
|
|
131
|
+
// }
|
|
132
|
+
// if (this.shadow) {
|
|
133
|
+
// textOptions.shadow = {
|
|
134
|
+
// color: this.shadow.color,
|
|
135
|
+
// blur: this.shadow.Z,
|
|
136
|
+
// offsetX: this.shadow.X,
|
|
137
|
+
// offsetY: this.shadow.Y,
|
|
138
|
+
// };
|
|
139
|
+
// }
|
|
140
|
+
// this.textLayer = new mapvgl.TextLayer(textOptions);
|
|
141
|
+
// if (this.showLabelMinZoom != null) {
|
|
142
|
+
// this.parent.init$.then(() => {
|
|
143
|
+
// const zoom = this.parent.map.getZoom();
|
|
144
|
+
// this.updateTextVisible(zoom);
|
|
145
|
+
// });
|
|
146
|
+
// }
|
|
147
|
+
// layers.push(this.textLayer);
|
|
148
|
+
// }
|
|
149
|
+
}
|
|
150
|
+
createOptions(group) {
|
|
151
|
+
const iconOptions = this.getIconOptions(group);
|
|
152
|
+
return { icon: iconOptions };
|
|
153
|
+
// if (this.enableMarkerClusterer || group?.enableMarkerClusterer) {
|
|
154
|
+
// const options: any = {
|
|
155
|
+
// iconOptions,
|
|
156
|
+
// textOptions: this.getTextOptions(this.clusterFont),
|
|
157
|
+
// minSize: this.clusterMinSize || 25,
|
|
158
|
+
// maxSize: this.clusterMaxSize || 40,
|
|
159
|
+
// };
|
|
160
|
+
// if (this.clusterGradient?.length) {
|
|
161
|
+
// const gradient: any = {};
|
|
162
|
+
// gradient[0] = this.clusterGradient[0];
|
|
163
|
+
// this.clusterGradient.slice(1).forEach((g, i) => {
|
|
164
|
+
// gradient[(i + 1) / this.clusterGradient.length] = g;
|
|
165
|
+
// });
|
|
166
|
+
// options.gradient = gradient;
|
|
167
|
+
// }
|
|
168
|
+
// if (this.clusterMaxZoom != null) {
|
|
169
|
+
// options.maxZoom = this.clusterMaxZoom;
|
|
170
|
+
// }
|
|
171
|
+
// this.addPickEvent(options);
|
|
172
|
+
// layer = new mapvgl.ClusterLayer(options);
|
|
173
|
+
// } else {
|
|
174
|
+
// this.addPickEvent(iconOptions);
|
|
175
|
+
// layer = new mapvgl.IconLayer(iconOptions);
|
|
176
|
+
// }
|
|
177
|
+
}
|
|
178
|
+
updateTextVisible(zoom) {
|
|
179
|
+
if (this.textLayer) {
|
|
180
|
+
if (zoom >= this.showLabelMinZoom) {
|
|
181
|
+
this.textLayer.show();
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
this.textLayer.hide();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
createOverlays() {
|
|
189
|
+
const overlays = [];
|
|
190
|
+
this.dataMap = {};
|
|
191
|
+
if (this.toCenter && this.data.length > 0) {
|
|
192
|
+
let maxLng = -180;
|
|
193
|
+
let minLng = 180;
|
|
194
|
+
let maxLat = -90;
|
|
195
|
+
let minLat = 90;
|
|
196
|
+
this.data.forEach((res) => {
|
|
197
|
+
maxLng = Math.max(maxLng, res.lng);
|
|
198
|
+
minLng = Math.min(minLng, res.lng);
|
|
199
|
+
maxLat = Math.max(maxLat, res.lat);
|
|
200
|
+
minLat = Math.min(minLat, res.lat);
|
|
201
|
+
});
|
|
202
|
+
this.parent.setRectCenterAndZoom(minLng, maxLng, minLat, maxLat);
|
|
203
|
+
}
|
|
204
|
+
const groupData = {};
|
|
205
|
+
this.groupData = groupData;
|
|
206
|
+
const textData = [];
|
|
207
|
+
const groups = Object.keys(this.optionsMap);
|
|
208
|
+
groups.forEach((group) => {
|
|
209
|
+
groupData[group] = [];
|
|
210
|
+
});
|
|
211
|
+
// const defaultData = [];
|
|
212
|
+
this.data.forEach((record) => {
|
|
213
|
+
let groupName = record.group;
|
|
214
|
+
if (groupName == null || this.optionsMap[groupName] == null) {
|
|
215
|
+
groupName = '';
|
|
216
|
+
}
|
|
217
|
+
let id = record.id_value || record.id;
|
|
218
|
+
if (id == null || id == '') {
|
|
219
|
+
id = getUUID();
|
|
220
|
+
}
|
|
221
|
+
// MapVGL的bug,ClusterLayer的iconOptions无效,只能通过properties设置
|
|
222
|
+
const options = this.optionsMap[groupName];
|
|
223
|
+
// if (layer != null && layer instanceof mapvgl.ClusterLayer) {
|
|
224
|
+
// const options = layer.getOptions();
|
|
225
|
+
// if (options.iconOptions) {
|
|
226
|
+
// const { height, width, offset, icon } = options.iconOptions;
|
|
227
|
+
// item.properties = { height, width, offset, icon, ...item.properties };
|
|
228
|
+
// }
|
|
229
|
+
// }
|
|
230
|
+
var point = this.parent.createLngLat(record.lng, record.lat);
|
|
231
|
+
var marker = new T.Marker(point, options); // 创建标注
|
|
232
|
+
marker.addEventListener('click', (e) => {
|
|
233
|
+
this.selectedId = id;
|
|
234
|
+
this.select(id);
|
|
235
|
+
this.zone.run(() => {
|
|
236
|
+
this.onClick.emit(Object.assign(Object.assign({}, record), { id }));
|
|
237
|
+
});
|
|
238
|
+
if (record.information) {
|
|
239
|
+
this.openInfo(record.information, e);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
overlays.push(marker);
|
|
243
|
+
if (this.showLabel && record.address) {
|
|
244
|
+
const label = new T.Label({
|
|
245
|
+
text: `${record.address}`,
|
|
246
|
+
position: marker.getLngLat(),
|
|
247
|
+
offset: new T.Point(this.labelOffsetX || -50, this.labelOffsetY || 10),
|
|
248
|
+
});
|
|
249
|
+
label.setBorderLine(this.strokeWidth || 0);
|
|
250
|
+
label.setBorderColor(this.stroke);
|
|
251
|
+
label.setBackgroundColor('rgba(0,0,0,0)');
|
|
252
|
+
label.setFontColor(this.labelFont.color);
|
|
253
|
+
label.setFontSize(this.labelFont.size);
|
|
254
|
+
overlays.push(label);
|
|
255
|
+
}
|
|
256
|
+
// if (this.selectedId && this.selectedId == id) {
|
|
257
|
+
// this.updateSize(item, 1.5);
|
|
258
|
+
// this.lastSelect = item;
|
|
259
|
+
// }
|
|
260
|
+
groupData[groupName].push(record);
|
|
261
|
+
this.dataMap[id] = record;
|
|
262
|
+
if (this.textLayer) {
|
|
263
|
+
textData.push(record);
|
|
264
|
+
}
|
|
265
|
+
});
|
|
266
|
+
// if (this.selectedId) {
|
|
267
|
+
// this.select(this.selectedId, { move: this.selectedId != this.currentSelectedId, resetLayer: false, force: true });
|
|
268
|
+
// }
|
|
269
|
+
// groups.forEach((group) => {
|
|
270
|
+
// const layer = this.layerMap[group];
|
|
271
|
+
// const data = groupData[group];
|
|
272
|
+
// layer.setData(data);
|
|
273
|
+
// });
|
|
274
|
+
// if (this.textLayer) {
|
|
275
|
+
// this.textLayer.setData(textData);
|
|
276
|
+
// }
|
|
277
|
+
return overlays;
|
|
278
|
+
}
|
|
279
|
+
getIconOptions(group) {
|
|
280
|
+
let icon = this.iconUrl || 'assets/img/screen/marker.png';
|
|
281
|
+
let height = this.iconHeight || 30;
|
|
282
|
+
let width = this.iconWidth || 20;
|
|
283
|
+
let offsetX = this.iconOffsetX == null ? width / 2 : this.iconOffsetX;
|
|
284
|
+
let offsetY = this.iconOffsetY == null ? height : this.iconOffsetY;
|
|
285
|
+
if (group && group.imageUrl) {
|
|
286
|
+
icon = this.fileUrlService.getUrl(group.imageUrl);
|
|
287
|
+
width = group.width || width;
|
|
288
|
+
height = group.height || height;
|
|
289
|
+
offsetX = group.XOffset != null ? group.XOffset : width / 2;
|
|
290
|
+
offsetY = group.YOffset != null ? group.YOffset : height;
|
|
291
|
+
}
|
|
292
|
+
const iconOptions = new T.Icon({
|
|
293
|
+
iconUrl: icon,
|
|
294
|
+
iconSize: new T.Point(width, height),
|
|
295
|
+
iconAnchor: new T.Point(offsetX, offsetY),
|
|
296
|
+
});
|
|
297
|
+
return iconOptions;
|
|
298
|
+
}
|
|
299
|
+
openInfo(content, e) {
|
|
300
|
+
var point = e.lnglat;
|
|
301
|
+
var markerInfoWin = new T.InfoWindow(content, { offset: new T.Point(0, -30) }); // 创建信息窗口对象
|
|
302
|
+
this.parent.map.openInfoWindow(markerInfoWin, point); //开启信息窗口
|
|
303
|
+
}
|
|
304
|
+
addPickEvent(options) {
|
|
305
|
+
// options.enablePicked = true;
|
|
306
|
+
// options.onClick = ({ dataItem }) => {
|
|
307
|
+
// // 每个图层都会触发一次click事件,如果每个图层都没有点中标记点,传出null
|
|
308
|
+
// if (dataItem) {
|
|
309
|
+
// this.clickData = dataItem;
|
|
310
|
+
// }
|
|
311
|
+
// if (this.unselectOnClickBlank !== false && this.clickTimeout == null) {
|
|
312
|
+
// this.clickTimeout = setTimeout(() => {
|
|
313
|
+
// if (this.clickData == null) {
|
|
314
|
+
// this.selectedId = null;
|
|
315
|
+
// this.select(null);
|
|
316
|
+
// }
|
|
317
|
+
// this.clickTimeout = null;
|
|
318
|
+
// this.clickData = null;
|
|
319
|
+
// this.subMarkers = null;
|
|
320
|
+
// });
|
|
321
|
+
// }
|
|
322
|
+
// if (dataItem) {
|
|
323
|
+
// if (dataItem.type === 'Feature') {
|
|
324
|
+
// const coordinates = dataItem.geometry.coordinates;
|
|
325
|
+
// this.parent.setCenterAndZoom(coordinates[0], coordinates[1], this.parent.map.getZoom() + 2);
|
|
326
|
+
// } else {
|
|
327
|
+
// const data = dataItem.properties.raw;
|
|
328
|
+
// if (data) {
|
|
329
|
+
// this.selectedId = dataItem.properties.id;
|
|
330
|
+
// this.select(dataItem.properties.id);
|
|
331
|
+
// this.zone.run(() => {
|
|
332
|
+
// this.onClick.emit({ ...data, id: data.id_value || data.id });
|
|
333
|
+
// });
|
|
334
|
+
// }
|
|
335
|
+
// }
|
|
336
|
+
// }
|
|
337
|
+
// };
|
|
338
|
+
// if (this.parent.showType === 'mouseover') {
|
|
339
|
+
// let infoWindow = null;
|
|
340
|
+
// let infoWindowData = null;
|
|
341
|
+
// options.onMousemove = ({ dataItem }) => {
|
|
342
|
+
// const data = dataItem != null ? dataItem.properties.raw : null;
|
|
343
|
+
// if (infoWindow != null && infoWindowData != data) {
|
|
344
|
+
// infoWindow.close();
|
|
345
|
+
// infoWindow = null;
|
|
346
|
+
// }
|
|
347
|
+
// if (data && data.information && infoWindow == null) {
|
|
348
|
+
// infoWindowData = data;
|
|
349
|
+
// infoWindow = this.parent.openInfoWindow(data, data.lng, data.lat);
|
|
350
|
+
// }
|
|
351
|
+
// };
|
|
352
|
+
// }
|
|
353
|
+
}
|
|
354
|
+
select(id, options = {}) {
|
|
355
|
+
if (id != this.currentSelectedId || options.force) {
|
|
356
|
+
let item;
|
|
357
|
+
if (id != null && id !== '') {
|
|
358
|
+
item = this.dataMap[id];
|
|
359
|
+
// 如果找不到数据,可能是数据还没加载,等数据加载了再执行
|
|
360
|
+
if (item == null) {
|
|
361
|
+
return;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
this.currentSelectedId = id;
|
|
365
|
+
// let lastSelectGroup: string;
|
|
366
|
+
// let currentSelectGroup: string;
|
|
367
|
+
let selectedData;
|
|
368
|
+
if (this.lastSelect) {
|
|
369
|
+
// lastSelectGroup = this.lastSelect.properties.group;
|
|
370
|
+
this.updateSize(this.lastSelect, 1);
|
|
371
|
+
this.lastSelect = null;
|
|
372
|
+
}
|
|
373
|
+
if (item) {
|
|
374
|
+
// currentSelectGroup = item.properties.group;
|
|
375
|
+
// this.updateSize(item, this.selectedSize ?? 1.5);
|
|
376
|
+
this.lastSelect = item;
|
|
377
|
+
selectedData = item;
|
|
378
|
+
if (options.move) {
|
|
379
|
+
// const layer = this.optionsMap[currentSelectGroup];
|
|
380
|
+
let zoom = this.parent.map.getZoom();
|
|
381
|
+
if (this.selectedMapZoom) {
|
|
382
|
+
zoom = this.selectedMapZoom;
|
|
383
|
+
}
|
|
384
|
+
// else if (
|
|
385
|
+
// layer instanceof mapvgl.ClusterLayer &&
|
|
386
|
+
// this.clusterMaxZoom != null &&
|
|
387
|
+
// Math.floor(zoom) <= this.clusterMaxZoom
|
|
388
|
+
// ) {
|
|
389
|
+
// zoom = this.clusterMaxZoom + 2;
|
|
390
|
+
// }
|
|
391
|
+
this.parent.setCenterAndZoom(selectedData.lng, selectedData.lat, zoom);
|
|
392
|
+
}
|
|
393
|
+
// if (selectedData.information && this.parent.showType !== 'mouseover') {
|
|
394
|
+
// // 防止其他图层将信息窗口关闭
|
|
395
|
+
// setTimeout(() => {
|
|
396
|
+
// this.parent.openInfoWindow(selectedData, selectedData.lng, selectedData.lat);
|
|
397
|
+
// });
|
|
398
|
+
// }
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
selectedData = {};
|
|
402
|
+
}
|
|
403
|
+
// if (options.resetLayer !== false) {
|
|
404
|
+
// if (currentSelectGroup != null) {
|
|
405
|
+
// this.resetLayerData(currentSelectGroup);
|
|
406
|
+
// }
|
|
407
|
+
// if (lastSelectGroup != null && lastSelectGroup !== currentSelectGroup) {
|
|
408
|
+
// this.resetLayerData(lastSelectGroup);
|
|
409
|
+
// }
|
|
410
|
+
// }
|
|
411
|
+
// 如果选中的id找不到对应数据,可能是数据还没加载,
|
|
412
|
+
if (id == null || item != null) {
|
|
413
|
+
this.zone.run(() => {
|
|
414
|
+
this.makerClick.emit(Object.assign(Object.assign({}, selectedData), { id: selectedData.id_value || selectedData.id }));
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
resetLayerData(group) {
|
|
420
|
+
// const layer = this.layerMap[group];
|
|
421
|
+
// const data = this.groupData[group];
|
|
422
|
+
// if (layer && data) {
|
|
423
|
+
// layer.setData(data);
|
|
424
|
+
// }
|
|
425
|
+
}
|
|
426
|
+
updateSize(item, scale) {
|
|
427
|
+
// if (item && this.enlargeOnSelect) {
|
|
428
|
+
// const layer = this.layerMap[item.properties.group];
|
|
429
|
+
// let options: any;
|
|
430
|
+
// if (layer instanceof mapvgl.ClusterLayer) {
|
|
431
|
+
// options = layer.getOptions().iconOptions;
|
|
432
|
+
// } else {
|
|
433
|
+
// options = layer.getOptions();
|
|
434
|
+
// }
|
|
435
|
+
// const { height, width, offset } = options;
|
|
436
|
+
// item.properties.height = height * scale;
|
|
437
|
+
// item.properties.width = width * scale;
|
|
438
|
+
// if (item.properties.offset) {
|
|
439
|
+
// item.properties.offset = [offset[0] * scale, offset[1] * scale];
|
|
440
|
+
// }
|
|
441
|
+
// }
|
|
442
|
+
}
|
|
443
|
+
};
|
|
444
|
+
TiandituMarkerComponent.decorators = [
|
|
445
|
+
{ type: Component, args: [{
|
|
446
|
+
selector: 'sc-tianditu-marker',
|
|
447
|
+
template: "",
|
|
448
|
+
styles: [""]
|
|
449
|
+
},] }
|
|
450
|
+
];
|
|
451
|
+
TiandituMarkerComponent.ctorParameters = () => [
|
|
452
|
+
{ type: TiandituComponent },
|
|
453
|
+
{ type: NgZone },
|
|
454
|
+
{ type: FileUrlService },
|
|
455
|
+
{ type: NzContextMenuService }
|
|
456
|
+
];
|
|
457
|
+
TiandituMarkerComponent.propDecorators = {
|
|
458
|
+
menu: [{ type: ViewChild, args: ['menu',] }]
|
|
459
|
+
};
|
|
460
|
+
__decorate([
|
|
461
|
+
Property('', { min: 1, ui: { widget: 'myPicture', spanLabel: 0, spanControl: 24 } }),
|
|
462
|
+
__metadata("design:type", Object)
|
|
463
|
+
], TiandituMarkerComponent.prototype, "iconUrl", void 0);
|
|
464
|
+
__decorate([
|
|
465
|
+
Property('图标宽', { type: 'number' }),
|
|
466
|
+
__metadata("design:type", Object)
|
|
467
|
+
], TiandituMarkerComponent.prototype, "iconWidth", void 0);
|
|
468
|
+
__decorate([
|
|
469
|
+
Property('图标高', { type: 'number' }),
|
|
470
|
+
__metadata("design:type", Object)
|
|
471
|
+
], TiandituMarkerComponent.prototype, "iconHeight", void 0);
|
|
472
|
+
__decorate([
|
|
473
|
+
Property('图标偏移x', { type: 'number' }),
|
|
474
|
+
__metadata("design:type", Object)
|
|
475
|
+
], TiandituMarkerComponent.prototype, "iconOffsetX", void 0);
|
|
476
|
+
__decorate([
|
|
477
|
+
Property('图标偏移y', { type: 'number' }),
|
|
478
|
+
__metadata("design:type", Object)
|
|
479
|
+
], TiandituMarkerComponent.prototype, "iconOffsetY", void 0);
|
|
480
|
+
__decorate([
|
|
481
|
+
Property('移至中心'),
|
|
482
|
+
__metadata("design:type", Boolean)
|
|
483
|
+
], TiandituMarkerComponent.prototype, "toCenter", void 0);
|
|
484
|
+
__decorate([
|
|
485
|
+
Property('显示标签', { ui: { visibleIf: { enableMarkerClusterer: [false] } } }),
|
|
486
|
+
__metadata("design:type", Boolean)
|
|
487
|
+
], TiandituMarkerComponent.prototype, "showLabel", void 0);
|
|
488
|
+
__decorate([
|
|
489
|
+
Property('标签显示缩放等级', { ui: { visibleIf: { showLabel: [true] } } }),
|
|
490
|
+
__metadata("design:type", Number)
|
|
491
|
+
], TiandituMarkerComponent.prototype, "showLabelMinZoom", void 0);
|
|
492
|
+
__decorate([
|
|
493
|
+
Property('标签字体', { ui: { widget: 'myFont', visibleIf: { showLabel: [true] } } }),
|
|
494
|
+
__metadata("design:type", Object)
|
|
495
|
+
], TiandituMarkerComponent.prototype, "labelFont", void 0);
|
|
496
|
+
__decorate([
|
|
497
|
+
Property('描边颜色', {
|
|
498
|
+
ui: {
|
|
499
|
+
widget: 'myColor',
|
|
500
|
+
},
|
|
501
|
+
}),
|
|
502
|
+
__metadata("design:type", String)
|
|
503
|
+
], TiandituMarkerComponent.prototype, "stroke", void 0);
|
|
504
|
+
__decorate([
|
|
505
|
+
Property('描边粗细', { type: 'integer' }),
|
|
506
|
+
__metadata("design:type", Number)
|
|
507
|
+
], TiandituMarkerComponent.prototype, "strokeWidth", void 0);
|
|
508
|
+
__decorate([
|
|
509
|
+
Property('标签偏移x', { ui: { widget: 'number', visibleIf: { showLabel: [true] } } }),
|
|
510
|
+
__metadata("design:type", Object)
|
|
511
|
+
], TiandituMarkerComponent.prototype, "labelOffsetX", void 0);
|
|
512
|
+
__decorate([
|
|
513
|
+
Property('标签偏移y', { ui: { widget: 'number', visibleIf: { showLabel: [true] } } }),
|
|
514
|
+
__metadata("design:type", Object)
|
|
515
|
+
], TiandituMarkerComponent.prototype, "labelOffsetY", void 0);
|
|
516
|
+
__decorate([
|
|
517
|
+
Property('选中时地图缩放', { type: 'number' }),
|
|
518
|
+
__metadata("design:type", Number)
|
|
519
|
+
], TiandituMarkerComponent.prototype, "selectedMapZoom", void 0);
|
|
520
|
+
__decorate([
|
|
521
|
+
Property('点击空白取消选中', { type: 'boolean', default: true }),
|
|
522
|
+
__metadata("design:type", Object)
|
|
523
|
+
], TiandituMarkerComponent.prototype, "unselectOnClickBlank", void 0);
|
|
524
|
+
__decorate([
|
|
525
|
+
Property('标记分组', {
|
|
526
|
+
type: 'array',
|
|
527
|
+
title: '标记分组',
|
|
528
|
+
maxItems: 10,
|
|
529
|
+
items: {
|
|
530
|
+
type: 'object',
|
|
531
|
+
properties: {
|
|
532
|
+
group: {
|
|
533
|
+
type: 'string',
|
|
534
|
+
title: '分组',
|
|
535
|
+
},
|
|
536
|
+
// type: {
|
|
537
|
+
// title: '类型',
|
|
538
|
+
// type: 'string',
|
|
539
|
+
// enum: [
|
|
540
|
+
// {
|
|
541
|
+
// label: '图标',
|
|
542
|
+
// value: 'icon',
|
|
543
|
+
// },
|
|
544
|
+
// {
|
|
545
|
+
// label: '圆点',
|
|
546
|
+
// value: 'circle',
|
|
547
|
+
// },
|
|
548
|
+
// {
|
|
549
|
+
// label: '正方形',
|
|
550
|
+
// value: 'square',
|
|
551
|
+
// },
|
|
552
|
+
// {
|
|
553
|
+
// label: '波纹',
|
|
554
|
+
// value: 'wave',
|
|
555
|
+
// },
|
|
556
|
+
// {
|
|
557
|
+
// label: '扩散',
|
|
558
|
+
// value: 'bubble',
|
|
559
|
+
// },
|
|
560
|
+
// ],
|
|
561
|
+
// default: 'icon',
|
|
562
|
+
// },
|
|
563
|
+
// color: {
|
|
564
|
+
// type: 'string',
|
|
565
|
+
// title: '颜色',
|
|
566
|
+
// ui: { widget: 'myColor', visibleIf: { type: ['circle', 'square'] } },
|
|
567
|
+
// },
|
|
568
|
+
// size: {
|
|
569
|
+
// type: 'number',
|
|
570
|
+
// title: '尺寸',
|
|
571
|
+
// ui: { visibleIf: { type: ['circle', 'square', 'wave', 'bubble'] } },
|
|
572
|
+
// },
|
|
573
|
+
imageUrl: {
|
|
574
|
+
type: 'string',
|
|
575
|
+
title: '图片',
|
|
576
|
+
ui: {
|
|
577
|
+
widget: 'myPicture',
|
|
578
|
+
visibleIf: { type: ['icon'] },
|
|
579
|
+
},
|
|
580
|
+
},
|
|
581
|
+
width: {
|
|
582
|
+
type: 'number',
|
|
583
|
+
title: '宽度',
|
|
584
|
+
default: 19,
|
|
585
|
+
ui: { visibleIf: { type: ['icon'] } },
|
|
586
|
+
},
|
|
587
|
+
height: {
|
|
588
|
+
type: 'number',
|
|
589
|
+
title: '高度',
|
|
590
|
+
default: 25,
|
|
591
|
+
ui: { visibleIf: { type: ['icon'] } },
|
|
592
|
+
},
|
|
593
|
+
XOffset: {
|
|
594
|
+
type: 'number',
|
|
595
|
+
title: 'X轴偏移',
|
|
596
|
+
ui: { visibleIf: { type: ['icon'] } },
|
|
597
|
+
},
|
|
598
|
+
YOffset: {
|
|
599
|
+
type: 'number',
|
|
600
|
+
title: 'Y轴偏移',
|
|
601
|
+
ui: { visibleIf: { type: ['icon'] } },
|
|
602
|
+
},
|
|
603
|
+
},
|
|
604
|
+
required: [],
|
|
605
|
+
},
|
|
606
|
+
ui: { grid: { arraySpan: 24 }, spanControl: 24 },
|
|
607
|
+
}),
|
|
608
|
+
__metadata("design:type", Object)
|
|
609
|
+
], TiandituMarkerComponent.prototype, "groups", void 0);
|
|
610
|
+
__decorate([
|
|
611
|
+
Data({
|
|
612
|
+
properties: {
|
|
613
|
+
id: ɵ0,
|
|
614
|
+
address: { type: 'string', title: '地点' },
|
|
615
|
+
information: { type: 'string', title: '信息' },
|
|
616
|
+
group: { type: 'string', title: '标记分组' },
|
|
617
|
+
lng: { type: 'number', title: '经度' },
|
|
618
|
+
lat: { type: 'number', title: '纬度' },
|
|
619
|
+
icon: { type: 'string', title: '图标' },
|
|
620
|
+
},
|
|
621
|
+
}),
|
|
622
|
+
__metadata("design:type", Array)
|
|
623
|
+
], TiandituMarkerComponent.prototype, "data", void 0);
|
|
624
|
+
__decorate([
|
|
625
|
+
DataOutput(['id', 'address', 'lng', 'lat']),
|
|
626
|
+
Event('选中值改变', {
|
|
627
|
+
params: {
|
|
628
|
+
properties: {
|
|
629
|
+
id: ɵ1,
|
|
630
|
+
address: { type: 'string', title: '地点' },
|
|
631
|
+
lng: { type: 'number', title: '经度' },
|
|
632
|
+
lat: { type: 'number', title: '纬度' },
|
|
633
|
+
},
|
|
634
|
+
},
|
|
635
|
+
}),
|
|
636
|
+
__metadata("design:type", Object)
|
|
637
|
+
], TiandituMarkerComponent.prototype, "makerClick", void 0);
|
|
638
|
+
__decorate([
|
|
639
|
+
DataInput('选中id'),
|
|
640
|
+
__metadata("design:type", String)
|
|
641
|
+
], TiandituMarkerComponent.prototype, "selectedId", void 0);
|
|
642
|
+
__decorate([
|
|
643
|
+
Event('点击', {
|
|
644
|
+
params: {
|
|
645
|
+
properties: {
|
|
646
|
+
id: ɵ2,
|
|
647
|
+
address: { type: 'string', title: '地点' },
|
|
648
|
+
lng: { type: 'number', title: '经度' },
|
|
649
|
+
lat: { type: 'number', title: '纬度' },
|
|
650
|
+
},
|
|
651
|
+
},
|
|
652
|
+
}),
|
|
653
|
+
__metadata("design:type", Object)
|
|
654
|
+
], TiandituMarkerComponent.prototype, "onClick", void 0);
|
|
655
|
+
TiandituMarkerComponent = __decorate([
|
|
656
|
+
Widget('标记层', {
|
|
657
|
+
hidden: true,
|
|
658
|
+
}),
|
|
659
|
+
__metadata("design:paramtypes", [TiandituComponent,
|
|
660
|
+
NgZone,
|
|
661
|
+
FileUrlService,
|
|
662
|
+
NzContextMenuService])
|
|
663
|
+
], TiandituMarkerComponent);
|
|
664
|
+
export { TiandituMarkerComponent };
|
|
665
|
+
export { ɵ0, ɵ1, ɵ2 };
|
|
666
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlhbmRpdHUtbWFya2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NjcmVlbi13aWRnZXQvc3JjL2xpYi90aWFuZGl0dS90aWFuZGl0dS1tYXJrZXIvdGlhbmRpdHUtbWFya2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBR1osTUFBTSxFQUtOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsSUFBSSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUl2RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUU5RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO1dBZ0xoRCxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxPQXdCN0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FhL0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7SUF6TTlCLHVCQUF1QixTQUF2Qix1QkFBd0IsU0FBUSxTQUFTO0lBZ09wRCxZQUNZLE1BQXlCLEVBQ3pCLElBQVksRUFDZCxjQUE4QixFQUM5QixvQkFBMEM7UUFFbEQsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQztRQUxWLFdBQU0sR0FBTixNQUFNLENBQW1CO1FBQ3pCLFNBQUksR0FBSixJQUFJLENBQVE7UUFDZCxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIseUJBQW9CLEdBQXBCLG9CQUFvQixDQUFzQjtRQWxPcEQsWUFBTyxHQUFHLDhCQUE4QixDQUFDO1FBRXpDLGNBQVMsR0FBRyxFQUFFLENBQUM7UUFFZixlQUFVLEdBQUcsRUFBRSxDQUFDO1FBRWhCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBRWpCLGdCQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLG9DQUFvQztRQUNwQyxjQUFjO1FBR2QsYUFBUSxHQUFZLEtBQUssQ0FBQztRQXlCMUIscUZBQXFGO1FBQ3JGLDJCQUEyQjtRQUUzQixjQUFTLEdBQVE7WUFDZixNQUFNLEVBQUUsRUFBRTtZQUNWLEtBQUssRUFBRSxTQUFTO1lBQ2hCLE1BQU0sRUFBRSxRQUFRO1lBQ2hCLElBQUksRUFBRSxFQUFFO1lBQ1IsS0FBSyxFQUFFLENBQUM7WUFDUixVQUFVLEVBQUUsQ0FBQztTQUNkLENBQUM7UUFTRixrREFBa0Q7UUFDbEQsaURBQWlEO1FBRWpELGlCQUFZLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFFbkIsaUJBQVksR0FBRyxFQUFFLENBQUM7UUFRbEIseUJBQW9CLEdBQUcsSUFBSSxDQUFDO1FBeUY1QixXQUFNLEdBQUcsRUFBRSxDQUFDO1FBWVosU0FBSSxHQUFVO1lBQ1o7Z0JBQ0UsRUFBRSxFQUFFLEdBQUc7Z0JBQ1AsT0FBTyxFQUFFLEVBQUU7Z0JBQ1gsV0FBVyxFQUFFLE1BQU07Z0JBQ25CLEtBQUssRUFBRSxFQUFFO2dCQUNULEdBQUcsRUFBRSxPQUFPO2dCQUNaLEdBQUcsRUFBRSxJQUFJO2FBQ1Y7U0FDRixDQUFDO1FBQ0YsY0FBYztRQVlkLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBYWhDLFlBQU8sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRTdCLFdBQU0sR0FBRyxFQUFFLENBQUM7UUFFWixxQkFBcUI7UUFDckIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQU1oQixZQUFPLEdBQUcsRUFBRSxDQUFDO0lBWWIsQ0FBQztJQUVLLFFBQVE7Ozs7O1lBQ1osTUFBTSxPQUFNLFFBQVEsV0FBRSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxFQUFFO2dCQUNuRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO29CQUN2RSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQy9CLENBQUMsQ0FBQyxDQUFDO2FBQ0o7UUFDSCxDQUFDO0tBQUE7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDaEMsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2YsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO2dCQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtvQkFDL0IsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN4QixDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsSUFBSSxPQUFPLENBQUMsVUFBVSxFQUFFO2dCQUN0QixJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO29CQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztpQkFDOUM7YUFDRjtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRCxJQUFJOztRQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUM1QyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxVQUFJLElBQUksQ0FBQyxNQUFNLDBDQUFFLE1BQU0sRUFBRTtZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO2dCQUM1QixJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUU7b0JBQ2YsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDMUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDO2lCQUN4QztZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRTtZQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pFLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BCLENBQUMsQ0FBQyxDQUFDO1NBQ0o7UUFDRCx1REFBdUQ7UUFDdkQsMEJBQTBCO1FBQzFCLDhDQUE4QztRQUM5Qyx3QkFBd0I7UUFDeEIsd0NBQXdDO1FBQ3hDLHVCQUF1QjtRQUN2QixtQkFBbUI7UUFDbkIsc0JBQXNCO1FBQ3RCLGdFQUFnRTtRQUNoRSxnQkFBZ0I7UUFDaEIsNEJBQTRCO1FBQzVCLFNBQVM7UUFDVCx1QkFBdUI7UUFDdkIsc0JBQXNCO1FBQ3RCLE9BQU87UUFDUCwwREFBMEQ7UUFDMUQsbURBQW1EO1FBQ25ELE1BQU07UUFDTiw0QkFBNEI7UUFDNUIsZ0RBQWdEO1FBQ2hELE1BQU07UUFDTix1QkFBdUI7UUFDdkIsNkJBQTZCO1FBQzdCLGtDQUFrQztRQUNsQyw2QkFBNkI7UUFDN0IsZ0NBQWdDO1FBQ2hDLGdDQUFnQztRQUNoQyxTQUFTO1FBQ1QsTUFBTTtRQUNOLHdEQUF3RDtRQUN4RCx5Q0FBeUM7UUFDekMscUNBQXFDO1FBQ3JDLGdEQUFnRDtRQUNoRCxzQ0FBc0M7UUFDdEMsVUFBVTtRQUNWLE1BQU07UUFDTixpQ0FBaUM7UUFDakMsSUFBSTtJQUNOLENBQUM7SUFFRCxhQUFhLENBQUMsS0FBVztRQUN2QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9DLE9BQU8sRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDN0Isb0VBQW9FO1FBQ3BFLDJCQUEyQjtRQUMzQixtQkFBbUI7UUFDbkIsMERBQTBEO1FBQzFELDBDQUEwQztRQUMxQywwQ0FBMEM7UUFDMUMsT0FBTztRQUNQLHdDQUF3QztRQUN4QyxnQ0FBZ0M7UUFDaEMsNkNBQTZDO1FBQzdDLHdEQUF3RDtRQUN4RCw2REFBNkQ7UUFDN0QsVUFBVTtRQUNWLG1DQUFtQztRQUNuQyxNQUFNO1FBQ04sdUNBQXVDO1FBQ3ZDLDZDQUE2QztRQUM3QyxNQUFNO1FBQ04sZ0NBQWdDO1FBQ2hDLDhDQUE4QztRQUM5QyxXQUFXO1FBQ1gsb0NBQW9DO1FBQ3BDLCtDQUErQztRQUMvQyxJQUFJO0lBQ04sQ0FBQztJQUVELGlCQUFpQixDQUFDLElBQWE7UUFDN0IsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUN2QjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2FBQ3ZCO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsY0FBYztRQUNaLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pDLElBQUksTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQ2xCLElBQUksTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUNqQixJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNqQixJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDeEIsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDbkMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDbEU7UUFDRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsMEJBQTBCO1FBQzFCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDM0IsSUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUM3QixJQUFJLFNBQVMsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQzNELFNBQVMsR0FBRyxFQUFFLENBQUM7YUFDaEI7WUFDRCxJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQzFCLEVBQUUsR0FBRyxPQUFPLEVBQUUsQ0FBQzthQUNoQjtZQUNELHlEQUF5RDtZQUN6RCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLCtEQUErRDtZQUMvRCx3Q0FBd0M7WUFDeEMsK0JBQStCO1lBQy9CLG1FQUFtRTtZQUNuRSw2RUFBNkU7WUFDN0UsTUFBTTtZQUNOLElBQUk7WUFDSixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUM3RCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTztZQUNsRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxpQ0FBTSxNQUFNLEtBQUUsRUFBRSxJQUFHLENBQUM7Z0JBQ3ZDLENBQUMsQ0FBQyxDQUFDO2dCQUNILElBQUksTUFBTSxDQUFDLFdBQVcsRUFBRTtvQkFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0QztZQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0gsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRTtnQkFDcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUN4QixJQUFJLEVBQUUsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFO29CQUN6QixRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRTtvQkFDNUIsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO2lCQUN2RSxDQUFDLENBQUM7Z0JBQ0gsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxLQUFLLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDbEMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUMxQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ3pDLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdkMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtZQUNELGtEQUFrRDtZQUNsRCxnQ0FBZ0M7WUFDaEMsNEJBQTRCO1lBQzVCLElBQUk7WUFDSixTQUFTLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQzFCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtnQkFDbEIsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUN2QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gseUJBQXlCO1FBQ3pCLHVIQUF1SDtRQUN2SCxJQUFJO1FBQ0osOEJBQThCO1FBQzlCLHdDQUF3QztRQUN4QyxtQ0FBbUM7UUFDbkMseUJBQXlCO1FBQ3pCLE1BQU07UUFDTix3QkFBd0I7UUFDeEIsc0NBQXNDO1FBQ3RDLElBQUk7UUFDSixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQVU7UUFDdkIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSw4QkFBOEIsQ0FBQztRQUMxRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUNuQyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUNqQyxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUN0RSxJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQ25FLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxRQUFRLEVBQUU7WUFDM0IsSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsRCxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7WUFDN0IsTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDO1lBQ2hDLE9BQU8sR0FBRyxLQUFLLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztZQUM1RCxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztTQUMxRDtRQUNELE1BQU0sV0FBVyxHQUFRLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQztZQUNsQyxPQUFPLEVBQUUsSUFBSTtZQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQztZQUNwQyxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUM7U0FDMUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELFFBQVEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNqQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3JCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVc7UUFDM0YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVE7SUFDaEUsQ0FBQztJQUNELFlBQVksQ0FBQyxPQUFZO1FBQ3ZCLCtCQUErQjtRQUMvQix3Q0FBd0M7UUFDeEMsK0NBQStDO1FBQy9DLG9CQUFvQjtRQUNwQixpQ0FBaUM7UUFDakMsTUFBTTtRQUNOLDRFQUE0RTtRQUM1RSw2Q0FBNkM7UUFDN0Msc0NBQXNDO1FBQ3RDLGtDQUFrQztRQUNsQyw2QkFBNkI7UUFDN0IsVUFBVTtRQUNWLGtDQUFrQztRQUNsQywrQkFBK0I7UUFDL0IsZ0NBQWdDO1FBQ2hDLFVBQVU7UUFDVixNQUFNO1FBQ04sb0JBQW9CO1FBQ3BCLHlDQUF5QztRQUN6QywyREFBMkQ7UUFDM0QscUdBQXFHO1FBQ3JHLGVBQWU7UUFDZiw4Q0FBOEM7UUFDOUMsb0JBQW9CO1FBQ3BCLG9EQUFvRDtRQUNwRCwrQ0FBK0M7UUFDL0MsZ0NBQWdDO1FBQ2hDLDBFQUEwRTtRQUMxRSxjQUFjO1FBQ2QsVUFBVTtRQUNWLFFBQVE7UUFDUixNQUFNO1FBQ04sS0FBSztRQUNMLDhDQUE4QztRQUM5QywyQkFBMkI7UUFDM0IsK0JBQStCO1FBQy9CLDhDQUE4QztRQUM5QyxzRUFBc0U7UUFDdEUsMERBQTBEO1FBQzFELDRCQUE0QjtRQUM1QiwyQkFBMkI7UUFDM0IsUUFBUTtRQUNSLDREQUE0RDtRQUM1RCwrQkFBK0I7UUFDL0IsMkVBQTJFO1FBQzNFLFFBQVE7UUFDUixPQUFPO1FBQ1AsSUFBSTtJQUNOLENBQUM7SUFFRCxNQUFNLENBQUMsRUFBTyxFQUFFLFVBQXFFLEVBQUU7UUFDckYsSUFBSSxFQUFFLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDakQsSUFBSSxJQUFTLENBQUM7WUFDZCxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDM0IsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQ3hCLDhCQUE4QjtnQkFDOUIsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO29CQUNoQixPQUFPO2lCQUNSO2FBQ0Y7WUFDRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsRUFBRSxDQUFDO1lBQzVCLCtCQUErQjtZQUMvQixrQ0FBa0M7WUFDbEMsSUFBSSxZQUFpQixDQUFDO1lBQ3RCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDbkIsc0RBQXNEO2dCQUN0RCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ3hCO1lBQ0QsSUFBSSxJQUFJLEVBQUU7Z0JBQ1IsOENBQThDO2dCQUM5QyxtREFBbUQ7Z0JBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO2dCQUN2QixZQUFZLEdBQUcsSUFBSSxDQUFDO2dCQUNwQixJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7b0JBQ2hCLHFEQUFxRDtvQkFDckQsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3JDLElBQUksSUFBSSxDQUFDLGVBQWUsRUFBRTt3QkFDeEIsSUFBSSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7cUJBQzdCO29CQUNELFlBQVk7b0JBQ1osNENBQTRDO29CQUM1QyxtQ0FBbUM7b0JBQ25DLDRDQUE0QztvQkFDNUMsTUFBTTtvQkFDTixvQ0FBb0M7b0JBQ3BDLElBQUk7b0JBQ0osSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQ3hFO2dCQUNELDBFQUEwRTtnQkFDMUUscUJBQXFCO2dCQUNyQix1QkFBdUI7Z0JBQ3ZCLG9GQUFvRjtnQkFDcEYsUUFBUTtnQkFDUixJQUFJO2FBQ0w7aUJBQU07Z0JBQ0wsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUNuQjtZQUNELHNDQUFzQztZQUN0QyxzQ0FBc0M7WUFDdEMsK0NBQStDO1lBQy9DLE1BQU07WUFDTiw2RUFBNkU7WUFDN0UsNENBQTRDO1lBQzVDLE1BQU07WUFDTixJQUFJO1lBQ0osNEJBQTRCO1lBQzVCLElBQUksRUFBRSxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7b0JBQ2pCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxpQ0FBTSxZQUFZLEtBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxRQUFRLElBQUksWUFBWSxDQUFDLEVBQUUsSUFBRyxDQUFDO2dCQUMxRixDQUFDLENBQUMsQ0FBQzthQUNKO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsY0FBYyxDQUFDLEtBQWE7UUFDMUIsc0NBQXNDO1FBQ3RDLHNDQUFzQztRQUN0Qyx1QkFBdUI7UUFDdkIseUJBQXlCO1FBQ3pCLElBQUk7SUFDTixDQUFDO0lBRUQsVUFBVSxDQUFDLElBQVMsRUFBRSxLQUFhO1FBQ2pDLHNDQUFzQztRQUN0Qyx3REFBd0Q7UUFDeEQsc0JBQXNCO1FBQ3RCLGdEQUFnRDtRQUNoRCxnREFBZ0Q7UUFDaEQsYUFBYTtRQUNiLG9DQUFvQztRQUNwQyxNQUFNO1FBQ04sK0NBQStDO1FBQy9DLDZDQUE2QztRQUM3QywyQ0FBMkM7UUFDM0Msa0NBQWtDO1FBQ2xDLHVFQUF1RTtRQUN2RSxNQUFNO1FBQ04sSUFBSTtJQUNOLENBQUM7Q0FDRixDQUFBOztZQWxuQkEsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLFlBQStDOzthQUVoRDs7O1lBUlEsaUJBQWlCO1lBbEJ4QixNQUFNO1lBWUMsY0FBYztZQUNkLG9CQUFvQjs7O21CQXlPMUIsU0FBUyxTQUFDLE1BQU07O0FBdE5qQjtJQURDLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7d0RBQzVDO0FBRXpDO0lBREMsUUFBUSxDQUFDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7MERBQ3JCO0FBRWY7SUFEQyxRQUFRLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOzsyREFDcEI7QUFFaEI7SUFEQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOzs0REFDckI7QUFFakI7SUFEQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDOzs0REFDckI7QUFLakI7SUFEQyxRQUFRLENBQUMsTUFBTSxDQUFDOzt5REFDUztBQXNCMUI7SUFEQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7MERBQ3pEO0FBRW5CO0lBREMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOztpRUFDMUM7QUFJekI7SUFEQyxRQUFRLENBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7MERBUS9FO0FBTUY7SUFMQyxRQUFRLENBQUMsTUFBTSxFQUFFO1FBQ2hCLEVBQUUsRUFBRTtZQUNGLE1BQU0sRUFBRSxTQUFTO1NBQ2xCO0tBQ0YsQ0FBQzs7dURBQ2E7QUFFZjtJQURDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUM7OzREQUNsQjtBQUlwQjtJQURDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDOzs2REFDL0Q7QUFFbkI7SUFEQyxRQUFRLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQzs7NkRBQ2hFO0FBTWxCO0lBREMsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQzs7Z0VBQ2hCO0FBRXhCO0lBREMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDOztxRUFDN0I7QUF5RjVCO0lBeEZDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7UUFDaEIsSUFBSSxFQUFFLE9BQU87UUFDYixLQUFLLEVBQUUsTUFBTTtRQUNiLFFBQVEsRUFBRSxFQUFFO1FBQ1osS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxVQUFVLEVBQUU7Z0JBQ1YsS0FBSyxFQUFFO29CQUNMLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxJQUFJO2lCQUNaO2dCQUNELFVBQVU7Z0JBQ1YsaUJBQWlCO2dCQUNqQixvQkFBb0I7Z0JBQ3BCLFlBQVk7Z0JBQ1osUUFBUTtnQkFDUixxQkFBcUI7Z0JBQ3JCLHVCQUF1QjtnQkFDdkIsU0FBUztnQkFDVCxRQUFRO2dCQUNSLHFCQUFxQjtnQkFDckIseUJBQXlCO2dCQUN6QixTQUFTO2dCQUNULFFBQVE7Z0JBQ1Isc0JBQXNCO2dCQUN0Qix5QkFBeUI7Z0JBQ3pCLFNBQVM7Z0JBQ1QsUUFBUTtnQkFDUixxQkFBcUI7Z0JBQ3JCLHVCQUF1QjtnQkFDdkIsU0FBUztnQkFDVCxRQUFRO2dCQUNSLHFCQUFxQjtnQkFDckIseUJBQXlCO2dCQUN6QixTQUFTO2dCQUNULE9BQU87Z0JBQ1AscUJBQXFCO2dCQUNyQixLQUFLO2dCQUNMLFdBQVc7Z0JBQ1gsb0JBQW9CO2dCQUNwQixpQkFBaUI7Z0JBQ2pCLDBFQUEwRTtnQkFDMUUsS0FBSztnQkFDTCxVQUFVO2dCQUNWLG9CQUFvQjtnQkFDcEIsaUJBQWlCO2dCQUNqQix5RUFBeUU7Z0JBQ3pFLEtBQUs7Z0JBQ0wsUUFBUSxFQUFFO29CQUNSLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxJQUFJO29CQUNYLEVBQUUsRUFBRTt3QkFDRixNQUFNLEVBQUUsV0FBVzt3QkFDbkIsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUU7cUJBQzlCO2lCQUNGO2dCQUNELEtBQUssRUFBRTtvQkFDTCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsSUFBSTtvQkFDWCxPQUFPLEVBQUUsRUFBRTtvQkFDWCxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO2lCQUN0QztnQkFDRCxNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLFFBQVE7b0JBQ2QsS0FBSyxFQUFFLElBQUk7b0JBQ1gsT0FBTyxFQUFFLEVBQUU7b0JBQ1gsRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRTtpQkFDdEM7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLElBQUksRUFBRSxRQUFRO29CQUNkLEtBQUssRUFBRSxNQUFNO29CQUNiLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUU7aUJBQ3RDO2dCQUNELE9BQU8sRUFBRTtvQkFDUCxJQUFJLEVBQUUsUUFBUTtvQkFDZCxLQUFLLEVBQUUsTUFBTTtvQkFDYixFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO2lCQUN0QzthQU1GO1lBQ0QsUUFBUSxFQUFFLEVBQUU7U0FDYjtRQUNELEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsRUFBRSxXQUFXLEVBQUUsRUFBRSxFQUF5QjtLQUN4RSxDQUFDOzt1REFDVTtBQVlaO0lBWEMsSUFBSSxDQUFDO1FBQ0osVUFBVSxFQUFFO1lBQ1YsRUFBRSxJQUFpQztZQUNuQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDeEMsV0FBVyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQzVDLEtBQUssRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRTtZQUN4QyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7WUFDcEMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO1lBQ3BDLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtTQUN0QztLQUNGLENBQUM7O3FEQVVBO0FBYUY7SUFYQyxVQUFVLENBQUMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxLQUFLLENBQUMsT0FBTyxFQUFFO1FBQ2QsTUFBTSxFQUFFO1lBQ04sVUFBVSxFQUFFO2dCQUNWLEVBQUUsSUFBaUM7Z0JBQ25DLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtnQkFDeEMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO2dCQUNwQyxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7YUFDckM7U0FDRjtLQUNGLENBQUM7OzJEQUM4QjtBQUVoQztJQURDLFNBQVMsQ0FBQyxNQUFNLENBQUM7OzJEQUNDO0FBV25CO0lBVkMsS0FBSyxDQUFDLElBQUksRUFBRTtRQUNYLE1BQU0sRUFBRTtZQUNOLFVBQVUsRUFBRTtnQkFDVixFQUFFLElBQWlDO2dCQUNuQyxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUU7Z0JBQ3hDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRTtnQkFDcEMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFO2FBQ3JDO1NBQ0Y7S0FDRixDQUFDOzt3REFDMkI7QUFoTmxCLHVCQUF1QjtJQUhuQyxNQUFNLENBQUMsS0FBSyxFQUFFO1FBQ2IsTUFBTSxFQUFFLElBQUk7S0FDYixDQUFDO3FDQWtPb0IsaUJBQWlCO1FBQ25CLE1BQU07UUFDRSxjQUFjO1FBQ1Isb0JBQW9CO0dBcE96Qyx1QkFBdUIsQ0EwbUJuQztTQTFtQlksdUJBQXVCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIEluamVjdCxcbiAgTmdab25lLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBTaW1wbGVDaGFuZ2VzLFxuICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0YSwgRGF0YU91dHB1dCwgUHJvcGVydHksIFdpZGdldCwgRXZlbnQsIERhdGFJbnB1dCB9IGZyb20gJ2Jiai13aWRnZXQtYmFzZSc7XG5pbXBvcnQgeyBQYXJlbnRDb250YWluZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9wYXJlbnQtY29udGFpbmVyL3BhcmVudC1jb250YWluZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFNGQXJyYXlXaWRnZXRTY2hlbWEgfSBmcm9tICdAZGVsb24vZm9ybSc7XG5pbXBvcnQgeyBnZXRGb250U3R5bGUgfSBmcm9tICcuLi8uLi9zaGFyZWQvdXRpbC9zdHlsZS51dGlsJztcbmltcG9ydCB7IEJhc2VMYXllciB9IGZyb20gJy4uL2Jhc2UtbGF5ZXInO1xuaW1wb3J0IHsgRmlsZVVybFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZS9maWxlLXVybC5zZXJ2aWNlJztcbmltcG9ydCB7IE56Q29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9kcm9wZG93bic7XG5pbXBvcnQgeyBTY3JvbGxEaXNwYXRjaGVyIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBnZXRVVUlEIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3V0aWwvYmFzZS51dGlsJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFRpYW5kaXR1Q29tcG9uZW50IH0gZnJvbSAnLi4vdGlhbmRpdHUuY29tcG9uZW50JztcblxuZGVjbGFyZSB2YXIgVDogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzYy10aWFuZGl0dS1tYXJrZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vdGlhbmRpdHUtbWFya2VyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGlhbmRpdHUtbWFya2VyLmNvbXBvbmVudC5sZXNzJ10sXG59KVxuQFdpZGdldCgn5qCH6K6w5bGCJywge1xuICBoaWRkZW46IHRydWUsXG59KVxuZXhwb3J0IGNsYXNzIFRpYW5kaXR1TWFya2VyQ29tcG9uZW50IGV4dGVuZHMgQmFzZUxheWVyIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcyB7XG4gIEBQcm9wZXJ0eSgnJywgeyBtaW46IDEsIHVpOiB7IHdpZGdldDogJ215UGljdHVyZScsIHNwYW5MYWJlbDogMCwgc3BhbkNvbnRyb2w6IDI0IH0gfSlcbiAgaWNvblVybCA9ICdhc3NldHMvaW1nL3NjcmVlbi9tYXJrZXIucG5nJztcbiAgQFByb3BlcnR5KCflm77moIflrr0nLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gIGljb25XaWR0aCA9IDIwO1xuICBAUHJvcGVydHkoJ+Wbvuagh+mrmCcsIHsgdHlwZTogJ251bWJlcicgfSlcbiAgaWNvbkhlaWdodCA9IDMwO1xuICBAUHJvcGVydHkoJ+Wbvuagh+WBj+enu3gnLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gIGljb25PZmZzZXRYID0gMTA7XG4gIEBQcm9wZXJ0eSgn5Zu+5qCH5YGP56e7eScsIHsgdHlwZTogJ251bWJlcicgfSlcbiAgaWNvbk9mZnNldFkgPSAzMDtcbiAgLy8gQFByb3BlcnR5KCfliIbnu4QnLCB7dHlwZTogJ3N0cmluZyd9KVxuICAvLyBncm91cCA9ICcnO1xuXG4gIEBQcm9wZXJ0eSgn56e76Iez5Lit5b+DJylcbiAgdG9DZW50ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gQFByb3BlcnR5KCfngrnogZrlkIgnKVxuICAvLyBlbmFibGVNYXJrZXJDbHVzdGVyZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLy8gQFByb3BlcnR5KCfogZrlkIjmnIDlsI/nm7TlvoQnLCB7IHR5cGU6ICdudW1iZXInLCB1aTogeyB2aXNpYmxlSWY6IHsgZW5hYmxlTWFya2VyQ2x1c3RlcmVyOiBbdHJ1ZV0gfSB9IH0pXG4gIC8vIGNsdXN0ZXJNaW5TaXplID0gMjU7XG4gIC8vIEBQcm9wZXJ0eSgn6IGa5ZCI5pyA5aSn55u05b6EJywgeyB0eXBlOiAnbnVtYmVyJywgdWk6IHsgdmlzaWJsZUlmOiB7IGVuYWJsZU1hcmtlckNsdXN0ZXJlcjogW3RydWVdIH0gfSB9KVxuICAvLyBjbHVzdGVyTWF4U2l6ZSA9IDQwO1xuICAvLyBAUHJvcGVydHkoJ+iBmuWQiOWtl+S9kycsIHsgdWk6IHsgd2lkZ2V0OiAnbXlGb250JyB9IH0pXG4gIC8vIGNsdXN0ZXJGb250OiBhbnkgPSB7XG4gIC8vICAgY29sb3I6ICcjZmZmZmZmJyxcbiAgLy8gICBzaXplOiAxNixcbiAgLy8gfTtcbiAgLy8gQFByb3BlcnR5KCfogZrlkIjpopzoibInLCB7XG4gIC8vICAgdWk6IHtcbiAgLy8gICAgIHdpZGdldDogJ3Nlcmllc0NvbG9yJyxcbiAgLy8gICAgIHZpc2libGVJZjogeyBlbmFibGVNYXJrZXJDbHVzdGVyZXI6IFt0cnVlXSB9LFxuICAvLyAgIH0sXG4gIC8vIH0pXG4gIC8vIGNsdXN0ZXJHcmFkaWVudDogc3RyaW5nW107XG4gIC8vIEBQcm9wZXJ0eSgn6IGa5ZCI5pyA5aSn57qn5YirJywgeyB0eXBlOiAnbnVtYmVyJywgdWk6IHsgdmlzaWJsZUlmOiB7IGVuYWJsZU1hcmtlckNsdXN0ZXJlcjogW3RydWVdIH0gfSB9KVxuICAvLyBjbHVzdGVyTWF4Wm9vbSA9IDQ7XG4gIEBQcm9wZXJ0eSgn5pi+56S65qCH562+JywgeyB1aTogeyB2aXNpYmxlSWY6IHsgZW5hYmxlTWFya2VyQ2x1c3RlcmVyOiBbZmFsc2VdIH0gfSB9KVxuICBzaG93TGFiZWw6IGJvb2xlYW47XG4gIEBQcm9wZXJ0eSgn5qCH562+5pi+56S657yp5pS+562J57qnJywgeyB1aTogeyB2aXNpYmxlSWY6IHsgc2hvd0xhYmVsOiBbdHJ1ZV0gfSB9IH0pXG4gIHNob3dMYWJlbE1pblpvb206IG51bWJlcjtcbiAgLy8gQFByb3BlcnR5KCfmoIfnrb7lupXoibInLCB7IHVpOiB7IHdpZGdldDogJ215Q29sb3InLCB2aXNpYmxlSWY6IHsgc2hvd0xhYmVsOiBbdHJ1ZV0gfSB9IH0pXG4gIC8vIGxhYmVsQmFja2dyb3VuZDogc3RyaW5nO1xuICBAUHJvcGVydHkoJ+agh+etvuWtl+S9kycsIHsgdWk6IHsgd2lkZ2V0OiAnbXlGb250JywgdmlzaWJsZUlmOiB7IHNob3dMYWJlbDogW3RydWVdIH0gfSB9KVxuICBsYWJlbEZvbnQ6IGFueSA9IHtcbiAgICBmYW1pbHk6ICcnLFxuICAgIGNvbG9yOiAnIzAwMDAwMCcsXG4gICAgd2VpZ2h0OiAnbm9ybWFsJyxcbiAgICBzaXplOiAxNixcbiAgICBzcGFjZTogMCxcbiAgICBsaW5lSGVpZ2h0OiAwLFxuICB9O1xuICBAUHJvcGVydHkoJ+aPj+i+ueminOiJsicsIHtcbiAgICB1aToge1xuICAgICAgd2lkZ2V0OiAnbXlDb2xvcicsXG4gICAgfSxcbiAgfSlcbiAgc3Ryb2tlOiBzdHJpbmc7XG4gIEBQcm9wZXJ0eSgn5o+P6L6557KX57uGJywgeyB0eXBlOiAnaW50ZWdlcicgfSlcbiAgc3Ryb2tlV2lkdGg6IG51bWJlcjtcbiAgLy8gQFByb3BlcnR5KCfpmLTlvbEnLCB7IHVpOiB7IHdpZGdldDogJ215U2hhZG93JyB9IH0pXG4gIC8vIHNoYWRvdzogYW55ID0geyBjb2xvcjogJycsIFg6IDAsIFk6IDAsIFo6IDAgfTtcbiAgQFByb3BlcnR5KCfmoIfnrb7lgY/np7t4JywgeyB1aTogeyB3aWRnZXQ6ICdudW1iZXInLCB2aXNpYmxlSWY6IHsgc2hvd0xhYmVsOiBbdHJ1ZV0gfSB9IH0pXG4gIGxhYmVsT2Zmc2V0WCA9IC01MDtcbiAgQFByb3BlcnR5KCfmoIfnrb7lgY/np7t5JywgeyB1aTogeyB3aWRnZXQ6ICdudW1iZXInLCB2aXNpYmxlSWY6IHsgc2hvd0xhYmVsOiBbdHJ1ZV0gfSB9IH0pXG4gIGxhYmVsT2Zmc2V0WSA9IDEwO1xuICAvLyBAUHJvcGVydHkoJ+mAieS4reaUvuWkpycpXG4gIC8vIGVubGFyZ2VPblNlbGVjdDogYm9vbGVhbjtcbiAgLy8gQFByb3BlcnR5KCfpgInkuK3ml7bmlL7lpKflgI3mlbAnLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gIC8vIHNlbGVjdGVkU2l6ZSA9IDEuNTtcbiAgQFByb3BlcnR5KCfpgInkuK3ml7blnLDlm77nvKnmlL4nLCB7IHR5cGU6ICdudW1iZXInIH0pXG4gIHNlbGVjdGVkTWFwWm9vbTogbnVtYmVyO1xuICBAUHJvcGVydHkoJ+eCueWHu+epuueZveWPlua2iOmAieS4rScsIHsgdHlwZTogJ2Jvb2xlYW4nLCBkZWZhdWx0OiB0cnVlIH0pXG4gIHVuc2VsZWN0T25DbGlja0JsYW5rID0gdHJ1ZTtcbiAgQFByb3BlcnR5KCfmoIforrDliIbnu4QnLCB7XG4gICAgdHlwZTogJ2FycmF5JyxcbiAgICB0aXRsZTogJ+agh+iusOWIhue7hCcsXG4gICAgbWF4SXRlbXM6IDEwLFxuICAgIGl0ZW1zOiB7XG4gICAgICB0eXBlOiAnb2JqZWN0JyxcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgZ3JvdXA6IHtcbiAgICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgICB0aXRsZTogJ+WIhue7hCcsXG4gICAgICAgIH0sXG4gICAgICAgIC8vIHR5cGU6IHtcbiAgICAgICAgLy8gICB0aXRsZTogJ+exu+WeiycsXG4gICAgICAgIC8vICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIC8vICAgZW51bTogW1xuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICBsYWJlbDogJ+WbvuaghycsXG4gICAgICAgIC8vICAgICAgIHZhbHVlOiAnaWNvbicsXG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgICAge1xuICAgICAgICAvLyAgICAgICBsYWJlbDogJ+WchueCuScsXG4gICAgICAgIC8vICAgICAgIHZhbHVlOiAnY2lyY2xlJyxcbiAgICAgICAgLy8gICAgIH0sXG4gICAgICAgIC8vICAgICB7XG4gICAgICAgIC8vICAgICAgIGxhYmVsOiAn5q2j5pa55b2iJyxcbiAgICAgICAgLy8gICAgICAgdmFsdWU6ICdzcXVhcmUnLFxuICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgbGFiZWw6ICfms6LnurknLFxuICAgICAgICAvLyAgICAgICB2YWx1ZTogJ3dhdmUnLFxuICAgICAgICAvLyAgICAgfSxcbiAgICAgICAgLy8gICAgIHtcbiAgICAgICAgLy8gICAgICAgbGFiZWw6ICfmianmlaMnLFxuICAgICAgICAvLyAgICAgICB2YWx1ZTogJ2J1YmJsZScsXG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgIF0sXG4gICAgICAgIC8vICAgZGVmYXVsdDogJ2ljb24nLFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBjb2xvcjoge1xuICAgICAgICAvLyAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAvLyAgIHRpdGxlOiAn6aKc6ImyJyxcbiAgICAgICAgLy8gICB1aTogeyB3aWRnZXQ6ICdteUNvbG9yJywgdmlzaWJsZUlmOiB7IHR5cGU6IFsnY2lyY2xlJywgJ3NxdWFyZSddIH0gfSxcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gc2l6ZToge1xuICAgICAgICAvLyAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAvLyAgIHRpdGxlOiAn5bC65a+4JyxcbiAgICAgICAgLy8gICB1aTogeyB2aXNpYmxlSWY6IHsgdHlwZTogWydjaXJjbGUnLCAnc3F1YXJlJywgJ3dhdmUnLCAnYnViYmxlJ10gfSB9LFxuICAgICAgICAvLyB9LFxuICAgICAgICBpbWFnZVVybDoge1xuICAgICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICAgIHRpdGxlOiAn5Zu+54mHJyxcbiAgICAgICAgICB1aToge1xuICAgICAgICAgICAgd2lkZ2V0OiAnbXlQaWN0dXJlJyxcbiAgICAgICAgICAgIHZpc2libGVJZjogeyB0eXBlOiBbJ2ljb24nXSB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHdpZHRoOiB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgdGl0bGU6ICflrr3luqYnLFxuICAgICAgICAgIGRlZmF1bHQ6IDE5LFxuICAgICAgICAgIHVpOiB7IHZpc2libGVJZjogeyB0eXBlOiBbJ2ljb24nXSB9IH0sXG4gICAgICAgIH0sXG4gICAgICAgIGhlaWdodDoge1xuICAgICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICAgIHRpdGxlOiAn6auY5bqmJyxcbiAgICAgICAgICBkZWZhdWx0OiAyNSxcbiAgICAgICAgICB1aTogeyB2aXNpYmxlSWY6IHsgdHlwZTogWydpY29uJ10gfSB9LFxuICAgICAgICB9LFxuICAgICAgICBYT2Zmc2V0OiB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgdGl0bGU6ICdY6L205YGP56e7JyxcbiAgICAgICAgICB1aTogeyB2aXNpYmxlSWY6IHsgdHlwZTogWydpY29uJ10gfSB9LFxuICAgICAgICB9LFxuICAgICAgICBZT2Zmc2V0OiB7XG4gICAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgICAgdGl0bGU6ICdZ6L205YGP56e7JyxcbiAgICAgICAgICB1aTogeyB2aXNpYmxlSWY6IHsgdHlwZTogWydpY29uJ10gfSB9LFxuICAgICAgICB9LFxuICAgICAgICAvLyBlbmFibGVNYXJrZXJDbHVzdGVyZXI6IHtcbiAgICAgICAgLy8gICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICAgIC8vICAgdGl0bGU6ICfmmK/lkKbogZrlkIgnLFxuICAgICAgICAvLyAgIHVpOiB7IHZpc2libGVJZjogeyB0eXBlOiBbJ2ljb24nXSB9IH0sXG4gICAgICAgIC8vIH0sXG4gICAgICB9LFxuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgIH0sXG4gICAgdWk6IHsgZ3JpZDogeyBhcnJheVNwYW46IDI0IH0sIHNwYW5Db250cm9sOiAyNCB9IGFzIFNGQXJyYXlXaWRnZXRTY2hlbWEsXG4gIH0pXG4gIGdyb3VwcyA9IFtdO1xuICBARGF0YSh7XG4gICAgcHJvcGVydGllczoge1xuICAgICAgaWQ6IHsgdHlwZTogJ3N0cmluZycsIHRpdGxlOiAnaWQnIH0sXG4gICAgICBhZGRyZXNzOiB7IHR5cGU6ICdzdHJpbmcnLCB0aXRsZTogJ+WcsOeCuScgfSxcbiAgICAgIGluZm9ybWF0aW9uOiB7IHR5cGU6ICdzdHJpbmcnLCB0aXRsZTogJ+S/oeaBrycgfSxcbiAgICAgIGdyb3VwOiB7IHR5cGU6ICdzdHJpbmcnLCB0aXRsZTogJ+agh+iusOWIhue7hCcgfSxcbiAgICAgIGxuZzogeyB0eXBlOiAnbnVtYmVyJywgdGl0bGU6ICfnu4/luqYnIH0sXG4gICAgICBsYXQ6IHsgdHlwZTogJ251bWJlcicsIHRpdGxlOiAn57qs5bqmJyB9LFxuICAgICAgaWNvbjogeyB0eXBlOiAnc3RyaW5nJywgdGl0bGU6ICflm77moIcnIH0sXG4gICAgfSxcbiAgfSlcbiAgZGF0YTogYW55W10gPSBbXG4gICAge1xuICAgICAgaWQ6ICcxJyxcbiAgICAgIGFkZHJlc3M6ICcnLFxuICAgICAgaW5mb3JtYXRpb246ICfmmoLml6Dkv6Hmga8nLFxuICAgICAgZ3JvdXA6ICcnLFxuICAgICAgbG5nOiAnMTIwLjcnLFxuICAgICAgbGF0OiAnMjgnLFxuICAgIH0sXG4gIF07XG4gIC8vIGlkOiBzdHJpbmc7XG4gIEBEYXRhT3V0cHV0KFsnaWQnLCAnYWRkcmVzcycsICdsbmcnLCAnbGF0J10pXG4gIEBFdmVudCgn6YCJ5Lit5YC85pS55Y+YJywge1xuICAgIHBhcmFtczoge1xuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBpZDogeyB0eXBlOiAnc3RyaW5nJywgdGl0bGU6ICdpZCcgfSxcbiAgICAgICAgYWRkcmVzczogeyB0eXBlOiAnc3RyaW5nJywgdGl0bGU6ICflnLDngrknIH0sXG4gICAgICAgIGxuZzogeyB0eXBlOiAnbnVtYmVyJywgdGl0bGU6ICfnu4/luqYnIH0sXG4gICAgICAgIGxhdDogeyB0eXBlOiAnbnVtYmVyJywgdGl0bGU6ICfnuqzluqYnIH0sXG4gICAgICB9LFxuICAgIH0sXG4gIH0pXG4gIG1ha2VyQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBEYXRhSW5wdXQoJ+mAieS4rWlkJylcbiAgc2VsZWN0ZWRJZDogc3RyaW5nO1xuICBARXZlbnQoJ+eCueWHuycsIHtcbiAgICBwYXJhbXM6IHtcbiAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgaWQ6IHsgdHlwZTogJ3N0cmluZycsIHRpdGxlOiAnaWQnIH0sXG4gICAgICAgIGFkZHJlc3M6IHsgdHlwZTogJ3N0cmluZycsIHRpdGxlOiAn5Zyw54K5JyB9LFxuICAgICAgICBsbmc6IHsgdHlwZTogJ251bWJlcicsIHRpdGxlOiAn57uP5bqmJyB9LFxuICAgICAgICBsYXQ6IHsgdHlwZTogJ251bWJlcicsIHRpdGxlOiAn57qs5bqmJyB9LFxuICAgICAgfSxcbiAgICB9LFxuICB9KVxuICBvbkNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIGxheWVycyA9IFtdO1xuICBpbml0ZWQ6IGJvb2xlYW47XG4gIC8vIGRlZmF1bHRMYXllcjogYW55O1xuICBvcHRpb25zTWFwID0ge307XG4gIGNsaWNrRGF0YTogYW55O1xuICBjbGlja1RpbWVvdXQ6IGFueTtcbiAgQFZpZXdDaGlsZCgnbWVudScpXG4gIG1lbnU6IGFueTtcbiAgc3ViTWFya2VyczogYW55W107XG4gIGRhdGFNYXAgPSB7fTtcbiAgZ3JvdXBEYXRhOiB7fTtcbiAgbGFzdFNlbGVjdDogYW55O1xuICBjdXJyZW50U2VsZWN0ZWRJZDogc3RyaW5nO1xuICB0ZXh0TGF5ZXI6IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIHBhcmVudDogVGlhbmRpdHVDb21wb25lbnQsXG4gICAgcHJvdGVjdGVkIHpvbmU6IE5nWm9uZSxcbiAgICBwcml2YXRlIGZpbGVVcmxTZXJ2aWNlOiBGaWxlVXJsU2VydmljZSxcbiAgICBwcml2YXRlIG56Q29udGV4dE1lbnVTZXJ2aWNlOiBOekNvbnRleHRNZW51U2VydmljZSxcbiAgKSB7XG4gICAgc3VwZXIocGFyZW50LCB6b25lKTtcbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHN1cGVyLm5nT25Jbml0KCk7XG4gICAgaWYgKHRoaXMuc2hvd0xhYmVsICYmIHRoaXMuc2hvd0xhYmVsTWluWm9vbSAhPSBudWxsKSB7XG4gICAgICB0aGlzLnBhcmVudC56b29tQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKHpvb20pID0+IHtcbiAgICAgICAgdGhpcy51cGRhdGVUZXh0VmlzaWJsZSh6b29tKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAodGhpcy5pbml0ZWQpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmRhdGEpIHtcbiAgICAgICAgdGhpcy56b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnVwZGF0ZU92ZXJsYXlzKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWRJZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZElkICE9IHRoaXMuY3VycmVudFNlbGVjdGVkSWQpIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdCh0aGlzLnNlbGVjdGVkSWQsIHsgbW92ZTogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHN1cGVyLm5nT25EZXN0cm95KCk7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgaW5pdCgpIHtcbiAgICB0aGlzLm9wdGlvbnNNYXAgPSB7fTtcbiAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IHRoaXMuY3JlYXRlT3B0aW9ucygpO1xuICAgIHRoaXMub3B0aW9uc01hcFsnJ10gPSBkZWZhdWx0T3B0aW9ucztcbiAgICBpZiAodGhpcy5ncm91cHM/Lmxlbmd0aCkge1xuICAgICAgdGhpcy5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAgICAgaWYgKGdyb3VwLmdyb3VwKSB7XG4gICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMuY3JlYXRlT3B0aW9ucyhncm91cCk7XG4gICAgICAgICAgdGhpcy5vcHRpb25zTWFwW2dyb3VwLmdyb3VwXSA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy51bnNlbGVjdE9uQ2xpY2tCbGFuaykge1xuICAgICAgdGhpcy5wYXJlbnQubWFwQ2xpY2sucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IG51bGw7XG4gICAgICAgIHRoaXMuc2VsZWN0KG51bGwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIGlmICghdGhpcy5lbmFibGVNYXJrZXJDbHVzdGVyZXIgJiYgdGhpcy5zaG93TGFiZWwpIHtcbiAgICAvLyAgIGNvbnN0IHRleHRPcHRpb25zID0ge1xuICAgIC8vICAgICAuLi50aGlzLmdldFRleHRPcHRpb25zKHRoaXMubGFiZWxGb250KSxcbiAgICAvLyAgICAgLy8gY29sb3I6ICcjZmZmJyxcbiAgICAvLyAgICAgLy8gZm9udEZhbWlseTogJ01pY3Jvc29mdCBZYWhlaScsXG4gICAgLy8gICAgIC8vIGZvbnRTaXplOiAxNCxcbiAgICAvLyAgICAgZmxhdDogZmFsc2UsXG4gICAgLy8gICAgIGNvbGxpZGVzOiB0cnVlLFxuICAgIC8vICAgICBvZmZzZXQ6IFt0aGlzLmxhYmVsT2Zmc2V0WCB8fCAwLCB0aGlzLmxhYmVsT2Zmc2V0WSB8fCAwXSxcbiAgICAvLyAgICAgc3Ryb2tlOiB7XG4gICAgLy8gICAgICAgY29sb3I6IHRoaXMuc3Ryb2tlLFxuICAgIC8vICAgICB9LFxuICAgIC8vICAgICBwYWRkaW5nOiBbMiwgMl0sXG4gICAgLy8gICAgIG1hcmdpbjogWzAsIDBdLFxuICAgIC8vICAgfTtcbiAgICAvLyAgIGlmICh0aGlzLnN0cm9rZSAmJiB0aGlzLnN0cm9rZSAhPT0gJ3JnYmEoMCwwLDAsMCknKSB7XG4gICAgLy8gICAgIHRleHRPcHRpb25zLnN0cm9rZSA9IHsgY29sb3I6IHRoaXMuc3Ryb2tlIH07XG4gICAgLy8gICB9XG4gICAgLy8gICBpZiAodGhpcy5zdHJva2VXaWR0aCkge1xuICAgIC8vICAgICB0ZXh0T3B0aW9ucy5saW5lV2lkdGggPSB0aGlzLnN0cm9rZVdpZHRoO1xuICAgIC8vICAgfVxuICAgIC8vICAgaWYgKHRoaXMuc2hhZG93KSB7XG4gICAgLy8gICAgIHRleHRPcHRpb25zLnNoYWRvdyA9IHtcbiAgICAvLyAgICAgICBjb2xvcjogdGhpcy5zaGFkb3cuY29sb3IsXG4gICAgLy8gICAgICAgYmx1cjogdGhpcy5zaGFkb3cuWixcbiAgICAvLyAgICAgICBvZmZzZXRYOiB0aGlzLnNoYWRvdy5YLFxuICAgIC8vICAgICAgIG9mZnNldFk6IHRoaXMuc2hhZG93LlksXG4gICAgLy8gICAgIH07XG4gICAgLy8gICB9XG4gICAgLy8gICB0aGlzLnRleHRMYXllciA9IG5ldyBtYXB2Z2wuVGV4dExheWVyKHRleHRPcHRpb25zKTtcbiAgICAvLyAgIGlmICh0aGlzLnNob3dMYWJlbE1pblpvb20gIT0gbnVsbCkge1xuICAgIC8vICAgICB0aGlzLnBhcmVudC5pbml0JC50aGVuKCgpID0+IHtcbiAgICAvLyAgICAgICBjb25zdCB6b29tID0gdGhpcy5wYXJlbnQubWFwLmdldFpvb20oKTtcbiAgICAvLyAgICAgICB0aGlzLnVwZGF0ZVRleHRWaXNpYmxlKHpvb20pO1xuICAgIC8vICAgICB9KTtcbiAgICAvLyAgIH1cbiAgICAvLyAgIGxheWVycy5wdXNoKHRoaXMudGV4dExheWVyKTtcbiAgICAvLyB9XG4gIH1cblxuICBjcmVhdGVPcHRpb25zKGdyb3VwPzogYW55KSB7XG4gICAgY29uc3QgaWNvbk9wdGlvbnMgPSB0aGlzLmdldEljb25PcHRpb25zKGdyb3VwKTtcbiAgICByZXR1cm4geyBpY29uOiBpY29uT3B0aW9ucyB9O1xuICAgIC8vIGlmICh0aGlzLmVuYWJsZU1hcmtlckNsdXN0ZXJlciB8fCBncm91cD8uZW5hYmxlTWFya2VyQ2x1c3RlcmVyKSB7XG4gICAgLy8gICBjb25zdCBvcHRpb25zOiBhbnkgPSB7XG4gICAgLy8gICAgIGljb25PcHRpb25zLFxuICAgIC8vICAgICB0ZXh0T3B0aW9uczogdGhpcy5nZXRUZXh0T3B0aW9ucyh0aGlzLmNsdXN0ZXJGb250KSxcbiAgICAvLyAgICAgbWluU2l6ZTogdGhpcy5jbHVzdGVyTWluU2l6ZSB8fCAyNSxcbiAgICAvLyAgICAgbWF4U2l6ZTogdGhpcy5jbHVzdGVyTWF4U2l6ZSB8fCA0MCxcbiAgICAvLyAgIH07XG4gICAgLy8gICBpZiAodGhpcy5jbHVzdGVyR3JhZGllbnQ/Lmxlbmd0aCkge1xuICAgIC8vICAgICBjb25zdCBncmFkaWVudDogYW55ID0ge307XG4gICAgLy8gICAgIGdyYWRpZW50WzBdID0gdGhpcy5jbHVzdGVyR3JhZGllbnRbMF07XG4gICAgLy8gICAgIHRoaXMuY2x1c3RlckdyYWRpZW50LnNsaWNlKDEpLmZvckVhY2goKGcsIGkpID0+IHtcbiAgICAvLyAgICAgICBncmFkaWVudFsoaSArIDEpIC8gdGhpcy5jbHVzdGVyR3JhZGllbnQubGVuZ3RoXSA9IGc7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgICBvcHRpb25zLmdyYWRpZW50ID0gZ3JhZGllbnQ7XG4gICAgLy8gICB9XG4gICAgLy8gICBpZiAodGhpcy5jbHVzdGVyTWF4Wm9vbSAhPSBudWxsKSB7XG4gICAgLy8gICAgIG9wdGlvbnMubWF4Wm9vbSA9IHRoaXMuY2x1c3Rlck1heFpvb207XG4gICAgLy8gICB9XG4gICAgLy8gICB0aGlzLmFkZFBpY2tFdmVudChvcHRpb25zKTtcbiAgICAvLyAgIGxheWVyID0gbmV3IG1hcHZnbC5DbHVzdGVyTGF5ZXIob3B0aW9ucyk7XG4gICAgLy8gfSBlbHNlIHtcbiAgICAvLyAgIHRoaXMuYWRkUGlja0V2ZW50KGljb25PcHRpb25zKTtcbiAgICAvLyAgIGxheWVyID0gbmV3IG1hcHZnbC5JY29uTGF5ZXIoaWNvbk9wdGlvbnMpO1xuICAgIC8vIH1cbiAgfVxuXG4gIHVwZGF0ZVRleHRWaXNpYmxlKHpvb20/OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy50ZXh0TGF5ZXIpIHtcbiAgICAgIGlmICh6b29tID49IHRoaXMuc2hvd0xhYmVsTWluWm9vbSkge1xuICAgICAgICB0aGlzLnRleHRMYXllci5zaG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnRleHRMYXllci5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlT3ZlcmxheXMoKSB7XG4gICAgY29uc3Qgb3ZlcmxheXMgPSBbXTtcbiAgICB0aGlzLmRhdGFNYXAgPSB7fTtcbiAgICBpZiAodGhpcy50b0NlbnRlciAmJiB0aGlzLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgbGV0IG1heExuZyA9IC0xODA7XG4gICAgICBsZXQgbWluTG5nID0gMTgwO1xuICAgICAgbGV0IG1heExhdCA9IC05MDtcbiAgICAgIGxldCBtaW5MYXQgPSA5MDtcbiAgICAgIHRoaXMuZGF0YS5mb3JFYWNoKChyZXMpID0+IHtcbiAgICAgICAgbWF4TG5nID0gTWF0aC5tYXgobWF4TG5nLCByZXMubG5nKTtcbiAgICAgICAgbWluTG5nID0gTWF0aC5taW4obWluTG5nLCByZXMubG5nKTtcbiAgICAgICAgbWF4TGF0ID0gTWF0aC5tYXgobWF4TGF0LCByZXMubGF0KTtcbiAgICAgICAgbWluTGF0ID0gTWF0aC5taW4obWluTGF0LCByZXMubGF0KTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5wYXJlbnQuc2V0UmVjdENlbnRlckFuZFpvb20obWluTG5nLCBtYXhMbmcsIG1pbkxhdCwgbWF4TGF0KTtcbiAgICB9XG4gICAgY29uc3QgZ3JvdXBEYXRhID0ge307XG4gICAgdGhpcy5ncm91cERhdGEgPSBncm91cERhdGE7XG4gICAgY29uc3QgdGV4dERhdGEgPSBbXTtcbiAgICBjb25zdCBncm91cHMgPSBPYmplY3Qua2V5cyh0aGlzLm9wdGlvbnNNYXApO1xuICAgIGdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4ge1xuICAgICAgZ3JvdXBEYXRhW2dyb3VwXSA9IFtdO1xuICAgIH0pO1xuICAgIC8vIGNvbnN0IGRlZmF1bHREYXRhID0gW107XG4gICAgdGhpcy5kYXRhLmZvckVhY2goKHJlY29yZCkgPT4ge1xuICAgICAgbGV0IGdyb3VwTmFtZSA9IHJlY29yZC5ncm91cDtcbiAgICAgIGlmIChncm91cE5hbWUgPT0gbnVsbCB8fCB0aGlzLm9wdGlvbnNNYXBbZ3JvdXBOYW1lXSA9PSBudWxsKSB7XG4gICAgICAgIGdyb3VwTmFtZSA9ICcnO1xuICAgICAgfVxuICAgICAgbGV0IGlkID0gcmVjb3JkLmlkX3ZhbHVlIHx8IHJlY29yZC5pZDtcbiAgICAgIGlmIChpZCA9PSBudWxsIHx8IGlkID09ICcnKSB7XG4gICAgICAgIGlkID0gZ2V0VVVJRCgpO1xuICAgICAgfVxuICAgICAgLy8gTWFwVkdM55qEYnVn77yMQ2x1c3RlckxheWVy55qEaWNvbk9wdGlvbnPml6DmlYjvvIzlj6rog73pgJrov4dwcm9wZXJ0aWVz6K6+572uXG4gICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zTWFwW2dyb3VwTmFtZV07XG4gICAgICAvLyBpZiAobGF5ZXIgIT0gbnVsbCAmJiBsYXllciBpbnN0YW5jZW9mIG1hcHZnbC5DbHVzdGVyTGF5ZXIpIHtcbiAgICAgIC8vICAgY29uc3Qgb3B0aW9ucyA9IGxheWVyLmdldE9wdGlvbnMoKTtcbiAgICAgIC8vICAgaWYgKG9wdGlvbnMuaWNvbk9wdGlvbnMpIHtcbiAgICAgIC8vICAgICBjb25zdCB7IGhlaWdodCwgd2lkdGgsIG9mZnNldCwgaWNvbiB9ID0gb3B0aW9ucy5pY29uT3B0aW9ucztcbiAgICAgIC8vICAgICBpdGVtLnByb3BlcnRpZXMgPSB7IGhlaWdodCwgd2lkdGgsIG9mZnNldCwgaWNvbiwgLi4uaXRlbS5wcm9wZXJ0aWVzIH07XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cbiAgICAgIHZhciBwb2ludCA9IHRoaXMucGFyZW50LmNyZWF0ZUxuZ0xhdChyZWNvcmQubG5nLCByZWNvcmQubGF0KTtcbiAgICAgIHZhciBtYXJrZXIgPSBuZXcgVC5NYXJrZXIocG9pbnQsIG9wdGlvbnMpOyAvLyDliJvlu7rmoIfms6hcbiAgICAgIG1hcmtlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IGlkO1xuICAgICAgICB0aGlzLnNlbGVjdChpZCk7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMub25DbGljay5lbWl0KHsgLi4ucmVjb3JkLCBpZCB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChyZWNvcmQuaW5mb3JtYXRpb24pIHtcbiAgICAgICAgICB0aGlzLm9wZW5JbmZvKHJlY29yZC5pbmZvcm1hdGlvbiwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgb3ZlcmxheXMucHVzaChtYXJrZXIpO1xuICAgICAgaWYgKHRoaXMuc2hvd0xhYmVsICYmIHJlY29yZC5hZGRyZXNzKSB7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gbmV3IFQuTGFiZWwoe1xuICAgICAgICAgIHRleHQ6IGAke3JlY29yZC5hZGRyZXNzfWAsXG4gICAgICAgICAgcG9zaXRpb246IG1hcmtlci5nZXRMbmdMYXQoKSxcbiAgICAgICAgICBvZmZzZXQ6IG5ldyBULlBvaW50KHRoaXMubGFiZWxPZmZzZXRYIHx8IC01MCwgdGhpcy5sYWJlbE9mZnNldFkgfHwgMTApLFxuICAgICAgICB9KTtcbiAgICAgICAgbGFiZWwuc2V0Qm9yZGVyTGluZSh0aGlzLnN0cm9rZVdpZHRoIHx8IDApO1xuICAgICAgICBsYWJlbC5zZXRCb3JkZXJDb2xvcih0aGlzLnN0cm9rZSk7XG4gICAgICAgIGxhYmVsLnNldEJhY2tncm91bmRDb2xvcigncmdiYSgwLDAsMCwwKScpO1xuICAgICAgICBsYWJlbC5zZXRGb250Q29sb3IodGhpcy5sYWJlbEZvbnQuY29sb3IpO1xuICAgICAgICBsYWJlbC5zZXRGb250U2l6ZSh0aGlzLmxhYmVsRm9udC5zaXplKTtcbiAgICAgICAgb3ZlcmxheXMucHVzaChsYWJlbCk7XG4gICAgICB9XG4gICAgICAvLyBpZiAodGhpcy5zZWxlY3RlZElkICYmIHRoaXMuc2VsZWN0ZWRJZCA9PSBpZCkge1xuICAgICAgLy8gICB0aGlzLnVwZGF0ZVNpemUoaXRlbSwgMS41KTtcbiAgICAgIC8vICAgdGhpcy5sYXN0U2VsZWN0ID0gaXRlbTtcbiAgICAgIC8vIH1cbiAgICAgIGdyb3VwRGF0YVtncm91cE5hbWVdLnB1c2gocmVjb3JkKTtcbiAgICAgIHRoaXMuZGF0YU1hcFtpZF0gPSByZWNvcmQ7XG4gICAgICBpZiAodGhpcy50ZXh0TGF5ZXIpIHtcbiAgICAgICAgdGV4dERhdGEucHVzaChyZWNvcmQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIGlmICh0aGlzLnNlbGVjdGVkSWQpIHtcbiAgICAvLyAgIHRoaXMuc2VsZWN0KHRoaXMuc2VsZWN0ZWRJZCwgeyBtb3ZlOiB0aGlzLnNlbGVjdGVkSWQgIT0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJZCwgcmVzZXRMYXllcjogZmFsc2UsIGZvcmNlOiB0cnVlIH0pO1xuICAgIC8vIH1cbiAgICAvLyBncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IHtcbiAgICAvLyAgIGNvbnN0IGxheWVyID0gdGhpcy5sYXllck1hcFtncm91cF07XG4gICAgLy8gICBjb25zdCBkYXRhID0gZ3JvdXBEYXRhW2dyb3VwXTtcbiAgICAvLyAgIGxheWVyLnNldERhdGEoZGF0YSk7XG4gICAgLy8gfSk7XG4gICAgLy8gaWYgKHRoaXMudGV4dExheWVyKSB7XG4gICAgLy8gICB0aGlzLnRleHRMYXllci5zZXREYXRhKHRleHREYXRhKTtcbiAgICAvLyB9XG4gICAgcmV0dXJuIG92ZXJsYXlzO1xuICB9XG5cbiAgZ2V0SWNvbk9wdGlvbnMoZ3JvdXA6IGFueSkge1xuICAgIGxldCBpY29uID0gdGhpcy5pY29uVXJsIHx8ICdhc3NldHMvaW1nL3NjcmVlbi9tYXJrZXIucG5nJztcbiAgICBsZXQgaGVpZ2h0ID0gdGhpcy5pY29uSGVpZ2h0IHx8IDMwO1xuICAgIGxldCB3aWR0aCA9IHRoaXMuaWNvbldpZHRoIHx8IDIwO1xuICAgIGxldCBvZmZzZXRYID0gdGhpcy5pY29uT2Zmc2V0WCA9PSBudWxsID8gd2lkdGggLyAyIDogdGhpcy5pY29uT2Zmc2V0WDtcbiAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuaWNvbk9mZnNldFkgPT0gbnVsbCA/IGhlaWdodCA6IHRoaXMuaWNvbk9mZnNldFk7XG4gICAgaWYgKGdyb3VwICYmIGdyb3VwLmltYWdlVXJsKSB7XG4gICAgICBpY29uID0gdGhpcy5maWxlVXJsU2VydmljZS5nZXRVcmwoZ3JvdXAuaW1hZ2VVcmwpO1xuICAgICAgd2lkdGggPSBncm91cC53aWR0aCB8fCB3aWR0aDtcbiAgICAgIGhlaWdodCA9IGdyb3VwLmhlaWdodCB8fCBoZWlnaHQ7XG4gICAgICBvZmZzZXRYID0gZ3JvdXAuWE9mZnNldCAhPSBudWxsID8gZ3JvdXAuWE9mZnNldCA6IHdpZHRoIC8gMjtcbiAgICAgIG9mZnNldFkgPSBncm91cC5ZT2Zmc2V0ICE9IG51bGwgPyBncm91cC5ZT2Zmc2V0IDogaGVpZ2h0O1xuICAgIH1cbiAgICBjb25zdCBpY29uT3B0aW9uczogYW55ID0gbmV3IFQuSWNvbih7XG4gICAgICBpY29uVXJsOiBpY29uLFxuICAgICAgaWNvblNpemU6IG5ldyBULlBvaW50KHdpZHRoLCBoZWlnaHQpLFxuICAgICAgaWNvbkFuY2hvcjogbmV3IFQuUG9pbnQob2Zmc2V0WCwgb2Zmc2V0WSksXG4gICAgfSk7XG4gICAgcmV0dXJuIGljb25PcHRpb25zO1xuICB9XG4gIG9wZW5JbmZvKGNvbnRlbnQsIGUpIHtcbiAgICB2YXIgcG9pbnQgPSBlLmxuZ2xhdDtcbiAgICB2YXIgbWFya2VySW5mb1dpbiA9IG5ldyBULkluZm9XaW5kb3coY29udGVudCwgeyBvZmZzZXQ6IG5ldyBULlBvaW50KDAsIC0zMCkgfSk7IC8vIOWIm+W7uuS/oeaBr+eql+WPo+WvueixoVxuICAgIHRoaXMucGFyZW50Lm1hcC5vcGVuSW5mb1dpbmRvdyhtYXJrZXJJbmZvV2luLCBwb2ludCk7IC8v5byA5ZCv5L+h5oGv56qX5Y+jXG4gIH1cbiAgYWRkUGlja0V2ZW50KG9wdGlvbnM6IGFueSkge1xuICAgIC8vIG9wdGlvbnMuZW5hYmxlUGlja2VkID0gdHJ1ZTtcbiAgICAvLyBvcHRpb25zLm9uQ2xpY2sgPSAoeyBkYXRhSXRlbSB9KSA9PiB7XG4gICAgLy8gICAvLyDmr4/kuKrlm77lsYLpg73kvJrop6blj5HkuIDmrKFjbGlja+S6i+S7tu+8jOWmguaenOavj+S4quWbvuWxgumDveayoeacieeCueS4reagh+iusOeCue+8jOS8oOWHum51bGxcbiAgICAvLyAgIGlmIChkYXRhSXRlbSkge1xuICAgIC8vICAgICB0aGlzLmNsaWNrRGF0YSA9IGRhdGFJdGVtO1xuICAgIC8vICAgfVxuICAgIC8vICAgaWYgKHRoaXMudW5zZWxlY3RPbkNsaWNrQmxhbmsgIT09IGZhbHNlICYmIHRoaXMuY2xpY2tUaW1lb3V0ID09IG51bGwpIHtcbiAgICAvLyAgICAgdGhpcy5jbGlja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgICAgICBpZiAodGhpcy5jbGlja0RhdGEgPT0gbnVsbCkge1xuICAgIC8vICAgICAgICAgdGhpcy5zZWxlY3RlZElkID0gbnVsbDtcbiAgICAvLyAgICAgICAgIHRoaXMuc2VsZWN0KG51bGwpO1xuICAgIC8vICAgICAgIH1cbiAgICAvLyAgICAgICB0aGlzLmNsaWNrVGltZW91dCA9IG51bGw7XG4gICAgLy8gICAgICAgdGhpcy5jbGlja0RhdGEgPSBudWxsO1xuICAgIC8vICAgICAgIHRoaXMuc3ViTWFya2VycyA9IG51bGw7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vICAgfVxuICAgIC8vICAgaWYgKGRhdGFJdGVtKSB7XG4gICAgLy8gICAgIGlmIChkYXRhSXRlbS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAvLyAgICAgICBjb25zdCBjb29yZGluYXRlcyA9IGRhdGFJdGVtLmdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgIC8vICAgICAgIHRoaXMucGFyZW50LnNldENlbnRlckFuZFpvb20oY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzWzFdLCB0aGlzLnBhcmVudC5tYXAuZ2V0Wm9vbSgpICsgMik7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgY29uc3QgZGF0YSA9IGRhdGFJdGVtLnByb3BlcnRpZXMucmF3O1xuICAgIC8vICAgICAgIGlmIChkYXRhKSB7XG4gICAgLy8gICAgICAgICB0aGlzLnNlbGVjdGVkSWQgPSBkYXRhSXRlbS5wcm9wZXJ0aWVzLmlkO1xuICAgIC8vICAgICAgICAgdGhpcy5zZWxlY3QoZGF0YUl0ZW0ucHJvcGVydGllcy5pZCk7XG4gICAgLy8gICAgICAgICB0aGlzLnpvbmUucnVuKCgpID0+IHtcbiAgICAvLyAgICAgICAgICAgdGhpcy5vbkNsaWNrLmVtaXQoeyAuLi5kYXRhLCBpZDogZGF0YS5pZF92YWx1ZSB8fCBkYXRhLmlkIH0pO1xuICAgIC8vICAgICAgICAgfSk7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICB9XG4gICAgLy8gfTtcbiAgICAvLyBpZiAodGhpcy5wYXJlbnQuc2hvd1R5cGUgPT09ICdtb3VzZW92ZXInKSB7XG4gICAgLy8gICBsZXQgaW5mb1dpbmRvdyA9IG51bGw7XG4gICAgLy8gICBsZXQgaW5mb1dpbmRvd0RhdGEgPSBudWxsO1xuICAgIC8vICAgb3B0aW9ucy5vbk1vdXNlbW92ZSA9ICh7IGRhdGFJdGVtIH0pID0+IHtcbiAgICAvLyAgICAgY29uc3QgZGF0YSA9IGRhdGFJdGVtICE9IG51bGwgPyBkYXRhSXRlbS5wcm9wZXJ0aWVzLnJhdyA6IG51bGw7XG4gICAgLy8gICAgIGlmIChpbmZvV2luZG93ICE9IG51bGwgJiYgaW5mb1dpbmRvd0RhdGEgIT0gZGF0YSkge1xuICAgIC8vICAgICAgIGluZm9XaW5kb3cuY2xvc2UoKTtcbiAgICAvLyAgICAgICBpbmZvV2luZG93ID0gbnVsbDtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICBpZiAoZGF0YSAmJiBkYXRhLmluZm9ybWF0aW9uICYmIGluZm9XaW5kb3cgPT0gbnVsbCkge1xuICAgIC8vICAgICAgIGluZm9XaW5kb3dEYXRhID0gZGF0YTtcbiAgICAvLyAgICAgICBpbmZvV2luZG93ID0gdGhpcy5wYXJlbnQub3BlbkluZm9XaW5kb3coZGF0YSwgZGF0YS5sbmcsIGRhdGEubGF0KTtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgfTtcbiAgICAvLyB9XG4gIH1cblxuICBzZWxlY3QoaWQ6IGFueSwgb3B0aW9uczogeyBtb3ZlPzogYm9vbGVhbjsgcmVzZXRMYXllcj86IGJvb2xlYW47IGZvcmNlPzogYm9vbGVhbiB9ID0ge30pIHtcbiAgICBpZiAoaWQgIT0gdGhpcy5jdXJyZW50U2VsZWN0ZWRJZCB8fCBvcHRpb25zLmZvcmNlKSB7XG4gICAgICBsZXQgaXRlbTogYW55O1xuICAgICAgaWYgKGlkICE9IG51bGwgJiYgaWQgIT09ICcnKSB7XG4gICAgICAgIGl0ZW0gPSB0aGlzLmRhdGFNYXBbaWRdO1xuICAgICAgICAvLyDlpoLmnpzmib7kuI3liLDmlbDmja7vvIzlj6/og73mmK/mlbDmja7ov5jmsqHliqDovb3vvIznrYnmlbDmja7liqDovb3kuoblho3miafooYxcbiAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5jdXJyZW50U2VsZWN0ZWRJZCA9IGlkO1xuICAgICAgLy8gbGV0IGxhc3RTZWxlY3RHcm91cDogc3RyaW5nO1xuICAgICAgLy8gbGV0IGN1cnJlbnRTZWxlY3RHcm91cDogc3RyaW5nO1xuICAgICAgbGV0IHNlbGVjdGVkRGF0YTogYW55O1xuICAgICAgaWYgKHRoaXMubGFzdFNlbGVjdCkge1xuICAgICAgICAvLyBsYXN0U2VsZWN0R3JvdXAgPSB0aGlzLmxhc3RTZWxlY3QucHJvcGVydGllcy5ncm91cDtcbiAgICAgICAgdGhpcy51cGRhdGVTaXplKHRoaXMubGFzdFNlbGVjdCwgMSk7XG4gICAgICAgIHRoaXMubGFzdFNlbGVjdCA9IG51bGw7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbSkge1xuICAgICAgICAvLyBjdXJyZW50U2VsZWN0R3JvdXAgPSBpdGVtLnByb3BlcnRpZXMuZ3JvdXA7XG4gICAgICAgIC8vIHRoaXMudXBkYXRlU2l6ZShpdGVtLCB0aGlzLnNlbGVjdGVkU2l6ZSA/PyAxLjUpO1xuICAgICAgICB0aGlzLmxhc3RTZWxlY3QgPSBpdGVtO1xuICAgICAgICBzZWxlY3RlZERhdGEgPSBpdGVtO1xuICAgICAgICBpZiAob3B0aW9ucy5tb3ZlKSB7XG4gICAgICAgICAgLy8gY29uc3QgbGF5ZXIgPSB0aGlzLm9wdGlvbnNNYXBbY3VycmVudFNlbGVjdEdyb3VwXTtcbiAgICAgICAgICBsZXQgem9vbSA9IHRoaXMucGFyZW50Lm1hcC5nZXRab29tKCk7XG4gICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNYXBab29tKSB7XG4gICAgICAgICAgICB6b29tID0gdGhpcy5zZWxlY3RlZE1hcFpvb207XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGVsc2UgaWYgKFxuICAgICAgICAgIC8vICAgbGF5ZXIgaW5zdGFuY2VvZiBtYXB2Z2wuQ2x1c3RlckxheWVyICYmXG4gICAgICAgICAgLy8gICB0aGlzLmNsdXN0ZXJNYXhab29tICE9IG51bGwgJiZcbiAgICAgICAgICAvLyAgIE1hdGguZmxvb3Ioem9vbSkgPD0gdGhpcy5jbHVzdGVyTWF4Wm9vbVxuICAgICAgICAgIC8vICkge1xuICAgICAgICAgIC8vICAgem9vbSA9IHRoaXMuY2x1c3Rlck1heFpvb20gKyAyO1xuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLnBhcmVudC5zZXRDZW50ZXJBbmRab29tKHNlbGVjdGVkRGF0YS5sbmcsIHNlbGVjdGVkRGF0YS5sYXQsIHpvb20pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGlmIChzZWxlY3RlZERhdGEuaW5mb3JtYXRpb24gJiYgdGhpcy5wYXJlbnQuc2hvd1R5cGUgIT09ICdtb3VzZW92ZXInKSB7XG4gICAgICAgIC8vICAgLy8g6Ziy5q2i5YW25LuW5Zu+5bGC5bCG5L+h5oGv56qX5Y+j5YWz6ZetXG4gICAgICAgIC8vICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIC8vICAgICB0aGlzLnBhcmVudC5vcGVuSW5mb1dpbmRvdyhzZWxlY3RlZERhdGEsIHNlbGVjdGVkRGF0YS5sbmcsIHNlbGVjdGVkRGF0YS5sYXQpO1xuICAgICAgICAvLyAgIH0pO1xuICAgICAgICAvLyB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZWxlY3RlZERhdGEgPSB7fTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIChvcHRpb25zLnJlc2V0TGF5ZXIgIT09IGZhbHNlKSB7XG4gICAgICAvLyAgIGlmIChjdXJyZW50U2VsZWN0R3JvdXAgIT0gbnVsbCkge1xuICAgICAgLy8gICAgIHRoaXMucmVzZXRMYXllckRhdGEoY3VycmVudFNlbGVjdEdyb3VwKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gICBpZiAobGFzdFNlbGVjdEdyb3VwICE9IG51bGwgJiYgbGFzdFNlbGVjdEdyb3VwICE9PSBjdXJyZW50U2VsZWN0R3JvdXApIHtcbiAgICAgIC8vICAgICB0aGlzLnJlc2V0TGF5ZXJEYXRhKGxhc3RTZWxlY3RHcm91cCk7XG4gICAgICAvLyAgIH1cbiAgICAgIC8vIH1cbiAgICAgIC8vIOWmguaenOmAieS4reeahGlk5om+5LiN5Yiw5a+55bqU5pWw5o2uLOWPr+iDveaYr+aVsOaNrui/mOayoeWKoOi9ve+8jFxuICAgICAgaWYgKGlkID09IG51bGwgfHwgaXRlbSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubWFrZXJDbGljay5lbWl0KHsgLi4uc2VsZWN0ZWREYXRhLCBpZDogc2VsZWN0ZWREYXRhLmlkX3ZhbHVlIHx8IHNlbGVjdGVkRGF0YS5pZCB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVzZXRMYXllckRhdGEoZ3JvdXA6IHN0cmluZykge1xuICAgIC8vIGNvbnN0IGxheWVyID0gdGhpcy5sYXllck1hcFtncm91cF07XG4gICAgLy8gY29uc3QgZGF0YSA9IHRoaXMuZ3JvdXBEYXRhW2dyb3VwXTtcbiAgICAvLyBpZiAobGF5ZXIgJiYgZGF0YSkge1xuICAgIC8vICAgbGF5ZXIuc2V0RGF0YShkYXRhKTtcbiAgICAvLyB9XG4gIH1cblxuICB1cGRhdGVTaXplKGl0ZW06IGFueSwgc2NhbGU6IG51bWJlcikge1xuICAgIC8vIGlmIChpdGVtICYmIHRoaXMuZW5sYXJnZU9uU2VsZWN0KSB7XG4gICAgLy8gICBjb25zdCBsYXllciA9IHRoaXMubGF5ZXJNYXBbaXRlbS5wcm9wZXJ0aWVzLmdyb3VwXTtcbiAgICAvLyAgIGxldCBvcHRpb25zOiBhbnk7XG4gICAgLy8gICBpZiAobGF5ZXIgaW5zdGFuY2VvZiBtYXB2Z2wuQ2x1c3RlckxheWVyKSB7XG4gICAgLy8gICAgIG9wdGlvbnMgPSBsYXllci5nZXRPcHRpb25zKCkuaWNvbk9wdGlvbnM7XG4gICAgLy8gICB9IGVsc2Uge1xuICAgIC8vICAgICBvcHRpb25zID0gbGF5ZXIuZ2V0T3B0aW9ucygpO1xuICAgIC8vICAgfVxuICAgIC8vICAgY29uc3QgeyBoZWlnaHQsIHdpZHRoLCBvZmZzZXQgfSA9IG9wdGlvbnM7XG4gICAgLy8gICBpdGVtLnByb3BlcnRpZXMuaGVpZ2h0ID0gaGVpZ2h0ICogc2NhbGU7XG4gICAgLy8gICBpdGVtLnByb3BlcnRpZXMud2lkdGggPSB3aWR0aCAqIHNjYWxlO1xuICAgIC8vICAgaWYgKGl0ZW0ucHJvcGVydGllcy5vZmZzZXQpIHtcbiAgICAvLyAgICAgaXRlbS5wcm9wZXJ0aWVzLm9mZnNldCA9IFtvZmZzZXRbMF0gKiBzY2FsZSwgb2Zmc2V0WzFdICogc2NhbGVdO1xuICAgIC8vICAgfVxuICAgIC8vIH1cbiAgfVxufVxuIl19
|